- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法
9 M. {2 R5 g7 M2 h% x8 |* z% a) X2 Z
select distinct 字段 from 表名+ t# _& l0 \6 O# L4 N
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。" h O4 Z- O9 P( U. C& H7 m
一.Select语句的完整语法为:
; A6 V, z2 K4 i' `7 @6 xSelect[ALL|DISTINCT|DISTINCTROW|TOP]
. B- U0 `3 C; |0 J" I+ Z{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}( ~& |- l" ]8 t4 B# K
FROM tablee xpression[,…][IN externaldatabase]# P' E4 A7 r5 {( d1 g; n* l% b( y
[Where…]
$ e# G; u/ z: G% }/ _+ z+ D[GROUP BY…]
' X4 m% \5 V. d& V ^, s[HAVING…]; \# y2 r5 V% T$ ~6 h f
[ORDER BY…]
5 W$ E9 D1 Y. F7 Z; y9 ~; G[WITH OWNERACCESS OPTION]4 o1 T$ X, r& |& i4 h+ J' }: a
说明:* U; m. c# t% I$ Z5 K! W8 d; `
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。1 q0 w1 \' N& S& t+ V$ u! x+ g% l7 X
1 FROM子句+ I/ z+ E$ g6 W- @
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。 R# |9 |9 T: m+ A, G0 \% J/ x0 N
例:下列SQL语句返回所有有定单的客户:7 _) } A9 @: l( ^# y
Select orderID,Customer.customerID
& d' J/ j6 F$ ]! E1 {FROM orders Customers
: \* W3 L7 o0 ~' O E3 p1 AWhere orders.CustomerID=Customers.CustomeersID4 F w! N- N" C
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
$ Y8 g/ J+ j6 D |- s5 V' _6 H(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
7 i( j$ z! l" e$ H" U例:Select ALL FirstName,LastName
' ~6 ?: S3 @9 P& \3 ?! ]FROM Employees& X' C. i8 ^/ o
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
- F8 f; S+ D/ a6 K, y9 z(3) DISTINCTROW 如果有重复的记录,只返回一个2 f J! Q1 t; {: N
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
0 [& Z! f3 \/ V5 H% i/ F1 d例:返回5%定货额最大的定单5 b$ L$ v$ I! P
Select TOP 5 PERCENT*$ B1 ^- {2 i! I3 M
FROM [ order Details]0 n& C, |4 L# j, N6 G
orDER BY UnitPrice*Quantity*(1-Discount) DESC
, p" R& J; `" s5 ~; P r. n3 用 AS 子句为字段取别名 m. z* a6 y9 }: @9 P( T, i. W2 Z
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
6 y' J- N/ z, ^. K% `, J* A例:返回FirstName字段取别名为NickName
0 c, Q& ]$ L7 K/ V. ~: X0 FSelect FirstName AS NickName ,LastName ,City
0 y8 d- A2 Q0 sFROM Employees- ` R( C. k9 }! M7 N; Q# r
例:返回新的一列显示库存价值& t) b @2 d- ?+ H3 e; }# c: K4 W
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock6 V: I' A( M0 W$ d. J7 l1 z
FROM Products
( a; ~& m" L3 n; i# q9 {二 .Where 子句指定查询条件7 S. S1 K1 a; l1 |
1 比较运算符; T; t6 U% z c4 [. B3 R
比较运算符 含义# T$ m, `5 h P H) [
= 等于$ j1 j5 ~# D: l" f2 h3 g
> 大于
y b2 R; h& X! F' f< 小于; x& |' B1 L \/ D1 N3 o9 v
>= 大于等于4 r( Z3 e5 h$ M: l& s
<= 小于等于3 l; W+ @: }' M
<> 不等于$ f# i9 e U5 v. p1 D
!> 不大于
, b$ y$ U6 v; U2 F' ]6 j!< 不小于' y! u' s2 w5 y4 l
例:返回96年1月的定单
: g' e3 k, C' x! J# `8 I; ?8 TSelect orderID, CustomerID, orderDate
1 d0 Q7 S2 x _' fFROM orders1 X9 x$ v& P4 V
Where orderDate>#1/1/96# AND orderDate<#1/30/96## Z, D8 r$ m" f0 T* s
注意:+ h1 ^- I" L' G2 w" r! j% [2 y
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。% p( E/ u, ~% s
例:
; ~, m; v/ H7 b! L: rWhere orderDate>#96-1-1#+ {9 M, N+ O7 a) G2 o( t4 t
也可以表示为:
; B. [, \' l, [+ z: JWhere orderDate>Datevalue(‘1/1/96’)
8 F6 y. M. M8 [- M1 w使用 NOT 表达式求反。! q! A3 J0 H) E! r/ M7 f
例:查看96年1月1日以后的定单
# K, B" D/ l. d. LWhere Not orderDate<=#1/1/96#, R: \8 f" Y5 z% U
2 范围(BETWEEN 和 NOT BETWEEN)7 ^3 H/ b5 H$ e8 F
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
( M5 a. L8 q8 r) f2 D例:返回96年1月到96年2月的定单。
" h* h3 z9 {. j# `; YWhere orderDate Between #1/1/96# And #2/1/96#
8 e% V6 g4 a9 [- D# l n3 列表(IN ,NOT IN)6 }- p6 ~* Q5 P6 N) C
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
* o1 K4 F+ B7 }例:要找出住在 London、Paris或Berlin的所有客户
9 n9 ~# N/ W) L0 \8 R, M& G6 pSelect CustomerID, CompanyName, ContactName, City
* Q1 N4 E# ?4 t' m5 |2 x0 @, _; ?FROM Customers
* ^" v/ J$ P- h9 e& D: a; }' CWhere City In(‘London’,’ Paris’,’ Berlin’)" d: H# z2 C# l9 f% t* ]: Z% P
4 模式匹配(LIKE). T7 H3 V. x' S! h: F3 |- K7 L! M/ b
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。5 ?, Y+ m& M( y* w0 _
LIKE运算符里使用的通配符
- o, N Y; c6 q8 c" v( h通配符 含义* ~) b. c, ^) l# Y0 d5 }# k1 V
? 任何一个单一的字符8 D* m9 R4 c* E3 j3 |9 s
* 任意长度的字符
& `/ l1 Q* F% w% f# 0~9之间的单一数字# b$ q, C0 x6 d7 |7 W, w j, k
[字符列表] 在字符列表里的任一值 ~ Q8 i" D$ E' S; |: k- L& S3 x
[!字符列表] 不在字符列表里的任一值2 c7 t1 Y l* |$ j) ?/ k
- 指定字符范围,两边的值分别为其上下限# o. i i4 k% v0 L
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户! \) r2 x8 {" w; T% o4 z( y0 f+ V
Select CustomerID ,CompanyName,City,Phone
7 T7 C! U/ }7 n, I- N7 F: TFROM Customers2 t* V% K2 l( H6 P, d
Where Phone Like ‘(171)555-####’3 H3 M5 k2 N; ~ p1 k; B( C t0 d
LIKE运算符的一些样式及含义/ y" n( c$ h0 x9 w6 ?
样式 含义 不符合
) }0 Q3 D) e+ O& `6 h% G* _8 G$ OLIKE ‘A*’ A后跟任意长度的字符 Bc,c255: B7 v$ Q, [8 b; T
# LIKE’5’ 5*5 555" Q! D) Q0 ?% S- r) H# b
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer58 }& e! _6 U: k3 B: A
LIKE’5##5’ 5235,5005 5kd5,5346
2 i9 {1 [) {9 N' }LIKE’
: v5 v+ \8 P# a# [% h9 Z[a-z]’ a-z间的任意一个字符 5,%
8 r6 p( O; V* m( e6 MLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
0 v* [. o- [" b1 h6 P& x9 SLIKE’[[]’ 1,*
' Q, p9 ~9 ]% l( ?4 V8 k, c; @+ _三 .用ORDER BY子句排序结果
7 v9 K/ w2 l$ l! F% Z' korDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
# k2 p% y" ]; D" Y/ m! k J# \0 h& VorDER子句中定义了多个字段,则按照字段的先后顺序排序。/ V3 Z, i- P% H' h7 C/ ^1 S
例:5 [6 f0 [" k3 K7 U2 d2 h! j
Select ProductName,UnitPrice, UnitInStock$ s A0 T% b9 X) x; ^
FROM Products
1 ~2 r# w$ I borDER BY UnitInStock DESC , UnitPrice DESC, ProductName
6 W% ], g5 y, T3 Z7 CorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。2 D8 t. F" c2 ?% e1 P. l) I& N6 c
例:下面的语句产生与上列相同的效果。
P/ Y1 e; A- P2 JSelect ProductName,UnitPrice, UnitInStock
V5 m& w$ G6 M% I8 ZFROM Products" ?6 R3 _8 p5 S' p$ a+ c& B
orDER BY 1 DESC , 2 DESC,3! I. `( x& Y6 ^' D
四 .运用连接关系实现多表查询
/ f. Z5 m3 O+ r$ M6 P/ b例:找出同一个城市中供应商和客户的名字6 z3 m @6 }/ w4 x/ L* k& m5 I
Select Customers.CompanyName, Suppliers.ComPany.Name6 q r) o; S' Z" |( d8 r
FROM Customers, Suppliers
' G/ q2 }8 A; r" |; m4 UWhere Customers.City=Suppliers.City) S5 ?7 Z5 f4 \' [
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
4 w; D7 Z6 p: H3 t2 e5 A# O. ISelect ProductName,OrderID, UnitInStock, Quantity
5 J9 ^" Q5 M! x. H6 e+ v8 BFROM Products, [Order Deails]
- {: u2 o) \+ B9 ? _; v" l3 H' zWhere Product.productID=[Order Details].ProductID
$ M) Z) v+ h/ T4 I2 ?3 GAND UnitsInStock>Quantity; x% M/ G1 x( j, V; e
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN3 n; T/ `; _! b6 {) | H
语法:$ m' R6 F& l- i% `; L
FROM table1 INNER JOIN table2' S( k% s, e% H3 L
ON table1.field1 comparision table2.field25 y9 s! J, d* ]5 L* `% V! n
其中comparision 就是前面Where子句用到的比较运算符。
3 s- q/ a3 r" R! D- Z4 @Select FirstName,lastName,OrderID,CustomerID,OrderDate
* w+ n$ U8 E6 C- z. P) ~4 Q3 wFROM Employees8 M- U# o1 b. F D3 m, S
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
# f' J5 C% m' u8 u注意:
( j/ n( M R4 ?3 V. ZINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。# k; Q$ E* b/ N, p f
在一个JOIN语句中连接多个ON子句
/ t& q2 M7 a& ~- A" C语法:
+ U6 g$ x5 @3 T: TSelect fields
* }) N6 L# W) J2 k6 nFROM table1 INNER JOIN table2+ X9 P( ]7 R6 T5 M% ^$ ]' e# y
ON table1.field1 compopr table2.field1 AND: q6 W1 @, N+ R' ~' B2 Z9 X3 B" \
ON table1.field2 compopr table2.field2 or
" F3 c- m, l! G: D: UON table1.field3 compopr table2.field34 w! B+ k+ z* y4 R4 r7 ~
也可以
6 e. \$ C. d z! J% p" ]6 d+ @Select fields# V& T! |, M, g& o( c
FROM table1 INNER JOIN
+ q* x0 R" P/ U(table2 INNER JOIN [( ]table3
! G6 b+ H/ [- n% h k[INNER JOER] [( ]tablex[INNER JOIN]1 o' n8 k9 C9 M. v2 x& r6 B% o# |% r4 Z! E
ON table1.field1 compopr table2.field1. x! [, K9 `, \/ [( i
ON table1.field2 compopr table2.field2, b2 s0 y0 r+ |3 q; U+ M$ K
ON table1.field3 compopr table2.field3
: W! h, ~8 A( J, N% i& \& W/ e外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。8 `/ X# C% |! c- T
FROM table [LEFT|RIGHT]JOIN table2
5 e5 _2 ^5 K, J, fON table1.field1comparision table.field2' l3 A& r- U6 ?5 ?: D+ C4 b% V5 y
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
. J4 B% R, I' t8 F; X& {/ a例:不管有没有定货量,返回所有商品
4 ?! e, {$ N2 ~Select ProductName ,OrderID
% h2 e6 n+ ?# e* N" y2 Y+ O( iFROM Products
5 A- |8 G: i$ X- y+ x! ~* nLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
/ W( o: Z0 @3 Q2 O2 N2 X右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
5 E! k! @9 v8 z7 D- J5 j8 b例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。4 J4 i; c2 h7 d. X; W7 @2 l# w
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。' N: f4 Q" W" |) Z: ^/ c
Select *4 [$ T0 T, R% r( x4 P- q# T; K
FROM talbe1. c5 O) f& x( _
LEFT JOIN table2 ON table1.a=table2.c
" F$ b% _6 Y3 Q+ n$ j9 j1 连接查询中使用Iif函数实现以0值显示空值2 b9 G% b9 i9 q& T4 \! k G" S f
Iif表达式: Iif(IsNull(Amount,0,Amout): y0 k+ X3 o7 N; k
例:无论定货大于或小于¥50,都要返回一个标志。
r9 H) Q g' r! n& HIif([Amount]>50,?Big order?,?Small order?)/ ]/ ]! g( i8 d8 m3 c
五. 分组和总结查询结果5 K( `1 A5 |+ s' X2 o
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。$ F* G- R* E. I+ L
GROUP BY 子句的语法/ ~" E ?/ ~( f z- K( g2 I
Select fidldlist
3 m b9 m3 y9 JFROM table1 h* `7 i ?+ Q: f
Where criteria
/ N% I: K& b$ |, Q6 H, s[GROUP BY groupfieldlist [HAVING groupcriteria]]
2 f# l! j1 N9 Y6 ~/ z. x l注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
: ^- A$ t( ^0 J K/ BGROUP BY字段中的Null值以备分组但是不能被省略。
& B# Y' c" h# B! J# m, x) c在任何SQL合计函数中不计算Null值。
$ S! C* E r) k3 G. B# K6 _GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。- V7 i [, o* H9 W8 C8 b9 t
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
; @! r8 V. W( K% | D' F: ESelect Title ,Count(Title) as Total2 E0 n% W2 m P
FROM Employees% D7 |" p7 [) z5 d- c
Where Region = ‘WA’
5 y5 L& l7 Z& \7 m" Q! h$ s0 F0 uGROUP BY Title" l( y5 g l6 i% O
HAVING Count(Title)>1
$ D. @5 R; y$ h# N( e$ H/ `JET SQL 中的聚积函数
; M1 G. z: Q' t$ W聚集函数 意义
( |( ?7 z$ x" N" u! z+ tSUM ( ) 求和
) e6 o2 z/ n2 y. o) uAVG ( ) 平均值
0 f' V/ Y- C( D& T9 x3 I; x: {COUNT ( ) 表达式中记录的数目
; ^4 i, E1 d3 D$ H( R. m2 A, wCOUNT (* ) 计算记录的数目
4 b9 A6 A; j6 ^6 J& L) B. RMAX 最大值
+ a5 _, @+ G2 b6 n" L& M% gMIN 最小值
$ l2 P" `5 p2 y6 z: `, ]VAR 方差( k$ t1 W/ w: _; V8 N
STDEV 标准误差
$ F# f3 J% p+ w; Z# aFIRST 第一个值
1 |2 j5 ~: Y% X# f5 G' U+ a1 kLAST 最后一个值
( v, I4 u A# B+ ~; ]2 P5 ~六. 用Parameters声明创建参数查询( V5 R: T( q0 o
Parameters声明的语法:
8 P4 a. _8 {1 {' l+ k" bPARAMETERS name datatype[,name datatype[, …]]
j7 E- X4 I& h" \其中name 是参数的标志符,可以通过标志符引用参数.4 G4 a( N8 ^ i5 N& l
Datatype说明参数的数据类型.
/ H- O# b, h8 F使用时要把PARAMETERS 声明置于任何其他语句之前.7 T& t0 ^3 o; K9 a; @
例:) h9 q: z- r. P- c. N! w5 o
PARAMETERS[Low price] Currency,[Beginning date]datatime: t+ S* V! h s' U' T% P
Select orderID ,OrderAmount
; f" w9 R" s! l7 U3 UFROM orders, Y: C/ [& K) k/ `
Where orderAMount>[low price]- r0 t& W1 Z0 i A
AND orderDate>=[Beginning date]
% O3 t2 p3 }! G; r' I. `七. 功能查询( W( J1 i$ Z) O7 b/ H
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.9 [ w7 d) x. [7 i( P4 @. L# `
1 更新查询
7 M/ L- b4 y7 b0 j' ^Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
B6 P& i! i3 w1 {* j: p1 L更新查询语法:
# ^ d' e6 t9 j4 ~% ~ c) m& JUpdate 表名# i+ ?% s: {+ Z1 {
SET 新值 o$ Q3 b! P7 Y) Y# A2 h
Where 准则
/ N! z p* k+ e# W8 Y* m1 P例:英国客户的定货量增加5%,货运量增加3%: ~3 J6 N8 C$ y* \
Update OEDERS
1 C& U& ~0 G; u* V4 l5 X: x$ @! H) K* {. \SET orderAmount = orderAmount *1.1
+ @; C; x9 z7 ^- Q. qFreight = Freight*1.03
8 J% R6 Q6 H8 O# e: N% B# N* dWhere ShipCountry = ‘UK’9 H" Y. k0 g5 m' j* O
2 删除查询
% U' f( A5 ?6 F! H; eDelete子句可以使用户删除大量的过时的或冗于的数据.( j% X- m6 d0 d T: p
注:删除查询的对象是整个记录.! L* M" d' y j# |8 s' P6 s
Delete子句的语法:
' j2 _( I" ?0 W( f2 jDelete [表名.*]
: A0 N* p5 ~* H/ JFROM 来源表* B f. r, W5 m- u
Where 准则
+ S7 @0 B' M& s( g% H0 L3 V- V例: 要删除所有94年前的定单
" D! R g( P# K! k5 g7 `! X, @Delete *
% J' L+ S; D+ A- K% P+ FFROM orders/ Z E: p2 s1 @- l8 k- k: W
Where orderData<#94-1-1#% Q7 i9 V- x0 J! W, g/ S
3 追加查询
$ ]% e; N3 V+ |# A3 r: IInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
M @- b$ f5 a9 t4 _; }INTO 子句指定接受新记录的表9 o# N5 I6 E* n& h6 y
valueS 关键字指定新记录所包含的数据值.
2 u- }1 O+ d9 y) y4 e, tInsert 子句的语法:
; P: I/ R" w. z* p& D8 ~INSETR INTO 目的表或查询(字段1,字段2,…)+ s% L, \4 A( b$ g& D' V6 s# a
valueS(数值1,数值2,…): U V, J/ t1 }- y& c
例:增加一个客户4 ^0 [* {: o8 m
Insert INTO Employees(FirstName,LastName,title)2 u& ^- ^7 M$ z
valueS(‘Harry’,’Washington’,’Trainee’)
- P+ ]: p6 j0 d3 k8 U3 [, p4 生成表查询$ W' T" x& Q% r, x& g* D0 K- U H
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
/ ^" K f' s' F1 c, eSelect INTO子句用来创建生成表查询语法:2 I* k: F9 n- d: H
Select 字段1,字段2,…
7 N+ a6 J" g. G- v4 wINTO 新表[IN 外部数据库]
5 p$ X' W* @: L! GFROM 来源数据库
3 Z5 {4 n) c6 ~5 sWhere 准则
5 }7 N- Z$ b( O* _例:为定单制作一个存档备份8 P6 {/ q8 G: ?' X+ P2 D' S
Select *
9 W0 ^- s7 ]& V- i" \# B. \7 iINTO ordersArchive" y! U% U" K) j' t1 I
FROM orders9 }0 `- g2 A$ {" X
八. 联合查询% d O! U h4 W" H$ z: G% S
UNION运算可以把多个查询的结果合并到一个结果集里显示.
& S0 _# V. I( j/ x" PUNION运算的一般语法:$ b+ y9 t/ `% k x# _/ `4 G4 r( {; v
[表]查询1 UNION [ALL]查询2 UNION …6 w1 o) B% A1 B7 q5 a! Q# F1 P
例:返回巴西所有供给商和客户的名字和城市
, b+ F. Y, h! G- jSelect CompanyName,City( A, A! u1 w9 D; U( H
FROM Suppliers6 Z7 s8 _# I1 `8 {- D1 x$ \
Where Country = ‘Brazil’
) {. p4 f' o) s! l- wUNION
8 \5 Y" ?- z+ L, W7 U* c# `. tSelect CompanyName,City( j# b. ^2 h7 e" ~
FROM Customers( x) Z& A. |8 T
Where Country = ‘Brazil’5 c' L" \' U' D9 D0 |4 ?% n
注:
- h# S1 L; P4 Q3 g8 I6 s% R缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
6 w- w# Z: L. ^2 l8 {9 vUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
. v, Q& T( Y; s2 k2 z. f9 A3 G每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.; p1 n0 p' `- S9 s
九. 交叉查询& K* B( [5 M8 E+ Q5 d" y6 d7 ]/ n
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.1 m2 {' @3 ?6 D1 _& B# ?
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:: ?% l% l# o, J1 P& b2 l: `
TRANSFORM aggfunction0 p6 i. Q( C& l1 z" R* L/ \
Select 语句
+ R$ Z# L( e+ c+ d0 i$ kGROUP BY 子句+ i0 @' T9 O$ }3 j$ R
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
' X2 g" Z4 K# l' d1 fAggfounction指SQL聚积函数,; v6 ~ y, c! A5 d4 m
Select语句选择作为标题的的字段,6 O. j% t0 _& A1 M, i, W# Q
GROUP BY 分组
- r2 q! `1 {8 }& J! w5 L+ _. [5 w, x o0 y说明:* y' W2 l8 G; F: L% S6 q
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.4 l0 `1 l2 q1 A$ w
value代表创建列标题的固定值./ B2 W- ~- B b3 s
例:显示在1996年里每一季度每一位员工所接的定单的数目:/ u' T# N8 v9 A( Z* A
TRANSFORM Count(OrderID)
7 G. [! v; T% E, k( q. gSelect FirstName&’’&LastName AS FullName, P. y3 s( x5 ^" S; F) v7 r
FROM Employees INNER JOIN orders
$ A4 j/ ~" X$ q8 J) C$ k$ FON Employees.EmployeeID = orders.EmployeeID5 d6 O9 k3 m& k, [! q, F6 e ~
Where DatePart(“yyyy”,OrderDate)= ‘1996’/ Q& A6 v% E/ }% L9 L
GROUP BY FirstName&’’&LastName, S; G9 g# e" B& C5 g5 _! e6 [# z! H
orDER BY FirstName&’’&LastName3 {2 Z2 l/ ?1 R- m `& }
POVOT DatePart(“q”,OrderDate)&’季度’
' y4 P6 U, @' o0 R! N. O十 .子查询: w1 e( Q# x; A7 H+ R7 D
子查询可以理解为 套查询.子查询是一个Select语句." Q0 T, v9 G/ E, g3 e
1 表达式的值与子查询返回的单一值做比较
2 y: c7 N' m* d! [* _语法:# U* d, N$ G1 A! ^
表达式 comparision [ANY|ALL|SOME](子查询)
+ g( i6 C" O& ?1 c2 e说明:
e8 c: N8 ~: }7 q+ {& gANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.! I1 c L* @8 z
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品: z6 u; M- c. f6 Q0 ]
Select * FROM Products5 m# ?- U; C) \
Where UnitPrice>ANY: ?1 I" U( M, U" Z) g/ w
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
H7 s# z( u( ^( v* s& ]9 t9 \2 检查表达式的值是否匹配子查询返回的一组值的某个值; g7 r8 B; j# Z4 J- |( O( k6 Y6 p7 ^
语法:: I& v4 }# f( U" ]
[NOT]IN(子查询)6 }/ S' [% S1 L1 o6 |, l
例:返回库存价值大于等于1000的产品.
0 o2 N/ V( ~% O) ]5 gSelect ProductName FROM Products) _5 r) `2 W+ U7 u
Where ProductID IN( n" v0 ?( N/ N0 U
(Select PrdoctID FROM [Order DEtails]
/ x- S* w; d6 A# |( |& `: o5 vWhere UnitPrice*Quantity>= 1000) c5 \+ `1 ~* R! J+ ?/ v; H- \5 ^
3检测子查询是否返回任何记录
. w& Q' f( X! i& e* F2 H* R8 V7 u语法:) r" n$ D1 `) V9 S) I) I' l+ w
[NOT]EXISTS (子查询)
) t) [1 k" z' D- u! S7 g例:用EXISTS检索英国的客户- R# o* S7 U: c1 e
Select ComPanyName,ContactName/ k7 b S' k% S# U# V$ I9 _
FROM orders
0 h( n5 A" v! V( Y; \9 X/ SWhere EXISTS' S: y4 I: L# Y9 ?! J% v, |
(Select *
, T7 m8 h5 U/ N" |4 {; ~FROM Customers/ r/ a& J9 J6 ~3 S- G7 ?
Where Country = ‘UK’ AND2 J6 b$ f2 t- v/ _
Customers.CustomerID= orders.CustomerID) |
|