- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法
7 k. |0 K8 Z8 a; L5 Q, Q+ g
3 ?3 U2 Y: e8 Dselect distinct 字段 from 表名; A, q* G" b: p6 i& L
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。/ k, k6 f( g8 ` ~7 L: t
一.Select语句的完整语法为:/ ]7 n# z+ }. J+ W; k
Select[ALL|DISTINCT|DISTINCTROW|TOP]: R$ l7 u5 ^8 R" |2 V) S
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
" v3 _7 H, o6 `/ L: p( g9 K# R' s, JFROM tablee xpression[,…][IN externaldatabase]
6 s- b1 w1 h. R9 w4 x7 T8 a0 ]& _[Where…]
6 E5 @$ @& q5 [ |/ `+ w[GROUP BY…]
" e' E( c4 U& L" W[HAVING…]
& \7 |0 n- o1 v: t |3 \ Q[ORDER BY…]
$ l& z9 L2 ?) l$ Q[WITH OWNERACCESS OPTION]" w0 h' s. @0 O
说明:
8 l8 z" r) R6 ~) V2 x用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。; p% m1 |. x& _& W3 g
1 FROM子句
) J/ x$ Q( T/ N8 H8 zFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。. J! c i; O) v( l( {7 ^
例:下列SQL语句返回所有有定单的客户:3 B1 |( _2 Z, d' X( a3 J- u
Select orderID,Customer.customerID
- w( E7 j- A5 }6 u! a9 K; F9 j8 }( A$ EFROM orders Customers% `' F3 ^9 _9 J! q
Where orders.CustomerID=Customers.CustomeersID$ t, H4 O. C0 a; d0 {: B
2 ALL、DISTINCT、DISTINCTROW、TOP谓词! C2 l: P. B1 C+ I( [% {7 j
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
7 _; u& M- Y8 ]6 x$ S, o例:Select ALL FirstName,LastName$ X, w+ ]; a. s0 @# u" V
FROM Employees+ n) R4 I/ m$ h
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
7 Z: g6 b2 |, B6 m(3) DISTINCTROW 如果有重复的记录,只返回一个, u+ N9 S. i0 n3 C- s! _/ Z( Z5 b
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)! g; v( I1 c/ Q
例:返回5%定货额最大的定单9 N+ T& D" x6 W- H( f
Select TOP 5 PERCENT*3 O1 B }7 q2 i' R
FROM [ order Details]
9 d" Q: x5 Z+ U8 horDER BY UnitPrice*Quantity*(1-Discount) DESC n p3 {2 q6 Y0 X. t/ E
3 用 AS 子句为字段取别名* U9 T8 a) M5 [
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
7 E3 a: M: R3 J! F, |例:返回FirstName字段取别名为NickName
7 m" ?9 _2 T$ r& XSelect FirstName AS NickName ,LastName ,City3 H( }: C# D+ K8 s( C# G$ W
FROM Employees
! h3 M6 h0 R9 b) F& D+ ?# ^例:返回新的一列显示库存价值
' v2 n; l$ H! T/ a" T" u: NSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock) u' d* Y1 L" y' `
FROM Products
2 }3 \! X7 V# r/ |# ]二 .Where 子句指定查询条件3 G# ?0 N2 j2 U
1 比较运算符
, p n, d* x n, p" S! E; X+ F比较运算符 含义
' k( ?: B! r1 ^$ j( m9 r4 r= 等于
* z. m6 d) P1 h! B& ~* ~6 V3 w> 大于, G4 B( r" c+ C r! n5 t
< 小于
1 l& B# j/ r+ J& g8 H: m>= 大于等于
- ^ V* P$ y0 p5 Q6 w4 F<= 小于等于
5 w% ]+ _3 W% f! J7 v' x e( @: j<> 不等于* l8 g; T: @9 y( v/ I" y$ W( A
!> 不大于1 u! L" y) ]. g3 s+ ~% H
!< 不小于 G6 }% {' m, W% v& T
例:返回96年1月的定单$ f" c4 w* R: k, Y8 q' R
Select orderID, CustomerID, orderDate
3 Q2 w) s9 x) ]3 L" s, ?9 X6 }FROM orders
' R/ {* g# {+ ~* ~; h. iWhere orderDate>#1/1/96# AND orderDate<#1/30/96#& z0 X H( y" j6 ^/ R4 p' p4 l
注意:: M: H' [; `6 d+ N, q: @2 k
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
7 P! z" q" @5 G0 j9 E/ ^1 E& J例:
+ K9 l" z2 D+ [5 SWhere orderDate>#96-1-1#
; c, r+ S; s8 }- q m- }6 X1 f, \也可以表示为:& Z8 `" H( O1 } x* ~) m& u
Where orderDate>Datevalue(‘1/1/96’)
6 r" w+ J- Z4 i( S. V& c! F* d使用 NOT 表达式求反。 r# t3 |* X9 _% N; v
例:查看96年1月1日以后的定单
i/ p7 C K6 v7 y, S* }Where Not orderDate<=#1/1/96#
5 h) z/ |) n6 m0 |. i2 范围(BETWEEN 和 NOT BETWEEN)
8 f1 _: @/ O$ o( h8 k0 sBETWEEN …AND…运算符指定了要搜索的一个闭区间。
% z4 ?: Z% v4 b2 l3 p- x例:返回96年1月到96年2月的定单。+ l% m$ x& n7 q, g' k2 @/ L* r
Where orderDate Between #1/1/96# And #2/1/96#- Y8 s m! l) C" A# v$ s+ w" X& d e
3 列表(IN ,NOT IN)
4 a; N) I8 d2 }IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。, e% y( B: g. }( X' _
例:要找出住在 London、Paris或Berlin的所有客户
5 ?+ G' i; M1 b: ISelect CustomerID, CompanyName, ContactName, City
) R9 D. ~0 K4 _8 mFROM Customers
& {: ]( u1 d( i6 W. U4 ~Where City In(‘London’,’ Paris’,’ Berlin’)
) O- Q& _" R$ U4 模式匹配(LIKE)2 P! R. J) G- u4 h7 W
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。0 A* X5 d" B1 R# v# K
LIKE运算符里使用的通配符/ I; o' Q( ?) Z- y3 D, R6 O
通配符 含义# p8 J3 ]/ Z4 y: }) z
? 任何一个单一的字符7 E% \8 f/ b! P( }: I
* 任意长度的字符
% w: G" o4 s' J0 S9 `4 y0 J# 0~9之间的单一数字
! W" @; D7 V" d3 F0 V0 L: N% ]4 `4 A[字符列表] 在字符列表里的任一值" \' ~2 d' A' A) a7 g! h, l
[!字符列表] 不在字符列表里的任一值
& p n9 Q, X7 t$ m- 指定字符范围,两边的值分别为其上下限
3 J) d0 G; e& {( ^% k! @3 W) Q例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户, ~* F. k; e! [) Y
Select CustomerID ,CompanyName,City,Phone' h& {6 \$ A' ]" B+ b. _0 @8 f
FROM Customers' U2 @4 \* N/ q. L6 E* \
Where Phone Like ‘(171)555-####’' f9 W* p% j8 a1 i3 P0 Q- g8 O( [
LIKE运算符的一些样式及含义
! N( \; @' s7 v样式 含义 不符合. ]# o9 } @4 s( K
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
1 `# o( Y: A Z5 d# LIKE’5’ 5*5 555
1 {: ~5 Y3 F: C4 a# [3 G, x. t) _LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
! n& f5 y, S* d9 h( z8 JLIKE’5##5’ 5235,5005 5kd5,5346
2 O5 D! g$ |) r& |; p' iLIKE’
8 t, F" [" u4 D( r+ g[a-z]’ a-z间的任意一个字符 5,%
' f: T2 U# ?8 s% I2 i+ B+ RLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
! G; d. v! [9 @LIKE’[[]’ 1,*( ?; L1 C1 i3 W2 y! g2 f
三 .用ORDER BY子句排序结果
& C( V0 K m5 ^: Y4 d2 Z3 iorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
* G: e [1 p9 ]5 i8 f& P/ i s; LorDER子句中定义了多个字段,则按照字段的先后顺序排序。7 a, i- M) G& [. V+ U
例:( S3 R$ \. E+ z- g- I: u3 U" x
Select ProductName,UnitPrice, UnitInStock
! ^( N9 {. o) s3 N% uFROM Products- |/ H' o8 i* P
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName, m3 @2 {1 M; a1 c% @7 O
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。$ Q9 P/ G* a9 a/ s7 [+ p2 F9 Z3 p! { I/ L
例:下面的语句产生与上列相同的效果。
, j E; Y: J7 o; o/ P* r9 ?) fSelect ProductName,UnitPrice, UnitInStock) K7 Q" A$ m+ j' m8 \5 b
FROM Products4 F1 X" v! K5 W% c
orDER BY 1 DESC , 2 DESC,39 I R2 @4 n! e: ]9 B) k$ h
四 .运用连接关系实现多表查询+ x6 X9 S% C2 u2 q L5 P6 @
例:找出同一个城市中供应商和客户的名字
0 E' L& \% Z( F( `4 Q1 h# x: ]Select Customers.CompanyName, Suppliers.ComPany.Name
3 W. ?9 m7 y9 ^* G; I! d( {FROM Customers, Suppliers
- `0 A& L- @! b [Where Customers.City=Suppliers.City. Q8 K7 ~) z8 [2 ?7 c& |. K& M
例:找出产品库存量大于同一种产品的定单的数量的产品和定单0 b& c; ~ t+ ?) F3 j
Select ProductName,OrderID, UnitInStock, Quantity/ R) |- N1 h8 Z+ P: U# G6 A
FROM Products, [Order Deails]/ |, g' _7 n3 q! v
Where Product.productID=[Order Details].ProductID* c! }+ u% {: d
AND UnitsInStock>Quantity5 N6 \ e8 v: C0 }! [0 O
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
+ t9 A8 F9 g6 S1 P1 w8 U' O语法:( k& Z. Y: l( N. H* E) X5 M/ ]
FROM table1 INNER JOIN table24 @& _' `5 U) H4 m
ON table1.field1 comparision table2.field2
, o5 I' |* d$ P) @其中comparision 就是前面Where子句用到的比较运算符。
: a) j; w* P3 @. a- N1 c2 {Select FirstName,lastName,OrderID,CustomerID,OrderDate
& v- v" o1 G" j FFROM Employees
1 \4 V+ M, A# ~' E; ]INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
( O1 `+ F- c* F& U注意:5 V. v6 h/ [2 O8 ?
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。1 G- H( s' G6 \
在一个JOIN语句中连接多个ON子句
7 u Y: x- c* d! k* f/ d5 \ X语法:
& Z' r1 [+ S) YSelect fields5 C4 X: V2 m5 K* X ? x) }
FROM table1 INNER JOIN table2+ a. m0 K6 w, Y/ H9 w4 g- e) G
ON table1.field1 compopr table2.field1 AND$ m, J" e6 Y2 C5 ]
ON table1.field2 compopr table2.field2 or5 f5 f( n- K) i a2 e: I8 X
ON table1.field3 compopr table2.field3
n `/ U# i4 M& N也可以9 H, n& [9 ]; `" V& \
Select fields
$ G$ _6 c& |' [( f6 \8 b. L6 fFROM table1 INNER JOIN. Y. l- G; H% U& O3 {, e, I
(table2 INNER JOIN [( ]table3
0 t8 d! e3 B* [, C[INNER JOER] [( ]tablex[INNER JOIN]
9 e4 }% G2 ]) }4 i# y5 JON table1.field1 compopr table2.field1/ T9 y4 b& r8 [, X2 L
ON table1.field2 compopr table2.field2
w( ]3 f8 L( q% rON table1.field3 compopr table2.field3; E) k. t) |9 m1 ?
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。# _ d" s3 C' i, `2 @3 q, @/ }
FROM table [LEFT|RIGHT]JOIN table2
+ @+ j( ]9 a7 I+ q |* f* e/ kON table1.field1comparision table.field2
6 J q) u& u- N _$ _% a8 q用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
, X3 x0 a* i3 N8 _1 G0 M- J, R例:不管有没有定货量,返回所有商品- r# g; H1 ~0 o4 V$ u5 {4 L v; ^
Select ProductName ,OrderID
' y5 A% s ?; z4 r4 SFROM Products
/ ~# _, f' s& Z" E _LEFT JOIN orders ON Products.PrductsID=Orders.ProductID. ~$ T7 C; ?; o4 ~, P
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。+ X& Y! s6 _& e4 T% d" B. L. J
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。, E$ ?- D( ?$ G+ H% A2 h1 ^2 ^% `- }
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
/ k8 K9 g9 w7 w$ x& x6 p1 A" h" PSelect *, u Z! z/ z4 I, b/ v. Q/ Y! s& x
FROM talbe1
4 c, N/ A0 S e1 MLEFT JOIN table2 ON table1.a=table2.c/ Z9 `) D {2 p5 E
1 连接查询中使用Iif函数实现以0值显示空值
+ R$ P/ U. D" EIif表达式: Iif(IsNull(Amount,0,Amout)
- a6 S" S- t1 s& b: ^3 p例:无论定货大于或小于¥50,都要返回一个标志。6 H! P& s0 q6 m5 K( ?
Iif([Amount]>50,?Big order?,?Small order?)
9 ~8 l6 c: c" o; Y1 @* b五. 分组和总结查询结果
6 n# z: H6 i% {在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。" y3 @8 o* R! }% Z5 C
GROUP BY 子句的语法
+ u/ A$ @* F+ |, P9 oSelect fidldlist
- I( Z, G- q$ u! R8 ]( WFROM table; C& l9 I& z- _ [6 N' ?0 p1 R
Where criteria7 k8 t7 a% Q2 @! m
[GROUP BY groupfieldlist [HAVING groupcriteria]]
1 S& P6 H. H9 {' K1 t注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。0 M' Y0 F+ P- O- q
GROUP BY字段中的Null值以备分组但是不能被省略。
0 X$ Q" M! v9 r' b3 y( ]. d$ O在任何SQL合计函数中不计算Null值。
# c l9 h! u. M6 YGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。2 _' R& Z: b: E7 P. o4 \6 A- C; D. C
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
! e3 V. P5 z$ `4 n3 b; QSelect Title ,Count(Title) as Total
% c/ G0 W3 G# T' HFROM Employees
9 C& `- t& V$ c* eWhere Region = ‘WA’1 L# Y$ f% ?- E3 `
GROUP BY Title
5 f/ q; D' T; j# f; ?, B; wHAVING Count(Title)>1- u+ n, i8 }# z7 v1 d$ h; P* Q7 N
JET SQL 中的聚积函数) b+ P# z# u3 E& f# A: G- m# L7 B
聚集函数 意义
! N' e% w" q% g6 f; }: oSUM ( ) 求和0 x* x; \3 t* N% o2 a) f
AVG ( ) 平均值 Y5 R& u& v& p. ^/ L. X
COUNT ( ) 表达式中记录的数目, @; O5 n7 z, z" i# Q
COUNT (* ) 计算记录的数目' d) F& ?/ m) n0 q+ u) f
MAX 最大值
% `8 y+ C6 c: `6 f7 u( P) PMIN 最小值
8 {0 C% j4 n5 O' u) }VAR 方差
% `1 {# i( X: j7 w# }& f% ESTDEV 标准误差
2 z$ B; j2 B7 n) A b& T3 s; xFIRST 第一个值
+ |3 b" H1 T: h# g9 H9 {LAST 最后一个值; z0 q8 f/ d. |" x1 }0 q
六. 用Parameters声明创建参数查询3 U4 [" j) H+ |. L3 \# N
Parameters声明的语法:4 u: R; |0 e1 }* a: j* M
PARAMETERS name datatype[,name datatype[, …]]
5 _4 c: \7 j/ I; C! \5 x0 W% _其中name 是参数的标志符,可以通过标志符引用参数.
5 X6 k" h% V$ u9 E7 u4 U0 ADatatype说明参数的数据类型.
6 q- U4 s! A2 t; I2 F; L使用时要把PARAMETERS 声明置于任何其他语句之前.5 U$ J; x) a! t, g3 Q- u7 U
例:$ r( D K1 H8 i! k2 a: c8 N, d
PARAMETERS[Low price] Currency,[Beginning date]datatime. R0 j9 j2 o5 U+ A, B# Q, v
Select orderID ,OrderAmount: Y2 l7 ] C' X6 R/ @
FROM orders
; W$ o& L* k' a- u& f PWhere orderAMount>[low price]. U/ a$ I' [& j1 l1 F. t/ b/ y! J; F
AND orderDate>=[Beginning date]
3 K; \4 F+ j. X0 k( O, \七. 功能查询
- M. S1 B5 Q- \# G L4 _9 w所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
$ C. U, M+ H. m: W5 \% q* p1 更新查询: s$ h4 L& \3 d L ~# V0 ^
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
# ?0 O2 P% I8 a# ~2 U+ G' j更新查询语法:, j$ G& p1 z& ?+ J/ ?
Update 表名4 b3 ]6 J6 T! F) |, c5 ^& j: Z! |
SET 新值
) p+ ]) X& Y9 n& H) I0 j; { MWhere 准则5 x% k3 `0 Z. `# M
例:英国客户的定货量增加5%,货运量增加3%
0 ^) [' X) W4 L5 M( A1 jUpdate OEDERS
0 J4 M, V* Z) y+ G1 f5 o8 OSET orderAmount = orderAmount *1.1
0 ]9 f& T4 G/ V+ KFreight = Freight*1.03/ I* N! T, m$ P# ?2 G
Where ShipCountry = ‘UK’
2 v i1 X5 d' X: v2 n/ [2 删除查询
+ d) U" V. F: B! k" M, cDelete子句可以使用户删除大量的过时的或冗于的数据.% i- i5 y# O# v$ k& ]5 t' X; e: r
注:删除查询的对象是整个记录.$ ?+ Y' X: ~/ X) x \; U$ U0 t
Delete子句的语法:' G& G* D# e5 ~' a0 c0 W7 @8 p0 M
Delete [表名.*]
) _0 w# F U% `# G8 J: e7 X) F9 {' x CFROM 来源表
$ O1 A; `. `7 J1 RWhere 准则
6 ^' w4 @* Z+ z. ?/ d. z例: 要删除所有94年前的定单2 O% E% S! H; r/ F) ~( D% d
Delete *! t U' W! c$ U4 s2 r
FROM orders* j' l7 t4 o' M9 m6 s0 [3 `
Where orderData<#94-1-1#& W7 z. S* I$ j) [$ m
3 追加查询& l; e4 ~2 Y7 b8 y
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.5 C) D- d; _0 y1 U% J" O
INTO 子句指定接受新记录的表7 l- S4 |. ^/ e+ t' Q
valueS 关键字指定新记录所包含的数据值.
0 |* |- Q0 U6 M, VInsert 子句的语法:
$ h! j2 C" z+ z9 aINSETR INTO 目的表或查询(字段1,字段2,…)
' J3 O# _- v( G; i. GvalueS(数值1,数值2,…)
1 g5 w; O: n r) L例:增加一个客户' k4 j0 n: P" D1 l+ m7 l
Insert INTO Employees(FirstName,LastName,title)
5 B, f" b. s' D- v. d; l# ~% tvalueS(‘Harry’,’Washington’,’Trainee’)# I0 {) T# @/ c; A- b) q% ~; O, k( A
4 生成表查询+ \ i! C" s; ]8 M4 d# z5 E+ v
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.# U! i; G4 s6 L! _7 l6 B9 i
Select INTO子句用来创建生成表查询语法:
1 @: d' c5 u4 E3 m( s) M" BSelect 字段1,字段2,…
J# p' d/ ~ K r5 PINTO 新表[IN 外部数据库]
& @9 a0 [) x3 O4 ]# G' ]FROM 来源数据库
4 K2 S T' v9 \& t( `* q! y% ~Where 准则
G, K# ]3 U4 q例:为定单制作一个存档备份: r& B& [+ d# Q+ m; F4 l# |
Select *+ `6 ~/ E0 D1 G3 k
INTO ordersArchive8 e3 ^$ C: q5 n( p$ `* d, J+ {
FROM orders
& G: O7 s1 V+ V0 z G& X# e八. 联合查询: G- x" S% {* N O5 U: ~
UNION运算可以把多个查询的结果合并到一个结果集里显示.
% Q1 J) m+ @, [( j! l" `/ [UNION运算的一般语法:
m* E( X& ?5 j( R! Q; I- M: f4 J[表]查询1 UNION [ALL]查询2 UNION …
1 A3 p4 |5 A6 ~ \4 @# s( R例:返回巴西所有供给商和客户的名字和城市
6 |$ |' u) h1 \5 j, `/ J; k% FSelect CompanyName,City. x, G. R* L3 I! J) d( M) R
FROM Suppliers
$ ^: Q0 e# y5 hWhere Country = ‘Brazil’
3 K. A4 o- A# ]$ m" oUNION8 ]3 V9 ~6 ]' S) f5 ^( ?
Select CompanyName,City
8 z0 h' m9 ~& j/ ~ q3 M; u% h+ i5 wFROM Customers
' R5 w; l! @, F7 \Where Country = ‘Brazil’
: w/ ^2 i3 r( \注:
4 X( |; B" |" ?! c( O$ O缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
+ K/ h l9 }6 n/ qUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
, j, @5 |5 y# }- R; t7 o1 }每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
' G$ w2 P9 H7 m% j# _5 I% Y九. 交叉查询
! I, `% B/ F. n6 U交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
1 v f1 E9 a# J6 B9 i1 T6 o2 KMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:' @' ~+ J+ S/ { F8 A7 N1 U. k4 B
TRANSFORM aggfunction
) n, q! {+ X" eSelect 语句( e- a: Y0 @, _' S
GROUP BY 子句0 {5 ?& o5 w- o4 n. e
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
c) m2 l8 ]3 d3 O) \& [Aggfounction指SQL聚积函数,
( t, l& _6 a z& D: p% TSelect语句选择作为标题的的字段,5 k# [, N( z x. V3 h3 \/ {
GROUP BY 分组 K0 `* F3 y8 S* o# B+ G
说明:
/ | q) G8 z9 N* X8 aPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
* _) c* _2 o$ S/ M# `" yvalue代表创建列标题的固定值.* h* K. s$ F9 B* I8 @0 l
例:显示在1996年里每一季度每一位员工所接的定单的数目:
8 H' J0 T; X7 f/ Y) r" STRANSFORM Count(OrderID)
4 _0 o5 G/ v2 A! `- @ S8 `Select FirstName&’’&LastName AS FullName. x" l: w, r9 z3 F, S( i
FROM Employees INNER JOIN orders! w% x6 o6 e8 Z. H, h( F
ON Employees.EmployeeID = orders.EmployeeID
9 h& I" M; ^( K: B# T! \Where DatePart(“yyyy”,OrderDate)= ‘1996’+ i% v$ A; U: Y+ L
GROUP BY FirstName&’’&LastName
$ I! G' v0 j6 yorDER BY FirstName&’’&LastName
' o9 q- Y0 e9 L. IPOVOT DatePart(“q”,OrderDate)&’季度’8 S! M4 S: |3 m" E
十 .子查询2 _: U R1 i2 F5 [1 H- ~
子查询可以理解为 套查询.子查询是一个Select语句.
+ J* m% I6 {8 Q1 表达式的值与子查询返回的单一值做比较
& Z$ t2 [7 Z' j6 E- V8 y, Z( {语法:
, n& _) U/ [; i$ }! [: e表达式 comparision [ANY|ALL|SOME](子查询)- }& b% D& Z! D& O' s
说明:
1 o6 b: q5 L, M3 VANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
' b |% y- o# B- n( t3 p例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品: p# A2 \, e9 y
Select * FROM Products
1 @+ r) Y' [. s8 E. k! qWhere UnitPrice>ANY7 I3 w1 Z8 V' w) u
(Select UnitPrice FROM[Order Details] Where Discount>0.25)3 R: C% ]0 e+ Z- A
2 检查表达式的值是否匹配子查询返回的一组值的某个值0 c' a" f' p, E& l4 ^: a
语法:7 |. {( {% ~+ @/ ]5 G2 }. d
[NOT]IN(子查询)
/ y% j' |7 J; s0 V- I# R例:返回库存价值大于等于1000的产品.6 p5 @; Z1 _$ H8 L
Select ProductName FROM Products
; T9 G& W. D3 X+ nWhere ProductID IN/ d& T* b2 Z( z/ I: ?- V5 d+ B
(Select PrdoctID FROM [Order DEtails]; D9 ]6 r, R7 N- {% B9 \
Where UnitPrice*Quantity>= 1000)
( f7 Q$ {6 ~1 P+ S- t& }3检测子查询是否返回任何记录' p+ a( u; K. |$ H' A/ J2 v: \
语法:! u7 N! w. i) d, z, T; V3 h
[NOT]EXISTS (子查询)9 N9 E' l9 l% A) o. V- I) W' o9 }2 U% p
例:用EXISTS检索英国的客户# b$ h8 v6 t/ m# g: ~. c+ \
Select ComPanyName,ContactName" r7 u0 Z; p& a
FROM orders0 C9 i5 m4 [; @ t3 ~; g
Where EXISTS
: m6 v2 d8 p: [/ d% A(Select *
; ^/ N& Q3 d8 q5 L. G! }- vFROM Customers
0 s: W- e0 f& ]Where Country = ‘UK’ AND
0 \1 z0 E } N5 I9 S, tCustomers.CustomerID= orders.CustomerID) |
|