- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
|
Access如何筛选重复数据以及Select语句的完整语法2 Q- l* Y6 G% b% b" y7 B; r
9 f7 a1 P; a8 w& Q% dselect distinct 字段 from 表名
! U6 z% N6 }* e6 z z; h' `3 E6 {distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
- v& N6 }/ p# }8 z8 F' v) u8 k! F一.Select语句的完整语法为:+ F8 S% D/ i4 M4 L) Z' M
Select[ALL|DISTINCT|DISTINCTROW|TOP]
6 E, L8 @( f. @+ \/ \{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}! {% ?, S' V1 k j7 I
FROM tablee xpression[,…][IN externaldatabase] l; ^4 F+ S4 |
[Where…]9 T6 k0 p1 {, l9 U: c( X: T
[GROUP BY…]! f2 ^" d5 p0 [% h. m7 k
[HAVING…]; z2 X1 d E+ R3 N/ C% D
[ORDER BY…]- J4 X- N+ p2 H$ j; j3 P
[WITH OWNERACCESS OPTION]- `) Q' ]- R: N2 Z( n: M
说明:: e; l2 t4 k& r! p. w
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。( m* R d& ~5 a6 w
1 FROM子句: |% z, ^1 ^$ k/ [1 z$ A' B8 a$ q2 c
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。$ t0 D6 q5 `$ g. z5 u
例:下列SQL语句返回所有有定单的客户:
& u; @( r9 c# i/ g, A, e* ASelect orderID,Customer.customerID* L# \' q# }2 b5 x2 N7 s9 R
FROM orders Customers
F# R) {9 r. y8 ~; s- n" l8 iWhere orders.CustomerID=Customers.CustomeersID
, d3 A6 Z! _) q" o g' L/ E2 ALL、DISTINCT、DISTINCTROW、TOP谓词( z) h9 {( _7 s* c0 b/ K
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
6 B$ h- h1 O0 D/ Y* X* V) E7 \. Y例:Select ALL FirstName,LastName
2 c9 u. V$ b/ H* B8 C; cFROM Employees
5 I* `, O& Z. c% i/ y" j- n(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。7 S3 {. Y, l5 p$ T% |3 ]2 B
(3) DISTINCTROW 如果有重复的记录,只返回一个
( Y4 B2 J/ x. x( Y/ V(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
! v+ t/ \* A& x* K( h1 ~) x+ |例:返回5%定货额最大的定单
8 `( R% |& `" a3 ]Select TOP 5 PERCENT*
- p# p" ]) x$ q' k3 kFROM [ order Details]
! X/ G" r" @# A. A$ L4 }orDER BY UnitPrice*Quantity*(1-Discount) DESC
. t( i4 s* v7 }3 M+ I3 用 AS 子句为字段取别名; ]8 s$ A! h Y0 R3 t+ X- ?
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。" P' H9 V5 @, r e
例:返回FirstName字段取别名为NickName2 S, n7 E: ^( F- w8 |$ d& n
Select FirstName AS NickName ,LastName ,City
( i" j; p( a; C6 r" \' t$ g2 ]# gFROM Employees
& z U! l I4 w$ O& W例:返回新的一列显示库存价值$ h3 F9 ~* P) D4 ? g) b
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock4 }8 g9 f1 I! V5 W* Y& }! [
FROM Products, S4 Z* U' r8 K5 I4 `2 F
二 .Where 子句指定查询条件
+ N2 s0 k j* _. B; s. r* A1 比较运算符
; H2 b2 r) ?: q3 B, d* t比较运算符 含义
2 S! \6 [8 x3 x' g= 等于
& r/ Z {6 e+ U; a' {% c> 大于
5 P7 d e! a3 ^ H/ a< 小于& [$ S) O, n7 [: Z
>= 大于等于0 |! E3 H6 m" i6 m, |
<= 小于等于& ]0 @" _0 L! |* l) M) m- R
<> 不等于
) E0 y$ j* X( J0 @# h7 R!> 不大于
& Y5 U' @3 D' H- V8 s!< 不小于3 {% n3 V4 s! Q" {7 _2 c' z; o5 l
例:返回96年1月的定单
1 R7 f4 i: j- t' u! ?) w1 hSelect orderID, CustomerID, orderDate
( F1 h" L! Y$ n9 D' A$ VFROM orders! y: r) p: G3 J9 m1 Y& _
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
, t% ^& [! M- p# R0 {注意:, [7 ?( [1 W2 a& i
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
5 B- u; Y5 g+ a9 r" M" a2 K6 H例:
: r9 I) r! N0 ?Where orderDate>#96-1-1#
1 h* J4 u f' x! u3 }7 |. `也可以表示为:$ F. P9 N1 b& f# {- m- {
Where orderDate>Datevalue(‘1/1/96’)
3 h# I! G: p8 a; L2 T% S; c使用 NOT 表达式求反。
1 X4 f9 K5 b. J, J0 a; q例:查看96年1月1日以后的定单' b& t5 m3 |. _/ f( V2 w
Where Not orderDate<=#1/1/96#
8 f* j$ X: W# k: f: o" _2 范围(BETWEEN 和 NOT BETWEEN)
( F& D- A9 e l; z/ ]9 p- g/ KBETWEEN …AND…运算符指定了要搜索的一个闭区间。- d4 i5 p" ]* [! b
例:返回96年1月到96年2月的定单。
2 K3 B2 ^" I9 ~$ U/ R& jWhere orderDate Between #1/1/96# And #2/1/96#
. q0 F, v4 F& s1 d% M9 d3 列表(IN ,NOT IN)
& W( F& a( C/ p6 @* i& i& D( cIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。+ B* _, O6 b- k M& Z8 d8 `3 B
例:要找出住在 London、Paris或Berlin的所有客户3 k* m v8 K3 X: w
Select CustomerID, CompanyName, ContactName, City
- V9 b/ }: e6 O3 d1 v: bFROM Customers6 p1 z. X- t: `3 b
Where City In(‘London’,’ Paris’,’ Berlin’)
/ D8 a& ^" c! ?+ r4 模式匹配(LIKE)0 h7 h: ]3 {6 z7 }$ V" l+ }! m
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。4 K% a6 W* O9 o; c# b0 ]
LIKE运算符里使用的通配符
4 j8 T1 N0 {) j0 ?' D通配符 含义
9 m2 g6 B [7 `2 \( S? 任何一个单一的字符5 l3 K& p& e0 w/ W$ A
* 任意长度的字符, C6 m4 Q# o+ G% d5 S7 I% `: d
# 0~9之间的单一数字2 ?( g6 O0 X* k* s' z/ Q6 D L
[字符列表] 在字符列表里的任一值* W, @% `: o$ S* L
[!字符列表] 不在字符列表里的任一值
7 W1 Q6 c/ P/ S8 v7 M( K4 O, ]) K- 指定字符范围,两边的值分别为其上下限
3 F) C4 ^, f( l例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
0 {+ l$ h) G. h/ f. T" S& e# w0 Y xSelect CustomerID ,CompanyName,City,Phone
) g: U1 I& I! K2 l CFROM Customers, Y: }: M: F& o# p1 x
Where Phone Like ‘(171)555-####’; C/ M, b( C% g# K
LIKE运算符的一些样式及含义8 P% P l% f" e, ]* v
样式 含义 不符合
: C2 D2 o; q' m6 y1 j+ w* sLIKE ‘A*’ A后跟任意长度的字符 Bc,c255; _7 @' v# u' R% ~2 }
# LIKE’5’ 5*5 555
& Q3 k) [" g7 Y: s7 }0 aLIKE’5?5’ 5与5之间有任意一个字符 55,5wer53 T q) |3 ]2 K
LIKE’5##5’ 5235,5005 5kd5,5346
! _0 Y- y- f1 O: d4 Z2 W# ULIKE’
# I5 v! F( t: g# S C[a-z]’ a-z间的任意一个字符 5,%& t7 J: s5 E- P7 j' p% m9 l7 I
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1% D( c M' Y5 a
LIKE’[[]’ 1,*
! g6 t7 w9 l+ i H; Q三 .用ORDER BY子句排序结果1 e) s# g q' O0 m
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
6 Q, F4 R/ I, b6 D6 O2 P8 S, yorDER子句中定义了多个字段,则按照字段的先后顺序排序。
) i+ n4 R7 e9 o1 \$ d9 w: [+ C例:5 w! P, o" N. g) ]
Select ProductName,UnitPrice, UnitInStock2 t& ]* Y* A3 U/ \' O' f9 x
FROM Products
+ y& x; ^$ e7 X6 _* {" X" d9 D- `4 ]orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
8 Y& ~% D, A$ a1 oorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。2 t4 C- a }2 z6 n- ?" Q5 r6 F6 G
例:下面的语句产生与上列相同的效果。
* R5 a3 l9 B4 d# g; y) RSelect ProductName,UnitPrice, UnitInStock& Z5 t- a* m( R9 T9 o' y- @
FROM Products
* R4 K6 X- b1 JorDER BY 1 DESC , 2 DESC,3
: p' H9 B/ X: I' y y: P四 .运用连接关系实现多表查询
" U4 P- Q ]% ~3 s5 y例:找出同一个城市中供应商和客户的名字$ k& m# ?# S! a* j
Select Customers.CompanyName, Suppliers.ComPany.Name
" V* l4 `2 F; J; @8 m# W5 QFROM Customers, Suppliers: \. l( Q& O3 B4 J- m2 {# s
Where Customers.City=Suppliers.City. }7 K X* |( ^% I0 a. W$ F
例:找出产品库存量大于同一种产品的定单的数量的产品和定单! N6 _6 B# }& t1 u; p
Select ProductName,OrderID, UnitInStock, Quantity2 {2 a5 Y f1 U7 M
FROM Products, [Order Deails]: d) v4 `) T3 h
Where Product.productID=[Order Details].ProductID" h4 T" J" o% k% m' R
AND UnitsInStock>Quantity) o; }. f% o+ x i3 `
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN$ z* u0 \8 Z! ^6 m( O" c7 h
语法:
# p8 H1 }; ^5 {FROM table1 INNER JOIN table2
% b! X- \! ~8 Y2 z# u. A. r' aON table1.field1 comparision table2.field2, |$ X/ Y2 a/ |
其中comparision 就是前面Where子句用到的比较运算符。
k5 P. ]. v1 o1 ]; Y5 \2 QSelect FirstName,lastName,OrderID,CustomerID,OrderDate1 H5 X5 ^# `( X S! I1 R
FROM Employees4 ] l' u/ Z( I* G) A
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
" E6 U# W# _, E ]# B9 ~! H. h注意:
4 R( e' N7 b: U' d, n7 p% mINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。: r4 S+ f# Q+ f' s8 L' m5 n
在一个JOIN语句中连接多个ON子句' \* {' Q: b6 S( `
语法:. z3 z* J0 P4 H z9 f
Select fields
: f8 c- F( A' k; dFROM table1 INNER JOIN table2
% t: v, ^- I. R' l2 JON table1.field1 compopr table2.field1 AND+ D1 W4 k0 y, n' ?
ON table1.field2 compopr table2.field2 or
- ]2 t3 ~# o! oON table1.field3 compopr table2.field34 b% N$ m: c8 z2 o7 g9 I
也可以
; B4 Y9 ^ r' p% E+ X$ o- mSelect fields* c4 X* P! N5 a$ b" v3 u, L
FROM table1 INNER JOIN% r4 f, f0 _4 H; E
(table2 INNER JOIN [( ]table3
- k- I; M5 C' K+ c7 s; n[INNER JOER] [( ]tablex[INNER JOIN]
+ E# y9 n o t% YON table1.field1 compopr table2.field1
4 @1 Q; `& D- t( `ON table1.field2 compopr table2.field2
- Q5 i( G, `: G; `ON table1.field3 compopr table2.field3
: b' F2 x+ P9 A& s2 C7 `外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。' z% I9 u k2 x& G! e9 H% A
FROM table [LEFT|RIGHT]JOIN table2. d2 Y$ @+ n* a; n% J9 M
ON table1.field1comparision table.field2. q9 }: O/ X% x
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
w: Y# i9 n. ~; W9 T/ S3 p例:不管有没有定货量,返回所有商品/ S' H4 T0 g6 ~
Select ProductName ,OrderID1 f* V* q. V6 g4 y: g0 b" h j1 e
FROM Products
5 u. X4 R. F1 {LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
/ I% d/ Z8 F+ j右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
" O! A. V7 ~" u7 F例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
6 f- ~5 v6 G; J2 G% T" J空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
/ _/ }4 Z0 ]' A% L1 OSelect *
0 i4 o! c' h0 A% UFROM talbe1
1 u9 {: Y* S! R) Z6 r) W! g' NLEFT JOIN table2 ON table1.a=table2.c
& S# F* n3 _- f1 连接查询中使用Iif函数实现以0值显示空值
' m* L/ \, Z5 s H# P/ iIif表达式: Iif(IsNull(Amount,0,Amout) b3 I/ F( z' k) v: q! U# L
例:无论定货大于或小于¥50,都要返回一个标志。; G6 w; {) b5 l1 [( i/ W
Iif([Amount]>50,?Big order?,?Small order?)
; E+ K7 h J/ i/ g' N9 N% @五. 分组和总结查询结果9 a8 E2 [% k9 n* _- ~
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
* O+ x% L6 Y& NGROUP BY 子句的语法$ j$ _: }3 g8 S" Y7 U! {" \. K
Select fidldlist" _2 U) b. [. C8 z- C& H" l3 T
FROM table
" m+ i7 K! A, Z' O& l: V! [- SWhere criteria: x- Z/ ~2 ^2 L9 R6 d3 w+ {
[GROUP BY groupfieldlist [HAVING groupcriteria]]
2 O+ B1 J w+ i2 P; t* @& ]注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
9 x0 h# y% A8 ~7 P: z; iGROUP BY字段中的Null值以备分组但是不能被省略。
w3 A `1 g) D: ?在任何SQL合计函数中不计算Null值。& x7 E2 ?/ P% W& U
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
|1 k; w `9 D9 b9 ?例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。 E) y: u M. c; n2 |# k
Select Title ,Count(Title) as Total
5 e9 ^0 j/ |8 T# S* UFROM Employees
Y9 f* M: Q0 e2 U+ V: _( c# JWhere Region = ‘WA’5 z. @) g, I: ~7 `
GROUP BY Title: b; U2 Y' L8 I; _8 T
HAVING Count(Title)>1) } }) X- r- D7 C% k5 h& j# x
JET SQL 中的聚积函数
# s* z+ e3 R7 g聚集函数 意义
( b: H6 \# W) l {2 A: ]SUM ( ) 求和/ O3 \- M5 \7 `1 p& Y7 Y
AVG ( ) 平均值 y0 P6 e3 Z- M/ P1 a
COUNT ( ) 表达式中记录的数目; u$ |4 }3 u3 q5 U2 q9 U# ?" Y
COUNT (* ) 计算记录的数目1 \8 P$ I) F( r$ h3 [
MAX 最大值
3 V! x/ P' r# E. @. TMIN 最小值
; M! f. A* j3 f {5 o* F9 EVAR 方差7 i; @8 M' O# P7 ~& h
STDEV 标准误差
( }" V, h% D) X, J5 r4 Z qFIRST 第一个值! ^) O2 S* c: G% ~
LAST 最后一个值$ G( ?& M/ r# J+ ~+ v1 d5 Q
六. 用Parameters声明创建参数查询
+ J; d# s( k- V1 r+ ^* ?! dParameters声明的语法:
/ O/ `: K- g/ k Z9 m# CPARAMETERS name datatype[,name datatype[, …]]/ l. |& Y9 K! T @6 |4 W, @
其中name 是参数的标志符,可以通过标志符引用参数.- n# x5 e. {% r1 ?% Z, ?
Datatype说明参数的数据类型.2 \- p- F& o& u
使用时要把PARAMETERS 声明置于任何其他语句之前.
X3 l$ |' U" _4 |& k" g. h例:+ ~ I1 Y. O+ @0 W6 `9 t
PARAMETERS[Low price] Currency,[Beginning date]datatime
7 q8 e* h3 |, a( E, uSelect orderID ,OrderAmount
5 Z C+ _8 k# B2 L* t) QFROM orders
( `! I% v5 j) j7 sWhere orderAMount>[low price]
V6 c6 _ ^: |) K9 oAND orderDate>=[Beginning date]
# _+ e9 J- K+ }; U7 d; {七. 功能查询
& O9 C" w3 p1 k8 D" R所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
. d7 W$ ~2 c- \) n' y, M1 更新查询; v- w) N$ [8 U" {' T" z9 x2 F% Q$ l
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.9 \. J; D$ F' `6 s. U5 p
更新查询语法:9 |) A- r( ]! d
Update 表名3 ?3 _5 F( ~% U& A+ r: Q
SET 新值( j, u% u! }. M: p0 O/ c O9 V
Where 准则
, i% U1 a& j2 L: B6 O, B& i; k例:英国客户的定货量增加5%,货运量增加3%8 a7 Y$ Y# j3 C& ?
Update OEDERS9 r: _& G4 y0 r* F3 j
SET orderAmount = orderAmount *1.1
/ y5 Q9 k4 {; C3 \Freight = Freight*1.03
1 j5 N$ E" r/ R8 D ^6 I0 l( tWhere ShipCountry = ‘UK’
- e( [/ ]* s) L9 {! H" o2 删除查询4 s! v( P; E! u& D1 b7 F: K9 q3 Y
Delete子句可以使用户删除大量的过时的或冗于的数据.
: I0 N! G- O6 }$ c7 p/ ^# x注:删除查询的对象是整个记录.9 ]/ f( S5 r2 g6 `, W h# u- j
Delete子句的语法:
6 P- I; p# L3 FDelete [表名.*]+ S) x& M1 v" j2 j1 N y
FROM 来源表
: ` f2 b7 T# d* x. x ]" u mWhere 准则6 i" ~2 L1 y; \) p: {
例: 要删除所有94年前的定单. Q2 k& \4 w6 ]) `1 C/ L" D
Delete *
2 S* `5 u I8 mFROM orders) P# A9 A0 Y( l2 p5 |
Where orderData<#94-1-1#
$ s( [: t+ }! g) E4 O) |, e" ?3 追加查询( {7 _) S: o+ c7 v
Insert子句可以将一个或一组记录追加到一个或多个表的尾部." C' x. f; ]1 T k1 G% C
INTO 子句指定接受新记录的表" G, m$ R0 Z9 ^* L
valueS 关键字指定新记录所包含的数据值.
) w# Y% W: P' C& zInsert 子句的语法:+ e( n5 d& D1 A$ Q7 j
INSETR INTO 目的表或查询(字段1,字段2,…)3 H5 f, ~1 I, I+ _' ^
valueS(数值1,数值2,…)8 n* y- J7 a, U$ ]! V5 ?* Z; X1 }% c
例:增加一个客户+ Q7 u) F" x N
Insert INTO Employees(FirstName,LastName,title)
7 @8 x d8 ^/ q, k* d. r, PvalueS(‘Harry’,’Washington’,’Trainee’)- y% { ^! K" K* B
4 生成表查询5 p( F( h# p( v( @: `
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.0 ^3 X( w* x' H
Select INTO子句用来创建生成表查询语法:& ^/ p3 p4 S* f+ D3 ]
Select 字段1,字段2,…
4 |( f1 P. \3 ~' |! _* r' e! lINTO 新表[IN 外部数据库]8 M% q/ h1 G, |9 W5 G0 \/ w
FROM 来源数据库- z1 Q( v3 ]- F* s
Where 准则- [$ ^; v! |9 Q# k
例:为定单制作一个存档备份
8 l" j+ L r: Y( J& ?Select *
* f# s' ~( f4 X& E/ c; ^+ G9 ?INTO ordersArchive! b' A2 n1 y% Q+ p
FROM orders
: g6 v) x! v& m) g# R八. 联合查询
, E& C( a: G8 j. K YUNION运算可以把多个查询的结果合并到一个结果集里显示.
- ?0 f. \9 |$ b# RUNION运算的一般语法:; m% n: P O( v$ Y0 s/ P$ X% ?
[表]查询1 UNION [ALL]查询2 UNION …
" w* S+ ]0 N) V4 X j% _例:返回巴西所有供给商和客户的名字和城市5 M; i+ I( b( o5 @7 P
Select CompanyName,City
+ h7 Q' t, {# mFROM Suppliers
% d. u/ x+ T3 H* G( Y* rWhere Country = ‘Brazil’2 ?) H! g$ w9 {6 x3 ]/ B( o
UNION! x5 H% m: ~5 w1 K- O9 {
Select CompanyName,City+ v7 W8 }8 ~* U( c' s( i3 m2 N7 M
FROM Customers
. v/ D. z% u# b2 AWhere Country = ‘Brazil’/ S& I( A ]& B+ S0 F( g" T4 k8 c7 C
注:1 h7 _: o7 u' u ]1 |2 V3 M
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
1 z/ S& }) W" M i! d# H' ?% kUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.- M/ h7 E, j' E& B* r( W1 J
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句./ O, B% b" c: H% [. e( i
九. 交叉查询& e0 M& L. T1 u/ ^) g6 J; }$ j" v5 z
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
$ Z' k; }" U' A% w& r7 s% CMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
% {' N$ L& D7 wTRANSFORM aggfunction
& I" X4 z9 |( ] M" h/ v& G8 oSelect 语句
' P7 G# _5 I0 A, @GROUP BY 子句, i4 }' ^* [0 [
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]( S# F! M; Q' _% @
Aggfounction指SQL聚积函数,
% b( n" j- D5 `7 S+ A; ?; BSelect语句选择作为标题的的字段,
/ W- V) \5 Y, m" p2 V- A8 T" k) G1 MGROUP BY 分组
$ e. V+ G9 q$ }* R3 e9 w: E说明:
( }* q/ y2 ^0 O& ePivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
4 k! A" o$ Q5 ~8 @ B# u1 bvalue代表创建列标题的固定值.+ R; Y- Q: N7 V" Y! X! L5 ]
例:显示在1996年里每一季度每一位员工所接的定单的数目:
8 a3 \+ o. n, g2 r* ?4 T. R+ s& B" C9 U5 OTRANSFORM Count(OrderID)) V2 n9 ?" g- i0 n% w [
Select FirstName&’’&LastName AS FullName
4 @2 x- U5 e! @' ?1 MFROM Employees INNER JOIN orders
- }+ C! R2 I* {0 hON Employees.EmployeeID = orders.EmployeeID {% j, G! y3 x3 P
Where DatePart(“yyyy”,OrderDate)= ‘1996’" L/ e( ^6 c% ^2 i* C% \- A# S# C
GROUP BY FirstName&’’&LastName" ?# p8 p2 }. e( e$ x4 a, N
orDER BY FirstName&’’&LastName
. E% i+ N7 c/ D7 G6 _; ZPOVOT DatePart(“q”,OrderDate)&’季度’
; ]& d% p/ j8 A% a# s9 f十 .子查询* ~8 A5 T3 m, ~4 Q, w. A
子查询可以理解为 套查询.子查询是一个Select语句./ Q# V) C6 _$ n- C8 N8 k( D1 v
1 表达式的值与子查询返回的单一值做比较
% K7 V8 V/ {, ]! V7 |% \) @语法:$ b4 y6 p% N$ t X; F' Q+ f0 V# ]
表达式 comparision [ANY|ALL|SOME](子查询), b/ N+ I5 c) Z ^: _2 R. }" j$ Q
说明:
9 H9 Y3 ~6 g+ w" R5 y3 A8 h. W/ `ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.# L0 q% R) |+ z7 I3 l' V
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
' a5 k2 {' r. X2 y8 H, A ASelect * FROM Products
1 x6 o$ k6 |0 x0 _Where UnitPrice>ANY
0 V# U; O% F o- l1 k2 |. ~. E(Select UnitPrice FROM[Order Details] Where Discount>0.25)2 T+ t- |- O2 c/ n/ T0 N/ g
2 检查表达式的值是否匹配子查询返回的一组值的某个值
, {3 n0 x; J) ?" s+ O% u, L9 O- I语法:
0 |# P5 |6 `; ^[NOT]IN(子查询)
+ f3 ] h3 z7 B8 G. C例:返回库存价值大于等于1000的产品.
" z$ K1 P& m; z5 {Select ProductName FROM Products. a1 D) G) n( h( G4 X
Where ProductID IN! w1 K( ^' Y7 x
(Select PrdoctID FROM [Order DEtails]9 w B* Q1 i4 C _) S" p
Where UnitPrice*Quantity>= 1000)0 q" }4 o# l3 e2 a5 b8 I
3检测子查询是否返回任何记录
9 P- }: `3 r- N# c1 x语法:
4 M+ P+ H; ^4 f& \" j[NOT]EXISTS (子查询)
2 l! ^# K6 Q& }" u5 N例:用EXISTS检索英国的客户, j" M- B' V5 q" i' `$ J' O
Select ComPanyName,ContactName8 ?+ A+ a: N8 ~7 \
FROM orders7 z9 H! ?( {4 {' j2 W5 l- e) Q" X
Where EXISTS' U5 E" k3 l% b& V: n' x
(Select *5 o) s( Q7 A7 ?& ^
FROM Customers
' {+ {3 d0 \3 z" C% [# Y; OWhere Country = ‘UK’ AND i8 r5 z: q4 t1 D) w
Customers.CustomerID= orders.CustomerID) |
|