- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法. P2 H5 c8 Y' C& H
0 n: \5 K0 l8 g+ O& A5 d! h* aselect distinct 字段 from 表名. e8 P O( i5 q) U( d
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
! g, F2 o& C$ T3 J8 |' F& M一.Select语句的完整语法为:' Y+ q1 [! O0 d6 G7 \- j! J4 w* Q5 t
Select[ALL|DISTINCT|DISTINCTROW|TOP]
# K& C" h" z1 u% K{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} {3 K# o% @3 g+ @6 |) n- q; ^
FROM tablee xpression[,…][IN externaldatabase], D' D$ Z# [" _0 B/ d
[Where…]- b" S# a6 F3 V# O0 w! W4 {1 H# }
[GROUP BY…]: |& G2 x; w8 I3 I4 n4 }
[HAVING…]
6 w' t+ p- G2 m[ORDER BY…]3 \* ]5 {$ ~ m# i0 `; ]
[WITH OWNERACCESS OPTION]
1 {# w, S# c; r! T- s' B, g说明:
* S. q- q6 W! W* G: A用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。* o8 C" I) U+ d+ i1 I" n
1 FROM子句
$ e, ~! y2 B& @# IFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
+ G+ ] S; N& L例:下列SQL语句返回所有有定单的客户:9 ]7 X; L7 @2 ~1 q6 D
Select orderID,Customer.customerID
8 T! s+ B! `$ [# [FROM orders Customers
) r/ E8 D O/ ?: v: MWhere orders.CustomerID=Customers.CustomeersID2 E. P- c3 h2 D6 {' Q
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
z& L+ j! A. S2 M4 j* |9 ~$ [1 Y(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
9 A* n( `& N+ U% |& f ^例:Select ALL FirstName,LastName/ x: X0 E. v- a" M5 B
FROM Employees7 g" x- o9 e: Y' ~& ?9 p# L, v+ M
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。) Q2 b+ N* H: u- p
(3) DISTINCTROW 如果有重复的记录,只返回一个8 Q/ ~$ u$ i8 E% [9 h% G
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比): c1 Z" p- ?) E! w7 j9 g/ ?8 y
例:返回5%定货额最大的定单
2 f7 j, E0 v5 V) A" T* x4 oSelect TOP 5 PERCENT*
; q) e) D3 Q* }. r' OFROM [ order Details]: U/ ^6 N: Z5 j9 o
orDER BY UnitPrice*Quantity*(1-Discount) DESC
7 Z$ \) ^1 ]7 h9 `! ?4 w3 用 AS 子句为字段取别名& X' o: ^! G3 G( @$ L
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
; `& p" G; U& `. k例:返回FirstName字段取别名为NickName6 W5 R! L) @! S7 t& E: Q( q
Select FirstName AS NickName ,LastName ,City
/ M2 s+ `# ?( T2 }, x2 v! Y7 g/ W9 jFROM Employees5 \# F I9 s9 J, N# g
例:返回新的一列显示库存价值
" b I' b) S8 ^+ H' KSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock/ K& m [. z7 Z( g
FROM Products1 b4 `+ ]3 G3 h% w* G/ b. C) `, i
二 .Where 子句指定查询条件! j/ `- D3 F- L7 v; B( }9 c! p
1 比较运算符) V) ?; A3 q+ s; _- y9 B
比较运算符 含义+ Y( @5 f( ?4 H* Z9 ~: I
= 等于
' f1 [7 V% I' c J% B# E) {5 Y' m d> 大于, A& U7 y* x* P+ P3 @; K
< 小于
/ O: G2 G# n% E>= 大于等于
' z. _% n. O6 G- ]5 V3 F( Z<= 小于等于1 k& r, _9 K9 c! R
<> 不等于% Q( J8 n6 U- M' H! F6 r2 v1 y% S
!> 不大于
D5 V" ]7 s& I# ~# `!< 不小于
8 q. J# h0 X8 s/ `例:返回96年1月的定单
- _9 _, k2 N, ~$ O% r; wSelect orderID, CustomerID, orderDate1 S& t( a: d- ~( X5 r
FROM orders: J$ \" C B4 e% K# }0 X& v( ?0 O: o
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
3 U# q$ ^% R7 }3 S注意:) Q$ u r2 R1 i7 w% c9 j
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
$ b8 t' b: a- t% \2 O例:
* p" K+ k8 g5 D$ ?Where orderDate>#96-1-1#( Q- ^: i9 O( D% \$ [# e
也可以表示为:' r3 B( |/ G, s; V: r% B
Where orderDate>Datevalue(‘1/1/96’): X1 q0 p4 E/ u* ~+ D1 S- K
使用 NOT 表达式求反。; y' u% E1 {0 Z, P' Y
例:查看96年1月1日以后的定单/ H5 i1 Y" R) { N: Q
Where Not orderDate<=#1/1/96#
7 ^+ r8 z; N4 |2 范围(BETWEEN 和 NOT BETWEEN)% L G2 |) `1 b, ^/ T+ v
BETWEEN …AND…运算符指定了要搜索的一个闭区间。0 V+ L" q0 c, T1 G4 J
例:返回96年1月到96年2月的定单。
% x9 n( D% c6 g- }, \7 Q$ ]+ _7 xWhere orderDate Between #1/1/96# And #2/1/96#
4 J) \ B1 E- M. u3 列表(IN ,NOT IN)
O2 F6 i: i, H7 |1 R/ l8 vIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
$ u" J3 @* l0 u. T3 C% \例:要找出住在 London、Paris或Berlin的所有客户
& X( `. d. g/ I9 t, k0 [Select CustomerID, CompanyName, ContactName, City" R7 ~5 m% R4 s/ L7 h; Z$ o
FROM Customers; G5 n/ t6 ~' `
Where City In(‘London’,’ Paris’,’ Berlin’)
* j, }: F+ B- ?9 p7 M. D- u' \4 模式匹配(LIKE)0 N+ d! E g2 R" S' {" Y
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
& ?1 t m+ O( R. N5 e4 d- r$ lLIKE运算符里使用的通配符! S! s& t! f8 ?5 R, n2 p3 ]
通配符 含义
' r8 C5 _$ m. n: K' B? 任何一个单一的字符
5 N& ^+ r2 z' E% V. G( `* 任意长度的字符& A- U: w- h: Q& [' L0 d
# 0~9之间的单一数字6 L3 K( r/ W% T. h3 n
[字符列表] 在字符列表里的任一值
3 H6 O4 E* d% _1 o. D8 v[!字符列表] 不在字符列表里的任一值3 E- J( F: B3 a
- 指定字符范围,两边的值分别为其上下限
7 l: g$ O' g3 D R5 W例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户/ D1 V; |5 r, ^
Select CustomerID ,CompanyName,City,Phone. h, F$ x4 ^: T5 L$ G
FROM Customers$ M# d B" `0 J+ l' M7 D# _
Where Phone Like ‘(171)555-####’
! K" U2 R. m+ _LIKE运算符的一些样式及含义, f1 k$ U2 U& w3 J$ S
样式 含义 不符合# k4 p& s8 X" D6 e3 c
LIKE ‘A*’ A后跟任意长度的字符 Bc,c2550 f; Y$ U" p1 }$ h
# LIKE’5’ 5*5 555
2 ?9 R# F( u0 ALIKE’5?5’ 5与5之间有任意一个字符 55,5wer5" S1 S3 K9 m$ f' L K2 _. d. w* G) b
LIKE’5##5’ 5235,5005 5kd5,5346
2 E( Y( C* ^% XLIKE’8 r8 ^8 T2 q2 _, C& X
[a-z]’ a-z间的任意一个字符 5,%
4 T% L8 {5 }. C" {3 H7 [' S' L8 nLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
# J/ @, H4 d/ ?3 ZLIKE’[[]’ 1,** e# c$ r& w+ z
三 .用ORDER BY子句排序结果% d; p! c6 ]! E1 _9 d
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
) L' @2 y5 ?% V! t9 porDER子句中定义了多个字段,则按照字段的先后顺序排序。
$ y5 [, v- s8 L) P- Y( W% D( z9 l例:% M5 d- z4 d X5 z9 I! q
Select ProductName,UnitPrice, UnitInStock
7 q3 B" \! \& {. k6 q! @4 `FROM Products
2 h! z- G& G0 @: morDER BY UnitInStock DESC , UnitPrice DESC, ProductName6 I/ D7 r/ k( ?* q1 @' C2 h
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
+ Q' _8 t$ z2 a3 v4 N例:下面的语句产生与上列相同的效果。0 P) v0 _8 B$ ^
Select ProductName,UnitPrice, UnitInStock' a* _: q: v) o1 P* h3 T
FROM Products, u% B6 I0 ]# C7 j) M
orDER BY 1 DESC , 2 DESC,3# z5 w% k5 t& y6 u( d3 D
四 .运用连接关系实现多表查询5 ^( B- V/ Z; _5 e
例:找出同一个城市中供应商和客户的名字
2 n6 W8 g5 x7 i8 C+ ~5 gSelect Customers.CompanyName, Suppliers.ComPany.Name! [8 w& x9 A& z" c$ S! R: @
FROM Customers, Suppliers3 F! {7 b7 o1 @3 ]0 p* u- A4 n% q P
Where Customers.City=Suppliers.City
5 I; N/ E7 t# `1 o; N, l例:找出产品库存量大于同一种产品的定单的数量的产品和定单8 T& L9 v* ^+ ^6 r* y
Select ProductName,OrderID, UnitInStock, Quantity
2 y2 Z. W- {. h6 s/ X( d) j0 }FROM Products, [Order Deails]
9 i3 E9 Y2 J' W- M& x" bWhere Product.productID=[Order Details].ProductID9 F3 t2 V ]! @# K: G7 M' c) r1 M
AND UnitsInStock>Quantity/ b8 |" p9 c4 b, { W' [" r
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN/ b. Z* d1 Z5 G9 H& x4 t
语法:
, I4 _4 s" \6 `/ oFROM table1 INNER JOIN table2
9 r0 K- E) H* B; I% XON table1.field1 comparision table2.field2
6 q" g; u5 V- j% x其中comparision 就是前面Where子句用到的比较运算符。0 q. i, J# c. O9 n2 Z: T' V
Select FirstName,lastName,OrderID,CustomerID,OrderDate3 C% }4 V7 r* k& y9 \. R O
FROM Employees. O7 x" h# O3 h) I5 y
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID) A, a8 h1 E# H. f
注意: k7 E# V0 J7 l0 _6 K
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。5 y, E1 K6 j4 Y9 z: U
在一个JOIN语句中连接多个ON子句3 I7 a" v# s; Z4 V
语法:2 |+ ]$ R I! H9 I3 P
Select fields; v0 n B$ L; k4 q# a
FROM table1 INNER JOIN table2- T& R6 k/ d0 S
ON table1.field1 compopr table2.field1 AND
U5 o z- N JON table1.field2 compopr table2.field2 or4 n7 ?! E, ?5 c
ON table1.field3 compopr table2.field3! L; ^, d+ S& M. a0 v$ G
也可以
9 N* V: B" [3 o2 y: ?Select fields0 h& a" J, k0 E; Q+ K$ i9 q5 N
FROM table1 INNER JOIN
3 y& }8 O* K! @3 W9 X! e(table2 INNER JOIN [( ]table34 Y( t4 i! y0 M7 n, V% z
[INNER JOER] [( ]tablex[INNER JOIN]& |6 a$ o3 D ?7 l+ E5 k5 i
ON table1.field1 compopr table2.field19 X4 d6 _+ `4 V
ON table1.field2 compopr table2.field2) [0 ]' Y2 F2 W, g& h" W
ON table1.field3 compopr table2.field3
. J" h6 X6 i% p1 r) h! L/ P外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
, Z; E4 A( }- OFROM table [LEFT|RIGHT]JOIN table2
" o+ Y ~/ M7 N# @: S! aON table1.field1comparision table.field2
9 x( @0 ~* U3 q3 u: @: H' t用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
$ c7 K7 r @0 d b# K例:不管有没有定货量,返回所有商品
- Z! F/ g2 C6 \4 Y/ H! YSelect ProductName ,OrderID8 X9 e7 {) g8 z, a) B+ b
FROM Products( T1 c7 }/ D( S/ c8 Y, A
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
" M, B5 i# D" H7 O& m! v右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
( k( [$ `$ X/ Y" v6 h; \例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
$ ~5 g) P7 s' e: e$ ~; l空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
$ z/ E' j3 f5 y2 R8 [Select *
; ~7 |, T7 w5 ]- l' ]* x: u8 @FROM talbe17 j( r" m6 I" }. h/ Q% W0 S
LEFT JOIN table2 ON table1.a=table2.c' T+ F2 e! I' |) O' p! n5 q
1 连接查询中使用Iif函数实现以0值显示空值
: ^5 k* O+ `4 c6 B( |Iif表达式: Iif(IsNull(Amount,0,Amout): Z. J" w$ w' B6 j
例:无论定货大于或小于¥50,都要返回一个标志。
3 N2 y2 d- b* @6 lIif([Amount]>50,?Big order?,?Small order?)
8 C6 k: j* C4 W2 r9 X五. 分组和总结查询结果6 ~6 W7 N6 x2 \5 X$ x
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
% ^, {/ g6 l% k0 cGROUP BY 子句的语法
9 y" J5 x. ~, ]Select fidldlist
4 s" [6 A- g6 o2 R6 }FROM table, p$ }, W' Y% P8 V
Where criteria- j) N8 j7 J8 |' o. ^9 M% B
[GROUP BY groupfieldlist [HAVING groupcriteria]]1 ^% c& U- c; w( M W4 [' y+ P
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
( O4 u- k! \* y/ ^3 C/ rGROUP BY字段中的Null值以备分组但是不能被省略。
0 C+ ^% p7 \3 y+ y; P! P; |在任何SQL合计函数中不计算Null值。5 O( c! r8 C' i5 j! B
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
/ Z- f" d9 o/ j9 [例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
" g: r0 Z3 o/ [! q8 R- |, _, @& tSelect Title ,Count(Title) as Total, T# N- U: @2 f& ^8 d [+ {
FROM Employees8 J1 I3 [0 o6 O+ l
Where Region = ‘WA’! Q K( `2 \- }! i
GROUP BY Title
7 a& ?$ Z; d& c4 t$ `6 vHAVING Count(Title)>1! U2 u0 x( j7 J" R/ P" ]
JET SQL 中的聚积函数
7 ~; |# ^8 @' W& \) B* F聚集函数 意义
4 O- S9 I. K1 v/ O4 H n2 m6 XSUM ( ) 求和& K5 N/ l& \, ]( `) Z0 k
AVG ( ) 平均值
5 A7 v$ J9 J* Y. `- I5 I; e& K5 ~: PCOUNT ( ) 表达式中记录的数目! C9 i" v c. Y& P3 O
COUNT (* ) 计算记录的数目" f7 y, O, @! x6 T- N
MAX 最大值
% f' F3 v$ i5 n( B4 N# z6 Y+ |MIN 最小值) R7 V( }3 E& w8 X: I
VAR 方差( y( o2 B) @6 Q3 B' @/ {0 P' n
STDEV 标准误差
6 J& s, ~+ \' b4 m$ U7 O3 }+ SFIRST 第一个值
, R ?. G6 X1 U$ R" r4 RLAST 最后一个值
7 x- G5 M8 ?9 z @% X7 y3 F六. 用Parameters声明创建参数查询
8 a5 M2 u9 w4 ~( d9 g) AParameters声明的语法:' K" P+ O; o9 j" R* Q, {, O. B a
PARAMETERS name datatype[,name datatype[, …]]* P3 _- }% @% d. c+ T
其中name 是参数的标志符,可以通过标志符引用参数.- Z/ h& ` `' H! h# D* c% J% R
Datatype说明参数的数据类型.
& R/ r! m, z7 W- |- u* F4 ^$ ?) T! @3 w9 `' M使用时要把PARAMETERS 声明置于任何其他语句之前.
; T4 t9 s# n. j' N+ W例:
( D4 S! ]- f8 Q8 fPARAMETERS[Low price] Currency,[Beginning date]datatime+ X- S5 J) v! Z
Select orderID ,OrderAmount# e2 l* u- d* S/ @3 n. m
FROM orders
' {4 `5 L0 R& p3 N$ q6 j# G- ~Where orderAMount>[low price]* D- K( g4 r! m3 h1 a
AND orderDate>=[Beginning date]2 @0 M5 {6 M5 v7 Q' N" X
七. 功能查询 q! Y4 X1 b, t! B* R* Y# l! B
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.0 O: T" w* ]0 I2 y: X" [
1 更新查询. o" [: D3 [. E/ g9 |1 H
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.4 v1 N. \7 I5 B8 M$ R3 r/ i
更新查询语法:
# a1 ]4 {4 O8 L5 d& tUpdate 表名0 R& V8 a5 ]5 E n' }( X
SET 新值
* ^% O/ Y, ?6 l, w* IWhere 准则
# m! j5 c% m: z. K6 z4 p! `4 W例:英国客户的定货量增加5%,货运量增加3%5 n5 Q: _; \1 n& l
Update OEDERS
0 f# W- X% o/ p ?/ ?7 ySET orderAmount = orderAmount *1.1
' m' s: S- ]$ f f' @Freight = Freight*1.03- L, e. ]. P7 d( K4 B
Where ShipCountry = ‘UK’
+ R' w- M2 V1 P7 p0 Z2 删除查询
6 r7 q t/ M4 e: X2 b1 KDelete子句可以使用户删除大量的过时的或冗于的数据.
1 W! S0 j: q" J4 w% T7 L' o; u, Z注:删除查询的对象是整个记录.
* X9 Y0 ]% B& O5 S% U# PDelete子句的语法:
1 J6 \1 I8 A/ S$ _" e1 ~3 b: WDelete [表名.*]) B6 f! d" l. i k+ p5 p
FROM 来源表. r- S3 ]$ s& P$ f1 [8 w8 c9 o
Where 准则
* u2 p! H# {; j @/ N& D* I例: 要删除所有94年前的定单- ~* ]! r; q/ j4 _1 A7 K" c2 ~4 R
Delete *
[& {1 Q, Z5 ]7 d( oFROM orders
( k# @6 x; H) Z+ X9 T+ J( BWhere orderData<#94-1-1#: ^2 e' l2 p1 ~+ o* N
3 追加查询
/ p: N; j' O: }Insert子句可以将一个或一组记录追加到一个或多个表的尾部.- [5 o2 {. c. L7 y
INTO 子句指定接受新记录的表
. G) S. L4 V$ F6 d) b" ZvalueS 关键字指定新记录所包含的数据值.
6 P3 O G$ V d/ {) kInsert 子句的语法:" }# u4 P) O/ @) M( W6 x' H. B* |
INSETR INTO 目的表或查询(字段1,字段2,…), O, o3 T0 Z& M0 D c
valueS(数值1,数值2,…)$ d3 F U+ L5 Q. R4 D! w" b
例:增加一个客户& S, ?7 a6 `6 m# B* Q2 g( n. U7 f
Insert INTO Employees(FirstName,LastName,title)8 `/ g! {4 g y; I
valueS(‘Harry’,’Washington’,’Trainee’)3 }; O) r+ B6 d0 R
4 生成表查询
- |0 S( A1 @, x4 q/ f可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.& F: |& s/ v: l- Y) o8 N4 z
Select INTO子句用来创建生成表查询语法:
( V8 r8 y0 a: r5 D5 H# iSelect 字段1,字段2,…
5 E: T5 n$ b1 h% r: p: GINTO 新表[IN 外部数据库]1 }3 X6 B7 Y I1 F
FROM 来源数据库
& o2 e. A0 n. D N* ?2 u# ]Where 准则+ I$ J Z d' W
例:为定单制作一个存档备份
/ C4 n+ R3 G4 Z- {Select *# |- M7 K$ _! \
INTO ordersArchive
8 ?+ `; i4 A+ wFROM orders0 J% _) [8 |. w! r
八. 联合查询/ R' i+ F8 {, V9 h
UNION运算可以把多个查询的结果合并到一个结果集里显示.
2 E4 F* u9 Q* Y- ]8 K/ ~' Q. iUNION运算的一般语法:
0 @3 q$ {, S" e' l% ~* C[表]查询1 UNION [ALL]查询2 UNION …
0 H! b1 j$ m% B- t1 v+ k例:返回巴西所有供给商和客户的名字和城市: g D" i7 [% i2 {- @: m( @8 q0 d( F
Select CompanyName,City& q- X, } D, A3 z# R$ L/ R4 u* g
FROM Suppliers# X& `% [+ Q/ }4 O+ b0 v) O. g
Where Country = ‘Brazil’ v" e* u& b, C' p5 ]3 _! ?8 b
UNION/ J) k; J% e- p, H
Select CompanyName,City
: A0 ] [& ~- l! n% p( WFROM Customers j4 k5 B0 z7 ~) v5 S k# U
Where Country = ‘Brazil’7 V4 S' e" ]/ b" u% O7 z( M4 ?
注:
5 l& c+ H7 @$ p5 ^9 k! a. Z缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
3 G$ p6 o( x8 P! LUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.! a4 U; V; y4 l# Z3 T, V; V
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
- q$ m' Z/ W9 L9 ~九. 交叉查询' L' k7 [4 v3 N. b: D: H" b7 T
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.5 r, o0 z2 ?- D- R1 m r Q
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
3 C' F) l+ ]" y/ j! I8 i( Z7 lTRANSFORM aggfunction3 R7 I( Z% H- }3 S5 h/ ^
Select 语句, B& n5 P1 Q! l/ a
GROUP BY 子句
! ~7 T7 j: F* zPIVOT pivotfield[IN(value1 [,value2[,…]]) ]1 @! g7 l# |4 a1 ~+ ~
Aggfounction指SQL聚积函数,7 }) b$ C% J7 Z: k' _( N
Select语句选择作为标题的的字段,$ f) F7 z( a8 E! t. _5 S, L
GROUP BY 分组! y* f- n6 A' l9 g8 B6 k A
说明:( a; d% u9 M* p7 i
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值." m; @# G8 O5 I, K+ {" H) t
value代表创建列标题的固定值.
0 C7 \9 I# Q2 b0 W2 L例:显示在1996年里每一季度每一位员工所接的定单的数目:1 w4 X# O" ?" R* B" J0 C* \
TRANSFORM Count(OrderID)( z7 ^9 n8 M5 ]+ \6 O- d
Select FirstName&’’&LastName AS FullName
# j2 l* d, Z" y2 T: N# v" M5 TFROM Employees INNER JOIN orders
/ V- a8 L$ q0 E7 w' SON Employees.EmployeeID = orders.EmployeeID
! b( p& o n% u" j& R# Y. s$ RWhere DatePart(“yyyy”,OrderDate)= ‘1996’. c( V, g# C2 a4 f) N
GROUP BY FirstName&’’&LastName
* f; L9 c9 {3 X3 l0 Z w1 }orDER BY FirstName&’’&LastName
2 @4 Z$ s) b: ~! N/ t" |7 p. S! gPOVOT DatePart(“q”,OrderDate)&’季度’
) W* ~( L# ^3 M' E4 f' J( c) v* e十 .子查询, N0 g+ _% }6 @' I
子查询可以理解为 套查询.子查询是一个Select语句.
* a( M+ q: n. z. Z- V1 表达式的值与子查询返回的单一值做比较1 o- x$ h" v! t, A: v2 W' [7 I# q
语法:! e; w* U7 h( s- w g
表达式 comparision [ANY|ALL|SOME](子查询)6 X8 l' V1 I3 C6 g$ E3 V1 i
说明:; L- D8 h, P8 N9 b; h# M
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.3 q1 N5 |- F8 r$ E2 U6 d/ ~
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
3 k5 O6 |/ O0 b1 Y: d0 B4 uSelect * FROM Products
: Q; O; c; I) R& ^% n" ^Where UnitPrice>ANY
' r' M& ^' ]5 J8 I% L' q8 H(Select UnitPrice FROM[Order Details] Where Discount>0.25)
* u- n/ e; w) [% M2 检查表达式的值是否匹配子查询返回的一组值的某个值
5 [# U, N, p! g语法:
+ N$ R& p" Z3 Y) v+ k+ u; r( a$ @[NOT]IN(子查询)
! w8 y0 u6 q. ?' B4 I: X6 M% Z, D例:返回库存价值大于等于1000的产品. S5 J/ u6 v& v6 m7 g0 C/ c* J7 |
Select ProductName FROM Products
" X$ G6 m$ e' i0 s& YWhere ProductID IN
1 f/ R# s2 I* b& Y' V2 c) S(Select PrdoctID FROM [Order DEtails]
! `9 ^1 j5 m6 a* r M3 LWhere UnitPrice*Quantity>= 1000)( |7 b( x2 A. }$ ^3 v
3检测子查询是否返回任何记录
3 [# y" H1 k! q( \1 _, C语法:. H1 [0 T4 l+ x
[NOT]EXISTS (子查询)
& U$ U/ |- f8 a- J& }例:用EXISTS检索英国的客户
. ~- g! k' T8 G' J$ I8 SSelect ComPanyName,ContactName/ i: g4 y2 y! F
FROM orders$ S! g/ o9 m/ P' m- Y }
Where EXISTS# u8 v0 M/ }" L \
(Select *- q; |# G7 W, T8 p4 \
FROM Customers: a# t; D) J% ^2 Y& U" v7 s
Where Country = ‘UK’ AND" G7 n9 g& ^6 G# {! j
Customers.CustomerID= orders.CustomerID) |
|