- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法3 z. s- n& S5 s# I6 F
' S5 [7 p- H1 M/ K* l7 Cselect distinct 字段 from 表名5 ~) g; y0 p0 ^
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。* i4 j4 P% _7 }7 U2 x1 p2 Y
一.Select语句的完整语法为:% \( l) s4 R7 p W5 y6 |
Select[ALL|DISTINCT|DISTINCTROW|TOP]
9 W" C* z* g/ F- ~) u* W4 r! o( y{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
8 g: |$ ~0 ^( y% K5 dFROM tablee xpression[,…][IN externaldatabase]5 ~7 L, R; v" F e
[Where…]
0 D: e/ }0 g) @" s1 {1 c[GROUP BY…]6 n& k9 z1 L* y0 Q1 M
[HAVING…]: r3 v x; ?0 ~# Z' L/ `
[ORDER BY…]
2 I# b/ z2 h( b. _6 p[WITH OWNERACCESS OPTION]8 y V8 Y. M4 ~& X
说明:
/ [# J" t) d* M用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。 Z& E0 n6 X1 F4 @
1 FROM子句 A& M( G0 F D
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
' d. ]2 F" e1 o- e B/ a例:下列SQL语句返回所有有定单的客户:
3 s& Z: [' U- d. q, {7 e FSelect orderID,Customer.customerID( ]( ] G/ ~ t! h
FROM orders Customers! s, J# k' r5 F+ t8 x
Where orders.CustomerID=Customers.CustomeersID
% ~- A) Z2 p. x2 ALL、DISTINCT、DISTINCTROW、TOP谓词: n2 ]. C: g" x8 ?* u
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
- d7 y/ t. m5 x2 {例:Select ALL FirstName,LastName
; |9 D3 c% d" f8 L) E, `- `; fFROM Employees( A$ u7 H$ F0 ]* P. `0 K
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。1 K& d6 ]9 D( N' S& E, s0 P% Y
(3) DISTINCTROW 如果有重复的记录,只返回一个 U- N- d4 ~: i0 Z4 b7 f6 G/ Q
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)& O+ h7 r( q( H
例:返回5%定货额最大的定单. }) k, k" f, y: {. y
Select TOP 5 PERCENT*
6 G) b, t: r: I- A6 [5 bFROM [ order Details], q( R7 V6 `2 Q4 {
orDER BY UnitPrice*Quantity*(1-Discount) DESC) P# Y E' a! n, F F. N
3 用 AS 子句为字段取别名
. H7 i2 ?. N9 m0 H9 S" \& R% U如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。: C% g b2 ^5 ~3 x# \9 H. a% N3 B+ ]
例:返回FirstName字段取别名为NickName4 _# d2 p7 i3 Y5 g; H
Select FirstName AS NickName ,LastName ,City0 J: U3 a7 v8 M" U* h
FROM Employees
; a6 v2 p) \/ \4 H) X0 C' R/ v c例:返回新的一列显示库存价值
! H; |; Q$ P8 ~2 _Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
1 g, _! d- S* y* k& s; d! M8 ^5 WFROM Products
! j$ n4 x+ H. J _二 .Where 子句指定查询条件
' W. G& O( y: E1 比较运算符- H* m. u8 K7 F7 O X: |
比较运算符 含义
4 a1 m6 t- m: _3 h/ \3 B= 等于& Z6 v( Z* x0 A( w- a( Q# S
> 大于
! A7 ?2 a. e# t# T. K7 @7 p6 N< 小于
0 z( U8 x! m8 ], _+ V>= 大于等于
' T( o& G/ a- P3 F<= 小于等于
" l0 K! Q0 @. b<> 不等于2 t! \& K) x# Y: _
!> 不大于% }9 B8 A+ b3 f3 P3 m8 D- P1 \
!< 不小于
% I( k5 B: A4 P9 u3 G3 V例:返回96年1月的定单
3 W# G8 e# ~) e3 l6 r4 qSelect orderID, CustomerID, orderDate8 B9 s3 J. v2 O, r9 A& f2 h# r
FROM orders6 Y0 Y+ e) |% u7 c* ]1 ?" Z
Where orderDate>#1/1/96# AND orderDate<#1/30/96#8 }! Y4 c% e, v1 J) t& y) c
注意:0 c: m- O8 c/ ?$ Z+ e9 e# P" j, @ n* h
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
3 x# l+ b) ^) k3 F( \' ^例:
+ L& [! S0 [9 A. U/ W% _; mWhere orderDate>#96-1-1#
& A2 N% R6 T7 v4 J7 `也可以表示为:3 S; N) G! {1 ]4 d. Z, k
Where orderDate>Datevalue(‘1/1/96’)
( D9 S9 L! l/ {" c! |1 S5 x. T使用 NOT 表达式求反。
7 h. @, ~: [5 l4 m$ f例:查看96年1月1日以后的定单 _% d2 Q& B; O6 I
Where Not orderDate<=#1/1/96#$ r7 q/ M; e7 x9 b4 E2 b
2 范围(BETWEEN 和 NOT BETWEEN)
9 B C9 ]; Y+ t9 s0 f$ V6 f* W% tBETWEEN …AND…运算符指定了要搜索的一个闭区间。( j7 o4 y/ [% H/ m T! \- l
例:返回96年1月到96年2月的定单。
. w( x8 u, |; R( eWhere orderDate Between #1/1/96# And #2/1/96#
: @- k7 e) g! f3 列表(IN ,NOT IN)/ o0 W/ E3 v) S# D$ n
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。5 @% X/ d; v- b( I. D
例:要找出住在 London、Paris或Berlin的所有客户/ f* ~6 i E0 }* [9 C6 I
Select CustomerID, CompanyName, ContactName, City# Q: j4 k0 `' W! \
FROM Customers( ~1 `( s$ p8 I2 ^$ _9 p8 ^
Where City In(‘London’,’ Paris’,’ Berlin’)4 m- @6 i9 A' W
4 模式匹配(LIKE)
9 h6 o$ _$ R4 P8 F- W3 Y: v$ TLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
5 K/ {8 w) K1 z: i# y- J9 H. c$ _LIKE运算符里使用的通配符8 K& @; H. R; P/ Y
通配符 含义7 e! D h* w9 ]6 h! B/ v3 C2 c
? 任何一个单一的字符/ c1 q8 Y: R3 a2 [3 N- k+ M8 l4 ~+ d
* 任意长度的字符
6 Q8 K, |- M0 }( }% q$ n# 0~9之间的单一数字
' x1 E; m% w# ~* s% K; B/ H' I: R[字符列表] 在字符列表里的任一值2 U) t/ o) F2 s7 y
[!字符列表] 不在字符列表里的任一值
, U" R* G t |# G7 r" b- 指定字符范围,两边的值分别为其上下限
- x7 |# N# y. H6 y例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
: d; c/ _! y4 I: h g! @8 m" \Select CustomerID ,CompanyName,City,Phone
0 Q3 r8 R" X; D R6 V2 X+ q( CFROM Customers
! c+ c; c7 r; J3 pWhere Phone Like ‘(171)555-####’9 P& N& b. g$ I, @+ p
LIKE运算符的一些样式及含义
, f% b5 A! d- F样式 含义 不符合
, J( Q A+ O$ e3 p5 qLIKE ‘A*’ A后跟任意长度的字符 Bc,c2555 N d- d1 @& M8 l7 T# [) j
# LIKE’5’ 5*5 555
% H0 n( Y% C" t, qLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
* h! c+ Y; P4 P4 \LIKE’5##5’ 5235,5005 5kd5,5346
9 f; H5 S& N$ Z! VLIKE’( G/ g! ^' A z
[a-z]’ a-z间的任意一个字符 5,%% N s' p- r1 T; b" D& ~
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
* ~& `4 m, @; hLIKE’[[]’ 1,*- w( N' F+ J7 U1 }* P* ]
三 .用ORDER BY子句排序结果
3 }% D, v4 a& EorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
4 Z8 T8 J7 v" P# f8 n( ^orDER子句中定义了多个字段,则按照字段的先后顺序排序。6 z; E4 E2 m( [2 Y
例:1 ?7 g9 B. D: D4 K0 j
Select ProductName,UnitPrice, UnitInStock
) C, D* F1 ~* b1 f% x5 W) ?$ zFROM Products' K& A6 n0 T! K8 w+ b3 `$ H
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
! Y+ M* w( @1 Z" c# B/ O% W4 OorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。 v6 N, w* Z Y1 N9 ?$ Z
例:下面的语句产生与上列相同的效果。9 Y w b' {0 c! q2 r8 c
Select ProductName,UnitPrice, UnitInStock+ j* N4 j. T0 f" Q+ P2 v# J
FROM Products7 \/ L C1 G+ _/ [
orDER BY 1 DESC , 2 DESC,31 S" ?8 C1 \' k. t3 n' r" n
四 .运用连接关系实现多表查询
; y4 }5 Y4 W$ _5 G; P+ b8 [例:找出同一个城市中供应商和客户的名字
5 J! _3 z; @, e8 B7 l: ?Select Customers.CompanyName, Suppliers.ComPany.Name
2 K- [* P4 Q5 }# vFROM Customers, Suppliers$ i+ {! o0 D1 ^0 M+ W' x/ N+ i3 i* Q
Where Customers.City=Suppliers.City
, b% Z; \0 U- |例:找出产品库存量大于同一种产品的定单的数量的产品和定单
; m; c) R" n2 P; f$ b% ~) R, l2 ]Select ProductName,OrderID, UnitInStock, Quantity5 L% p, v8 i+ M' q0 M
FROM Products, [Order Deails]
/ R7 W! E( f2 y8 f: {+ PWhere Product.productID=[Order Details].ProductID# Z/ F3 I; |0 }) m) g
AND UnitsInStock>Quantity
7 T' l9 _# t; b! P6 z/ k5 @" w另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN" {$ Q# n9 |: {- A$ `* @
语法: c3 M8 n6 c9 _& M4 ^9 o
FROM table1 INNER JOIN table2& I/ B' |/ W4 Z' x- s n
ON table1.field1 comparision table2.field22 I5 Q! r( |9 c. W' ?- \0 W; t* w g
其中comparision 就是前面Where子句用到的比较运算符。8 k4 I; e. U; l7 c4 p
Select FirstName,lastName,OrderID,CustomerID,OrderDate! L" c$ G! m( x7 N) j
FROM Employees
" v1 L7 H. Q- H3 IINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
( w! k; w0 j: l1 P3 Z注意:
+ j' U0 P6 K0 vINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
; ^' g, `& k' A' H# p- R在一个JOIN语句中连接多个ON子句7 k: o: |9 ^5 {' T' u& @; l8 d
语法:8 k% R! Y; X; Z
Select fields3 H$ Z5 s: Y, u6 i- J
FROM table1 INNER JOIN table2/ [: Y( u: ?. [% D* Q. p1 M
ON table1.field1 compopr table2.field1 AND
' Q/ h! P7 R9 \ON table1.field2 compopr table2.field2 or
' s) U2 G) `2 K, M! \9 C; w# XON table1.field3 compopr table2.field3
2 S5 r6 A/ R" T) q3 O+ d, ^% h% N也可以8 P( E" u! e" [& u! x- n( a# Y2 X
Select fields8 A8 w; n/ m9 Q6 d! t( Q5 u) Q
FROM table1 INNER JOIN7 Y* q% G* [7 j" u2 H) f( m7 Z
(table2 INNER JOIN [( ]table3* `6 d/ q6 {+ ?
[INNER JOER] [( ]tablex[INNER JOIN], c0 G8 ?5 h5 p% k l4 l
ON table1.field1 compopr table2.field12 X: Z* a, K5 [9 l
ON table1.field2 compopr table2.field2
& z$ \" A3 r$ h" R, MON table1.field3 compopr table2.field3
" o' N7 E9 p. Y: m! _! G5 c' G: `外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
4 r3 M) _8 \3 w1 j! Z8 l. E, SFROM table [LEFT|RIGHT]JOIN table2
8 D! ?; V/ D+ QON table1.field1comparision table.field2) G3 j( z: ^1 d* [
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据# D! j& c- [5 a7 U6 k
例:不管有没有定货量,返回所有商品( _+ x8 L4 x1 { D; |
Select ProductName ,OrderID
3 q1 x$ ~& Z# P+ |FROM Products
& N2 \ _2 k" RLEFT JOIN orders ON Products.PrductsID=Orders.ProductID, y. a& a# h0 P8 i4 k3 ]# i/ M
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
$ n: f0 P2 Y" U! j; W4 [例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。+ `9 _, i) h1 U" r
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
8 A! f" E! M3 H* r* x* o, V1 A8 P3 MSelect *
( X$ Z/ \( [# j; d* s$ Q8 tFROM talbe1: \) i8 Q. G; I( O4 K# ]
LEFT JOIN table2 ON table1.a=table2.c0 j! X" }1 a9 s3 K3 \
1 连接查询中使用Iif函数实现以0值显示空值
0 c- \- h4 q# x8 L( O7 gIif表达式: Iif(IsNull(Amount,0,Amout)
, q- z. H" f5 |6 u3 g例:无论定货大于或小于¥50,都要返回一个标志。
}+ z6 u" P3 L9 j! `) C7 Q5 ?Iif([Amount]>50,?Big order?,?Small order?)$ q/ K! G! |9 }( y
五. 分组和总结查询结果
: F: r% f* Q' T$ ]1 [* X! C) x# X5 K在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。. }" _: o! p# c& m6 M+ N# i
GROUP BY 子句的语法6 k1 c8 Q! Y ~
Select fidldlist
, S* q% |& J5 M' x, AFROM table
9 [$ L2 {7 ?: `: jWhere criteria- ^8 v( D2 e; Y5 e9 l5 z9 _
[GROUP BY groupfieldlist [HAVING groupcriteria]]
0 _3 V8 i9 S4 G% G' J0 C7 z注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。* ^9 z2 u) A( |5 b
GROUP BY字段中的Null值以备分组但是不能被省略。: M0 S) w8 T4 f5 K9 u0 T, ]
在任何SQL合计函数中不计算Null值。
$ X, e; U* ^/ {. W( z, MGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
0 s+ [, Z2 Q1 Y" z例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
, D) H9 {9 t/ e8 mSelect Title ,Count(Title) as Total: n2 ?- Y# c8 }4 }/ r1 B8 p
FROM Employees
$ i9 Y& N8 G( W4 h& ]- ~3 ZWhere Region = ‘WA’. d( g. t) Z. {+ m' M
GROUP BY Title; P( \/ c+ f" v" Y( B8 e8 Q
HAVING Count(Title)>1
) o0 J- i( h& t7 f+ ^9 z AJET SQL 中的聚积函数( h" l& b( Z- c4 S1 q
聚集函数 意义
6 E. u7 a$ n. \1 C9 x7 `% ZSUM ( ) 求和0 T7 S/ Q- ~3 ~% V% A
AVG ( ) 平均值 W4 d5 {5 J+ N. V: I
COUNT ( ) 表达式中记录的数目
6 ?% `+ c( o: ^8 yCOUNT (* ) 计算记录的数目
4 S, \8 H J' |' t' `9 |: i( cMAX 最大值* f, {+ S- E5 U
MIN 最小值7 W. j }# S# K' m( f( ]
VAR 方差$ P# z+ _* S; N3 Y7 j; \ N
STDEV 标准误差) t7 S5 F8 c X+ {& A$ ], V
FIRST 第一个值. G3 S1 R: h; p% u3 J7 a6 ^+ N
LAST 最后一个值5 Z) O. N: J, ^. b
六. 用Parameters声明创建参数查询
3 v$ @- {7 r8 b6 D9 V" JParameters声明的语法:
* k6 |" [( Q& f( q9 zPARAMETERS name datatype[,name datatype[, …]]
# S- r8 m# |8 Z: Z ]6 H其中name 是参数的标志符,可以通过标志符引用参数.
7 [: R: j* {; T# xDatatype说明参数的数据类型.
6 M5 p! _$ ~% q& ~/ o; E+ {使用时要把PARAMETERS 声明置于任何其他语句之前.- x3 s* ~/ C& X! m7 N
例:$ {& D. m0 p/ ^ z& J: q- P
PARAMETERS[Low price] Currency,[Beginning date]datatime, u. b& f0 s6 p
Select orderID ,OrderAmount
0 `/ o; N+ ]5 x0 j MFROM orders, Z4 T' z+ b4 ], F, {
Where orderAMount>[low price]/ k4 \" M! E4 G# F5 l1 j, ^
AND orderDate>=[Beginning date]6 ]/ O6 Z6 e# a0 M$ h7 P
七. 功能查询; j @9 I& B/ J
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.1 J( Y. m6 m: B0 M# r) {$ o
1 更新查询
7 E9 h0 [0 o* ]5 e9 |' k7 R+ JUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值./ T+ w; \3 G0 s3 S
更新查询语法:& K6 `6 t/ k7 A, v1 ]( r
Update 表名* D& V( X J3 H0 C% R1 B
SET 新值
- M8 E) A: [9 ?Where 准则
- r* l' i$ U' q; q) _! @& G3 n0 d3 ?: S例:英国客户的定货量增加5%,货运量增加3%
2 R3 N6 ^! r- u' z2 gUpdate OEDERS
' b3 W1 f6 i1 s% ^1 [9 RSET orderAmount = orderAmount *1.1
4 g% c, v/ i+ a* S* K; JFreight = Freight*1.033 e2 @2 z! S# V9 g+ |
Where ShipCountry = ‘UK’( z- D* G, T: D) u0 k o. N
2 删除查询
6 w, ^4 o/ d; s1 ~Delete子句可以使用户删除大量的过时的或冗于的数据., Q, }7 t* ?5 s. P! X
注:删除查询的对象是整个记录.
# O, D- Q: ~8 [Delete子句的语法:
( F: i8 c4 y/ t3 m& VDelete [表名.*] o/ I( z* x, o* a ~
FROM 来源表
z4 S. W; U) ]Where 准则3 X( g% m" ]7 r9 G% U: Q
例: 要删除所有94年前的定单
+ L% w; j4 M9 J4 l9 {% GDelete * t/ b( J# h& B( d9 K: h R
FROM orders
6 R# P, j0 m" \" C0 g% v+ d& HWhere orderData<#94-1-1#; Q- n% `! H0 n/ _2 V
3 追加查询! O1 Q% U; E/ K
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.. F) D- p5 M e1 J" L
INTO 子句指定接受新记录的表' Y: c3 g$ |1 Q5 L; I* K0 @0 q
valueS 关键字指定新记录所包含的数据值.! P# t S4 _- g( O" k6 f6 ?4 T
Insert 子句的语法:
, o5 \3 j" `3 ]INSETR INTO 目的表或查询(字段1,字段2,…)
0 J8 r0 [% A& _" W* N5 I, T5 svalueS(数值1,数值2,…)
* p* e* o8 D, ~例:增加一个客户
9 K1 G* f! z: R6 XInsert INTO Employees(FirstName,LastName,title)
9 s# w! {. w# m' E$ K |valueS(‘Harry’,’Washington’,’Trainee’)9 u/ [0 K2 w: u+ O" a$ b
4 生成表查询
9 ?2 c: m3 h6 m5 f7 e* N' z可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.; K; w+ D/ R2 D$ \. I
Select INTO子句用来创建生成表查询语法:$ }; Q- Z4 T; e, Z# W2 o# W
Select 字段1,字段2,…
' o" k5 K( r* f x5 d' Q* pINTO 新表[IN 外部数据库]/ o8 d3 h; J" r* n. f$ i$ Y, V
FROM 来源数据库7 V6 q; V7 a8 h& L& l8 T. `% P$ i
Where 准则
+ t" _, }# ]. H9 k; U8 D8 T0 l例:为定单制作一个存档备份
- k( r v/ |# c% ^) E0 aSelect *
; s: a5 u& Z6 S+ U( XINTO ordersArchive6 m& m A7 a5 m/ r
FROM orders1 \7 ~7 ~2 I2 r( D+ S* v
八. 联合查询# t, e( Y& S) \& G% w' b
UNION运算可以把多个查询的结果合并到一个结果集里显示.
% A0 R: ]4 U" B. z& UUNION运算的一般语法:
# ?% q4 A% \" t' I$ c# s[表]查询1 UNION [ALL]查询2 UNION …( u- |9 g6 D$ U; J
例:返回巴西所有供给商和客户的名字和城市
! x6 F$ V6 `# o& a& y5 z5 r3 zSelect CompanyName,City
, |3 I7 Z/ g0 I" U UFROM Suppliers
/ H! S& W$ h6 k! J+ \% AWhere Country = ‘Brazil’
+ c3 H$ o: A5 ?UNION
; @; W2 l2 R6 p: h. C$ f& S$ L5 YSelect CompanyName,City
- c5 i: z, n+ N5 I, ]9 i5 D! NFROM Customers1 J$ M7 I; b3 f, ~# N
Where Country = ‘Brazil’
1 z5 [6 D4 y5 W/ S/ m! T% e! b0 Q注:: M" E5 o3 \1 Y$ D
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项0 A7 t0 t' g7 c0 [3 Z
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
: k5 e: T D T$ k7 v( _每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.% ^% j! E3 L7 K8 c* ]+ s2 k; w
九. 交叉查询
3 Q9 v+ j! |, t1 n% Q- L! g+ m+ v交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
, o6 w/ c4 P! D d! J8 t* v( LMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
: @4 g) b4 B" |) u: xTRANSFORM aggfunction
# s, C7 W e1 aSelect 语句7 E* p0 ^8 { m, `8 g
GROUP BY 子句4 {6 K" ]0 r0 V* m. R2 l4 ]% f
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]. f, W, g$ s+ C& ^ t7 {" |
Aggfounction指SQL聚积函数,3 l2 R" t/ I: h W) S* X
Select语句选择作为标题的的字段,
5 x! H& K( `! v tGROUP BY 分组- ]( m# v% _- }6 B
说明:* p* N7 y0 L" o; a! E
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.# n4 ^+ J g3 I4 I- K5 t: [6 F
value代表创建列标题的固定值.% O) W" o( C1 R" o0 Q/ M' r# d
例:显示在1996年里每一季度每一位员工所接的定单的数目:; x: n; }/ m. E/ j
TRANSFORM Count(OrderID)1 O8 M1 m: x( P# |& m9 s
Select FirstName&’’&LastName AS FullName7 f; c$ n' c; k: R K9 t
FROM Employees INNER JOIN orders
8 d9 t+ G& L7 b2 A2 B+ ~ ~ON Employees.EmployeeID = orders.EmployeeID
" y; Q$ i, I: Y8 SWhere DatePart(“yyyy”,OrderDate)= ‘1996’ c/ P% v D0 Y, x* q. n
GROUP BY FirstName&’’&LastName) q& f; P5 z% S' X+ _$ q7 L
orDER BY FirstName&’’&LastName
$ ], j+ P$ u& I7 r+ C- b' O( RPOVOT DatePart(“q”,OrderDate)&’季度’
" G! P- \& ^1 q" @+ F+ p9 n十 .子查询
# m2 |0 z( y5 S子查询可以理解为 套查询.子查询是一个Select语句.
$ y6 a! Y- I/ I9 f0 B o5 J; F1 表达式的值与子查询返回的单一值做比较 |& f2 B; _5 S3 j% u
语法:
, _. @% S3 F9 B; w9 Y- Z) W表达式 comparision [ANY|ALL|SOME](子查询)1 C) R4 K8 J' l/ R- c% K
说明:3 a4 R: O; h, u' {
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
+ Y" F7 O4 |- ?. j例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
% p2 v2 ]4 t" M& r3 lSelect * FROM Products
, p" W7 d5 p) S6 h" F# A" ^1 HWhere UnitPrice>ANY
9 T# m' S; M: y5 |(Select UnitPrice FROM[Order Details] Where Discount>0.25)0 \6 x3 R: a3 o' I1 a+ ?' _( _& ~
2 检查表达式的值是否匹配子查询返回的一组值的某个值
+ [1 L/ _% y9 z6 _, A' j( t7 ]语法:
1 g% `. X N, F" c9 a! r[NOT]IN(子查询)
0 X: c0 [! l' }( o: R$ s4 ~# F例:返回库存价值大于等于1000的产品. i3 N f+ R; [
Select ProductName FROM Products
; S7 v5 z+ s7 {Where ProductID IN$ r) n* b1 _# W( k9 b' i
(Select PrdoctID FROM [Order DEtails]2 c l1 P! ^: R. X7 S
Where UnitPrice*Quantity>= 1000)
1 m% f7 B, |6 I% ?7 D% V+ r, p! w3检测子查询是否返回任何记录
6 g% E4 f! }. u9 d9 u1 S. j) `8 H5 B6 l语法:
8 y& }6 \+ V1 x6 ?2 x& q" M7 H[NOT]EXISTS (子查询)
Q- b4 e" @- ]* o, x: W7 t例:用EXISTS检索英国的客户: [9 W9 V1 f& D3 _+ l% X
Select ComPanyName,ContactName: F$ j0 `( r( W8 V
FROM orders
( o( S% q" F. z( r: F+ o2 |6 V4 hWhere EXISTS
; M, V, Z" R- q4 m(Select ** }. {$ r! a4 p2 R& n2 }# n b" s' f1 n; ]
FROM Customers
8 I1 W' o+ l) G. ?/ P* ]Where Country = ‘UK’ AND% R# U4 W- t" W9 }
Customers.CustomerID= orders.CustomerID) |
|