- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法
% u' }, p4 n8 O! ]% [; m' H7 H6 q/ f2 n% R* g2 L% I
select distinct 字段 from 表名7 E/ i1 F, a: V/ n! Z% P& a+ l6 w
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。/ x% I$ P& `# Q5 |/ V# L
一.Select语句的完整语法为:2 x. W- w- \2 }! V
Select[ALL|DISTINCT|DISTINCTROW|TOP]
6 x% h1 O& q6 [$ _" Z/ f$ T{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
1 b3 r( M9 _% G& eFROM tablee xpression[,…][IN externaldatabase]3 [# S5 p/ P# `4 O" N
[Where…]
( L( W0 @+ j2 V+ s0 `' ?1 d[GROUP BY…]& N6 L' Z# [( |/ \+ R. H& ?
[HAVING…]
! U) c* J' r* O[ORDER BY…]
- O* y) q% D; f9 n" B1 Q0 X[WITH OWNERACCESS OPTION]
* `. M2 E4 ?- y, Y/ B说明:
( w8 @ p2 L0 H. n用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
" r5 K& n" A d7 t; `0 }1 FROM子句
9 J) |6 u# D/ m& mFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
: d) [8 {* ~+ J; Y) y; U例:下列SQL语句返回所有有定单的客户:8 b+ A. u# L5 t' ?# ?) {
Select orderID,Customer.customerID
+ @# s; K9 A8 P; }! ZFROM orders Customers
' h* t3 I2 \8 q( a$ L4 n- VWhere orders.CustomerID=Customers.CustomeersID
" b) s3 n0 i7 ~3 P7 u2 b9 I2 ALL、DISTINCT、DISTINCTROW、TOP谓词 v7 I4 F8 y5 R0 _ _- [. P
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
* C( p* @; b, h例:Select ALL FirstName,LastName
5 {7 n1 z) ~! P |FROM Employees/ H2 Q4 n1 k2 O& @4 v
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。; e# Z7 r% g) n: o# M" Z+ J2 {
(3) DISTINCTROW 如果有重复的记录,只返回一个: ?, O- q8 D- Q# S5 T: L" d
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
3 t6 r% p; @: n# N例:返回5%定货额最大的定单5 N: \* J, r( _6 N6 b" e& X
Select TOP 5 PERCENT*8 V; ~0 z$ {( x
FROM [ order Details]; ?8 b$ T3 B, m2 t! N1 L
orDER BY UnitPrice*Quantity*(1-Discount) DESC
8 d! S. v1 I1 A$ F+ t6 H3 用 AS 子句为字段取别名
0 Z1 m4 e: E( X) Q( b M如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
2 A6 [' {, k: e3 p; a/ _例:返回FirstName字段取别名为NickName
- i- Q$ j7 ?, m' o A8 G! }3 eSelect FirstName AS NickName ,LastName ,City
h$ s2 m0 j+ s# pFROM Employees3 u+ E9 R" N9 a2 |5 L2 N
例:返回新的一列显示库存价值6 W) W% V8 o9 n$ R2 K
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock) @' r1 o: e- V! E# c! v$ F7 O
FROM Products
( L2 O1 I# d, c2 _二 .Where 子句指定查询条件
W- e& [$ z( d. F6 D+ l% K5 Z' a8 i# Y1 比较运算符
9 }! K' u9 B0 e! @% L8 d6 J) f比较运算符 含义
5 D( c4 R1 H1 w7 E- A9 i5 ]% E= 等于9 F: a2 [3 Y' L- `& o5 n+ E; w; o
> 大于0 D+ ^ M# J* Y. p6 D6 q _! B- g' v
< 小于
! y( x4 F; z7 M>= 大于等于
; ]% e4 h) ^0 g' q- g<= 小于等于
2 V1 s8 p/ o3 `- j" n<> 不等于
1 {) S. O' Y& _7 ?3 a!> 不大于. U# j' i# \8 H' S8 }
!< 不小于
4 d: L9 g: c" b/ j" m例:返回96年1月的定单2 ?6 c% T& ?+ T
Select orderID, CustomerID, orderDate c2 e2 {: r# f" d* F
FROM orders
8 f3 Q" ?9 u, I8 tWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
3 P' d* }: l; @9 x! s+ Y注意:
) G- T( Z4 i6 f! p/ CMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。6 T6 V6 b% q0 L: _/ |# ?: {" S# }7 b
例:# N8 T% O1 F2 o
Where orderDate>#96-1-1#
& Y2 ]1 k# s0 i+ q也可以表示为:& Z! n- r4 w# Z) R& C5 Q1 p! j
Where orderDate>Datevalue(‘1/1/96’). i. |) Y# O/ {
使用 NOT 表达式求反。, P, Q' f! d- P; v; Y$ h* o: \
例:查看96年1月1日以后的定单) M# ]/ ~; ]- F/ d% ?! w
Where Not orderDate<=#1/1/96#
% O# ~% ?$ |# C2 范围(BETWEEN 和 NOT BETWEEN)% K) f& f; v! V8 Y- [6 A8 m
BETWEEN …AND…运算符指定了要搜索的一个闭区间。# S: n% i9 M' I* H& Q2 l
例:返回96年1月到96年2月的定单。
3 p: ~: I/ L0 \ i9 }8 n$ D; M4 UWhere orderDate Between #1/1/96# And #2/1/96#
& }& g) f3 e6 [: h& h6 U3 列表(IN ,NOT IN)4 A0 b- J6 Q9 i
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。% x$ S. Z, a7 p, ?9 @: A
例:要找出住在 London、Paris或Berlin的所有客户
# p( ?% I- }, o8 Y2 |. [1 X! _! g8 @Select CustomerID, CompanyName, ContactName, City
& c7 c9 I4 s: R, R7 DFROM Customers
2 y h% Q: x, F) lWhere City In(‘London’,’ Paris’,’ Berlin’)
- z( [% d: \1 {4 模式匹配(LIKE)
a& g% |' S7 lLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。7 ]* j/ Q" J( c9 p# e# ]
LIKE运算符里使用的通配符
4 A) k2 i) g2 p通配符 含义6 B- B. `: k8 a
? 任何一个单一的字符# @' p4 h# S1 v! v' X
* 任意长度的字符
1 g4 w) G6 s0 r! t m; L# R' z# 0~9之间的单一数字9 Y5 `+ U; U. U+ F8 G
[字符列表] 在字符列表里的任一值* U l8 \4 ~$ y1 S8 `( Y& d8 i
[!字符列表] 不在字符列表里的任一值
5 y, S2 |. S! Y* p" e, G' b) N- 指定字符范围,两边的值分别为其上下限8 c% F, v7 C" g* z2 O( Q5 c9 X; {
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户( X: j/ f# O0 Y' B4 R
Select CustomerID ,CompanyName,City,Phone: c5 M1 F! R3 W5 n; P0 [, z
FROM Customers
8 d" c. g: \8 u4 nWhere Phone Like ‘(171)555-####’
( O0 N; j0 f9 c' D/ c. RLIKE运算符的一些样式及含义 |2 j6 ]5 b9 ~5 M2 H
样式 含义 不符合( B4 L/ h" ^+ o" _! F
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
6 I" k$ ~1 w$ G- Z# LIKE’5’ 5*5 555
8 z! {1 v4 D, q' A1 t" M7 G% TLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
" G0 Y' ?7 T8 [# v7 kLIKE’5##5’ 5235,5005 5kd5,5346 J! m9 g6 {5 H6 Y' O# G5 v
LIKE’
; `+ `& B4 }3 U; e[a-z]’ a-z间的任意一个字符 5,%7 z! y. ]. {( [1 z& q, Q+ ^( d F
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
$ {; t5 G- G/ O& `( XLIKE’[[]’ 1,*$ A! |% h$ U N$ Y
三 .用ORDER BY子句排序结果: z6 w* ], |2 [ o
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
# f" y4 [. H0 `$ f& morDER子句中定义了多个字段,则按照字段的先后顺序排序。- I- c8 _8 z E/ b8 b
例:
% t: w$ Z: y5 L8 _* y1 r( ASelect ProductName,UnitPrice, UnitInStock
4 F3 ^! m8 ?) {4 l' }FROM Products
2 A4 h n) F7 i. q* P5 b" n9 r$ sorDER BY UnitInStock DESC , UnitPrice DESC, ProductName, c. [. g9 v4 F7 _- ?$ Z
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
1 M* `; R$ X. K0 l `3 V5 B2 G例:下面的语句产生与上列相同的效果。: }8 v; Y/ a/ X
Select ProductName,UnitPrice, UnitInStock
9 t4 Y- t* W$ f7 q3 n( B* Z8 zFROM Products) v8 ~2 g6 Q3 Q& B# r
orDER BY 1 DESC , 2 DESC,3
( w3 I0 u4 w3 o; i7 w. _四 .运用连接关系实现多表查询$ d* |! z/ O# r! {) U6 M2 x% h
例:找出同一个城市中供应商和客户的名字+ I7 {) b: c5 W8 ~( z. T
Select Customers.CompanyName, Suppliers.ComPany.Name/ h! V) A+ g( i) W
FROM Customers, Suppliers4 ?# O+ s1 g% {2 `
Where Customers.City=Suppliers.City* ^0 P9 k7 y* i6 C4 ]' ~* R5 ?
例:找出产品库存量大于同一种产品的定单的数量的产品和定单& z1 e- U( J/ k7 }/ n3 l, D
Select ProductName,OrderID, UnitInStock, Quantity
1 _4 Q, R9 e" Y# p4 X1 t6 yFROM Products, [Order Deails]
! `( \( ]8 w6 `4 K9 S. Q: C7 J$ HWhere Product.productID=[Order Details].ProductID# q/ q e7 b9 }) I0 \! I
AND UnitsInStock>Quantity0 E' r; _7 D( y( w) T H! ?
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN" [6 B. a2 m g! W
语法:
0 A. ^( W5 k8 f) L7 Y* |% l6 K8 dFROM table1 INNER JOIN table2& K) e+ s, r9 y# m0 ~7 k
ON table1.field1 comparision table2.field2
/ ~7 N% C) l2 r6 N2 x& j其中comparision 就是前面Where子句用到的比较运算符。
6 L8 d- Z. P7 S# K& x& vSelect FirstName,lastName,OrderID,CustomerID,OrderDate: D& J f- f; ]
FROM Employees
/ r8 G* \7 ?9 r6 f: kINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID7 f3 N8 `7 F$ F
注意:$ X% Z7 @9 A; S% n4 j0 O
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
+ P* R9 }& Z1 } s在一个JOIN语句中连接多个ON子句
5 H$ u( L' A; @5 n语法:
. ~" e& A' r5 D2 J1 WSelect fields
0 S6 R) L4 B: hFROM table1 INNER JOIN table2, ]) ~+ ?4 R1 E; A* J" Z
ON table1.field1 compopr table2.field1 AND
8 X0 l( K/ X' K' N AON table1.field2 compopr table2.field2 or8 ~/ f. h6 y" Q
ON table1.field3 compopr table2.field3- m4 K; B9 j6 C; G8 }, V* J2 m
也可以! O& f6 C9 |( M' L" n* b' M
Select fields
' V* f2 p0 l* `& r$ e2 DFROM table1 INNER JOIN; q+ j3 t' F) ~6 y. x; L R
(table2 INNER JOIN [( ]table33 k$ }. g- J; b, j
[INNER JOER] [( ]tablex[INNER JOIN]
% a! T# w8 R( w$ G6 FON table1.field1 compopr table2.field1
0 n. d# [3 D8 ~ON table1.field2 compopr table2.field29 L- s' S" w$ @0 e5 y; d1 s. K
ON table1.field3 compopr table2.field3
8 h+ Q) W. s! J; S5 I外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
) _0 [2 D% P5 T$ Q" QFROM table [LEFT|RIGHT]JOIN table2
7 `+ c% A6 q$ G4 u, bON table1.field1comparision table.field2
$ d3 x( s) f4 ~' q* B5 c' |用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据" e" J% T2 y; P, }# I. O
例:不管有没有定货量,返回所有商品
0 A y( l: u- Q# OSelect ProductName ,OrderID
& h$ C6 K4 {- g8 nFROM Products
; T% {; u5 ?" w' M9 [8 L+ k* zLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
! A6 G. s( T" u( ]8 y$ a1 W9 u! Q右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
( j+ q8 E$ _6 N例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。- G; Y8 |0 v% J. d# m, H
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
- \" P! z- n6 e$ r# m* g/ G9 ?Select *, _, y4 _( C; ?" {' R
FROM talbe1
) v9 [8 F o) \& o5 k5 k3 lLEFT JOIN table2 ON table1.a=table2.c
* Z/ h9 D* i5 F* a. E- f7 E! ^1 连接查询中使用Iif函数实现以0值显示空值
) G# G/ D9 I2 X& r$ j: p) y$ [Iif表达式: Iif(IsNull(Amount,0,Amout)
( b3 l- J* g. \) X$ L2 c( ~% Z例:无论定货大于或小于¥50,都要返回一个标志。( F: _( I- v. s# G& ]
Iif([Amount]>50,?Big order?,?Small order?)
* ?$ [& o! ]- K: r五. 分组和总结查询结果
# [6 p! [7 U3 D在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。8 B4 G3 X8 t3 z9 M
GROUP BY 子句的语法 Z" g( C M0 v
Select fidldlist+ c+ f/ B& P" m: Q, X
FROM table
( w y8 l& ] [' VWhere criteria
0 h: P+ T, T( K0 _[GROUP BY groupfieldlist [HAVING groupcriteria]]- B- y$ o4 n3 L* `: V7 W3 v: P
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。$ | y; o" E( o; J/ o# B( r R, }
GROUP BY字段中的Null值以备分组但是不能被省略。% N* {! ^# W2 D0 d
在任何SQL合计函数中不计算Null值。
6 v) a; o7 z. y8 p2 z. W2 IGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
$ e* [. w- v6 ]0 O3 r7 l, g1 m1 d! A例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。* ~ ?& z7 x/ r" [: m* L
Select Title ,Count(Title) as Total6 a( }3 b3 q4 ?9 n* K4 E7 T
FROM Employees
7 R6 M$ I3 L5 YWhere Region = ‘WA’
4 [: _' i6 T& Z3 uGROUP BY Title
; e8 R- t# t" L$ n0 P, t( uHAVING Count(Title)>1
% s0 @0 i9 [7 Y+ q+ h" ^JET SQL 中的聚积函数
! n3 Q# z1 I }$ q聚集函数 意义
3 q+ p' H) r: q! M) o- T1 DSUM ( ) 求和8 v, F1 A# c6 T5 W& W
AVG ( ) 平均值
& L' q# j. H. L$ Q2 BCOUNT ( ) 表达式中记录的数目- z8 V$ k. ]+ d3 R
COUNT (* ) 计算记录的数目
( g1 r& p# g3 f9 a7 T9 n0 y/ YMAX 最大值* p: ]- _, A, \* l4 v8 U; `' e
MIN 最小值
; [& M4 L% z T9 Y) V, U. r7 kVAR 方差
" x$ H4 N. |. A D/ bSTDEV 标准误差0 O% {! h- S: v
FIRST 第一个值
+ e: B0 E& i9 r1 e w. PLAST 最后一个值$ j. x |8 h) H! I* K; ^; ~" q H
六. 用Parameters声明创建参数查询% k& g3 W1 n( @0 h
Parameters声明的语法:
, T/ k: i3 r! B7 o9 lPARAMETERS name datatype[,name datatype[, …]]
& D$ |- \/ G2 i9 |: S6 G其中name 是参数的标志符,可以通过标志符引用参数.' G1 H+ Q/ n% Z/ U7 c; g+ k/ m1 x
Datatype说明参数的数据类型. \: y8 I1 [' K" c# U/ x+ i
使用时要把PARAMETERS 声明置于任何其他语句之前.
& f# w$ ?4 i) i2 d例:. s6 V& d) Z+ _ Y# u {& B+ ?7 D
PARAMETERS[Low price] Currency,[Beginning date]datatime
0 p+ ^ e1 B, c3 ^Select orderID ,OrderAmount
; a0 v/ u! `+ W- R0 w3 b5 CFROM orders+ }6 X: E4 w& u0 a" u& U; T) X
Where orderAMount>[low price]6 } V1 r$ ?6 O% E) ^
AND orderDate>=[Beginning date]; N2 i: G! b/ n& T
七. 功能查询
# P/ N4 h& i7 \% M7 d) F) Y4 y所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询., m# l& b/ O/ t+ l
1 更新查询
9 a$ j B; K n/ Q1 ]Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
& V( D$ a# L7 u" U) V7 r7 ?: u$ O更新查询语法:) {8 b/ [$ E( `0 f1 L- G
Update 表名. P5 p9 S( d/ E$ L0 A
SET 新值: K. z( T: U; \2 q: V
Where 准则0 E0 d+ W* E9 M8 n! {2 k
例:英国客户的定货量增加5%,货运量增加3%/ Y8 `5 V& X( v' {4 E$ Z
Update OEDERS
( j* f/ I$ w5 M4 ?% \# N* VSET orderAmount = orderAmount *1.1
2 a% `) R- V, Q2 D5 mFreight = Freight*1.03
" v. ^% o! i. D! w. gWhere ShipCountry = ‘UK’' w* A3 d& w3 D0 O
2 删除查询
7 Z; Y! p1 d' ^& F1 K, [( iDelete子句可以使用户删除大量的过时的或冗于的数据. G# e- }7 |9 U) w2 N
注:删除查询的对象是整个记录.* }' i3 X' {1 `9 d( C# K( C( |
Delete子句的语法:
9 v/ f Z# o ^# n3 XDelete [表名.*]
$ p( @" E/ M7 w- ^5 tFROM 来源表; J6 o0 Z4 I4 N% K; s- N
Where 准则7 p% g5 d, H/ _$ a$ Q
例: 要删除所有94年前的定单6 u/ c* |: ^) ~+ P- I9 Y& i) t
Delete *
7 [. s7 h$ j& v6 o/ gFROM orders
) D9 E. Y' _$ ]7 ]Where orderData<#94-1-1#9 S% E/ S6 K- M+ S9 ?
3 追加查询7 I3 C: D' J5 ~( B" B
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
: p" L4 `: `/ N' O s7 H) L2 mINTO 子句指定接受新记录的表4 K# c. Z, o6 Y' t
valueS 关键字指定新记录所包含的数据值.. I2 \0 e9 n4 `) r7 z
Insert 子句的语法:' J# U1 \7 |& J" K' o
INSETR INTO 目的表或查询(字段1,字段2,…)8 k" `! r/ T3 E
valueS(数值1,数值2,…)0 Y7 O6 X( ~4 w" e0 A1 {$ b
例:增加一个客户- ]9 @' l% m# X9 J3 o
Insert INTO Employees(FirstName,LastName,title)6 Q/ D* \8 I# h/ b0 ^# }/ ~
valueS(‘Harry’,’Washington’,’Trainee’)
0 \. D/ z& B/ c, A0 i4 生成表查询
* z# I- ^0 k% d& f! x( @' w可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.6 R9 y8 T* h0 M
Select INTO子句用来创建生成表查询语法:" B5 R' f" N1 N" [- {0 p
Select 字段1,字段2,… ~ @. R5 i/ F
INTO 新表[IN 外部数据库]
% ?0 v. k& i0 A. Y$ Y2 KFROM 来源数据库
9 L2 A' J9 q: C# z# O% a6 y% sWhere 准则
! y$ P6 [* B6 H例:为定单制作一个存档备份; U& I" r r4 x* n- |
Select *
7 R0 L: b D$ g3 p K9 u- qINTO ordersArchive
( n7 {$ M; Y& v* H( t+ a7 gFROM orders% j4 m5 n* s/ s' ~. X7 L* F7 g% W# B% T
八. 联合查询+ X) D/ ]7 h) F0 x- Y/ e$ H
UNION运算可以把多个查询的结果合并到一个结果集里显示.3 y0 Z8 v [# Z2 O6 T1 d+ N
UNION运算的一般语法:
& j% U# S5 ]0 J5 |8 U[表]查询1 UNION [ALL]查询2 UNION …2 k0 K0 e/ j. {2 |! r {/ B
例:返回巴西所有供给商和客户的名字和城市
, g) w8 q7 H; D g3 A$ wSelect CompanyName,City
+ V# I' P% |. B/ C( qFROM Suppliers+ J% E, F" g$ g
Where Country = ‘Brazil’3 G( d' d2 u e$ d) k) ]7 p
UNION" O$ h) f! R" x$ }# S
Select CompanyName,City
q! P) I. Q* N" R" {" q5 GFROM Customers
7 w( S/ t, V" Z( s0 @1 oWhere Country = ‘Brazil’
% V' V9 \! a# O( C8 T; [0 d注:
9 X$ Z6 h4 c7 |- Y5 e( j" J缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项- k8 \3 v, ~6 A" \5 S0 \. `" t
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
7 H( j2 ?/ X: ]( G( V* D每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句., o1 S, g' S1 y9 q6 w E' F2 X
九. 交叉查询
* L2 v7 Y0 ^4 @+ O交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
! W: F2 l) B1 S' U9 P# e, |/ p& yMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
. |( F8 Q$ U; G2 Q$ T4 MTRANSFORM aggfunction4 q9 D" y( J9 S& w: ^& h: @
Select 语句: g$ @ r, ]7 x9 l7 O0 R7 C" R3 y W
GROUP BY 子句
; w! _" K+ g, h5 Y) HPIVOT pivotfield[IN(value1 [,value2[,…]]) ]( V, J" }/ e4 C. J5 b( S
Aggfounction指SQL聚积函数,
& T+ {1 ?. n0 m& @* u0 M) B' {Select语句选择作为标题的的字段,
0 t2 V' {1 x0 Q" Q& {- @. _GROUP BY 分组$ K( Z6 \& V3 N+ D
说明:- R( U6 k, T) j4 n
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
3 F: {5 S, M* h- j- p& fvalue代表创建列标题的固定值.
) ~4 Z J) G4 i; k5 X" B/ e例:显示在1996年里每一季度每一位员工所接的定单的数目:. M5 P! ~3 l; \
TRANSFORM Count(OrderID)
v8 i1 l4 k/ t7 GSelect FirstName&’’&LastName AS FullName
3 s- H Y* A) g3 |7 V8 ?' OFROM Employees INNER JOIN orders( ]+ q+ O& k( ~3 H" y' ~) N) v
ON Employees.EmployeeID = orders.EmployeeID
, S9 i5 H& J- j1 G1 yWhere DatePart(“yyyy”,OrderDate)= ‘1996’
/ q" {( W D. k+ n: Z9 vGROUP BY FirstName&’’&LastName
. o0 d7 J* w, ZorDER BY FirstName&’’&LastName
% J$ t: a. u0 D9 ^1 oPOVOT DatePart(“q”,OrderDate)&’季度’
) A% f/ J$ B1 e# z% @8 Q十 .子查询% y: o- t( m: a
子查询可以理解为 套查询.子查询是一个Select语句.+ s& I/ g" ^) @$ S1 ^& P
1 表达式的值与子查询返回的单一值做比较" U# N. z9 d/ J8 U8 h0 D
语法:% q5 W# o& J6 [9 C9 c: L, v. N
表达式 comparision [ANY|ALL|SOME](子查询). c6 s! ^$ I) G
说明:
# A' o+ }) Z' P( J e+ m5 c v9 g NANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
/ x: h3 F/ S0 R" Z: @例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
" X7 u' @; {& r2 P9 YSelect * FROM Products
* F# I Y" ^" V2 D' e# D, tWhere UnitPrice>ANY
`+ ^. l5 D8 ]* _0 ~" }; K(Select UnitPrice FROM[Order Details] Where Discount>0.25)1 I8 k$ H6 Q, z% E- k
2 检查表达式的值是否匹配子查询返回的一组值的某个值
# R; L! _6 K% R语法:
/ F( M4 n3 [3 a+ @5 P$ i[NOT]IN(子查询)# H8 G# v$ M) |2 s; k
例:返回库存价值大于等于1000的产品.1 O$ U6 L: L z, T! g5 ], T+ ^
Select ProductName FROM Products: C; s" S" t) \& {1 U0 ?8 w# a7 o
Where ProductID IN( a6 u4 j6 N* S! N. h4 g
(Select PrdoctID FROM [Order DEtails]/ F- K/ J9 [! N3 Q4 r. o
Where UnitPrice*Quantity>= 1000)
3 S9 g# ^( o. {; g" f+ g% |% e3检测子查询是否返回任何记录, a: K$ B# i; k5 V- P1 o" z2 O
语法:) u! @0 O6 F6 |% w2 F, r( }1 @: D
[NOT]EXISTS (子查询)
/ X8 d' g/ b- X, }/ t) S例:用EXISTS检索英国的客户
4 A+ w" L# i- ISelect ComPanyName,ContactName4 x( X, ^6 w8 j! x
FROM orders
. i# i9 z$ \2 V9 a" GWhere EXISTS
8 q O7 r" u1 ]& B, d(Select *
; n5 A1 h" _' v: ^0 Y6 yFROM Customers8 [! v% `2 z& ` j$ x" w7 H& E6 p( b
Where Country = ‘UK’ AND
1 E5 Y: K. {* ~8 I. W" _- V1 TCustomers.CustomerID= orders.CustomerID) |
|