- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法, [1 p. z' [* ~5 w' C- I, y' G
9 O6 t: o4 X/ O. mselect distinct 字段 from 表名
& R; V0 u: U+ Bdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
7 B" {# s8 a& w+ l* d8 f# J一.Select语句的完整语法为:
; R/ i6 i5 L! Y% MSelect[ALL|DISTINCT|DISTINCTROW|TOP]
; Q" v( H8 ]. T k{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}) [8 G5 M! C4 u" ^8 Z9 |+ R( y
FROM tablee xpression[,…][IN externaldatabase]: u) O n6 e! C3 _% B6 `
[Where…]+ M0 h4 d0 @8 B+ ]3 ~
[GROUP BY…]$ o' O7 Y' ]: I
[HAVING…]
6 Q' S5 K a$ d8 N[ORDER BY…]9 z/ U- p$ [( o9 f
[WITH OWNERACCESS OPTION]
1 |* D# t8 e) y: Z说明:
+ ?# B9 q4 L* Q3 \3 _8 Q; B用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
0 j3 l* [+ N r. B" G1 FROM子句
) ^3 C% v$ p. H) p. MFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
* n/ O8 g9 O" }$ |$ Z: n. B例:下列SQL语句返回所有有定单的客户:0 ^5 f- @- w( A' Q _. P A# {) K. g
Select orderID,Customer.customerID
% I# I! z8 t6 [2 p# PFROM orders Customers
6 I$ S" f9 V+ wWhere orders.CustomerID=Customers.CustomeersID
4 V: m* l2 b& c) r: A) r- D0 P2 ALL、DISTINCT、DISTINCTROW、TOP谓词" S u8 V. `2 n
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
) V) i( q/ I* ]1 I! w, c7 }例:Select ALL FirstName,LastName: f, B1 w* Q7 E( G+ f/ E0 A, g
FROM Employees
; b( f' r+ `! w' V(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
: p7 H/ W( v! h! k" `- _(3) DISTINCTROW 如果有重复的记录,只返回一个
0 i- U( g M7 S(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
9 n! b) p! E4 w( v例:返回5%定货额最大的定单
6 K9 c: t/ t/ M; ?Select TOP 5 PERCENT*
5 ^7 f: h$ E7 ^- V% hFROM [ order Details]
6 Z/ l: g4 ^" ZorDER BY UnitPrice*Quantity*(1-Discount) DESC
/ k/ n$ q5 c: y# {; ?, u+ @& r3 用 AS 子句为字段取别名+ @: B8 t4 F7 z0 R ?7 {; g, q
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
1 j; W+ t; A. W& R4 t# x例:返回FirstName字段取别名为NickName
4 Q& C% s1 y T! r0 ISelect FirstName AS NickName ,LastName ,City8 j- `+ u* O: a( a
FROM Employees, d& o# v: x( @: z, N- |; |& i3 R
例:返回新的一列显示库存价值
4 t- q: n. j1 z, ySelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock5 C4 r. N! [) K
FROM Products
: {; m( O( a8 v- W8 I9 N二 .Where 子句指定查询条件
0 [1 f- s E! N. p1 比较运算符
" L) U7 u7 l ~! R/ k1 D8 F$ }比较运算符 含义3 L3 i; t8 e. W% o D' K, r
= 等于% Z( r9 A0 f2 i0 W. M
> 大于! ?; O2 h0 o- h" O( W
< 小于
, A: G5 @) L$ G8 `>= 大于等于3 N @& r5 r2 P
<= 小于等于4 a0 I; \% v- [7 Z% M/ E3 F
<> 不等于
. c; y0 W! A' b1 r. X!> 不大于, @. Q4 I$ r, k9 H0 T6 x H+ k
!< 不小于
6 l6 m: H7 d+ T例:返回96年1月的定单' Y& g, I0 D4 I5 p
Select orderID, CustomerID, orderDate0 y8 b, E$ Z8 |
FROM orders/ M1 {" ^( p/ P; F; i
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
* t8 @6 c4 n" {+ H9 ]注意:
6 _5 L; I! J5 zMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。( t8 r1 r$ w! L$ m
例:! O, o( X1 W! j$ N
Where orderDate>#96-1-1#. ]/ g( M& e; E. W
也可以表示为:; \ t3 D6 c& l
Where orderDate>Datevalue(‘1/1/96’)
" g2 E& ?3 c3 D' S使用 NOT 表达式求反。
" B1 E* G8 J/ H3 d例:查看96年1月1日以后的定单- c8 T( j, T. b; f0 B# w& j
Where Not orderDate<=#1/1/96#
; s4 K, |, N, _2 h2 s5 t, A- c2 范围(BETWEEN 和 NOT BETWEEN)
- [, ?* D, U l8 nBETWEEN …AND…运算符指定了要搜索的一个闭区间。1 z0 @& e6 b5 a: }/ K5 [$ P* X
例:返回96年1月到96年2月的定单。
: f/ a! P1 v$ c' I( {, c3 B7 fWhere orderDate Between #1/1/96# And #2/1/96#9 b+ ?9 C+ m* Y/ L
3 列表(IN ,NOT IN)
, U$ H4 G5 O3 p. p/ DIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。+ n+ Q1 l6 q# Y2 j0 ?- G- f5 t4 R
例:要找出住在 London、Paris或Berlin的所有客户 t& I& J6 @& @: s. w* Y9 J
Select CustomerID, CompanyName, ContactName, City
4 y9 h( K; N2 H& b# PFROM Customers
+ w( f% H* N9 @Where City In(‘London’,’ Paris’,’ Berlin’)
`' x1 J7 a4 o& o V) ?! w5 ~4 模式匹配(LIKE)
* z% ~* e7 N! j; |' JLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
' [ B6 [# O( H, x, i1 yLIKE运算符里使用的通配符
4 K- Z1 ?$ i# y: s: Y- D2 h通配符 含义
* P' X% G6 v( V: n? 任何一个单一的字符
4 q/ s C+ B; F) R' Q2 H7 ~* 任意长度的字符5 d1 R) u! G2 m% j+ d/ D; g
# 0~9之间的单一数字
1 x8 R! J, O( } ]1 t* X2 n[字符列表] 在字符列表里的任一值
; f- h, s( F" K1 {$ J2 O, E! J1 ]4 |- A[!字符列表] 不在字符列表里的任一值
* G6 T0 H/ t% T+ L8 T5 ]6 @" h+ }- 指定字符范围,两边的值分别为其上下限
2 u. ? _- v7 P: k; V例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户# u- x/ l3 ?& E0 E7 e$ o
Select CustomerID ,CompanyName,City,Phone
( h8 b- ~: J" J- i* ?0 n, rFROM Customers
o# g' K W1 E9 | T! qWhere Phone Like ‘(171)555-####’
( h; g$ _6 o }- Q3 Z" G. }1 ALIKE运算符的一些样式及含义
! _2 V% Z; [2 \1 D2 A' }( E样式 含义 不符合
0 ?8 ~# R4 W5 g9 a' KLIKE ‘A*’ A后跟任意长度的字符 Bc,c255
5 K, ~1 }$ T! z9 G l# LIKE’5’ 5*5 5555 t q& m% i6 q- T2 K
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
5 O* k0 O# B4 a5 ]# Q6 ]LIKE’5##5’ 5235,5005 5kd5,5346
! X. B+ Y* f4 }* \- @; ]0 MLIKE’
4 F9 ? z1 [5 J/ i* H[a-z]’ a-z间的任意一个字符 5,%$ I3 `1 L3 r( }
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1& p' o/ t a: D7 W* _6 c
LIKE’[[]’ 1,*
( d( L: s4 g! o" {9 F. {0 C( \三 .用ORDER BY子句排序结果
5 C7 Q$ s0 z9 m/ v& p sorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。' d& x( S' q' P
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
8 V! z- z' \5 G7 {4 b$ X例:
) e! t8 N; b: J4 y3 SSelect ProductName,UnitPrice, UnitInStock3 A- G; s. p+ K
FROM Products
8 S7 q& \+ h7 K+ E3 O- E6 y! ~7 q, AorDER BY UnitInStock DESC , UnitPrice DESC, ProductName/ a$ p) \6 {$ Q2 j- t
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
7 p2 e* u" |2 s( |例:下面的语句产生与上列相同的效果。
( F: q- n" q1 Q) W8 n* S% e+ tSelect ProductName,UnitPrice, UnitInStock
2 k4 c2 G: K; F8 p' Y! aFROM Products9 h. H7 I$ s4 c7 W2 ^" f! x
orDER BY 1 DESC , 2 DESC,3) X0 D: q9 p; J# r! d9 x
四 .运用连接关系实现多表查询
4 x- Q6 {2 f" ^8 W例:找出同一个城市中供应商和客户的名字
2 \2 W' r( T2 FSelect Customers.CompanyName, Suppliers.ComPany.Name
- J8 x' b! I: U oFROM Customers, Suppliers
$ @: I2 @& s7 c$ R qWhere Customers.City=Suppliers.City% m- `+ f, f- N
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
5 t8 [5 }+ m% |" DSelect ProductName,OrderID, UnitInStock, Quantity
3 k: ]0 _' X! n* vFROM Products, [Order Deails]
: j' G' b* o9 L( oWhere Product.productID=[Order Details].ProductID! H4 v3 _ L) L4 G+ _* U0 d* F& A' Q
AND UnitsInStock>Quantity
# z; {9 x$ E( {: t5 V另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN2 I2 i# a k: o& R' |
语法:' k1 i$ |5 K# q& B8 w
FROM table1 INNER JOIN table21 s! _ t' S) j) T
ON table1.field1 comparision table2.field26 G! M; F1 |0 h. g9 G( B3 h
其中comparision 就是前面Where子句用到的比较运算符。. [* @# V+ g" k4 A) y
Select FirstName,lastName,OrderID,CustomerID,OrderDate% C- G( P# P6 c0 ~5 V( d6 P) A
FROM Employees! b& m% V/ h) M l) V
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID; n; F1 M) {! G* V- N
注意:
+ F8 B" x7 g8 c+ AINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。9 \* _/ d5 T! I1 C
在一个JOIN语句中连接多个ON子句 @8 I2 \0 m$ N' Q. {; R0 O( T2 Z6 @
语法:
8 l' ~6 f4 S) C4 bSelect fields( O( i; j7 m) h3 O5 V# G, B# Z
FROM table1 INNER JOIN table2
) [, b: Z/ Y, m* FON table1.field1 compopr table2.field1 AND( I1 m+ N0 K' d8 j
ON table1.field2 compopr table2.field2 or
. _ U1 R0 u, i* n" [) i( e% fON table1.field3 compopr table2.field30 S Q Q9 B( h$ [- S$ Q. a
也可以' Y# ]0 @9 Z" W" z, |
Select fields
, d, g1 V7 \( o6 e7 HFROM table1 INNER JOIN2 L4 Q5 d- Y, v
(table2 INNER JOIN [( ]table3( A: U6 M2 |; V+ U; `2 ^3 F
[INNER JOER] [( ]tablex[INNER JOIN]
* q% N# @! x7 O% g+ x4 u# w3 rON table1.field1 compopr table2.field1- W* c! A- I; V* J
ON table1.field2 compopr table2.field2; D$ r2 r- W( g0 n# C, m# R
ON table1.field3 compopr table2.field38 W7 m3 ?; ]" d
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
& b! j: }6 Z1 N3 U7 JFROM table [LEFT|RIGHT]JOIN table20 y% e f. K. h/ q7 A* t
ON table1.field1comparision table.field2( n* y C. ^# e# z! |( \
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据2 {4 l3 j! `( C
例:不管有没有定货量,返回所有商品
4 A0 ]" h- _6 f" U( y! ISelect ProductName ,OrderID$ S; j( {9 p; a+ l4 q) H1 C/ E0 b5 c
FROM Products
& Y4 ~& L+ _, `1 S! qLEFT JOIN orders ON Products.PrductsID=Orders.ProductID3 q7 l! O0 ^! A3 G6 C
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。$ E. ^* e- d7 I4 @
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
, w* O7 ]+ _: K+ _- b2 h, V! P1 v空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
; f4 i+ Z4 C, G% P+ P; L8 ]. gSelect *& |# C; ?, |4 Z, [
FROM talbe1
* [2 T/ s8 `6 A, d$ k/ K$ ?8 vLEFT JOIN table2 ON table1.a=table2.c1 ^0 o5 @1 D4 h. S4 N
1 连接查询中使用Iif函数实现以0值显示空值' y( X3 `/ a% S) n+ C
Iif表达式: Iif(IsNull(Amount,0,Amout)1 [* I- Q5 X% V$ F/ G
例:无论定货大于或小于¥50,都要返回一个标志。
% M) I5 h" |$ c: rIif([Amount]>50,?Big order?,?Small order?)9 H# D1 v: M6 }$ [
五. 分组和总结查询结果' Z' `- X- d! B9 N6 O
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。( v; o2 s/ f* z; M! ?4 ^1 o
GROUP BY 子句的语法
i2 F( g3 b* g! R0 h; j( bSelect fidldlist
$ U5 A; L8 y+ Q& ?# {6 E# c/ @FROM table m7 m3 \# X9 m, r2 r
Where criteria) D/ N6 f) r7 D! l6 `
[GROUP BY groupfieldlist [HAVING groupcriteria]]
- Z' d5 E4 U# L$ H注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
& t! v" G/ W$ O+ iGROUP BY字段中的Null值以备分组但是不能被省略。
6 H/ U- ]- K0 K. M; v" B在任何SQL合计函数中不计算Null值。5 X+ L o' e& e, T8 Z3 }, ]# o
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。6 q$ B" `( v8 x! ~1 E( V" G: z5 j
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
9 G. [! _' E" YSelect Title ,Count(Title) as Total
: a. @" b, I. M4 y9 U2 YFROM Employees
4 @: Q% p3 D4 g% W7 O- HWhere Region = ‘WA’
. t6 d+ Y* d1 g' UGROUP BY Title$ Y6 m1 e8 O6 W! b/ w
HAVING Count(Title)>1
) I, x' ]* m" ]# yJET SQL 中的聚积函数
6 y8 @7 u7 Z/ z1 q8 S: w: s聚集函数 意义
+ w; c! F% Z( C v0 k _! p: BSUM ( ) 求和 [ o, p& R. \' [
AVG ( ) 平均值
7 F/ j( L7 Z7 W/ X5 e6 K- NCOUNT ( ) 表达式中记录的数目# c% \" O! }, q- z
COUNT (* ) 计算记录的数目. g- J; i1 O3 D% K
MAX 最大值
% a- D+ k/ J" _+ z k% O$ S, t3 Z/ @% |0 iMIN 最小值' \( M: W9 _& b- C u- r. j* ~
VAR 方差" @7 G7 Y% M: \0 ^
STDEV 标准误差
) q3 H# n: T. U6 c# a* X: BFIRST 第一个值$ m; M' X' d6 C0 r. R( u# J! L
LAST 最后一个值
) O) N2 s/ ]7 s: |2 R* L4 b六. 用Parameters声明创建参数查询
/ I' b! Q' C% d" l5 n ^7 dParameters声明的语法:
* Y3 \6 |2 b, b; g6 a, h1 iPARAMETERS name datatype[,name datatype[, …]]
( m+ D' ?1 c4 o其中name 是参数的标志符,可以通过标志符引用参数./ i; j6 G" r. U; ]* |8 P
Datatype说明参数的数据类型.( V; y# ^5 `" v# \1 |
使用时要把PARAMETERS 声明置于任何其他语句之前.
5 L/ K: Z4 d, Q. s4 p例:
. m/ @6 Z$ J; x( N- S- O+ `PARAMETERS[Low price] Currency,[Beginning date]datatime
V4 B( Y k# s: s/ T" S7 d$ R7 T0 {6 FSelect orderID ,OrderAmount
) \$ Q% c7 {( y) o3 p: ~FROM orders
) g+ a6 B, A' r( m3 L+ G& EWhere orderAMount>[low price]7 L* R0 k [: D* [/ f; i8 w
AND orderDate>=[Beginning date]. E: |* R: p# b, Z) I. V, z* q; C4 w
七. 功能查询
* F) s9 }+ Q, Q所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.) j5 y, L# e1 Z! S$ J3 Y8 I
1 更新查询: _ C5 R0 r/ D4 B* ~
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值. |1 k" S" P- F9 _% L: r) v
更新查询语法:1 `' Y$ x3 ~) \: Q& C$ \
Update 表名
4 ^/ u* z# R. W) T5 \3 aSET 新值 q" Z) t' D5 M/ I8 l3 g1 ~
Where 准则
; N0 q6 l' _7 \7 t* n例:英国客户的定货量增加5%,货运量增加3%
1 Y I# S# _5 x* Y; Y! }& ZUpdate OEDERS
E; n. N- Y. D4 ~1 o( w4 d6 _SET orderAmount = orderAmount *1.12 k2 z5 C! ?: ]: ~" I
Freight = Freight*1.03
7 g4 z) _& _. X vWhere ShipCountry = ‘UK’+ R$ E b4 {2 `& s! ^) B
2 删除查询+ Z5 n: |! M/ E2 a7 N( g4 q
Delete子句可以使用户删除大量的过时的或冗于的数据.
. y; v4 k$ u! |+ q# c注:删除查询的对象是整个记录.
" G; v3 ^1 [8 q. C0 R3 pDelete子句的语法:" g0 F% U( @8 d9 } w) k* b
Delete [表名.*]
" Y9 R* y, K4 k [6 ?) ~' c6 _% WFROM 来源表( M- Z( t6 l1 {! [
Where 准则
' I7 r% {& K9 v" P* A8 _- M+ j4 m例: 要删除所有94年前的定单' F% F1 y1 i# y& b- ^
Delete *
" G9 j6 |) ~5 f7 |+ X! F& U' Y0 y4 OFROM orders: c/ ?' X! @/ D4 }* [
Where orderData<#94-1-1#
3 Q; M+ H! p9 I6 z; W; K( e% P2 i; T3 追加查询
/ [& J3 N+ p0 @# o/ X+ ], nInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
( A; k, _+ C* |- K: h `1 lINTO 子句指定接受新记录的表. O7 F. q, r3 _9 p/ q
valueS 关键字指定新记录所包含的数据值.
2 \8 t w/ s2 O: ~( T% R CInsert 子句的语法:
$ m$ Y+ p$ _+ J8 a! cINSETR INTO 目的表或查询(字段1,字段2,…); D$ @7 u/ J/ `1 f3 b
valueS(数值1,数值2,…)
9 O* s; n# d% [2 q例:增加一个客户& B: {8 s! H5 {, M' Z" O. G6 u4 `# p
Insert INTO Employees(FirstName,LastName,title)( T3 v7 }/ W, W5 y; A3 g" [
valueS(‘Harry’,’Washington’,’Trainee’), B* r# D) d( O/ ?/ c. o/ z9 }
4 生成表查询7 e; B: v a0 G' f3 ~" [3 z+ }
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
/ e p! b7 |. C D6 z+ l' cSelect INTO子句用来创建生成表查询语法:
( L7 i! q2 K2 B# ^0 y: cSelect 字段1,字段2,…. K3 f" F3 h4 h- Z/ z' P
INTO 新表[IN 外部数据库]7 r* u c. g4 ]( e
FROM 来源数据库) H% U, x' \& R4 |; h( l) h
Where 准则 l+ i6 h7 c5 h% a1 {! [
例:为定单制作一个存档备份. h6 T m/ w) R/ B3 k- o
Select *8 P8 R! u7 h, O+ T
INTO ordersArchive! [- K; s* \; U2 S
FROM orders
+ b9 S G" C& _5 _2 U八. 联合查询
+ F$ u, h2 G' h9 P, w. eUNION运算可以把多个查询的结果合并到一个结果集里显示.
( y5 [+ }3 y- \- sUNION运算的一般语法:
; T. y9 G% e0 }[表]查询1 UNION [ALL]查询2 UNION …: B$ z0 a1 i' l
例:返回巴西所有供给商和客户的名字和城市
% F* K( {/ p0 p9 X9 i+ |Select CompanyName,City0 m# o7 L; ], b- `8 c$ I
FROM Suppliers
D, v& _& k: k/ KWhere Country = ‘Brazil’& H" e* Q' a' a! o3 y% G
UNION
9 ~8 ?- g r, PSelect CompanyName,City' {% ^7 Q* z4 w6 j0 ]( k
FROM Customers% w2 y- c5 a1 J" L
Where Country = ‘Brazil’
0 a* c8 W& h+ W2 |7 k g注:
" _* G" x& ?, Z2 A缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
9 Q% Y5 A# h m! E( Q1 X0 _UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.; s0 O/ o7 U7 X2 ?
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.0 } a) G7 i7 Y
九. 交叉查询
$ C: F$ z6 s2 f. }' j交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
( N4 g+ r; s h3 bMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:. f @4 `/ Z$ @2 O9 y& p
TRANSFORM aggfunction' ?) N: K* f I$ T, W8 u! m
Select 语句
5 L# u% R) a: v }' F/ tGROUP BY 子句
) D$ |9 V7 r8 ~. R) l5 ePIVOT pivotfield[IN(value1 [,value2[,…]]) ]
( J- ?+ ?: @% R1 P& s0 I3 uAggfounction指SQL聚积函数,
% e5 `8 f% N8 K3 _5 o1 d3 ] HSelect语句选择作为标题的的字段,
$ q* B" V2 R- o( V! u% SGROUP BY 分组; \! O6 J' m9 B5 C3 ?2 A7 B4 v
说明:# L. K# G4 r3 ~: { q% R% |0 ~, U
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.7 n7 n5 \& h+ t. ^
value代表创建列标题的固定值.) a8 n J1 F. @- }6 l* V
例:显示在1996年里每一季度每一位员工所接的定单的数目:9 j+ t; s( R p Y
TRANSFORM Count(OrderID)
' G% ~- q5 e1 O7 U cSelect FirstName&’’&LastName AS FullName3 Y6 e0 ]( {' W' @ x$ [. B
FROM Employees INNER JOIN orders o4 B5 Z, h% W4 p
ON Employees.EmployeeID = orders.EmployeeID6 ?) K# e; ^3 U# p
Where DatePart(“yyyy”,OrderDate)= ‘1996’$ K5 g! h4 Q( N% X$ f
GROUP BY FirstName&’’&LastName7 G. C8 V" y5 ~$ K# D
orDER BY FirstName&’’&LastName6 p- r; S6 `" O' j* G1 s7 x. Q/ e0 m( e1 O
POVOT DatePart(“q”,OrderDate)&’季度’
9 E) v9 \( j: j! A十 .子查询
; }5 n) H+ k" [6 |. e子查询可以理解为 套查询.子查询是一个Select语句.
; Q/ z4 V6 @2 T; N8 u1 表达式的值与子查询返回的单一值做比较# y- p! C4 h3 N2 T
语法:. S8 |/ B9 w v$ d2 {
表达式 comparision [ANY|ALL|SOME](子查询)2 E% q0 ?! t: Q/ Z* i
说明:
1 `& ~4 g6 K" ]+ k- E. SANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值." ?2 `# [7 k# [) `( F
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品/ g0 {- Z% @) M9 ^
Select * FROM Products
- X( i& o; T+ F4 h7 @Where UnitPrice>ANY6 @8 ` j% x3 ?" l1 n! O6 e
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
2 m2 D8 O3 `) w1 W& b) H* ~; q: F2 检查表达式的值是否匹配子查询返回的一组值的某个值
* d0 P. s. |3 M9 d语法:
q6 ~* Z" c8 {4 n/ ?[NOT]IN(子查询)! t5 l7 v& s, n' G+ [
例:返回库存价值大于等于1000的产品.
5 Y! D3 m' o0 g) c) Q8 M" jSelect ProductName FROM Products
* c- f5 R; i# f' S9 \Where ProductID IN
! O5 G* M7 N( }8 X8 X% _' p3 L(Select PrdoctID FROM [Order DEtails]( o* Y2 J8 r. V" ~, Q
Where UnitPrice*Quantity>= 1000): B& w- a' S$ N
3检测子查询是否返回任何记录& V; h& F1 S- R$ y( q. ]0 ~! z
语法:, N7 L/ M0 }6 S) K
[NOT]EXISTS (子查询)0 `. R: ]( T, b$ [
例:用EXISTS检索英国的客户4 k. f; K J7 r6 k
Select ComPanyName,ContactName
$ ?) b3 y4 U* \& B* P7 cFROM orders
( ?3 Q. X* V' D1 n" O$ ]: HWhere EXISTS& k& r9 n0 ]8 A* F/ M& E) P
(Select */ N& T; ~; ]7 V; U9 c( u
FROM Customers; b, }$ \+ i' G- _: ^( |8 K3 N
Where Country = ‘UK’ AND# }, P2 q- m9 K5 d; H8 r5 a
Customers.CustomerID= orders.CustomerID) |
|