- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
|
Access如何筛选重复数据以及Select语句的完整语法: f+ O6 V {% v6 ^: W
2 [# x- B) l) F5 q P0 ^select distinct 字段 from 表名& d7 }* D, [' O" i, }1 ^! \; ?" K
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。/ s" C z) R a* b. B% Z
一.Select语句的完整语法为:$ d8 L0 p! d! H) S% f
Select[ALL|DISTINCT|DISTINCTROW|TOP]
7 z; E. [0 d. ]2 K{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}4 i+ V6 J) R/ d
FROM tablee xpression[,…][IN externaldatabase]
) k, z5 B w3 C5 ?) ^) K[Where…]
) {9 O$ ?0 |* f! z) n$ {[GROUP BY…]0 U9 e4 b6 e" x5 l7 ^* Y
[HAVING…]( t: q+ O5 F; ?. s
[ORDER BY…]0 ]1 n& Y6 s+ c% b! A- E$ X
[WITH OWNERACCESS OPTION]
# h$ u/ F( Z) Y说明:
# `, |6 i5 _# [用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。$ J9 R+ v1 V. ]3 C( a
1 FROM子句
. K3 @- b' `% h$ nFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
7 {: P; T, _6 \2 m, J' X例:下列SQL语句返回所有有定单的客户:
2 p) U- G7 \1 ]" b& E& OSelect orderID,Customer.customerID* A- x2 F0 i: m
FROM orders Customers, K: d" E3 I% X& d/ ?
Where orders.CustomerID=Customers.CustomeersID' F7 K+ u4 Y% z$ u$ q
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
: e8 \/ T8 F0 ]% m5 K(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。' H4 Q0 P7 w# n& j
例:Select ALL FirstName,LastName
+ K$ y/ Y4 X- yFROM Employees
8 _1 C& }: x! I(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
) k, [) _$ H: T4 _1 Q(3) DISTINCTROW 如果有重复的记录,只返回一个
, ]2 F, a- ~" {( q- U(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)* W7 m3 t3 E. ^: ~
例:返回5%定货额最大的定单% `+ H' N0 Y( C/ o5 ?- N, n3 \6 \
Select TOP 5 PERCENT*
8 u: G8 Z$ ?$ cFROM [ order Details]4 l9 x6 ~* `; ^6 E$ x
orDER BY UnitPrice*Quantity*(1-Discount) DESC" j, [( q# p# d
3 用 AS 子句为字段取别名
' t) l( F m6 c3 H( R0 T如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
5 _' D3 d6 y6 O2 C( |1 Y8 ]" V9 Q例:返回FirstName字段取别名为NickName. b$ U1 }+ m6 D6 F& Z# N' B9 D
Select FirstName AS NickName ,LastName ,City
, v# w3 U' ~+ f! DFROM Employees
6 \$ d& L2 c6 w+ R, ~5 {例:返回新的一列显示库存价值
- W* X" T# t) d$ d% ESelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock" ]3 |. Q0 w6 M( Z
FROM Products4 n L' J" @# J% O6 j
二 .Where 子句指定查询条件
$ }" Z n7 a3 J9 [1 比较运算符! M2 \0 X* b# O L1 ?2 s7 ~: r
比较运算符 含义; l! `: @- |! {2 a$ _* O, ^1 f/ [0 L
= 等于
4 B* a% G$ H7 G6 }$ K% |) k" o> 大于
# U' |% ~& A1 B" M< 小于: S7 w& c5 o- U% d0 [' x5 u
>= 大于等于0 S! ?) O9 A( o# n0 k% a7 V/ ]( a
<= 小于等于
7 z- Q4 H" G7 X5 I<> 不等于( e4 J2 |$ }7 Q% k8 l1 e3 G" E1 ~/ X
!> 不大于
* p" G# w/ D q# y1 Y+ I!< 不小于
9 J/ O& v" R8 c+ e例:返回96年1月的定单
6 o1 b: P6 Q- _9 G% U6 G4 z2 c+ ?# j2 iSelect orderID, CustomerID, orderDate
& S. V' K8 U$ _5 @6 j6 O/ y& U+ O# BFROM orders
* }' W6 P* W9 g6 R% KWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
9 F% k3 J G* W4 g- o P! T* j注意:
3 Y+ J2 W2 L& K& w! D- iMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
0 x. L% _; N E" C; a例:
. x. v3 q& Z4 b. K! E8 MWhere orderDate>#96-1-1#
8 C- R- J5 G6 Y也可以表示为: R) o7 T% D8 L: E2 H3 O! w l
Where orderDate>Datevalue(‘1/1/96’)
4 p' G5 W( h3 K) q. ?# f# g$ m/ c使用 NOT 表达式求反。
4 a+ ~- ]' l, C5 } ]例:查看96年1月1日以后的定单
( x5 g' Y) ^' J% QWhere Not orderDate<=#1/1/96#
, A/ | d* g+ F& r2 范围(BETWEEN 和 NOT BETWEEN): X/ b7 _% y5 t: W9 J) h
BETWEEN …AND…运算符指定了要搜索的一个闭区间。( y" E5 j" {8 O* N, T& i2 D! T
例:返回96年1月到96年2月的定单。
. {- \; P3 Q: y4 X6 ?Where orderDate Between #1/1/96# And #2/1/96#* E# d& C6 _' |+ I, N; v
3 列表(IN ,NOT IN)! a- C* q( L. e: K7 v
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。2 J, {' a; _1 s
例:要找出住在 London、Paris或Berlin的所有客户
% i4 p$ y( `' {9 `6 ]3 m) p7 QSelect CustomerID, CompanyName, ContactName, City
5 x6 j0 n5 v: X2 k+ M0 A7 BFROM Customers
3 n8 v6 E( |" s5 e; lWhere City In(‘London’,’ Paris’,’ Berlin’)6 R- r! y' Q" i: B5 j# E
4 模式匹配(LIKE)
3 n9 s, {" k6 _, aLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。5 H( @$ J' P+ g
LIKE运算符里使用的通配符% E6 t6 z; N/ L0 `
通配符 含义0 \1 _+ O3 H/ D4 A' u
? 任何一个单一的字符) o# t; y+ C! u& |+ Q* p
* 任意长度的字符
% N+ E4 Z2 m8 P+ U E# 0~9之间的单一数字! o+ V2 P1 A2 I6 a) b$ M Y
[字符列表] 在字符列表里的任一值
8 {& Y1 n0 p7 ?$ U, F0 D( O* T[!字符列表] 不在字符列表里的任一值2 k& \$ g& @. I1 Y0 K
- 指定字符范围,两边的值分别为其上下限
9 }# l" G3 X: h) i例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户" Y+ Y$ B8 }$ c) w4 Z4 Z3 i9 x& V
Select CustomerID ,CompanyName,City,Phone7 ?' U& _- f0 W U) p) K
FROM Customers: ?' K$ n% h3 K! g) B' ~
Where Phone Like ‘(171)555-####’1 V! ], Y' J0 [2 b5 r0 K, G
LIKE运算符的一些样式及含义) V; c5 ?* W; `, a. V: N
样式 含义 不符合# o) i# E" C. l+ `; N
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255* z) X5 Q7 u: P5 [+ \: @* i
# LIKE’5’ 5*5 555
& i( ?0 o0 I) y5 X( hLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5- Q- j, E2 }; {! [2 E" D0 p
LIKE’5##5’ 5235,5005 5kd5,5346
8 }3 m S$ h3 m% Z! P* i0 {LIKE’
( O4 M' b Q- P! u4 n. Z[a-z]’ a-z间的任意一个字符 5,%5 Q5 p5 Q% d+ x! N- P. F |) x5 G4 T
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,11 i- ]) _6 W+ Y4 @0 g: W- \9 ~* b
LIKE’[[]’ 1,*
. p# U+ P8 F0 R9 F) w1 ?; d三 .用ORDER BY子句排序结果) L- W u/ p1 ^, P1 Q3 f
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
( v2 \9 U* ~4 _* I* n0 HorDER子句中定义了多个字段,则按照字段的先后顺序排序。
, S+ Y4 ^. T) y# r! {' i" k例:5 f; x0 T2 ~; O& U5 l0 [2 M" t
Select ProductName,UnitPrice, UnitInStock
5 B% x4 H% L# D# `FROM Products
- H4 u1 s2 o8 v& E& t) r( ~orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
3 E: K$ ? S( K. s: h( `1 norDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
* H8 s! b% z' p: O, j6 J例:下面的语句产生与上列相同的效果。( Q3 ^- @' f \( y% w
Select ProductName,UnitPrice, UnitInStock, m4 M9 J {' U
FROM Products' ~% @, @2 v5 Q* n; t
orDER BY 1 DESC , 2 DESC,3
5 t1 D' S' ?% }; O( ~7 e h$ ?四 .运用连接关系实现多表查询
) R6 Q2 m8 c4 W6 v: }例:找出同一个城市中供应商和客户的名字
. B1 B9 ^& K3 [Select Customers.CompanyName, Suppliers.ComPany.Name; R; U) O# t/ B4 a
FROM Customers, Suppliers
$ l0 a- E8 l" f8 x5 k% L* ?Where Customers.City=Suppliers.City
+ [2 v/ k# _5 C9 h例:找出产品库存量大于同一种产品的定单的数量的产品和定单+ I* M3 ?# D$ U' G, D
Select ProductName,OrderID, UnitInStock, Quantity
& F4 `/ F/ w- V* S- w- u% X9 O$ yFROM Products, [Order Deails]
4 B, C* c. X8 d9 P% JWhere Product.productID=[Order Details].ProductID1 ~: l. } ]+ F5 j
AND UnitsInStock>Quantity
p2 `0 F% ?: Q* v& I另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
# S; l z: _% o0 C7 \语法:3 A- w6 G/ C9 h. G( }% `
FROM table1 INNER JOIN table2
5 t; [4 ?* G. h0 PON table1.field1 comparision table2.field2
?0 k' r' M" C7 E# Q! u3 d& A其中comparision 就是前面Where子句用到的比较运算符。" k% R7 a1 v+ K& t: d2 F) N
Select FirstName,lastName,OrderID,CustomerID,OrderDate
+ G1 D/ r$ y* K; g: x& B+ L1 bFROM Employees$ J, h5 \: s" }2 x0 Y4 y1 ^* O* f
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID- V& n7 F! Q: x2 b( b
注意:0 J) j! X" g- ?
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。. p+ ], z, Q! w7 l
在一个JOIN语句中连接多个ON子句2 ?/ ?* s7 V7 v: P
语法:/ E7 g( N2 m5 \( S
Select fields
|5 D+ Q: x* d7 YFROM table1 INNER JOIN table2
- q- d3 W3 F2 v$ Y7 Z* d( mON table1.field1 compopr table2.field1 AND
4 { C2 X0 f9 l5 ?ON table1.field2 compopr table2.field2 or0 V F2 j: R! g* h* J7 R
ON table1.field3 compopr table2.field3
6 Q5 Q& r: p+ b& m( b! c7 [6 S% g# O也可以
; b, T& Y- b e- _6 p: G* MSelect fields5 G/ z3 F9 a7 j6 |& v
FROM table1 INNER JOIN
2 \+ F$ J0 A3 x7 [ K4 o! ]) Q(table2 INNER JOIN [( ]table32 A7 y+ j& Y) [' q$ k4 b
[INNER JOER] [( ]tablex[INNER JOIN]
- Q4 q. |, h1 m; UON table1.field1 compopr table2.field1( k b9 ?- | T4 l4 E5 @& T
ON table1.field2 compopr table2.field2
$ L: G5 H: E! Y* JON table1.field3 compopr table2.field3& x- @% u2 Z: l
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。6 T4 J: \0 ^8 A
FROM table [LEFT|RIGHT]JOIN table2& a. F+ u8 U# w: F
ON table1.field1comparision table.field2
! F. F3 ^4 L; g; e" Q* D用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据2 W) Y3 _; L% a1 y' U
例:不管有没有定货量,返回所有商品' O* P2 p8 _1 g% C* a4 @, p8 X
Select ProductName ,OrderID
9 ~5 D+ B- q4 Y) C9 v% zFROM Products
( y, C: g; c% Z( O; xLEFT JOIN orders ON Products.PrductsID=Orders.ProductID1 v! v" }1 p/ ], n8 j
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
/ E7 _* u) y0 G! q; _3 B例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。* {, I/ ~* e: |! j- p% A4 E
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。3 K; u! }3 ?' I! c
Select */ m/ l6 X) J" w
FROM talbe1
& \4 G1 b: c, [3 z) VLEFT JOIN table2 ON table1.a=table2.c
7 u F9 n: A* w# i1 连接查询中使用Iif函数实现以0值显示空值/ v9 C, } Z$ b, L
Iif表达式: Iif(IsNull(Amount,0,Amout)
* Z ]9 t y; b! j- D例:无论定货大于或小于¥50,都要返回一个标志。
/ D; D5 \. t. K. @( wIif([Amount]>50,?Big order?,?Small order?)( Y% V3 L% N( Q
五. 分组和总结查询结果& P0 D) H' r- w- v/ j2 z: W5 h
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
& s2 L0 e6 M$ V' kGROUP BY 子句的语法2 E+ d% F, T; ?
Select fidldlist# f& g, ~; T) _5 d, p3 O
FROM table- s. z1 l0 p$ F* H, d
Where criteria
2 G3 {$ M5 q1 z* M' j0 W[GROUP BY groupfieldlist [HAVING groupcriteria]] z T! z1 Q r' ^1 U# t7 h
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。0 T8 L. V9 q2 w; ]: C- m @. L
GROUP BY字段中的Null值以备分组但是不能被省略。* y6 U1 K! F5 M6 p2 G& v
在任何SQL合计函数中不计算Null值。9 Y5 e) e7 L$ ]! `% o4 {+ u4 ~7 P
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。& p7 n3 N! e% }( d' g( l
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
' q) ~! k$ I$ M; |* F9 P8 l6 VSelect Title ,Count(Title) as Total
6 `; m; \" W! Q. D3 h, R" pFROM Employees F4 L: j0 g/ H( |/ K
Where Region = ‘WA’. X. Q# q( l2 }5 N. R5 b4 ?
GROUP BY Title3 q' w( r$ i9 D
HAVING Count(Title)>13 B+ y1 y K7 L
JET SQL 中的聚积函数! V# V K' S& E, }* B) ]7 ^
聚集函数 意义
3 j; e: `6 t7 f7 S2 c6 ?# \SUM ( ) 求和) y6 T3 X5 W0 z; W+ G% ^- c
AVG ( ) 平均值
" `; m7 J& e2 N. UCOUNT ( ) 表达式中记录的数目" {, t! k- a) A+ |; S1 V
COUNT (* ) 计算记录的数目5 V3 s: F+ I4 V- U$ ?; J Q+ E
MAX 最大值" C+ O% K( ^2 Q1 p, M1 D- ?
MIN 最小值" k+ \: |; s) Z1 S- o1 {( J
VAR 方差" s9 y% m: G7 Z& Y+ o& q
STDEV 标准误差9 }9 M% } O8 T
FIRST 第一个值
) ~9 l9 _( P1 v! {LAST 最后一个值
4 z* Z) q2 O' s9 _六. 用Parameters声明创建参数查询( x/ m# d# i% {& {5 A
Parameters声明的语法:7 F& B' t% a) [" ?7 _
PARAMETERS name datatype[,name datatype[, …]]" a5 M6 W. P: g" E
其中name 是参数的标志符,可以通过标志符引用参数.
/ p: V4 _. V2 O! k, a% ]5 iDatatype说明参数的数据类型.
) S2 d; J% W4 ?4 v使用时要把PARAMETERS 声明置于任何其他语句之前.
; r- O F# R W6 Y+ T- w8 i' H% q例:
( m% r. Z0 G, o2 W1 y. wPARAMETERS[Low price] Currency,[Beginning date]datatime; T8 p. T9 C6 E' t& X
Select orderID ,OrderAmount) v, v" M- G0 M e3 V
FROM orders
# `5 `# X% N3 f, R. d: j% q! {Where orderAMount>[low price]
& g. S# b/ r0 ^5 c7 N& KAND orderDate>=[Beginning date]
+ }# {5 R. I. E! {七. 功能查询5 t5 o, V$ M8 L7 t
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询." O% e" ]: p, m; @/ f, a) J1 O
1 更新查询% l! w/ I4 `0 i( H+ W+ R/ t6 v
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.* H, y; G. `" q$ Y0 ~
更新查询语法:
. ~: O% b0 h; [: E* A. {Update 表名4 E4 @- n3 N( Y: a) H+ s
SET 新值3 d8 T5 K) \+ \0 x4 B# w* D4 k
Where 准则, H2 r6 D( R, B* S n" W4 B4 |1 {
例:英国客户的定货量增加5%,货运量增加3%1 M9 e% V T: U+ ?; e: e" E
Update OEDERS/ G7 o3 w- y* M# {7 S
SET orderAmount = orderAmount *1.1! Z! u$ M' d* ^) M- y1 Y- o
Freight = Freight*1.03- v* o5 U! }! s+ a! G
Where ShipCountry = ‘UK’( }1 I/ o5 U+ c# s5 A
2 删除查询
( y% r5 V0 f6 c& U( c/ g3 uDelete子句可以使用户删除大量的过时的或冗于的数据.
7 N* d4 s5 y4 x% Y% y" ]8 q M# J注:删除查询的对象是整个记录.
! n8 u% i2 Y- x Y$ V2 U6 SDelete子句的语法:. _0 h0 b7 Q$ @; D
Delete [表名.*]
% B$ Y* _7 b& A- yFROM 来源表$ Q A# a# {5 }( A9 g( H2 D3 S' v
Where 准则
2 r, x% B" q. M例: 要删除所有94年前的定单
8 S& s8 Q/ h/ R. M2 h* v" _: v8 ?Delete *
$ G* | w0 @7 K8 N' c2 ?! j/ gFROM orders+ n* @' d4 J: B4 e j3 Y2 O. x, W- a
Where orderData<#94-1-1#0 l* {0 f. e# B* L
3 追加查询
* f2 d( Y3 H' |3 ^, wInsert子句可以将一个或一组记录追加到一个或多个表的尾部.7 J# j% W( G* F+ v
INTO 子句指定接受新记录的表, _& u# r* D$ ^) F2 e0 q& z% E
valueS 关键字指定新记录所包含的数据值.
/ [4 v$ Y7 U" O- I) rInsert 子句的语法:% f" f6 h3 @5 X* k; {# I
INSETR INTO 目的表或查询(字段1,字段2,…)4 R! K7 B. E3 {
valueS(数值1,数值2,…)
* ~' O5 z- ?, [) o4 s# e例:增加一个客户6 \1 d& u7 F9 P; ^/ s( m! F
Insert INTO Employees(FirstName,LastName,title)
% {7 F/ G* S$ t( W8 U2 e, Y6 T% SvalueS(‘Harry’,’Washington’,’Trainee’)
' d7 g7 M, P5 M5 @4 生成表查询
% x# Q9 g' Q0 B X可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.* |; H1 R. U8 {3 h; |& i
Select INTO子句用来创建生成表查询语法:
) r8 K1 M o4 W% K7 Q* tSelect 字段1,字段2,…
- V) R, `2 t$ {) j6 e" jINTO 新表[IN 外部数据库]3 A R( S: p) b$ H# }
FROM 来源数据库
9 ~5 _& v. o& a2 C+ h1 d9 ?+ E8 t3 VWhere 准则
7 R- @# |0 _1 l4 c例:为定单制作一个存档备份5 a7 F9 s; l) r& x) C
Select *
Z! K, V7 t& D+ ^' k$ @INTO ordersArchive
( ~7 A3 v; R0 [, r- `( ]FROM orders
# [3 o+ R$ i* {9 S7 C- D& j6 r1 _八. 联合查询
, _& O% G) D/ l) d2 x1 a0 P' QUNION运算可以把多个查询的结果合并到一个结果集里显示." O7 m* l; C9 K B( v8 n
UNION运算的一般语法:% N, q$ K; S I8 a
[表]查询1 UNION [ALL]查询2 UNION …3 P# \ w3 P: L6 R1 P9 M- s* K
例:返回巴西所有供给商和客户的名字和城市
. n2 r' S1 I b4 y; jSelect CompanyName,City
( _ M& p7 }* I+ P, A, FFROM Suppliers/ ^' ~2 h( ~! k& I0 G9 |
Where Country = ‘Brazil’
& P+ q( Z# c0 y* i, C" b$ g6 eUNION
% _1 z! V9 \" qSelect CompanyName,City
7 B. Y5 W7 S0 A2 V# H. gFROM Customers
8 @& n8 K) K* R& v% s5 Z$ q+ LWhere Country = ‘Brazil’
; p$ |6 k3 h4 U注:; V4 X! I* d+ Z! A8 R, i2 Y
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
3 P* P. \$ @2 l- R) \! |UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.4 N1 _4 C0 k( g- v/ l N
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.5 V( h' Z) {, B W% m" q
九. 交叉查询
4 W* V& j& I' `! h- X交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
& q) R1 W% Z3 k0 r' |* F+ B. R zMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
7 L4 o- m4 b& f5 u0 @: w" \3 KTRANSFORM aggfunction
8 i+ a( H! \7 B" l0 _Select 语句
# r0 |& ` I+ Z3 d$ q6 LGROUP BY 子句
: w, L7 w; k4 Z% d8 gPIVOT pivotfield[IN(value1 [,value2[,…]]) ]5 Q8 b5 n) f0 w/ W* {
Aggfounction指SQL聚积函数,
% S$ G$ ^ F$ w$ ]Select语句选择作为标题的的字段," g% }! R/ v) \7 I
GROUP BY 分组
4 o0 [ U f, H* A5 n3 C说明:6 B. @3 e1 a1 b+ t" R: C
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.( u. l% `, q T! j, n4 l$ z
value代表创建列标题的固定值.
' z) e% y" ~7 D& {* r/ W例:显示在1996年里每一季度每一位员工所接的定单的数目:9 I0 L r: i& [1 N" X: W
TRANSFORM Count(OrderID)
) l* V) L" ]3 w2 f8 iSelect FirstName&’’&LastName AS FullName
# k1 j- k" i' i9 D- bFROM Employees INNER JOIN orders
4 L6 r0 L$ @% R0 {8 y. b5 JON Employees.EmployeeID = orders.EmployeeID$ D& v: g9 s8 G \: f" V# V8 y& R
Where DatePart(“yyyy”,OrderDate)= ‘1996’
# v F2 U* G6 I- a" T3 KGROUP BY FirstName&’’&LastName4 I( X3 j& l% \2 C# L
orDER BY FirstName&’’&LastName# R0 B1 K1 p" _( n2 Z
POVOT DatePart(“q”,OrderDate)&’季度’# s, t+ }( M: o
十 .子查询9 V" l2 `3 y0 S) e! i
子查询可以理解为 套查询.子查询是一个Select语句.$ O! j6 B+ f. W" x3 q0 `1 M( Q
1 表达式的值与子查询返回的单一值做比较7 {+ s- }' c: ?9 `, `" |
语法:
2 T( n* H+ W" X* U: ]表达式 comparision [ANY|ALL|SOME](子查询)
3 r3 N6 _( \" G; \( s说明:
+ i9 Q3 B' U+ ~' Z, `ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
7 ?) Q3 N9 ~8 y例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品+ e# H2 t, p; q5 e) U
Select * FROM Products
! I" F6 [; X% |7 D( GWhere UnitPrice>ANY
4 L! c* x/ f$ Z* X( b(Select UnitPrice FROM[Order Details] Where Discount>0.25)8 L [8 n# L* {1 R
2 检查表达式的值是否匹配子查询返回的一组值的某个值
5 \- a2 C* [+ b, W, z5 v语法:( K8 K* A, h9 p {
[NOT]IN(子查询)
6 S, _' ^5 E7 J6 c例:返回库存价值大于等于1000的产品.
5 W) t. b8 @3 Z* tSelect ProductName FROM Products
$ {0 F5 F; N7 O. @Where ProductID IN
+ [6 H1 M5 ~, X C* Y) I(Select PrdoctID FROM [Order DEtails]0 l0 N3 w$ K2 Z0 O( f, B7 H' i
Where UnitPrice*Quantity>= 1000)
; i0 c: h, s6 L; y* U9 |0 A! |3检测子查询是否返回任何记录
$ }& m% [6 f# Y3 o/ r8 J$ N语法:. ]3 @* T5 D8 \
[NOT]EXISTS (子查询)2 D, C% d, I+ I, B/ G% G. S
例:用EXISTS检索英国的客户6 d1 S) R! q3 W! D( V; `: o4 K; @
Select ComPanyName,ContactName, `7 f5 p u1 ?' `
FROM orders
( d) c/ o6 ]- _0 F0 S5 KWhere EXISTS
5 i }0 ^& T( _4 d/ q* e(Select *& C, {3 F6 P8 B' B$ n q/ Z
FROM Customers
/ p! x0 y5 u$ v; O8 F; M+ vWhere Country = ‘UK’ AND
2 R% m5 b8 k8 wCustomers.CustomerID= orders.CustomerID) |
|