- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法
6 o- N6 |* E/ x3 V
' N2 @, m8 w$ m" ~. z* C% Eselect distinct 字段 from 表名$ S9 W* M+ `, C& l
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。" n/ z2 C9 s* ?5 ? ]
一.Select语句的完整语法为:
8 x/ u/ p4 l5 JSelect[ALL|DISTINCT|DISTINCTROW|TOP]
5 g3 ?+ N/ g) _ T) k8 @- `0 z{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}5 M; C8 V) V3 j5 h* X+ I3 {
FROM tablee xpression[,…][IN externaldatabase]$ Y- T7 Q+ \2 y* i. q+ Q2 r& o
[Where…]
7 |6 C% R; P6 }; Q8 n9 y[GROUP BY…]1 w4 n- } t! w7 c- ]
[HAVING…]
) }2 }- Q4 a0 B[ORDER BY…]
( C6 p N0 ~" q: k+ T[WITH OWNERACCESS OPTION]
) b2 ^! z/ d7 ~1 T) ]1 L0 M说明:2 Q7 V6 j6 R$ D
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。 X/ H% o% b+ W% E8 v
1 FROM子句
9 O# S/ B; ~- o; G2 Y9 r5 NFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
; S0 }/ c: Z+ U2 L7 \例:下列SQL语句返回所有有定单的客户:
8 q, C6 T3 I, R& I1 ?% TSelect orderID,Customer.customerID |8 _# J' b$ y, \# K6 l7 d
FROM orders Customers
) ^. I& L6 a" n0 f: sWhere orders.CustomerID=Customers.CustomeersID
* e) E! I) u6 Y! C2 c& g, ~* Z2 ALL、DISTINCT、DISTINCTROW、TOP谓词) |- x" u& |, }% ]+ A
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。, i' w Z/ z! ?, o/ Z
例:Select ALL FirstName,LastName: }2 u3 W% B7 E6 v$ r# O4 }; j
FROM Employees( r& D" ? G3 G8 @
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。" y3 g2 V$ o" R: Z# b0 @
(3) DISTINCTROW 如果有重复的记录,只返回一个% H& h' q( o' C0 q8 T9 P. l
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比); S. k+ S4 [/ R/ ?% {
例:返回5%定货额最大的定单. w7 x4 y! t1 f7 s( p+ l5 A
Select TOP 5 PERCENT*
% G# m( ]& |* {3 r+ W/ J; q. NFROM [ order Details]7 U$ }) W& S& M) h/ Y. q
orDER BY UnitPrice*Quantity*(1-Discount) DESC9 f' t! E3 K( y2 B- c7 n, x2 ^
3 用 AS 子句为字段取别名. i/ x4 h2 X# i
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
* z8 U4 R" Y0 r; \例:返回FirstName字段取别名为NickName1 }2 y- R, ]9 j5 H: |
Select FirstName AS NickName ,LastName ,City0 `% H0 {2 x5 ?8 J( J
FROM Employees9 d' o m+ K: r: I7 W2 A7 k
例:返回新的一列显示库存价值% A8 w3 O; V2 a [# a" B0 u- U5 o
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock& z8 b5 u, |+ J
FROM Products
7 A! G1 }9 O3 K- Z; k# B* V二 .Where 子句指定查询条件! W2 e* A# O* h3 I3 k% T) d
1 比较运算符
7 {" G! p1 t1 }- o( P比较运算符 含义4 S7 b0 C2 S2 W) U4 D6 `* x
= 等于
) C4 l1 {* G- W, a* g; Z% Y+ W> 大于
) C4 p$ }3 V* y$ ~% w1 G! s< 小于
8 f, N7 k( q) Y' B( ?, ~' \% j>= 大于等于0 Y8 z' h: E0 N
<= 小于等于
# p, _9 x/ K6 h6 B) Q' P<> 不等于- k. d+ v% @9 Z( |% A9 \* u, y2 Z+ W
!> 不大于: D; b2 q7 Q; X
!< 不小于
. x9 d& f/ U1 L! D/ l例:返回96年1月的定单: q& E9 E: `+ h0 f. R# `/ b
Select orderID, CustomerID, orderDate
8 w& F0 k1 f% Q; J: G: J$ L! ~: w7 R4 K' ?FROM orders( y7 Y- h2 k$ f) A: a# h. B Z. V
Where orderDate>#1/1/96# AND orderDate<#1/30/96#+ I8 ~5 n J3 C- |- w/ K
注意:$ N2 X: g1 |! Y0 M; C. X8 T" f
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。& K+ W& p7 E: \/ v H0 O' l+ n9 u
例:, D! ^1 f) O2 p1 T( P0 k0 P
Where orderDate>#96-1-1#
' S) [0 m5 ~. m& l也可以表示为:3 J; Y- e& W8 l, V& }7 \$ N1 A
Where orderDate>Datevalue(‘1/1/96’)) h% |; q8 I5 y4 S0 @. z
使用 NOT 表达式求反。
/ U- y5 l- }2 v7 u7 a8 v例:查看96年1月1日以后的定单9 I$ W$ D; q6 s. g' k
Where Not orderDate<=#1/1/96#" L# |& W! W% |; e0 F7 M
2 范围(BETWEEN 和 NOT BETWEEN)
! q5 J2 B0 X+ H6 B; n% ~BETWEEN …AND…运算符指定了要搜索的一个闭区间。
; \/ J6 f( E0 } g5 j0 F$ e$ _' W% D例:返回96年1月到96年2月的定单。7 F; F0 a0 r- g: C2 U# l$ r2 l
Where orderDate Between #1/1/96# And #2/1/96#) W' y$ [0 c: }) f3 ~! p
3 列表(IN ,NOT IN)/ T: L% W p) C4 O F6 _ k! C L
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。4 y0 P2 W8 U6 K5 H4 @& u9 N0 V
例:要找出住在 London、Paris或Berlin的所有客户
4 g5 B2 \- N i& g# DSelect CustomerID, CompanyName, ContactName, City
# _( t8 v- v* }* M8 c0 rFROM Customers
0 h* B- M9 L9 LWhere City In(‘London’,’ Paris’,’ Berlin’)9 { H5 m) N) e8 J+ J k _2 t
4 模式匹配(LIKE)1 R8 e3 f: w; ]
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
0 \7 D3 u+ h6 RLIKE运算符里使用的通配符7 c# m" `; f, b6 ~
通配符 含义
3 }* X' g/ R3 H? 任何一个单一的字符+ g5 u, o( J9 @, z
* 任意长度的字符
: o5 ?; e* q8 k: b# 0~9之间的单一数字
8 G) O) e# z6 k; y: f[字符列表] 在字符列表里的任一值7 C+ M$ [ N- K+ t
[!字符列表] 不在字符列表里的任一值
+ w! q* _: l$ Z6 `2 i9 l- 指定字符范围,两边的值分别为其上下限
" a# A& r* u0 g例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
9 @* X1 D: d& i7 z% V* O) bSelect CustomerID ,CompanyName,City,Phone/ m3 h/ m* P0 x8 h" ^4 \& V& X
FROM Customers
/ Q9 |; ]1 k( ?. G, `- R8 h# cWhere Phone Like ‘(171)555-####’0 o% K# Z+ Q# X/ ?1 I) f
LIKE运算符的一些样式及含义4 d/ V2 }' |* g: I( q
样式 含义 不符合 v1 ^4 T. i% g
LIKE ‘A*’ A后跟任意长度的字符 Bc,c2555 ]( x( Y L {
# LIKE’5’ 5*5 555# \# ~* C2 O# H6 l* F% f7 q
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
% F% R) L/ V: \8 I" BLIKE’5##5’ 5235,5005 5kd5,5346
, a1 G4 M3 p# N/ \, S4 v( K9 Z3 H) N5 jLIKE’( s: |/ h# R& y& t6 C- ~
[a-z]’ a-z间的任意一个字符 5,%# \6 z b& X9 o& v- D7 }5 h8 p
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1! ~8 Z' Q& U, U* _
LIKE’[[]’ 1,*9 K. C9 j7 }% Z) f9 [) j( M) h* ^( s
三 .用ORDER BY子句排序结果" p) Z0 w/ |3 e
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
/ O# F, X. I3 u3 H! t; `orDER子句中定义了多个字段,则按照字段的先后顺序排序。4 D+ N# Z8 [6 \% `6 k
例:
+ @. f% N: J3 p; g4 _Select ProductName,UnitPrice, UnitInStock
0 ~% X0 k/ @6 q: |5 kFROM Products. h+ P& F9 c0 q! @9 c) n
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName0 P: ~0 I& U* r6 R) A; j7 T# q
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。) x' b5 Q. F% F2 D
例:下面的语句产生与上列相同的效果。
1 L; @ T3 K4 L X8 VSelect ProductName,UnitPrice, UnitInStock
) S0 P& B& y/ a5 b: [" s. tFROM Products. k, Y1 j/ a8 @
orDER BY 1 DESC , 2 DESC,3
% [- N' t0 i) q- O5 C) _" i四 .运用连接关系实现多表查询& P% x7 P" V. J
例:找出同一个城市中供应商和客户的名字
3 F; K9 b4 ]- g. M7 B aSelect Customers.CompanyName, Suppliers.ComPany.Name: E2 ^. t q2 R" C! x9 B) Y4 }! G
FROM Customers, Suppliers
6 x' w# f0 Z: ~Where Customers.City=Suppliers.City5 ^8 ?2 {) T! @" s0 N; n) J. |9 L( {
例:找出产品库存量大于同一种产品的定单的数量的产品和定单1 G! R5 y' ~) L6 j- m$ E2 c3 I
Select ProductName,OrderID, UnitInStock, Quantity3 ]1 Q, V( T; ?* C4 M& E( D0 a
FROM Products, [Order Deails]8 y- g* i3 h T* l: r
Where Product.productID=[Order Details].ProductID6 R' I# s0 y$ l: [& l6 Z& u. w, D
AND UnitsInStock>Quantity
3 n; U* h2 U& E0 l% g3 A另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
' Z4 m/ q0 L' ^- \5 U2 S语法:3 D- W7 a2 x7 C( ?( K
FROM table1 INNER JOIN table2
9 t3 g! @& Y. o8 |2 w' sON table1.field1 comparision table2.field2
0 x3 B- B Z) @: ]0 u7 Z9 b其中comparision 就是前面Where子句用到的比较运算符。
& i. o& T& @' L% T* bSelect FirstName,lastName,OrderID,CustomerID,OrderDate
) m1 \8 H5 [" L+ E" vFROM Employees4 S t& g. [6 \
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID! ?% S/ s5 I8 [' j( y& k
注意: b5 U7 T9 e( {" Q/ b5 P
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
2 m" K: H+ n+ d3 i, W W$ m在一个JOIN语句中连接多个ON子句
7 R$ I4 b0 z7 \- [8 z/ {; u9 ^语法:. }, ]; m( W. T
Select fields; \% ]2 m" i8 g+ o! ^. _
FROM table1 INNER JOIN table2& z! Y( e/ h3 N, w/ c. U
ON table1.field1 compopr table2.field1 AND- W- K* a3 L( U+ Y
ON table1.field2 compopr table2.field2 or
9 m6 R4 l* s$ o. `' f3 |ON table1.field3 compopr table2.field3/ j$ |6 g1 E% A, A7 J; G( l
也可以
7 _; w/ N* o D: rSelect fields
' B8 S5 s2 `. t3 r d0 R/ hFROM table1 INNER JOIN
& V, C: D1 H% g* K# c! j(table2 INNER JOIN [( ]table3* w; T, a/ `: f5 z0 C( ?& x9 [* Z' r
[INNER JOER] [( ]tablex[INNER JOIN]
9 I) s8 e' m( z) MON table1.field1 compopr table2.field1
+ W/ t1 l# X+ f2 {7 B# \: m2 yON table1.field2 compopr table2.field2- s9 H& B1 t |7 I9 ?
ON table1.field3 compopr table2.field3% d- [3 N! S" f
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。6 m( R7 _) V( P- i
FROM table [LEFT|RIGHT]JOIN table2
5 U2 C5 O" v! {( l- x/ E' B8 i. ^ON table1.field1comparision table.field2
( Z7 e: A, @( o, c* B! C$ K用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据6 g! [3 S& |- _4 G
例:不管有没有定货量,返回所有商品
7 E- R, \: N9 D1 j; g" A( oSelect ProductName ,OrderID
* m9 k- J6 S( X; I3 BFROM Products& e1 X. D' Y4 `0 T: _: I+ H; Y
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID& a* N! l& w4 U
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
" y1 A" l Z+ ?+ K例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
. y- c& x$ c% _/ L空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。! M6 O6 F$ R% R
Select *
. R c! T8 W# ] rFROM talbe1$ a( j6 `6 W. @6 W& w
LEFT JOIN table2 ON table1.a=table2.c
1 T& f+ z! q3 I& G+ p" n1 连接查询中使用Iif函数实现以0值显示空值2 G/ w; W7 l% P S9 V/ H9 q
Iif表达式: Iif(IsNull(Amount,0,Amout)6 M# `+ [: S* A4 K8 ?/ `& ?
例:无论定货大于或小于¥50,都要返回一个标志。/ o& _6 W3 {5 R( P! `, k
Iif([Amount]>50,?Big order?,?Small order?)3 G3 i# B# y) Y4 |
五. 分组和总结查询结果! Q+ Q& F) J* j) X( B4 U3 Z
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。$ d/ Q. `' U! }3 w( H
GROUP BY 子句的语法; B, v7 B4 R) A0 Q% W6 M; N- l
Select fidldlist; f0 @# V5 T5 Q& \: t$ L2 ?
FROM table
$ y; Z( B$ [7 x* z3 pWhere criteria( G% }8 c8 W9 K3 ~% l) `: p4 T
[GROUP BY groupfieldlist [HAVING groupcriteria]]& ]' }& Y3 p( a6 V$ V
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。6 N# |; D: w+ g# k8 z. ~9 l. k
GROUP BY字段中的Null值以备分组但是不能被省略。
0 L7 A( E( R( c0 u在任何SQL合计函数中不计算Null值。
+ L2 A4 M" Y, q- M yGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。8 b3 u$ }$ _" N3 u
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。, R3 n4 ~) Q# ^2 n/ o+ b; }0 `
Select Title ,Count(Title) as Total9 {# F3 i' I% _( h0 P6 C" t; T
FROM Employees
4 ]$ X6 S! }" c0 sWhere Region = ‘WA’5 J+ U$ M$ h" ]# M+ S6 }% y i
GROUP BY Title! ^7 j! i0 \' P5 o& M
HAVING Count(Title)>10 a, m5 k" `: e0 }9 o
JET SQL 中的聚积函数
- Z, Z7 A' K/ I! j8 v聚集函数 意义
- a% N6 J( f6 O6 j+ aSUM ( ) 求和
/ h3 u& Y/ {1 @; p9 L; C4 |; \; M0 UAVG ( ) 平均值2 ~+ \( t+ S( f
COUNT ( ) 表达式中记录的数目
* D7 z. B5 v" f$ v' _5 |* nCOUNT (* ) 计算记录的数目% }# w6 I! o* N" `# L$ v& J7 d) o- ~& P
MAX 最大值' k9 O3 Y, |. L$ _9 k2 z7 N4 c
MIN 最小值& Y. ^3 k8 l+ m* k
VAR 方差
* c$ P& Y4 `! V/ HSTDEV 标准误差
7 x2 [0 C5 h# V ]$ l. TFIRST 第一个值
) G, n4 q* ~2 B T+ TLAST 最后一个值1 P& Y& h% q( O6 \8 M- \. f
六. 用Parameters声明创建参数查询
- f- j6 F" F" H) d9 qParameters声明的语法:
8 N6 M' w3 X9 `' X1 @( `0 ]PARAMETERS name datatype[,name datatype[, …]]' D% B2 h9 M) @" `. m, F
其中name 是参数的标志符,可以通过标志符引用参数.
+ {1 C. x \( z5 ]7 ]/ \/ u* V( UDatatype说明参数的数据类型.
# ?2 v5 R0 L+ Z+ P9 I使用时要把PARAMETERS 声明置于任何其他语句之前.1 R, @7 E6 A4 i, P4 O% C' Q" {
例:
; f; M' o4 t$ j$ tPARAMETERS[Low price] Currency,[Beginning date]datatime
( _* M3 j- F* H* {# }6 PSelect orderID ,OrderAmount2 _) U1 N$ x1 d/ m4 h0 p
FROM orders
$ |, c1 e4 O$ g/ VWhere orderAMount>[low price]( U- v9 ^8 a1 m" W! P
AND orderDate>=[Beginning date]
0 b0 C7 S' z) c6 ]- N3 |) C七. 功能查询& \- ^4 a0 D' ?6 d. o% f+ c
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
. r$ B" t/ X s6 X3 W* I+ C& k1 更新查询4 b2 |" A' _+ E
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.. `! N: k A7 x; g/ N3 |0 B
更新查询语法:# @: y% @& X, f" O8 d- A
Update 表名: x' i9 F8 ]0 B1 R
SET 新值
# F% k" c/ s( ^' ~7 g3 S* _4 t" x" Z' bWhere 准则
, b" v( a% u& i; S* K9 U _" h例:英国客户的定货量增加5%,货运量增加3%! n/ n7 }. C2 A" s9 l8 m7 S' z0 P- `
Update OEDERS: p# d" p" G# q2 Z9 B, N8 Y' Y
SET orderAmount = orderAmount *1.1
, |9 k! N- f8 e; X' v3 J8 f: D2 [Freight = Freight*1.03( `$ l5 j* o' A2 ]9 ~+ p
Where ShipCountry = ‘UK’
7 |" S' M; p" Z' g3 n7 Q2 删除查询
8 B5 S2 c' a/ ?Delete子句可以使用户删除大量的过时的或冗于的数据.
! _5 Q' J% Q5 X2 y, ] n0 Z注:删除查询的对象是整个记录.
% y, H6 q: f, v1 n( A9 ~% E. yDelete子句的语法:
1 f% a% {! k5 p: z! BDelete [表名.*]
1 O* X k0 u* AFROM 来源表
2 \! M# W" m7 k4 y4 P5 w6 }Where 准则
/ J- f% @" m/ {. N% n+ [6 h例: 要删除所有94年前的定单
' z f5 b; o _, @* x: ~+ f6 d& @Delete *6 F2 r2 j0 g2 F
FROM orders
9 Y) \# B, r. B+ A: V6 _* u4 ^Where orderData<#94-1-1#
. A0 b$ u1 v5 j0 h8 z3 追加查询1 P: z$ s% _7 R, l- g
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.7 Y: ^2 b; h3 m1 Q" S& Z
INTO 子句指定接受新记录的表
4 ]1 P4 |7 h% }" M; CvalueS 关键字指定新记录所包含的数据值.' I- w" t# ]$ @: V
Insert 子句的语法:$ @, F2 p' b$ G
INSETR INTO 目的表或查询(字段1,字段2,…): _9 @ m; j1 V7 i5 S3 P8 a
valueS(数值1,数值2,…)& |6 t% Q+ l- s. D' i& ^: a
例:增加一个客户/ B4 g2 g+ {) @4 N0 S
Insert INTO Employees(FirstName,LastName,title)
" j. a3 c) G3 R8 S7 x: y# o, QvalueS(‘Harry’,’Washington’,’Trainee’)( Y# s" B2 l# V+ T9 @5 K3 H; o
4 生成表查询% r5 y" g* C1 x& E& t" T, J
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.; K, J" f5 g9 |" ~, r/ }0 q
Select INTO子句用来创建生成表查询语法:: M9 U1 k4 w: }0 [
Select 字段1,字段2,…. b& f5 T' B* e3 O, S5 U$ M- e: [
INTO 新表[IN 外部数据库]
+ b2 ?/ B( b5 Y, ]9 b# W) |/ LFROM 来源数据库# C4 o* u. ^1 p3 O- l; K2 M
Where 准则
3 O; J2 c% @8 E! i2 T例:为定单制作一个存档备份! y% U2 F: O$ |" e b
Select *
8 |! ?$ g3 T! p& _INTO ordersArchive! C2 t# @. H4 M7 q1 F0 h9 b, d
FROM orders& x8 w6 A& M' v; x1 m2 M
八. 联合查询' f6 s; i. H4 r2 z- p
UNION运算可以把多个查询的结果合并到一个结果集里显示.
) Z# m( b1 Z1 OUNION运算的一般语法:
. [* k' H6 [0 a* B[表]查询1 UNION [ALL]查询2 UNION …
0 S5 ]( V4 Q0 F8 w8 ]9 X# G例:返回巴西所有供给商和客户的名字和城市1 K, {' C3 f4 \, |6 _0 i t! ?+ u
Select CompanyName,City4 o6 g- A( ?& b" e6 Z& I3 p
FROM Suppliers
; i2 b5 R4 K, \% a( ^Where Country = ‘Brazil’; g% x! a" s6 g; N5 J
UNION# K! R/ u7 h+ L
Select CompanyName,City
. i0 V' {- ~" R5 e. _: e) nFROM Customers% e) ^' M0 o1 p7 P' c2 D
Where Country = ‘Brazil’
8 f3 \9 v7 T0 A I$ m注:, E: Z- e+ W$ W
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
8 O- S2 q1 h# mUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.. N5 l& z3 ?& K+ A y* P
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
% a, [2 Y/ q% f! e九. 交叉查询; O2 t! t7 J2 {) ]
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.# r: ]2 G- c9 p3 q& W9 y! [( Z
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:1 o1 R! y' r7 ?
TRANSFORM aggfunction4 [4 ]+ X3 l& w3 @+ W
Select 语句$ [2 G) X- E9 O
GROUP BY 子句
0 F3 j- Z1 G$ I J9 [: T& O3 @PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
5 @% m! o/ y6 yAggfounction指SQL聚积函数,
) y, s' k+ P: N+ O) S4 oSelect语句选择作为标题的的字段,
& d/ _- D8 g$ }4 nGROUP BY 分组
) K K' T+ v- k8 f9 |2 W% v1 ?说明:" s. `: x5 Q/ g, M) A
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值., U: p+ E& O* h7 u2 J7 R! o/ o
value代表创建列标题的固定值.
4 y2 F5 M& |3 e3 G% `" J* n: @, I例:显示在1996年里每一季度每一位员工所接的定单的数目:
, T4 c, N3 g) n, Z3 P+ j& Q2 WTRANSFORM Count(OrderID)5 K1 T* L; Q2 R& G! Z
Select FirstName&’’&LastName AS FullName- G1 r; ~+ g$ s! ^" U% z
FROM Employees INNER JOIN orders
4 e6 p/ }3 Z5 _5 ~* _ON Employees.EmployeeID = orders.EmployeeID
F0 h5 z& T4 {! N4 LWhere DatePart(“yyyy”,OrderDate)= ‘1996’
( S/ w: v M) v8 l7 k0 }GROUP BY FirstName&’’&LastName" ? h( [3 ` y+ W
orDER BY FirstName&’’&LastName% h6 ~; `; z: o' B
POVOT DatePart(“q”,OrderDate)&’季度’% H# V$ {$ I6 q% r( o
十 .子查询) k6 Z- J- ? ]4 ]
子查询可以理解为 套查询.子查询是一个Select语句.! @+ ]6 D* w+ A
1 表达式的值与子查询返回的单一值做比较
, x/ Q; O l C" z2 W! c; Y. q1 R语法:
" b8 l7 ?$ a& \% e! ~ \; H表达式 comparision [ANY|ALL|SOME](子查询)# \8 t. i- c$ F3 N+ |% Q& o0 f: F2 s% z: r
说明:6 J/ N) j3 L7 h6 S
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.. s5 p- I( | b* l% s; l5 E
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
3 T3 J! l+ T/ XSelect * FROM Products
+ b6 Z4 b: p1 \; A. m3 G0 ZWhere UnitPrice>ANY
2 [' }3 s; X- E: ~(Select UnitPrice FROM[Order Details] Where Discount>0.25)0 D5 ~8 \ h% G( s, \5 u9 g# K& a5 a
2 检查表达式的值是否匹配子查询返回的一组值的某个值
# L, m% ]! R$ U7 ]7 |' _语法:: `5 ~) p6 _4 e5 Q& l5 h( M
[NOT]IN(子查询)
2 D0 _: N' V5 O8 h* b# ~# u例:返回库存价值大于等于1000的产品.
- O8 l$ G1 [" N5 R3 c: m- wSelect ProductName FROM Products+ M/ X: z0 U( ?2 C1 J
Where ProductID IN/ c+ V8 k6 @* |
(Select PrdoctID FROM [Order DEtails]4 l! x$ T$ }& @: B( j u
Where UnitPrice*Quantity>= 1000)
4 Q5 r& i5 @6 q4 H! [3检测子查询是否返回任何记录# c3 d4 u( _! c$ F& i7 I" f
语法:
" B& m" Y6 N0 z, W[NOT]EXISTS (子查询)
; R3 z; Y' g' X0 ~4 P# j; D; v例:用EXISTS检索英国的客户0 I, k" B, a8 P+ z5 O
Select ComPanyName,ContactName/ N L* @: }& H0 Z0 e0 S( m& k0 w
FROM orders
3 ^' s8 |3 f. T! e' k/ b, UWhere EXISTS6 d- Z- g1 O' b6 z# w; m0 S4 N; T
(Select *
- d6 @$ z" D+ U( h9 ^9 JFROM Customers
. W2 Z6 v$ [9 m! W4 O6 T* c) G( OWhere Country = ‘UK’ AND2 Q9 K- ^1 f3 o) i+ z
Customers.CustomerID= orders.CustomerID) |
|