- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法( x; [6 }9 e3 ^" T' `8 k
) y7 | A4 \! F, N: i' D; H
select distinct 字段 from 表名
# ]8 Y2 c: q) _; v; cdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。& [* l5 O8 O- J: P
一.Select语句的完整语法为:
" ]# y; L5 |1 D3 CSelect[ALL|DISTINCT|DISTINCTROW|TOP]) g: J0 a! _6 l0 j% k' a
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}3 I2 j* F E7 _2 Y% a1 j5 y
FROM tablee xpression[,…][IN externaldatabase] t9 g* W& E3 ?
[Where…]
3 A/ l) u8 Q& X+ b0 g# i" v$ ^[GROUP BY…], ~: R Y" C9 | _2 ]- h
[HAVING…]4 a& {8 t! R: m2 J
[ORDER BY…]2 k( {% g# c* l
[WITH OWNERACCESS OPTION]9 G/ s2 r# b# a4 L" Y. b: `
说明:
. d% m% Z$ s' Q- M' R用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
m( p9 o- C2 {' B1 FROM子句; `* t! `, D# Q) K7 V! G
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。7 G# w9 g: l4 x* M; O% u2 C7 m
例:下列SQL语句返回所有有定单的客户:( i9 z) d& [% a- T
Select orderID,Customer.customerID
, |5 c6 |, I2 S; ]( WFROM orders Customers
% s: [# s0 x/ H' ]Where orders.CustomerID=Customers.CustomeersID
7 @* a* i" M9 Q7 p2 ALL、DISTINCT、DISTINCTROW、TOP谓词3 r7 x( x: ^* P3 {
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
2 k' }7 p K* U0 S+ s例:Select ALL FirstName,LastName
. ?: J. p2 p L; KFROM Employees: F+ }% G& T9 F; M5 Y$ C8 E: Z% v
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。. l6 y, s" h- H; z$ |5 u0 J
(3) DISTINCTROW 如果有重复的记录,只返回一个
5 {) r% h4 Q: C2 C0 {2 h! {' h+ a(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
; m8 z3 W/ `6 A' @2 }$ J Y3 c+ T' U例:返回5%定货额最大的定单
% `8 O1 c- _6 I# z' I l6 W) X& QSelect TOP 5 PERCENT*
$ k E5 H p. r% {* o. {* _: CFROM [ order Details]: _9 B0 P2 r) B8 O) z. d
orDER BY UnitPrice*Quantity*(1-Discount) DESC
8 B3 E/ n( j- _ K5 Z1 L, C3 用 AS 子句为字段取别名" F7 z7 Y1 b, T! ~3 Z
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。, [" ?: M. ~+ o J, K
例:返回FirstName字段取别名为NickName
* K$ ^7 E# M, a9 Y6 d4 ~Select FirstName AS NickName ,LastName ,City8 X5 [" ?, q9 f' V) U
FROM Employees M) Z& M; i6 O# t% {
例:返回新的一列显示库存价值
+ D) K* X6 o7 k% n$ H* y: d- k1 hSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock8 i8 _6 x9 o) w5 Q. V, F
FROM Products% |( v2 a7 g+ ~: n2 h+ i/ Y
二 .Where 子句指定查询条件; _7 S+ q e5 n5 a4 r* U
1 比较运算符0 S- ] h/ i/ p0 P: W5 ^ {4 C$ i5 T
比较运算符 含义, g3 y N1 T# V
= 等于
0 x& y' G& ?* N* L9 {8 c> 大于3 f1 @& R$ y1 U
< 小于5 a, i, X9 B, n z
>= 大于等于
5 o1 a( e2 e4 u% s5 J1 [<= 小于等于
( J9 x' W# e+ u) Z<> 不等于
8 p. d B( j: A, }5 ~!> 不大于' L8 ?# n( V1 v2 R
!< 不小于
0 C X- q: v: ]: D7 k( C例:返回96年1月的定单/ A& n# w# p/ I
Select orderID, CustomerID, orderDate
5 O9 [5 J$ y3 u7 N2 n yFROM orders7 x: V4 v) q4 J' r- P& p. a' |
Where orderDate>#1/1/96# AND orderDate<#1/30/96# v" `8 y' @- S8 S' \2 {
注意:- ] g R+ D9 L
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。* i1 J4 |0 S6 l, |9 u8 j+ H+ r, A
例:, L0 J5 k8 p( Z
Where orderDate>#96-1-1#9 L: p$ @' K; ~
也可以表示为:
- @5 U1 r; n/ L% a4 C3 n l+ G8 Q5 qWhere orderDate>Datevalue(‘1/1/96’)) K' A* K- L& |0 v! l% f
使用 NOT 表达式求反。
( L! E( _1 A$ Y" n+ j/ D# H7 C+ r例:查看96年1月1日以后的定单
% {# i0 @3 x0 q! b9 e( Z. L$ {Where Not orderDate<=#1/1/96#- r# _% S( |+ i r( x( K
2 范围(BETWEEN 和 NOT BETWEEN)
; ^" y/ o% c$ a# tBETWEEN …AND…运算符指定了要搜索的一个闭区间。
3 I7 o5 e# g. b$ B+ B例:返回96年1月到96年2月的定单。, ~+ r$ ]) H% S3 p# L0 R
Where orderDate Between #1/1/96# And #2/1/96#
- M, B1 k+ L, U& }3 列表(IN ,NOT IN)7 G ]9 V: V4 a3 A/ L/ b
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
5 ?# d0 Z2 k+ V0 z例:要找出住在 London、Paris或Berlin的所有客户
. F' X6 A8 H" c; l$ q" K6 f7 \Select CustomerID, CompanyName, ContactName, City
8 V& P6 m5 p1 x5 MFROM Customers# o/ _2 D4 l: ^- H
Where City In(‘London’,’ Paris’,’ Berlin’)2 q" L1 E% b* }8 [
4 模式匹配(LIKE)9 C x: R% A9 ~
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。& q. D, T Z' y4 p2 h9 C# m
LIKE运算符里使用的通配符7 w4 z4 V- u6 J1 [! W& Q
通配符 含义0 O: z3 r1 @$ L) ~5 A5 s, t" I/ R
? 任何一个单一的字符
7 r4 j4 i0 f! X" |" a3 |* 任意长度的字符6 L7 H& p# H0 D: f4 Y5 \: U
# 0~9之间的单一数字& P& g& s( \ @* I4 ^$ q
[字符列表] 在字符列表里的任一值
) t# m& f8 \" S9 V2 W; G& q: p' [[!字符列表] 不在字符列表里的任一值! |+ v3 g/ _0 ?0 x" O$ y
- 指定字符范围,两边的值分别为其上下限
0 K+ M3 E) k/ W例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户' E: O$ _: C. M$ o! s; D/ d, i
Select CustomerID ,CompanyName,City,Phone
D, _! s# K+ F6 ]' P) AFROM Customers3 q: b( c$ K/ J
Where Phone Like ‘(171)555-####’; p1 p/ _7 r5 `* h0 P# _/ v3 E3 [
LIKE运算符的一些样式及含义9 l* C" S- {$ q3 L
样式 含义 不符合/ V% E, S2 c$ D) D* H
LIKE ‘A*’ A后跟任意长度的字符 Bc,c2558 a v" y/ n* n. t/ |0 C$ x
# LIKE’5’ 5*5 555% C) n2 u4 B& `. [" L, W7 R
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5& Q/ T0 l( F; Z) |
LIKE’5##5’ 5235,5005 5kd5,53465 D! p" X. H% ]5 B) X! u
LIKE’' |, z$ g+ z: C; K/ F0 c9 n! V5 R
[a-z]’ a-z间的任意一个字符 5,%
. _+ g7 I1 v4 q7 m, A+ i/ pLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
1 z# k% X( D# `# O! |LIKE’[[]’ 1,*
7 B. r ~/ x# d, i, y3 f三 .用ORDER BY子句排序结果
6 V# w* @6 J4 ^' s. }1 G- J1 DorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。8 I2 B* f8 r+ t) {
orDER子句中定义了多个字段,则按照字段的先后顺序排序。. s0 ~1 s% }+ f; o+ W4 s/ ]" @- v
例:, v, \9 N$ o4 V1 o- K7 C
Select ProductName,UnitPrice, UnitInStock
6 T, s5 G6 _3 K" t- z1 o8 G* uFROM Products8 J! Q% Q$ K5 J/ M3 Y
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
" N7 O$ a: \5 K# k# ^5 }orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
2 k/ e5 U2 k5 M* ]9 Q0 M例:下面的语句产生与上列相同的效果。
3 Z/ k2 r, c: Y' ~* RSelect ProductName,UnitPrice, UnitInStock
& |7 E) }8 }* B7 f7 eFROM Products
; L' M% ]! c2 r7 e& o- `orDER BY 1 DESC , 2 DESC,3
+ w/ z& N4 Q- O" s四 .运用连接关系实现多表查询
8 W. K1 O9 h; a# C: D% n例:找出同一个城市中供应商和客户的名字
& X5 I5 u( `* C! @3 Z- P2 w% KSelect Customers.CompanyName, Suppliers.ComPany.Name
5 E1 v2 F% t" Y$ _FROM Customers, Suppliers
Y% |9 @8 `) P- L! `4 Q3 X/ ~" |' qWhere Customers.City=Suppliers.City0 F$ O5 o7 q- G! [- u Y# C
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
* I% \8 `: B" }, P" w3 ?' r/ Z$ f3 vSelect ProductName,OrderID, UnitInStock, Quantity
: Q3 z# D( D& d+ e! JFROM Products, [Order Deails]
# P8 S8 C1 o, N* W, ]! KWhere Product.productID=[Order Details].ProductID( K9 w1 k e% C
AND UnitsInStock>Quantity
2 d1 C$ d. y& F, V! i3 o* n另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
& p! h I1 @* k7 K5 C# o2 D* C8 V语法:
9 _+ X3 j3 x% ]% q" {* UFROM table1 INNER JOIN table2! j2 }- L3 R( U! r8 L# W
ON table1.field1 comparision table2.field2: z- ^; _0 y$ l1 l$ B5 ]' m% a @) a- a
其中comparision 就是前面Where子句用到的比较运算符。
* t/ k$ N, p+ o0 _$ N/ D0 _Select FirstName,lastName,OrderID,CustomerID,OrderDate4 u8 p4 Y9 E: ?# M2 i
FROM Employees
: d, _% E r2 c& ^& A+ x* }INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
6 A' o& q# e1 G注意:
5 V/ m2 ~ Z$ P' @- R1 aINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
/ M& M' W& C! a- U1 l在一个JOIN语句中连接多个ON子句8 X0 i* b# g( s
语法:$ R# J5 ?& R/ U {
Select fields
2 d: P3 w# K9 u$ u& T" ?FROM table1 INNER JOIN table23 w! ?; K4 L: p' F2 r. {" b
ON table1.field1 compopr table2.field1 AND% F( |/ X9 s2 C: p. K5 J
ON table1.field2 compopr table2.field2 or
- `8 V. J5 w/ q4 i5 HON table1.field3 compopr table2.field3( _! {/ X3 Y3 W
也可以' j, H) J" e4 E6 K
Select fields
! _! l y1 d* w. U' d2 aFROM table1 INNER JOIN* {, n3 h: q6 ?4 N$ i
(table2 INNER JOIN [( ]table3! f$ N: ^5 U, O; P* S
[INNER JOER] [( ]tablex[INNER JOIN], `$ i, u* b9 r% N8 j m$ f
ON table1.field1 compopr table2.field1' k4 f) E1 F0 {/ v+ ^$ f) L- x
ON table1.field2 compopr table2.field2
+ Y. c6 Z+ \* Z/ h# S) C- r7 x& U: TON table1.field3 compopr table2.field3
9 Q: B' ^/ ~! Y- M' b$ S- U外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。( }* M7 v* Y' Z2 l7 Z) d
FROM table [LEFT|RIGHT]JOIN table2( w/ A1 |. A' j1 B+ F2 g& H
ON table1.field1comparision table.field21 e l' O/ f# b& D+ \
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据/ c) t& y, N. E) `0 X# g
例:不管有没有定货量,返回所有商品
/ {1 U! j$ U, |" Q! t* aSelect ProductName ,OrderID6 r4 T, ~: Y) f% M5 K, }* E6 o. m
FROM Products
6 G8 I0 M4 r+ z. G" Y' {LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
% ^" g% f. h( _9 A6 n8 \% B右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
+ f9 T8 S: a3 T7 ~' s: T) ?" t例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。1 r% Q2 n, C# e' t! U
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。1 x6 F) e i* F& _: x& r4 V# T
Select *
* K5 w: y, ~+ k( E6 D+ DFROM talbe19 Y, j7 y1 ?7 |! h9 g( s
LEFT JOIN table2 ON table1.a=table2.c
5 u/ d R: s6 f% w8 z2 f1 连接查询中使用Iif函数实现以0值显示空值# L _. a3 p# z3 g4 m
Iif表达式: Iif(IsNull(Amount,0,Amout)( A& y) i9 N$ \! X
例:无论定货大于或小于¥50,都要返回一个标志。
* h! F* S( m& P0 T" r1 v! tIif([Amount]>50,?Big order?,?Small order?)( h5 Q4 N0 K6 z" O5 l1 l# Z: C" L
五. 分组和总结查询结果
6 ]8 r/ x+ R& n! p+ h6 \7 J在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。# @/ g( q2 h) I/ A+ \$ \
GROUP BY 子句的语法5 z: f2 O: c6 F$ V$ S/ S- B
Select fidldlist0 Q- H6 {& W5 D; P
FROM table
6 P1 v8 G+ l; k$ UWhere criteria
6 f0 M6 k: g3 \" I7 V, z% ?( ?& W1 @[GROUP BY groupfieldlist [HAVING groupcriteria]]
_8 E4 Q* h' L3 K/ v" ?注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。! x- E3 R5 |- o0 B5 T8 ^; p
GROUP BY字段中的Null值以备分组但是不能被省略。
! N0 z" Z1 e7 q0 M* O在任何SQL合计函数中不计算Null值。
# T' K0 Z+ l8 {+ b: Z' U) H& v1 bGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
3 ?1 A3 P7 D9 q( @2 m: S例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
0 d K3 o' q2 ^, n, ^Select Title ,Count(Title) as Total
( s% i; J& A* p* {FROM Employees
- W/ c3 ?/ g# `. r9 C9 yWhere Region = ‘WA’: S6 ?# i' \2 v$ J+ ?) D
GROUP BY Title
& B6 o& A) K1 xHAVING Count(Title)>1
1 N: u4 M( o$ j- s2 n3 ?: _7 `JET SQL 中的聚积函数' W; p& m a6 K- d- o2 B( h
聚集函数 意义1 p: Y% `: E' J2 O+ W
SUM ( ) 求和
: |+ _ [5 ?6 q9 ~/ }AVG ( ) 平均值; O* _3 O- [% Z* g. v
COUNT ( ) 表达式中记录的数目
$ p, c& h0 s/ h! L9 Z3 Z& ~COUNT (* ) 计算记录的数目
. U3 D7 r3 M6 \/ G; T! Y0 c% LMAX 最大值' L, n1 {5 D0 l4 ~3 u3 ~/ l& M+ p
MIN 最小值. S& P a- k: w6 M
VAR 方差% X6 j4 Z7 c$ G* Z7 Q: E; ^
STDEV 标准误差
+ N5 N- ?. f, t2 CFIRST 第一个值+ L X# G* ^; S1 v7 E* j
LAST 最后一个值! @" z. E9 v; b7 E/ z Q+ t: y% m
六. 用Parameters声明创建参数查询# j6 p0 Z4 L4 L
Parameters声明的语法:
. x" u. ? [4 _, ?& H2 q0 |PARAMETERS name datatype[,name datatype[, …]]- z1 [3 C( k/ d" m- P! j( L
其中name 是参数的标志符,可以通过标志符引用参数.
( y. k8 H# }* L. r1 }Datatype说明参数的数据类型.
5 s$ f; h4 T- k3 C9 ]' e5 E使用时要把PARAMETERS 声明置于任何其他语句之前.$ Y9 X8 x6 ^, d/ K. j! O; J4 z
例:
$ a1 L. ^. C% ~& kPARAMETERS[Low price] Currency,[Beginning date]datatime
' e1 j) |- v) DSelect orderID ,OrderAmount q* _2 q. S! w
FROM orders& o+ X6 S1 N1 n, Z1 u
Where orderAMount>[low price]
: q6 {, ^& D' t8 ?AND orderDate>=[Beginning date]" g1 h: }& [+ |8 U: [# K* i- f
七. 功能查询' M8 I% L5 m4 r7 \8 X
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
3 M; q- o/ X `7 \1 `; K" Z* G' M1 更新查询
% k. m) B& _2 o* ZUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
! M) S" Y; j+ v# T8 q# W' g更新查询语法:
5 q$ B) t6 ]7 z8 G" TUpdate 表名; z! b, y! H4 R# J* p
SET 新值
) J' q: q, v2 K: ?Where 准则' _! p+ m) Y6 K* B; N4 B
例:英国客户的定货量增加5%,货运量增加3%3 H& I$ ?# R6 `
Update OEDERS; S, F! Y7 r3 ?) `
SET orderAmount = orderAmount *1.1
( Z# D' m* O7 q$ vFreight = Freight*1.037 n; E7 ~" ^! n9 F0 N+ M
Where ShipCountry = ‘UK’& r6 z( _, ^( C, W' A' K
2 删除查询$ l! W# q) V7 b
Delete子句可以使用户删除大量的过时的或冗于的数据.2 }+ V. K" S3 @0 @* {
注:删除查询的对象是整个记录.5 o; m: h( Z+ k6 M) p
Delete子句的语法:+ D. T# F/ T) b* E3 r
Delete [表名.*]
8 _% h( x3 [! e1 VFROM 来源表
: M! D$ l: X2 N6 e; C2 c6 zWhere 准则: [( W* A& B2 d" {" L
例: 要删除所有94年前的定单7 m' U- u+ R/ X
Delete *
5 C9 ?: Y- N5 e& w) d8 z TFROM orders
5 A# I0 U" i# j9 JWhere orderData<#94-1-1#4 N. [/ ? N2 D1 R& A& Y" X
3 追加查询
: G( j! R4 m4 {0 OInsert子句可以将一个或一组记录追加到一个或多个表的尾部.3 u( H; Y) l9 w* q* o6 Q' t1 ~
INTO 子句指定接受新记录的表
; a! k; _3 y1 P, A. V' k- E( z& SvalueS 关键字指定新记录所包含的数据值.3 s" h) T$ o+ X( r
Insert 子句的语法:
1 ~! a* S: D" B) {" rINSETR INTO 目的表或查询(字段1,字段2,…)
/ W/ s) B a% ?% @valueS(数值1,数值2,…)
- B# q4 H3 B x5 r w& u/ }: B; h) Q例:增加一个客户
) V: C+ b) _/ V* s( _% WInsert INTO Employees(FirstName,LastName,title)
1 o3 K g8 }$ s4 K: evalueS(‘Harry’,’Washington’,’Trainee’)
/ t; u) z4 L5 _4 生成表查询
1 [/ M$ a1 `0 V7 ?& y可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.2 }0 p1 _# ^8 Q- |" ~
Select INTO子句用来创建生成表查询语法:6 [( e% J1 n# O$ H' _$ [
Select 字段1,字段2,…& g. L! s! t1 S' z
INTO 新表[IN 外部数据库]0 F7 A, R9 O2 v1 F. b
FROM 来源数据库
3 _' v8 a. i Y1 t5 KWhere 准则
4 M5 ]1 E% u: \: F6 R( T( C' z例:为定单制作一个存档备份, L% k. o2 t& E5 e) [) `% s5 N, U
Select */ Q* G2 `- A8 }# c$ h. z! [
INTO ordersArchive
& Y# k8 S3 i/ y8 k* \FROM orders
1 e$ x- R9 j+ h( z! b八. 联合查询4 I* a& n, z3 A; C
UNION运算可以把多个查询的结果合并到一个结果集里显示.0 s$ D* {& O( ]3 r% q% T
UNION运算的一般语法:
3 ^1 Z9 I# ~/ F- P[表]查询1 UNION [ALL]查询2 UNION …( L [8 o8 Z7 O) U
例:返回巴西所有供给商和客户的名字和城市2 }. _1 R1 q5 f- ?# b+ o- ~
Select CompanyName,City
) C; F, n4 A* m; HFROM Suppliers6 Z2 H. k; ?- f* s
Where Country = ‘Brazil’1 S2 N3 J8 D0 P
UNION. g6 K! I7 [; T& P" F
Select CompanyName,City
E7 m$ U& S D/ R$ lFROM Customers: M( K/ j# z+ i9 w2 x# |% d) v
Where Country = ‘Brazil’
! G9 y2 B" O! t' C注:
% q2 A2 p! N% J6 g# a6 W Z9 _0 W缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项/ s: l6 d* o# e, _7 a( w6 h
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
+ R1 }) g7 x5 l& Y6 b7 s0 o每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.2 i) C+ _3 |6 h1 z% y: `. e
九. 交叉查询
. D' M" G1 k" A N* ~, |交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
. N9 R" |/ S0 ^% W( \# S3 wMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
g9 ]- w- n+ FTRANSFORM aggfunction+ p* Z- ^: G/ B
Select 语句& B$ p3 Y, }; v L R! D7 g
GROUP BY 子句" G. I) c8 `. R& t6 ]" V8 U: I
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
! ?$ ?8 |5 d0 t: B5 x: v% g& QAggfounction指SQL聚积函数,8 B) j; C) H; k4 G
Select语句选择作为标题的的字段,/ ]* P- q& [9 k4 g1 @ k
GROUP BY 分组( o0 q6 W# @1 k
说明:1 E4 |+ d" u$ y
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值., \* Q' p9 X& j; b {( x) W: J
value代表创建列标题的固定值.5 E& ?, e, c+ c% P: p( @
例:显示在1996年里每一季度每一位员工所接的定单的数目: |' f, }0 g$ r9 ]( s
TRANSFORM Count(OrderID)8 U4 i: O6 h! r2 i& d* j% j7 L
Select FirstName&’’&LastName AS FullName
1 F3 u4 C% `7 {; |& y0 x" |/ uFROM Employees INNER JOIN orders
' w, Z- i5 k' o! cON Employees.EmployeeID = orders.EmployeeID8 v. c7 p2 z4 k. Q' d
Where DatePart(“yyyy”,OrderDate)= ‘1996’7 |, ?$ c+ ]; K* ]/ f1 y
GROUP BY FirstName&’’&LastName
9 `9 Q" `' z( @" ~orDER BY FirstName&’’&LastName7 P( C" _5 A# Q- x3 c
POVOT DatePart(“q”,OrderDate)&’季度’. ^$ x" K1 v/ D% i
十 .子查询) q: |; ?& c( Z d
子查询可以理解为 套查询.子查询是一个Select语句.7 [6 ~ r- z% Q0 E6 O6 H9 j6 f- _2 E
1 表达式的值与子查询返回的单一值做比较: m: n( Z2 N: v
语法:
" o2 o5 A! t1 i8 I4 M5 e表达式 comparision [ANY|ALL|SOME](子查询)
0 K8 I' w8 G q8 x' I说明:
' A% S5 {+ G: k3 e6 A5 L$ ^% _ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
' ]0 Y! G3 o# @# w/ I" G2 L" R. ~例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品# `) w1 }* T7 z! r8 z" o1 G
Select * FROM Products- \7 X; ^% V) o0 P" }
Where UnitPrice>ANY
! A9 q& p! q: W% W; d6 Q(Select UnitPrice FROM[Order Details] Where Discount>0.25)
. k/ y/ L" k. a2 K9 S2 o& t2 检查表达式的值是否匹配子查询返回的一组值的某个值" R& E5 S" n* K2 z& r2 I
语法:$ ?) |5 U2 K: q8 v
[NOT]IN(子查询)' V7 }$ C, Y3 A1 R& |
例:返回库存价值大于等于1000的产品.
) \6 G( i! K) e/ T. i$ G" Y* MSelect ProductName FROM Products! c2 O& A+ m) _9 C/ U, O* v2 R5 z" e
Where ProductID IN" H/ x4 W% h9 q3 a9 s
(Select PrdoctID FROM [Order DEtails]
! P2 P" f& Q: DWhere UnitPrice*Quantity>= 1000)' r$ I. j( T" u: z0 I/ \+ w
3检测子查询是否返回任何记录
7 G" e, W) g% u2 j5 A: D语法:5 t( d. ]9 ], Q" U' h: s7 P' L2 d
[NOT]EXISTS (子查询)
# {6 [8 _! p+ G例:用EXISTS检索英国的客户
2 R9 e+ i0 S+ K0 JSelect ComPanyName,ContactName
9 t" I3 t9 p- R2 @/ {$ q' ZFROM orders3 G5 ]2 r6 r4 l
Where EXISTS" I, ~) n) L8 ~) l. Y4 l0 g
(Select *# A& L8 V, x, I2 Z/ }3 |( v
FROM Customers5 n; o; S# d; b+ y! g6 X- c" }
Where Country = ‘UK’ AND
) u5 r9 d( I5 W0 d3 Q5 [' E) L) yCustomers.CustomerID= orders.CustomerID) |
|