- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法
5 Y: N q& ~6 I
4 J2 c1 }- ], w `! O, P+ Bselect distinct 字段 from 表名. P4 ~) N* c" o9 S( p; w
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
/ l+ i( }1 a. F7 H( g) s一.Select语句的完整语法为:
V! }- f( L; v1 ~/ }Select[ALL|DISTINCT|DISTINCTROW|TOP]
, n8 h9 p- P. q1 A7 | J8 y/ E{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}8 j1 K, l9 J7 |& t$ R" r" a2 p+ i9 Q3 O
FROM tablee xpression[,…][IN externaldatabase]5 M3 ?+ E3 H/ e K; y) a
[Where…]
( o; e' H B1 d' o! I[GROUP BY…]# ]: Y& v# b! ]0 q( a, g: q
[HAVING…]. J6 F+ n- x6 a4 H1 Y+ C
[ORDER BY…]
' W2 `. d& m: P[WITH OWNERACCESS OPTION]$ d& a) [: C. a$ y2 `
说明:
^3 I8 R6 ^! K7 W7 _% Y用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。- b2 ?3 O& M2 e3 E/ n$ z
1 FROM子句
, X( o; h: W9 A1 G( s, J4 KFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。6 i: @, d8 ]" g3 x8 O8 A2 u
例:下列SQL语句返回所有有定单的客户:
6 Y9 E, c2 G4 K$ c1 F/ `/ _: ?5 ~Select orderID,Customer.customerID
6 b6 Z: o9 `3 H9 XFROM orders Customers9 p9 A& q1 l$ h7 h$ h$ F. @
Where orders.CustomerID=Customers.CustomeersID
' S# x% o3 Y$ O9 M" V" ^5 n2 ALL、DISTINCT、DISTINCTROW、TOP谓词& [7 S5 c1 r4 `
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。' \% h: U' V' f# K9 s0 |" }
例:Select ALL FirstName,LastName
: ]& P# I6 o% p' I( h# f! CFROM Employees
% A* x! H( P4 h1 Q8 v4 S, W3 Z(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
5 [( }/ E5 [7 }, G4 ~0 N9 E(3) DISTINCTROW 如果有重复的记录,只返回一个
+ w$ V, W. K9 l5 r(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
3 {7 |6 c2 b1 W6 ~& j例:返回5%定货额最大的定单3 J _' }% i: t! V1 O" X# I* a7 u s, g
Select TOP 5 PERCENT*
5 y( O6 X' W2 w5 i! w2 R1 N& c5 d4 T9 BFROM [ order Details]- F5 N+ p2 @; Z' t6 S
orDER BY UnitPrice*Quantity*(1-Discount) DESC
' b# c" s( W# T+ _8 h; G- C3 用 AS 子句为字段取别名
$ D K2 U0 Q9 G; q8 \2 ?' a% F5 L. P如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
; c) j9 c+ P% H2 D* X/ L2 t, f例:返回FirstName字段取别名为NickName
1 C6 S; A* Z5 Y. dSelect FirstName AS NickName ,LastName ,City! w( s" i @' x! ^/ m) D0 b, c
FROM Employees' e( K1 ?! |1 B- s4 e. @
例:返回新的一列显示库存价值. v" m& t$ b$ Y5 M7 a7 ]+ Q
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
) [2 h$ @8 l! k2 x; kFROM Products
0 p6 w" \. A- C' c u二 .Where 子句指定查询条件
7 V" ]" v3 k" w d) j4 m, ~% |1 比较运算符
6 m% I5 F | }8 `3 O* A0 h比较运算符 含义( G1 q/ t! k5 C; v. u# x
= 等于
% |: V) v0 J8 v' | e! g> 大于
" n2 Q) O2 Q% ]6 E< 小于
3 n$ y; k; d; `% ~: ~3 V>= 大于等于
3 S. x- U/ h* R# S4 Z& C<= 小于等于4 Y+ c3 D5 R9 r3 t2 _1 h+ m
<> 不等于
/ Y- o, R, X4 P+ j: s: n6 d5 x!> 不大于
5 q8 }( {- U# p P7 {!< 不小于9 C+ m/ j+ g. y L& ^
例:返回96年1月的定单* v3 s. G# Z! h3 A/ w
Select orderID, CustomerID, orderDate' T) ~. q; c; l' M3 b7 D( O5 Z
FROM orders
1 ~# A+ a+ R1 _& F, ZWhere orderDate>#1/1/96# AND orderDate<#1/30/96#2 v+ }& y, U" W; d# L6 Y4 a
注意:
1 ]" p3 \, n" _Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
/ @7 {' c/ P# R8 W例:
- _5 \ e# L3 N9 W; t0 |0 m, DWhere orderDate>#96-1-1#
; `* G- L u8 w* a( C ]& f3 ^也可以表示为:
+ I% @( N; N" k" n; xWhere orderDate>Datevalue(‘1/1/96’)
' f& P6 c' U. G使用 NOT 表达式求反。
* n1 ], l6 F$ e! D例:查看96年1月1日以后的定单
L6 I5 k# j5 _4 |# {: u1 s+ u% j2 _Where Not orderDate<=#1/1/96#
* ~0 Z+ c7 P* a: B6 Z6 o6 b7 [2 范围(BETWEEN 和 NOT BETWEEN)
8 I: R: Y# J+ D1 Z: ^6 DBETWEEN …AND…运算符指定了要搜索的一个闭区间。
1 ` U3 u1 R8 J m例:返回96年1月到96年2月的定单。2 i: U* ^1 x" Y8 W5 }! M
Where orderDate Between #1/1/96# And #2/1/96#
8 G7 k9 b* K/ d& Q3 列表(IN ,NOT IN)
C1 C' W3 C7 T uIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。1 B3 b7 [& V' u0 W. g
例:要找出住在 London、Paris或Berlin的所有客户% {8 C# ~8 \# s$ H% u
Select CustomerID, CompanyName, ContactName, City! B/ T3 }# X; y1 \
FROM Customers2 W: {& \1 P# T
Where City In(‘London’,’ Paris’,’ Berlin’)
7 s O) C2 w5 h; e5 z4 模式匹配(LIKE)9 N9 v& u) y- W0 ~
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
( q7 c5 Z b* u( u$ @9 p5 {LIKE运算符里使用的通配符, r% B9 e! m' d
通配符 含义4 ]7 W8 [# K) K+ o! K0 s
? 任何一个单一的字符( K, F# t1 [/ I) {
* 任意长度的字符
: m5 H7 Q' v! G/ j8 X' v/ U# 0~9之间的单一数字* Q8 ^) x$ | s e [
[字符列表] 在字符列表里的任一值
5 l4 N0 |3 q1 p3 z& t[!字符列表] 不在字符列表里的任一值4 t, L9 K5 o& O' q
- 指定字符范围,两边的值分别为其上下限4 ~ Z8 W- K+ ^% S7 s
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
6 n! [8 U3 X4 ^0 ^; |( m+ tSelect CustomerID ,CompanyName,City,Phone5 I) H2 l/ w2 x
FROM Customers
- c" C7 Y s' n0 ]Where Phone Like ‘(171)555-####’. D9 R6 H; { R# Z% g& c
LIKE运算符的一些样式及含义1 v8 w: M1 M. r; J! E7 J( A/ S
样式 含义 不符合
$ T/ x' ?8 P9 k7 E" e$ f$ H- ~LIKE ‘A*’ A后跟任意长度的字符 Bc,c2553 n) c2 i- k, n$ w7 _
# LIKE’5’ 5*5 555
3 J- g6 y6 e7 g8 [5 VLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5* a3 B% d: d. Q9 \2 \
LIKE’5##5’ 5235,5005 5kd5,5346
4 m" b# t$ {: i2 V) f1 cLIKE’
4 f8 T1 j% @ H1 J, c; f& X[a-z]’ a-z间的任意一个字符 5,%
3 k9 V+ [: _+ g4 g* `% X' R2 r ?LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1+ m& t0 i; t, j+ j& ]* \
LIKE’[[]’ 1,*
! Q y) Z9 t" N1 `5 k: s三 .用ORDER BY子句排序结果
3 J5 |1 T" [- `% u% z2 A2 dorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。7 V) N7 s0 S. j( p8 t* _% o
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
3 F& o+ }7 S0 g例:
8 F! I {, j$ m$ U( @& @Select ProductName,UnitPrice, UnitInStock
& d2 {- S2 R. K8 RFROM Products
& e; K" t* V, k: h6 G0 DorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
3 O; L: P7 m1 P3 f3 k, l' o# KorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
% _. ]/ N' Z" ]& e) [例:下面的语句产生与上列相同的效果。7 q" F' x) D+ Y
Select ProductName,UnitPrice, UnitInStock& s f) q- g/ {+ E' p
FROM Products9 Y% }# P7 J h% T. P( g" X1 L- A/ \
orDER BY 1 DESC , 2 DESC,3
3 S v1 q C" K: F四 .运用连接关系实现多表查询) c, e- x0 B( v( |3 u5 K6 }
例:找出同一个城市中供应商和客户的名字
# w% r5 b; U5 _1 T( d L# JSelect Customers.CompanyName, Suppliers.ComPany.Name
/ h! E1 j8 Q# L6 C e; y$ qFROM Customers, Suppliers$ \5 `* ^& W! I7 R8 S7 K4 q% I
Where Customers.City=Suppliers.City
4 f" H1 n( E& q7 A例:找出产品库存量大于同一种产品的定单的数量的产品和定单8 B/ P9 _. I" h1 {* x4 K" N1 q
Select ProductName,OrderID, UnitInStock, Quantity$ K+ y0 R4 i# K& j0 H
FROM Products, [Order Deails]
: F: ?& w% m9 }7 T' uWhere Product.productID=[Order Details].ProductID
; H1 v2 g4 `! n* P$ `2 Q2 KAND UnitsInStock>Quantity
9 S }9 J- f# X$ N# i另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN3 c0 a; Y: [( k" @' K4 H
语法:
2 e, k9 ?- j* u, L4 iFROM table1 INNER JOIN table2' v- \1 S, @+ {8 P
ON table1.field1 comparision table2.field21 I& ]5 s3 N5 T: F( I, o3 T
其中comparision 就是前面Where子句用到的比较运算符。; t! v9 M2 D8 S9 R& Y! Q
Select FirstName,lastName,OrderID,CustomerID,OrderDate3 X+ Z; L% z0 z3 u4 \
FROM Employees0 F3 x1 ?, Q- G0 l
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID. a5 n" c. E, b5 Q! A
注意:
8 ]$ A) J/ a. k8 M0 yINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
" {% u A6 l& b9 B7 K' V在一个JOIN语句中连接多个ON子句4 P0 D0 A- u$ d
语法:9 V* Q0 T5 U& I; d. ?
Select fields- U3 ~ n8 I8 {4 D
FROM table1 INNER JOIN table2
% S6 A6 a+ @7 aON table1.field1 compopr table2.field1 AND( v, H0 `. r6 j5 u
ON table1.field2 compopr table2.field2 or
3 _" K+ g0 V6 ?/ C% H! h0 }ON table1.field3 compopr table2.field32 e* K( K2 ]# x- p# ]4 ~
也可以; g0 W& A/ e& h$ v/ N
Select fields- o: F- o1 g3 u! p+ Y4 ^! l4 M& e
FROM table1 INNER JOIN
# v$ w& v/ ^( ?- V9 ^(table2 INNER JOIN [( ]table3
# B5 C/ y5 A' d/ h6 `, z: s[INNER JOER] [( ]tablex[INNER JOIN]
" k9 g8 n% {6 j3 HON table1.field1 compopr table2.field1- D+ v0 r8 r( P+ k0 W& ^( h
ON table1.field2 compopr table2.field2( s8 T j6 U! K
ON table1.field3 compopr table2.field3, O& L9 H$ |4 [/ N# ]- I4 n
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
0 I2 e1 u5 D+ z& C. L8 o0 b7 aFROM table [LEFT|RIGHT]JOIN table2
$ o; t* p1 S+ [: w z7 yON table1.field1comparision table.field2
. f; I$ a1 ^+ X. L% ^用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据9 u) Q2 C5 h' l2 W5 S7 _5 k. C2 L* H
例:不管有没有定货量,返回所有商品
) L, {1 E( Z. DSelect ProductName ,OrderID
; g$ W$ c* P* r0 p1 _' k9 A4 A) FFROM Products
* x3 Y# b9 b! X1 D/ ZLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
' s- b) N4 p, u% k右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
5 s9 _- c: X' l2 o例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。/ s" Y Q+ f( s8 \ ]
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
! u% W0 d0 Q! } k) |8 q0 @7 ^" iSelect *% @6 |3 J" H8 S; x6 ?# D; q' b
FROM talbe1
0 S8 A: {. _, X. R# a& ^LEFT JOIN table2 ON table1.a=table2.c
: k* F7 f9 c' C& N- d/ Q/ h5 A1 连接查询中使用Iif函数实现以0值显示空值7 H- @. Y2 t. J3 `: e8 g
Iif表达式: Iif(IsNull(Amount,0,Amout)
, }, m! f: W+ N, M; b例:无论定货大于或小于¥50,都要返回一个标志。! r; j3 M0 C. K: L8 `
Iif([Amount]>50,?Big order?,?Small order?)8 a8 m. K% M( T! Q+ x; f
五. 分组和总结查询结果
% \3 }" e* Q9 N V% \4 D+ t在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
4 `& X2 ^$ | k2 f: eGROUP BY 子句的语法1 v* f2 W% E8 P& X5 ~
Select fidldlist4 l+ \! D) J: i* N7 }
FROM table" W( p: v9 c: U+ H; x8 `6 M
Where criteria
' J4 S$ q, l8 |9 K! G) g. V% c[GROUP BY groupfieldlist [HAVING groupcriteria]]
, @$ c2 R. Q/ `. o- N: T' b注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。# M/ N5 n6 {% w. }
GROUP BY字段中的Null值以备分组但是不能被省略。
% G3 _+ g5 Y% r4 s8 @在任何SQL合计函数中不计算Null值。2 i4 q: T' p4 H8 {- f, ?
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。$ k2 P9 `- F1 D
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
% O! I- {9 b/ w0 W8 _9 W) TSelect Title ,Count(Title) as Total- F8 g ~6 f V, ~4 B
FROM Employees: e2 X* P7 c3 `) W
Where Region = ‘WA’
- F2 }+ y; D- P; a3 D9 ?- c5 q9 l% [GROUP BY Title
. L1 P6 s# ? C% WHAVING Count(Title)>1' t# D* R; L# y/ ?" Y
JET SQL 中的聚积函数
6 n7 m6 f/ h( k, @聚集函数 意义
3 r2 C3 V9 n8 k0 t, H( V# W/ t3 iSUM ( ) 求和
: d6 ]; f- U( v6 u! Y6 \2 bAVG ( ) 平均值
8 Z" i. v( z0 y2 c; ]' X, S3 E6 J( wCOUNT ( ) 表达式中记录的数目/ a) B) e/ L6 p) O: C3 U5 @1 l( V
COUNT (* ) 计算记录的数目
) o! t9 r1 [ T8 o5 C0 AMAX 最大值
7 M7 @$ ]' o7 T1 _9 ?$ {( DMIN 最小值2 s, _' B8 { E. i2 b0 k# J
VAR 方差
; d! y1 F4 f5 [% N6 w- V. D9 X. KSTDEV 标准误差
1 u9 H0 F, w( Y Q+ x" R! G2 hFIRST 第一个值
- a7 o) I# L5 F) u5 A; i8 N( {LAST 最后一个值% R& w1 r I4 ]/ y9 W
六. 用Parameters声明创建参数查询
# {# v' I/ c/ J6 HParameters声明的语法:
; [8 n8 G8 _1 APARAMETERS name datatype[,name datatype[, …]]
+ o0 I6 Y7 F( o. l$ O* m& V其中name 是参数的标志符,可以通过标志符引用参数.
- F6 r8 k% h2 ^# o) Y9 g$ a' VDatatype说明参数的数据类型.$ a% }( t5 C& H+ V
使用时要把PARAMETERS 声明置于任何其他语句之前.
4 \7 J2 s% I! S3 Q7 J2 U2 R例:
1 T- o! s" p1 U/ u/ V, r/ r( aPARAMETERS[Low price] Currency,[Beginning date]datatime
! S5 `- e" a2 s/ FSelect orderID ,OrderAmount5 y& }+ o# [6 N; p
FROM orders4 k q: u2 O1 V" `; H2 X
Where orderAMount>[low price]
' M& J' [5 z) `6 s H) _AND orderDate>=[Beginning date]
! N# J4 @2 ]0 i3 Z) `- w% X2 L/ O七. 功能查询9 `0 i2 Q# K" `1 x* m
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
, i3 E) X6 a+ P1 更新查询" i/ ~: x4 h Z1 @
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.; g: z. q* k( X0 O1 P- f
更新查询语法:; ]4 |9 ] W- { M; ~- w8 g
Update 表名
( b1 r8 W* B8 T4 z$ t& R% oSET 新值* d/ l4 x& a5 h7 y* B9 u" F6 T
Where 准则+ s0 P8 c- Z* x2 E. ^/ j
例:英国客户的定货量增加5%,货运量增加3% D/ e6 r5 ~, H8 F' {
Update OEDERS, [0 F" x! e" g; v3 b: g g
SET orderAmount = orderAmount *1.1
f; c$ ]7 d% L/ h' w/ R8 tFreight = Freight*1.03
* Q8 Y2 `5 |) G. PWhere ShipCountry = ‘UK’ M5 |8 @- C( O3 h% ` a
2 删除查询
! ]% z3 x. ^* o/ `9 v6 aDelete子句可以使用户删除大量的过时的或冗于的数据.
8 w& {' B, |0 `6 M注:删除查询的对象是整个记录.
* M* \( C; [! E7 r; XDelete子句的语法:3 B5 h. P! @* |# j
Delete [表名.*]; c6 h/ b' j" n
FROM 来源表% e: x; C g# F* T4 j. W
Where 准则 N" V& ]& L% e) V3 j
例: 要删除所有94年前的定单
7 T1 r0 C4 U8 G1 W$ R% G5 yDelete *
/ ~# W3 t9 a X7 N; K0 b8 w" \FROM orders
9 E# C4 M/ v# O" q4 F9 cWhere orderData<#94-1-1#, L* S9 P0 h; h6 r+ X
3 追加查询
6 b+ _6 ^) @" M# iInsert子句可以将一个或一组记录追加到一个或多个表的尾部." ?( V% ^& Z! Q5 e3 R% S+ m
INTO 子句指定接受新记录的表" {" {$ q. o: c& j$ U- N1 s$ ^. q, F
valueS 关键字指定新记录所包含的数据值.
4 N. J. ]3 a3 C n* cInsert 子句的语法:3 A. ^; H1 _" T5 V/ t
INSETR INTO 目的表或查询(字段1,字段2,…)
1 a$ v$ o) |2 J, a. g. }8 dvalueS(数值1,数值2,…)" Q4 J5 l2 r! X
例:增加一个客户8 i% x; G4 n7 S& A- |% z
Insert INTO Employees(FirstName,LastName,title)) K6 I" _0 {+ d& e
valueS(‘Harry’,’Washington’,’Trainee’)8 k7 B( E; x- X$ Y# q$ G
4 生成表查询" Z6 O1 c1 D" j% \, h( W- v
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.5 e1 ^+ A3 B$ M Z T" T- _
Select INTO子句用来创建生成表查询语法:
; Q7 G8 M6 } e9 g) QSelect 字段1,字段2,… M) w% Q3 C" t6 y% m( o
INTO 新表[IN 外部数据库]8 U/ R F6 ]2 V; L9 G3 x
FROM 来源数据库
2 O, M Y) g$ Y# s2 i+ TWhere 准则
3 e4 e* X$ i/ G例:为定单制作一个存档备份
' @/ t7 Q6 ]7 f- U$ y9 n6 NSelect *
/ A9 |: \+ R# aINTO ordersArchive7 Z3 @" |. V1 h0 E
FROM orders
+ m* F9 A. ^2 `8 [八. 联合查询" P9 N- E' _" T2 w
UNION运算可以把多个查询的结果合并到一个结果集里显示.
; x& F. k; [$ M+ k7 N" E5 ?$ dUNION运算的一般语法:
( t4 m& |9 \+ l7 { U- x[表]查询1 UNION [ALL]查询2 UNION …' L% M( d. w6 t3 y5 E/ |% h% c5 X
例:返回巴西所有供给商和客户的名字和城市8 K0 r" z4 R6 D8 D' o; p- F
Select CompanyName,City
S, S/ r8 c( M3 }+ Z) rFROM Suppliers
5 g2 @* @; j, T9 @* h ~' jWhere Country = ‘Brazil’
0 N0 V' q, \9 C* c- i9 JUNION
6 E T* l( f4 u4 l/ [+ f9 d+ nSelect CompanyName,City
6 t4 Q; ~ }2 ?3 v, t7 y; `FROM Customers
) m# u" M& v+ k+ Z$ uWhere Country = ‘Brazil’7 s$ E2 o, W7 V6 ]! s
注: h" A; e9 f! N
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项, w) [; r: h3 x! }3 [- u
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
6 q1 M4 Y3 P+ P% F每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.) o3 x9 w4 q4 O( T
九. 交叉查询
) U; H) l2 U9 V. h' S交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
5 T6 s1 m. T# v) K- T! c" f9 CMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
' ?9 x3 C0 F1 Q' h" |; ^4 dTRANSFORM aggfunction
6 C& Y9 ]5 A# j& HSelect 语句
9 i1 u& J$ @8 X( aGROUP BY 子句8 b( M8 q7 H$ K7 l' Y
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
( r; Y( a4 o- [4 W, yAggfounction指SQL聚积函数,$ W7 e- Z% N! [' b% z5 ] X
Select语句选择作为标题的的字段,
?/ E; t" k0 t! A2 l \# K! m; iGROUP BY 分组0 O0 A4 L4 F5 ]: k$ X$ z& |3 C4 {
说明:
3 o* m4 W2 B* q, SPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
9 v$ T4 L+ P5 f1 _6 Z. Dvalue代表创建列标题的固定值.7 r) ~2 o" g; N+ a# ^
例:显示在1996年里每一季度每一位员工所接的定单的数目:* f7 n ]- W+ L1 x! m, j6 Z- ~2 ]
TRANSFORM Count(OrderID)
* J. F' T! B. P' Q2 u% y5 ySelect FirstName&’’&LastName AS FullName
. M/ E1 C1 Y& ]& xFROM Employees INNER JOIN orders: I9 u" W" {# h0 Z! C0 r
ON Employees.EmployeeID = orders.EmployeeID
: P) C3 u. g3 m, IWhere DatePart(“yyyy”,OrderDate)= ‘1996’
6 W% [, z$ M9 l9 [2 uGROUP BY FirstName&’’&LastName
* N! [/ g4 q8 Y5 korDER BY FirstName&’’&LastName5 F: k" F2 @0 |# O
POVOT DatePart(“q”,OrderDate)&’季度’
, @9 V9 R ~. x& u. i十 .子查询
1 M- ]. ] O9 z9 c* o3 v- y: R U子查询可以理解为 套查询.子查询是一个Select语句.
/ q) s( v# M/ z. ?) `) N- ^) Z1 表达式的值与子查询返回的单一值做比较
* k. f9 I8 n8 M) j: G. b语法:
: r7 b. J2 q- Z- E/ l Q表达式 comparision [ANY|ALL|SOME](子查询)8 c! D( d# A! r* ?6 ~
说明:& a1 Z0 w$ B/ Z8 |2 a
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
6 j' h6 t6 R) v1 R例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品# y6 h! s% z Y* O. d
Select * FROM Products, e7 Z0 |# E& J) D/ I
Where UnitPrice>ANY$ \1 K6 R% @! q; f
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
9 @3 v% S, ]7 B2 U l2 检查表达式的值是否匹配子查询返回的一组值的某个值3 Y. ~' j4 v) ^( v3 g: H2 \8 j
语法:4 Z4 j/ e" J$ v* i) o
[NOT]IN(子查询)
- _6 ?! T: N7 C6 Y例:返回库存价值大于等于1000的产品.
6 Y' l+ |! C, r7 `% S/ o* M2 @( gSelect ProductName FROM Products1 [% S+ z) q2 @2 w+ j. D, m; O
Where ProductID IN
: C& L6 r/ C5 O& s/ h% d(Select PrdoctID FROM [Order DEtails]; q3 H2 J) L& G* E
Where UnitPrice*Quantity>= 1000)3 _% a4 r6 R( T* h. R
3检测子查询是否返回任何记录
. a. j, T% D( A O3 m& e9 H语法:7 s! p9 \: T% d1 P9 r( I4 `0 r: k
[NOT]EXISTS (子查询)
6 t3 o% }4 r9 [. r9 i- K例:用EXISTS检索英国的客户
" O: D' L# V2 K) u; ~) TSelect ComPanyName,ContactName9 a1 ^5 i) y! `, A: k
FROM orders1 I# ]) X- v$ j4 h4 q& {$ J3 Y
Where EXISTS
3 P# P, a& E3 o; [+ k(Select *
& _5 @2 H6 p% V; XFROM Customers
. A* {/ D/ P7 P# KWhere Country = ‘UK’ AND
) K- W5 E( M q" `% s2 c% k. _( [Customers.CustomerID= orders.CustomerID) |
|