航空论坛_航空翻译_民航英语翻译_飞行翻译

 找回密码
 注册
搜索
查看: 2439|回复: 0
打印 上一主题 下一主题

Access如何筛选重复数据以及Select语句的完整语法 [复制链接]

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法+ ~0 k+ N7 Q% ^  d: J2 ?" O

3 r9 Z* T  p) T4 H) L; [select distinct 字段 from 表名& A! e- |. H6 e7 o/ S- J
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。4 }  h% T8 B2 u! r8 l# ^
一.Select语句的完整语法为:) L* X; K% O+ h: ?
Select[ALL|DISTINCT|DISTINCTROW|TOP]
1 f. G5 [/ h" D3 g- l9 Z" w  _' e{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
" P+ m, K# Q6 f. ]+ |# ^4 L* EFROM tablee xpression[,…][IN externaldatabase]
* X4 A3 ~2 x3 H1 `- P& w[Where…]3 ^: e5 I8 E. H; o/ j
[GROUP BY…]# W! i, i; H8 x- W% A) F
[HAVING…]: D, Z1 E, X9 J! i4 z( A, m
[ORDER BY…]
' i5 L3 x# m) E[WITH OWNERACCESS OPTION]
0 H; C$ N! _1 {7 b5 c0 s0 O说明:
9 G( p* P0 F; L7 X9 w用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。  |+ z4 v! k: V9 h# `+ w
1 FROM子句: w, G/ _3 x* T; r4 L- I% ]
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
; q' }7 J! p! _9 b7 Y% P$ t例:下列SQL语句返回所有有定单的客户:
6 `% p5 @  _6 w2 t7 TSelect orderID,Customer.customerID
" n9 [8 D5 S+ YFROM orders Customers
9 {% ]3 ^, a5 L; m# K* J3 p& j0 CWhere orders.CustomerID=Customers.CustomeersID6 m; S3 Z2 j: i1 S; n! s$ j- M' h
2 ALL、DISTINCT、DISTINCTROW、TOP谓词7 S8 C; m( {0 Y$ v
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。; Q5 u2 }  E! }7 S
例:Select ALL FirstName,LastName
) ^: t0 M2 c. tFROM Employees
3 b+ R+ N3 p) T; p8 B7 K(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
1 j: Z% N' M; l) y5 o(3) DISTINCTROW 如果有重复的记录,只返回一个
. t3 V$ q$ \" G(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)+ D2 K1 Q$ x* B6 c' L9 x3 t/ b
例:返回5%定货额最大的定单
2 M; C  p( g' v0 ?Select TOP 5 PERCENT** T  }& |$ e+ i1 M: F+ y
FROM [ order Details]
: n+ R( e2 v; ]6 }& t4 borDER BY UnitPrice*Quantity*(1-Discount) DESC* P) T/ u' z8 x6 c- W% A" d
3 用 AS 子句为字段取别名
% y0 c  d" q/ w6 U2 ?( W; u如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。, Z! u. p4 p( p  y7 U
例:返回FirstName字段取别名为NickName: O/ t5 L' h, D, _1 {
Select FirstName AS NickName ,LastName ,City
1 P/ C' a, ]- j4 q2 wFROM Employees# l' E* m: g" Z2 L
例:返回新的一列显示库存价值1 w0 o0 D: y* S; B7 L. W2 [
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
# z  Z* e( x4 w9 A4 |; dFROM Products' r/ R3 H$ F( c4 K0 t' N
二 .Where 子句指定查询条件
8 r& g9 E0 \" O' @5 @; l1 比较运算符' ^6 C6 a2 R2 o) P8 |/ R( Q$ z
比较运算符 含义
7 n; ~9 Q- R2 A8 x/ ?= 等于7 W. E! s2 [& v3 J
> 大于  [- @* V3 O; w% g& j" a; P
< 小于
( t- J- b( V+ m, e, k7 K8 ~>= 大于等于
1 B) ]( b/ X. z, [<= 小于等于
+ O+ b& d0 A# m<> 不等于  \6 f( [7 k) ]! `
!> 不大于
+ V) d% b: @4 {. n& w9 v2 e!< 不小于3 i) h" ?$ M* }8 b7 }# ^) W
例:返回96年1月的定单+ e* G! b/ K, b$ l5 B) _2 C
Select orderID, CustomerID, orderDate
6 v1 a" e& c# n# S% ~5 N& mFROM orders/ O, U2 C. s( {3 {" ^0 y( w; t
Where orderDate>#1/1/96# AND orderDate<#1/30/96#2 U# b/ N5 U5 p, `. w
注意:8 F+ v  A  A- v2 `6 D- D) ?' y
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
. x0 p6 ]4 ]# P2 {2 V5 f例:. ]" l$ ^9 ]$ k$ L. m7 G# J0 p
Where orderDate>#96-1-1## n9 M5 n  d1 @; K* [; N
也可以表示为:- z$ }; l0 T/ B; k  _: ~7 W( [
Where orderDate>Datevalue(‘1/1/96’)/ v0 ]8 c, h5 B, f1 n- a: o
使用 NOT 表达式求反。
) ?3 K. r' Y# C例:查看96年1月1日以后的定单
: X# ]5 |* d& ^7 {* L0 k/ bWhere Not orderDate<=#1/1/96#
* W$ _8 {1 R4 N/ W* H7 j; D2 范围(BETWEEN 和 NOT BETWEEN)- g* X+ H! |0 g6 J) w2 ^5 q
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
' I: L5 E. P, F3 B# ^# u/ C例:返回96年1月到96年2月的定单。" {4 b' Z9 @' i3 X+ g
Where orderDate Between #1/1/96# And #2/1/96## c' [) G( {% _. X( `6 _% I. h
3 列表(IN ,NOT IN)( T+ e; Y: J9 {* k* y* R1 U( \6 M
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。3 k+ g  @" |3 W& Y1 U4 S
例:要找出住在 London、Paris或Berlin的所有客户
8 L6 d9 ?: e6 tSelect CustomerID, CompanyName, ContactName, City) d* v9 P7 ^; i  n$ e4 e2 g
FROM Customers
; ?' H$ d% i' E9 nWhere City In(‘London’,’ Paris’,’ Berlin’)
0 l" w7 ?) j/ m( D7 r6 U, ^4 模式匹配(LIKE)
) i) a/ \; b6 |! ELIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
) N, z$ i, q+ B2 _9 V! T3 m( ~2 v5 `LIKE运算符里使用的通配符% k6 {# J% j# J5 `
通配符 含义" [0 Y* H8 a& S/ P. j3 Y6 g# i* g
? 任何一个单一的字符
5 ?: f8 ]% ^4 n! x$ ~* 任意长度的字符
8 R- c* R9 o( b# 0~9之间的单一数字5 A. k' K  t* o. |% z, B
[字符列表] 在字符列表里的任一值7 _- M7 g; c5 c2 [9 P7 }- |; d7 y
[!字符列表] 不在字符列表里的任一值
, c8 r  ^  ]+ `8 G: v3 u- 指定字符范围,两边的值分别为其上下限* g+ \' w0 A( X9 {
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户1 V" _9 F" w  {+ k% C; {
Select CustomerID ,CompanyName,City,Phone
: i" S4 S  ~8 JFROM Customers- x( f  D4 l9 E/ X; W0 g
Where Phone Like ‘(171)555-####’
) D% F% O  P. @1 b6 ALIKE运算符的一些样式及含义
9 X: y7 E$ e: G- W样式 含义 不符合
! a/ w0 L% G! u& j9 tLIKE ‘A*’ A后跟任意长度的字符 Bc,c2559 |' E5 l) H% ]/ i# |! p
# LIKE’5’ 5*5 555) t: R- P' {, ~3 N
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
% p' h4 W  g5 a' v$ r0 H  k1 sLIKE’5##5’ 5235,5005 5kd5,53468 q  D5 l: g8 W2 Z; ^
LIKE’
1 W* g- u8 e5 d3 E( @  p[a-z]’ a-z间的任意一个字符 5,%& L: d- j) J9 J) _6 [! {5 @$ e
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
7 k4 K( \- v, ^7 Q8 T3 yLIKE’[[]’ 1,*
6 u  A3 h8 s+ h" P' G1 l三 .用ORDER BY子句排序结果. T) ?! q3 m0 R6 J6 Y
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。' }* M. x0 r+ _2 G$ Z4 k
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
! b- p7 |- r3 T例:
! Z7 J. W1 u) W( [" p5 @Select ProductName,UnitPrice, UnitInStock% {0 t2 y, H8 u
FROM Products
% \' F7 C+ H; J* Z" j  yorDER BY UnitInStock DESC , UnitPrice DESC, ProductName/ b  K! p' ^) t- I4 E6 p
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
6 V# T3 k! d+ J' r- H# I例:下面的语句产生与上列相同的效果。
$ S& A' l: J2 k5 t1 T3 Q6 ESelect ProductName,UnitPrice, UnitInStock
3 g0 _$ c9 o) h# `FROM Products
( R4 [5 `) u" `/ s8 xorDER BY 1 DESC , 2 DESC,3- y( r& d$ [/ ?* z/ i! Z2 A
四 .运用连接关系实现多表查询. a3 M: P! D% B2 M- l
例:找出同一个城市中供应商和客户的名字
' [9 c% q2 F0 oSelect Customers.CompanyName, Suppliers.ComPany.Name
7 M( o/ A5 L; D. K1 b$ ~FROM Customers, Suppliers
/ Z5 B* a: W0 @! ZWhere Customers.City=Suppliers.City# V! b5 W) c! q. W
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
, ^) s% G, `( X$ \: gSelect ProductName,OrderID, UnitInStock, Quantity3 Z* w8 b2 b2 O0 y( @7 u3 V4 b
FROM Products, [Order Deails]
& c3 t* u: [2 {5 ^7 f8 ~Where Product.productID=[Order Details].ProductID
* p4 |3 H7 u; T# {AND UnitsInStock>Quantity6 e  B7 L, Z: K, V4 `
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
: S4 Q* x% Z5 ~& j语法:
8 O) ~, B, O$ e; z4 A4 XFROM table1 INNER JOIN table2  A7 N" M3 g# H
ON table1.field1 comparision table2.field2
+ w) v: u0 [; @0 R: p% q" J! }其中comparision 就是前面Where子句用到的比较运算符。* u% R0 |' ~# C1 U: Z
Select FirstName,lastName,OrderID,CustomerID,OrderDate- k8 u* }! |$ ^/ k7 E3 `6 g0 u
FROM Employees; x# x$ ~; J! I/ K! M
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID" ]) I5 H9 I7 U, f2 D8 S& V
注意:- n1 @- d5 d4 p' h  M! S# y$ x
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
, L$ y) ?% Z3 u9 t- U在一个JOIN语句中连接多个ON子句' K2 P6 F8 i8 y6 S6 e
语法:% L% ?" k' h' i
Select fields$ ]' g* `: {+ d
FROM table1 INNER JOIN table2) j7 `* Y* B; ~0 U
ON table1.field1 compopr table2.field1 AND
9 T/ ?; _$ f/ [; @5 O4 e: }ON table1.field2 compopr table2.field2 or
7 f* c  D+ Z7 AON table1.field3 compopr table2.field3$ a# u  o/ S% O5 V9 L
也可以
& ~: B" F. Y6 e& p7 V) sSelect fields
/ z  L5 I4 h: P( d! \% r* M# CFROM table1 INNER JOIN! ^9 s) g  r$ T, `
(table2 INNER JOIN [( ]table3( K! \0 g- P. Z. {; g, H! x: I" d
[INNER JOER] [( ]tablex[INNER JOIN]
+ o5 J& X7 P  l3 u2 V; M* yON table1.field1 compopr table2.field1
4 J: u5 D( r8 ]+ WON table1.field2 compopr table2.field2
0 g$ O* Y3 a2 k/ U# UON table1.field3 compopr table2.field3
' @7 v  K' i; ?7 R6 d6 c0 b# {外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
' R3 a2 K- i" A( ]/ ~: [/ LFROM table [LEFT|RIGHT]JOIN table2
* p4 f" d, f4 ?" Y" @( CON table1.field1comparision table.field2
/ J' F) w  H) \0 Z% ?* N用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据/ a, t. l3 C+ \8 ^/ K4 q' Q# {
例:不管有没有定货量,返回所有商品
5 s! x. J6 y% |! [- u: x# g* cSelect ProductName ,OrderID3 `, W: B7 \8 h' @+ ^& N
FROM Products
4 P: D4 p- D- C8 W! ZLEFT JOIN orders ON Products.PrductsID=Orders.ProductID, [( O  L& v& u8 z* \9 H
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
( [* C5 i4 d6 R例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。4 }9 O3 t. p) q
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
, f, g' U; w6 T7 l! RSelect *. t+ b7 |8 r+ R. J2 x
FROM talbe17 p5 N: z" n) w8 d7 K. E0 P- v/ a$ K+ V8 e
LEFT JOIN table2 ON table1.a=table2.c
$ ~  x, I. d" w0 F1 ~! C% n1 连接查询中使用Iif函数实现以0值显示空值! o9 v$ m& V  U1 n3 T7 c0 ^
Iif表达式: Iif(IsNull(Amount,0,Amout)& ?, O! `3 `" E% g# C
例:无论定货大于或小于¥50,都要返回一个标志。  d1 E6 @. X# T' I: @+ R
Iif([Amount]>50,?Big order?,?Small order?)
9 z+ s. y9 M5 V0 O) g* N9 E五. 分组和总结查询结果
0 u; o2 T' ~, i6 }) R在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。7 e. O8 d$ _7 [8 B7 X# Q
GROUP BY 子句的语法! E  D+ H8 t& Q  G3 `) x3 v& ]
Select fidldlist/ ~4 g* H3 ?8 E4 H6 y" j4 f
FROM table4 E) X7 A" L+ v/ ~5 U
Where criteria
7 ^6 e$ O1 ~8 @; a! q[GROUP BY groupfieldlist [HAVING groupcriteria]]2 C1 [4 c9 ~7 ^: E: e7 \* e
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
. h0 Q* h: f2 X. W& F; b9 fGROUP BY字段中的Null值以备分组但是不能被省略。8 w0 I( k" z1 C% W6 o# {" X* j
在任何SQL合计函数中不计算Null值。5 T! F: [4 |4 I0 i, k4 i. ^
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
) O* U6 h* v: }/ D) O# K例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
/ `" K8 e1 W; ]! \- HSelect Title ,Count(Title) as Total3 i3 I' L: n0 x  _2 {
FROM Employees: D, e* S% \7 W2 X
Where Region = ‘WA’
4 {/ [# _: e: h- `GROUP BY Title& K' h2 V9 ?6 K" O2 W
HAVING Count(Title)>11 A0 z! V) h" l- z$ U& |  n
JET SQL 中的聚积函数
9 ^* s: t. S4 F& {* }0 ^- c9 p聚集函数 意义& f1 s. f$ S) G8 T' y
SUM ( ) 求和5 k! z! E' F$ D& @3 t
AVG ( ) 平均值
+ M& g% N7 r- ]1 @0 {/ ~COUNT ( ) 表达式中记录的数目$ b- ]6 _4 ?1 ~+ b/ g7 Y
COUNT (* ) 计算记录的数目% R. v6 j: ]( W  @
MAX 最大值: e' g: B6 l/ a7 {; j
MIN 最小值( B3 S) s/ g: o' b  s6 n) J  s
VAR 方差
5 [( F* D' e4 z  `( `+ {- ^5 mSTDEV 标准误差
7 m, K: }* U! j% JFIRST 第一个值; O& H. ^; I' m$ G5 y! f) M  Y
LAST 最后一个值
# k. z1 Y: @# j+ C' a六. 用Parameters声明创建参数查询1 \' x+ u2 ~6 e' t
Parameters声明的语法:1 O8 Y8 L& J3 k5 _- a
PARAMETERS name datatype[,name datatype[, …]]* n, {+ ~( w& g" D
其中name 是参数的标志符,可以通过标志符引用参数.5 J) }6 [4 B% A2 W9 n
Datatype说明参数的数据类型.$ x5 Q, C7 y( t! O) i
使用时要把PARAMETERS 声明置于任何其他语句之前.
2 b, H; g( w/ \7 J. q5 I# E例:  W& q9 K, _3 p' K' {; |
PARAMETERS[Low price] Currency,[Beginning date]datatime
4 Q# G; D- e; w! l% \0 T! _Select orderID ,OrderAmount
+ `3 u9 P. K$ K2 qFROM orders+ H0 [6 m$ Z% ~& n5 o: j" z
Where orderAMount>[low price]- {8 X- A8 C- X, ~5 ]
AND orderDate>=[Beginning date]
( K  _  K; T5 j七. 功能查询
. G8 d* ~( w8 {, n所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.  b4 S' k4 M% p+ H, ^( Y  v
1 更新查询
4 _( ]% A  q! ?$ LUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.4 A5 P4 l$ R9 M/ i4 T6 O
更新查询语法:- a  k/ U8 P) p
Update 表名  t$ U! v# C' z9 T5 o$ ?& s
SET 新值
# H$ V: y5 b5 i9 P1 l' }0 t( FWhere 准则' V5 U3 a% C1 R1 b( m( `
例:英国客户的定货量增加5%,货运量增加3%
  D7 Z$ N6 u5 q' Y: {/ LUpdate OEDERS
+ P( S1 s$ @' iSET orderAmount = orderAmount *1.1. x4 }9 X# e3 F" G; E
Freight = Freight*1.03
2 w: _1 E4 o! q0 n& ^Where ShipCountry = ‘UK’
% T! ?1 p1 e1 d# Y& v5 E2 删除查询
% T. a, _6 k/ M3 \# E% v& WDelete子句可以使用户删除大量的过时的或冗于的数据.) T' o2 M+ E# p$ W/ K
注:删除查询的对象是整个记录." v3 |2 J  I* n/ L5 N. I+ f8 @
Delete子句的语法:1 o8 A8 i, @- e6 b% ?) ]( T) Q
Delete [表名.*]( h! h5 ~& d1 E. A9 v4 V, _
FROM 来源表2 b% ]( F# h" B* P" ^
Where 准则7 {; a9 S: ?( P
例: 要删除所有94年前的定单
' f  b0 S3 y# I6 c! Y& X+ `Delete *
8 Z. k: w) j& k) y- b3 S- ]" @' rFROM orders
" D1 I1 Y1 O( Z5 \1 \& IWhere orderData<#94-1-1#5 v: _. B# e5 t8 O% C
3 追加查询
! O( T" |! e1 K$ K  ]Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
9 T8 p7 @: F, G3 eINTO 子句指定接受新记录的表
) `" f3 y0 |1 f1 |/ w6 j% RvalueS 关键字指定新记录所包含的数据值.' P, [. a6 J6 t3 P: {+ s, d: q
Insert 子句的语法:
# P* _$ y# _* iINSETR INTO 目的表或查询(字段1,字段2,…)9 K: v# U) I9 {  A
valueS(数值1,数值2,…)
) L/ Z  j7 B: l7 w8 L2 O例:增加一个客户
( b/ K& U5 s9 _" G& y* ^8 ]. jInsert INTO Employees(FirstName,LastName,title)0 y# e( M5 A# o
valueS(‘Harry’,’Washington’,’Trainee’)
$ p  k/ U% p5 z4 生成表查询
  v1 e" R1 i/ W6 @: m& y, m* X可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
7 j- s9 u5 y, ?  Y5 V3 F! OSelect INTO子句用来创建生成表查询语法:' S* F3 p8 ]0 t( ?1 P
Select 字段1,字段2,…
, C7 S! ^7 s# Z4 F3 SINTO 新表[IN 外部数据库]
" G# F8 A- J. _8 E' g/ q5 VFROM 来源数据库! e, W  |: B& x& ?2 o
Where 准则( u$ ]$ q* U1 x( ]
例:为定单制作一个存档备份
4 p- U0 J7 Y0 i- D2 aSelect *: G4 e8 e$ ^5 {4 ?/ j
INTO ordersArchive
5 g2 w( {) _, Y0 d# A1 wFROM orders! M  U: u. S+ r  S
八. 联合查询3 [# s* E/ @% A" b2 D% X' p
UNION运算可以把多个查询的结果合并到一个结果集里显示.2 P1 R- {- e# r4 z
UNION运算的一般语法:  c5 S. M1 @6 @
[表]查询1 UNION [ALL]查询2 UNION …
. w$ V9 m, e6 b: e例:返回巴西所有供给商和客户的名字和城市# Z1 ^5 R% F" Q. M; X& Q# R# B
Select CompanyName,City2 {# O% w. f& @! o
FROM Suppliers' i" R0 s) o- _$ q5 R1 L
Where Country = ‘Brazil’* D! H8 j0 ?% D5 n
UNION
, D- ~* b  x7 w' B+ D/ v9 v4 {Select CompanyName,City0 I. I- I# s6 D. }$ F
FROM Customers+ B0 @% h, b1 r- @
Where Country = ‘Brazil’; U: O' d. O$ I( I- X0 Q& O- D
注:) j2 Y! a8 e" m7 b4 K7 [
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
/ n: d; j: J3 \; eUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.. q# }, Z( R2 a- ]* n6 l
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.7 j' |5 a2 W% |7 h( j6 z
九. 交叉查询
$ y, o# s* p" ~, H5 S; o7 o交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.2 ]& D" Y# y; S& A) ]9 |0 U
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:0 Q" e, ^/ P" t9 B$ ~. x$ E% p2 T
TRANSFORM aggfunction
2 I  O" J5 j1 c" MSelect 语句
- R( Y* d3 {: v/ {6 z1 mGROUP BY 子句
8 z* `* Y0 r3 P$ ]' L( Q' SPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
5 [3 [" \$ f% Y5 F. oAggfounction指SQL聚积函数,
! U5 d# y% C1 f9 Y4 fSelect语句选择作为标题的的字段,3 u! [, ^+ l6 G# w% m
GROUP BY 分组
0 Z% q* ~8 T' q0 V说明:
) `4 j' M" H+ y6 a8 K' QPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.$ f# @: `7 U! ]+ a2 k6 Q
value代表创建列标题的固定值.
* s" U" Y) X8 j9 H" y/ t例:显示在1996年里每一季度每一位员工所接的定单的数目:* u& H* {$ l  ?4 S. m5 }
TRANSFORM Count(OrderID)9 T- A" {9 L( |6 i; |
Select FirstName&’’&LastName AS FullName
; }8 R+ G9 S3 c) F: WFROM Employees INNER JOIN orders
) X3 g7 X5 f, ~ON Employees.EmployeeID = orders.EmployeeID
# ~5 w1 ~6 l6 E; L+ Y) a: U! ~Where DatePart(“yyyy”,OrderDate)= ‘1996’0 Z! E7 C- Z+ D( a
GROUP BY FirstName&’’&LastName
2 d) Z  A6 d$ I5 r& G% gorDER BY FirstName&’’&LastName4 g' [8 V4 w' ]3 T1 H- z  G
POVOT DatePart(“q”,OrderDate)&’季度’/ B2 X" G9 N) D* V, a0 S
十 .子查询( q; y9 K2 g) ?, S9 b4 m+ V
子查询可以理解为 套查询.子查询是一个Select语句.
' q/ |0 {( O1 u+ m8 O1 表达式的值与子查询返回的单一值做比较9 P1 k6 k8 `, h* L. F9 j
语法:
7 d5 K- z: T: a4 l9 e0 k表达式 comparision [ANY|ALL|SOME](子查询)$ G4 Q8 `1 ^! C& R
说明:
1 _( o0 E8 `  X) U6 BANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.( [5 k3 O- a, [6 U+ I; I* Z% r1 \
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
3 ^# K: g9 \' R; r" r0 U) F' jSelect * FROM Products, c; X/ W* M# Q
Where UnitPrice>ANY2 d. H" I! f+ x; f8 M9 r
(Select UnitPrice FROM[Order Details] Where Discount>0.25)& i4 V0 E7 @( J* v2 y
2 检查表达式的值是否匹配子查询返回的一组值的某个值
2 e3 o# K' s" m! I; ]' E语法:1 r( H0 b  \1 l5 @# l& _; k
[NOT]IN(子查询)
0 N- l/ h! S% s% H! @例:返回库存价值大于等于1000的产品.
5 U& h9 X% F+ @! n% `2 u6 vSelect ProductName FROM Products
5 q6 E/ L+ o5 _Where ProductID IN$ B* ~8 V+ q' E' g' K- F7 H
(Select PrdoctID FROM [Order DEtails]5 L2 F- J% K# Z4 B- E
Where UnitPrice*Quantity>= 1000)
( j7 b2 ^& }3 _. j; |9 ?- J3检测子查询是否返回任何记录* f6 h9 n* k& q" w
语法:- X5 s: `& B8 V7 _# B: K
[NOT]EXISTS (子查询)- ^) h: ~* B% g1 B/ e- a% Z' N
例:用EXISTS检索英国的客户
) V! {6 t4 U4 J4 D; K3 ySelect ComPanyName,ContactName6 P; `) H: o. S- v* r
FROM orders
* C9 x; g+ ?4 D* P4 P6 ~) GWhere EXISTS
6 N. Q& _1 q3 l(Select *0 R" Y5 r) a2 e7 D) }# ~
FROM Customers
2 ?2 j& t( ~7 T) f5 i' ~% e& VWhere Country = ‘UK’ AND
4 g  p% C* ^" m0 Q4 ^9 e4 YCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


Archiver|航空论坛 ( 渝ICP备10008336号 )

GMT+8, 2026-1-13 11:41 , Processed in 0.026001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部