- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法
" C) J; A7 X* k7 N9 M- e0 ]3 F$ d% M; }: e
select distinct 字段 from 表名, A0 ]; a6 g2 G! ?. x
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
& l2 n: a N/ |. V( g一.Select语句的完整语法为:, L# ~+ ]: I H" t2 s
Select[ALL|DISTINCT|DISTINCTROW|TOP]
7 F2 J( p3 i |5 T: Y+ i$ R{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}& h$ E o3 f+ H: W# A& a6 t" |
FROM tablee xpression[,…][IN externaldatabase]
9 A& g1 C- [5 P% h W, I8 k[Where…]
$ W$ O; a: L. v[GROUP BY…]
7 R3 R9 X; Z+ u6 t8 o$ J) o; l[HAVING…]4 p2 D! f2 U0 U: w
[ORDER BY…]
1 \ H P6 k+ T/ G/ _) \% n[WITH OWNERACCESS OPTION]/ M+ H! H( ]/ a) F# }2 B% i% Z
说明:
2 b: f5 F2 g- c* u5 B7 l) A用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。: I0 \/ }5 H$ G- P8 E4 O/ k
1 FROM子句
$ I7 z: R7 y3 o% h- vFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。7 O* h, v4 ?% i- T
例:下列SQL语句返回所有有定单的客户:# x# ~) T9 z: w
Select orderID,Customer.customerID
; z- Q2 N+ l6 J. c S9 v+ Z7 q4 K6 AFROM orders Customers
2 T0 n. m' ^6 Y: ]7 C! UWhere orders.CustomerID=Customers.CustomeersID
4 T0 C& y. p5 Q# s+ Q1 X* Y: y2 ALL、DISTINCT、DISTINCTROW、TOP谓词
. `" ^* H3 b5 [" q! }3 I(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
, U5 G8 R( u5 Z3 K; r6 f例:Select ALL FirstName,LastName
0 g/ T2 O: P$ G& W9 L% ZFROM Employees: T7 K9 S# _5 E
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
) O8 W( H) V( T3 Z8 R(3) DISTINCTROW 如果有重复的记录,只返回一个
) ~$ U: S- \0 Y. |+ }(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)" z2 i* B/ B. Y- M
例:返回5%定货额最大的定单
F* {! L0 C& _, m7 `! @Select TOP 5 PERCENT*! o+ B# T _+ l) \2 w7 M2 ?/ i" U
FROM [ order Details]$ w' x/ S( O. W* u3 Z
orDER BY UnitPrice*Quantity*(1-Discount) DESC) T+ [$ r4 r3 M& U0 j/ n* l9 O
3 用 AS 子句为字段取别名7 T, B3 q7 B( P1 I2 D: [6 L
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。6 J, A5 E& r! N; r" `
例:返回FirstName字段取别名为NickName1 G" a# N/ }, y G$ Z2 \
Select FirstName AS NickName ,LastName ,City
- _/ o- L, e6 j- W* oFROM Employees! U3 y# r/ l6 V' b
例:返回新的一列显示库存价值/ ~$ {- Q$ E& y0 Q6 A
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
; q: S( O z9 `) bFROM Products
- P+ B6 j2 {& a# I0 v二 .Where 子句指定查询条件
3 E: Y+ Y6 `/ [1 比较运算符, V. N- I6 ~+ W* K3 c9 x
比较运算符 含义+ L" e6 i% j9 y' n, S- k
= 等于
) Z" g5 D& l v2 N$ D# H> 大于; m9 O3 C/ Z3 U3 f
< 小于
* b X0 P6 y, L- a>= 大于等于 s; ~ x& p6 { }6 A
<= 小于等于
1 ^) r2 R; E) M6 Q<> 不等于
' [' E; s* t7 K- Y( w! n!> 不大于
8 K+ x8 L5 t7 }9 V% X!< 不小于0 ^3 [. X$ [8 U& R. Y
例:返回96年1月的定单
8 F( x7 v; \6 A( Q" ]Select orderID, CustomerID, orderDate
( R3 d, o! ?9 w3 H, t* b- O( g4 fFROM orders7 ~; Z6 i$ p* d% T4 s: }+ A
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
: V' F) W% Y+ e( K8 t0 T注意:
2 V7 Z" E( L% w- B3 {4 O+ ?; JMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。" Z5 S o& R4 O* m9 g
例:$ `' _/ {& U4 f* I- P" a+ K
Where orderDate>#96-1-1#
* Z2 Z: L# A. u7 U6 k. z也可以表示为:9 ]' d4 J8 d9 |# d" o
Where orderDate>Datevalue(‘1/1/96’)1 n% z* q3 ]/ N/ U* x5 w
使用 NOT 表达式求反。3 u* l7 {# Y* }9 |' U/ [1 q
例:查看96年1月1日以后的定单/ |( P H9 _- R5 r) S
Where Not orderDate<=#1/1/96#9 N* D8 i. V7 I$ F0 g
2 范围(BETWEEN 和 NOT BETWEEN)$ L/ t) V) g; X
BETWEEN …AND…运算符指定了要搜索的一个闭区间。6 O. x3 U; |2 h. K% j/ K- p2 v
例:返回96年1月到96年2月的定单。3 W" i% I2 m+ S: H
Where orderDate Between #1/1/96# And #2/1/96#
7 h8 s0 m& }1 F+ o1 f3 列表(IN ,NOT IN)
% M, M3 M$ w# ]; }% G# M; sIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。6 ~7 ~7 |8 q# H& V5 ]$ t [
例:要找出住在 London、Paris或Berlin的所有客户
3 y$ w- i. K5 \# S" p: `Select CustomerID, CompanyName, ContactName, City
$ x* ]) S8 G. c- g1 w: F/ o4 zFROM Customers7 J0 s- g: ^' u4 _$ ?
Where City In(‘London’,’ Paris’,’ Berlin’)
5 q# ~: w, C0 |. e4 模式匹配(LIKE)
0 S% ]& L" ~# f# F" G3 }LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
9 i: R/ s1 z& O4 [LIKE运算符里使用的通配符
8 R1 u4 E2 j: O3 l. ~- U通配符 含义
! g9 A. T: I! [$ }? 任何一个单一的字符 v& [" P6 N! f% u# H
* 任意长度的字符
, V/ t+ E# y7 T, ^9 k# 0~9之间的单一数字
; N1 r9 W. U' V4 x s" |[字符列表] 在字符列表里的任一值; h4 S2 o# ]* S& d& r+ r& P' r
[!字符列表] 不在字符列表里的任一值
" y& V6 y" t/ o. j4 K+ D5 \4 y- 指定字符范围,两边的值分别为其上下限
) d% h- K A1 Q例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户" d' d) y8 J; B3 H7 V1 I; U
Select CustomerID ,CompanyName,City,Phone/ A5 k7 f. R- w2 l
FROM Customers D& V) s7 g2 ?$ \ l
Where Phone Like ‘(171)555-####’
, H9 m. i' A+ G* Y0 qLIKE运算符的一些样式及含义
5 W3 ]/ d0 f g* f9 G& K样式 含义 不符合
$ m6 b0 j" X: d# g6 {LIKE ‘A*’ A后跟任意长度的字符 Bc,c2553 R I' p9 E% b- @/ }" b( m: ?
# LIKE’5’ 5*5 555! I) d; K j+ k( _! l
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
6 c5 M* u( h* w: ULIKE’5##5’ 5235,5005 5kd5,5346
* G- m6 u0 t6 OLIKE’
4 d5 a. ]' v4 S' n: J( |6 E8 a[a-z]’ a-z间的任意一个字符 5,%' l0 E+ P3 U5 s* v# g' _
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1* S9 {! ~. t' a! v4 z! a9 y! h
LIKE’[[]’ 1,*
; ]6 s8 D5 c6 K8 a, @; `三 .用ORDER BY子句排序结果0 t6 n' k4 _2 D6 q/ f$ d
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。* Y1 F4 P0 j& e( P, F3 ^
orDER子句中定义了多个字段,则按照字段的先后顺序排序。* ^ ^0 p/ ]- U
例:2 _! ?- h, Q0 C( ?, v$ Y! _
Select ProductName,UnitPrice, UnitInStock
4 M- j4 ~; B/ ~' ]/ H+ Y2 LFROM Products
: R/ l- g6 E( _$ q% P, P! N3 PorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
% B, t( i& f m$ `! f4 norDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
* A% |# H1 h* x例:下面的语句产生与上列相同的效果。
0 c8 K; M" Q/ aSelect ProductName,UnitPrice, UnitInStock. n- f3 {1 T# G( c3 @
FROM Products
( U0 o4 Q* h( Y1 f6 W) ?orDER BY 1 DESC , 2 DESC,3# C$ j& V. u+ [/ `
四 .运用连接关系实现多表查询
: q. j- A# O# w) D% {1 o# U% \- |例:找出同一个城市中供应商和客户的名字: u3 {% q9 m/ x+ a
Select Customers.CompanyName, Suppliers.ComPany.Name
& q9 C2 {$ ?( `2 K4 X2 l2 t' v5 m0 x$ _8 H* |FROM Customers, Suppliers6 o2 N$ N b6 k9 e' [
Where Customers.City=Suppliers.City" Q; p: S7 p" A5 G2 p8 @1 `( ~
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
3 A( _, \3 e) }; h& ZSelect ProductName,OrderID, UnitInStock, Quantity* q7 i' G/ S; ?
FROM Products, [Order Deails]" ^6 w7 B. c* Y: y0 y* P
Where Product.productID=[Order Details].ProductID
. X2 h. e2 d8 EAND UnitsInStock>Quantity
/ P1 o+ e: S- j7 {5 t另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
' e( c9 | P+ C语法:
3 I0 V% E) Y6 P/ N% H6 U% |FROM table1 INNER JOIN table24 M6 \- B7 R% \* T
ON table1.field1 comparision table2.field2 {; l" D( w) l+ a, r3 l3 I
其中comparision 就是前面Where子句用到的比较运算符。6 ?( Y& E5 V0 m) o
Select FirstName,lastName,OrderID,CustomerID,OrderDate
$ C& \: ?+ @! P; i# j3 p5 s tFROM Employees
9 O& R. j l# ]; tINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
s2 t) Y/ A4 c+ E, e注意:% `+ M' ^4 K3 ^3 h" J8 d( n
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
5 B# N2 `0 x7 L8 @/ ^# `在一个JOIN语句中连接多个ON子句5 h7 n4 b* u, d+ i( ^
语法:
% T% }7 B3 k9 S% E- l- ~Select fields
+ q& e* z1 ]1 H7 N: C7 J' B: J' C; q! ~FROM table1 INNER JOIN table2) Z; } z% t' {, B" d
ON table1.field1 compopr table2.field1 AND+ d2 T! r' w! d7 K) Q+ G3 E
ON table1.field2 compopr table2.field2 or+ [2 [/ e, D- n& b; a- W) i
ON table1.field3 compopr table2.field3
& Q. x: t: F- G' ]( w! L l也可以: Y9 u; n7 A6 w" d4 X
Select fields4 Q! {) s$ o p: r' x
FROM table1 INNER JOIN
( I# S( z: d1 H$ f. a8 \/ J(table2 INNER JOIN [( ]table3
0 p% i) v" Z; x9 w" r1 R: z: b[INNER JOER] [( ]tablex[INNER JOIN]; S- q1 `5 r3 e3 q0 }* j, n6 D7 Z
ON table1.field1 compopr table2.field1- q$ b* ^. i4 f# l% Q9 R: x5 j5 i
ON table1.field2 compopr table2.field2
7 l }4 ~+ c$ M: K1 K: p, qON table1.field3 compopr table2.field3% v* u, r, r O& b& ^
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
5 [: x. o4 h* v; B% s: Y9 \FROM table [LEFT|RIGHT]JOIN table2
$ D1 j; d7 t1 d# `1 lON table1.field1comparision table.field28 F2 \& R @# J5 U: i8 ], ?2 m
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
K/ i" z3 ?8 J9 U例:不管有没有定货量,返回所有商品
# b/ J2 \% F4 r7 U, M. [) k" }% Z- WSelect ProductName ,OrderID1 L4 c5 i4 ]' H+ X% y0 q
FROM Products9 F, q9 b" Y8 a( \' b
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
# I/ l6 b, t/ g' Q# t @ Z右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。( h. h! r. M7 [ i2 t; ^( x. {. [
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。2 s2 y+ \# \% @7 i8 z- u. _* P4 R, N
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。4 C0 G4 a* v+ \
Select *! ~9 T: p9 `) ]* `% y( U$ ~
FROM talbe1
/ X+ N+ t X5 u. ^' L% @. |LEFT JOIN table2 ON table1.a=table2.c0 P6 F/ f7 f7 o% h" a, }
1 连接查询中使用Iif函数实现以0值显示空值# ^" r+ _9 H1 K7 L$ f
Iif表达式: Iif(IsNull(Amount,0,Amout)
- d% ^- e: P1 B# u; b' O例:无论定货大于或小于¥50,都要返回一个标志。2 {3 o7 M% r4 j: v# b' F2 Z. B
Iif([Amount]>50,?Big order?,?Small order?)3 H: v H: _4 e0 B7 q7 q
五. 分组和总结查询结果3 J, o9 u% @( \5 v9 n* w: T
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
7 c% G" ?4 ?7 O4 t0 A1 |7 k/ MGROUP BY 子句的语法8 ~4 O X, y. U$ W" R, G
Select fidldlist
7 K( d. t; ^6 S+ B; XFROM table
* }# k! c6 O5 b7 V4 D& fWhere criteria
) h; x" H. M, [' a3 D[GROUP BY groupfieldlist [HAVING groupcriteria]]2 Y: Q7 J* E3 L* E+ x- j0 k/ d
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
: A0 O# j3 p4 q6 ]6 h5 CGROUP BY字段中的Null值以备分组但是不能被省略。6 o- M7 L* W0 E+ `& K `
在任何SQL合计函数中不计算Null值。+ V8 Q; N. k2 \8 Y6 ~+ N
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
' @' ~0 E0 {5 h1 E' _8 Q0 c例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。5 f8 L/ U4 X! F8 x& n$ l' d& ?9 O
Select Title ,Count(Title) as Total4 U9 q8 v/ A! e* t
FROM Employees
1 H9 m y7 T% J/ I+ fWhere Region = ‘WA’- ], a+ W3 w2 c- q1 O* r+ `* k
GROUP BY Title
" ?" y. z0 g* p' HHAVING Count(Title)>1
2 ?' @) _3 w4 B" g3 S7 ]' PJET SQL 中的聚积函数7 i/ u6 U: r$ {! n5 ?3 S
聚集函数 意义
. i8 q9 P& p% V9 w% H5 ]SUM ( ) 求和3 S2 Y' T7 _, E& G
AVG ( ) 平均值
4 D5 a$ r& \; b( \! A! mCOUNT ( ) 表达式中记录的数目+ B: c1 h4 C$ v2 y0 ?6 B
COUNT (* ) 计算记录的数目
. H7 ?) j" {1 D2 b U' D7 S' xMAX 最大值
' p1 F8 {8 H0 p" q9 XMIN 最小值
" M3 X" d% z( j+ HVAR 方差" I5 N, x3 a- o' t) _! E
STDEV 标准误差
) a& @$ ]) C7 o* a7 ?FIRST 第一个值
) Y2 }7 G$ e# C) e+ ~# pLAST 最后一个值* K# m: ?) M2 O; I/ A
六. 用Parameters声明创建参数查询1 v8 m7 c& e7 S8 {2 H- _& D- M
Parameters声明的语法:
9 s- v0 _& ^. l- i- t7 ?! `PARAMETERS name datatype[,name datatype[, …]]
" s7 c; o" L8 x0 Q其中name 是参数的标志符,可以通过标志符引用参数.
; {& C6 P: W$ ], ]' t' hDatatype说明参数的数据类型.$ ]2 |. [9 t& L; K9 C
使用时要把PARAMETERS 声明置于任何其他语句之前.6 c* _/ }( ^% L( _( l4 E" K
例:
0 w, N: d) v( |6 ]: PPARAMETERS[Low price] Currency,[Beginning date]datatime$ e! W$ ^- [. u1 W7 W+ l
Select orderID ,OrderAmount
$ P8 w7 m/ c. ~$ ?- z; v% PFROM orders# F; w$ i0 ]3 V) P: u
Where orderAMount>[low price]
9 Z6 z" _% j& p! }AND orderDate>=[Beginning date]
* t9 e0 q& x7 G* A七. 功能查询
+ c O. z- L+ s F- J2 { d" L所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
( M7 }. x4 w: V. h X/ s1 更新查询
8 g6 c7 K5 G# G' K1 rUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
4 k" `' B5 D8 f. X. M更新查询语法:
# w( Z& _- k1 ~" U9 v# J8 e# vUpdate 表名
4 y/ G; ], L- B4 Q0 I$ `SET 新值
! r/ P; k. t4 b" e$ t# g# {! jWhere 准则- E3 V1 l: X: s/ z1 e7 Y. [# t7 u( w
例:英国客户的定货量增加5%,货运量增加3%9 V/ O8 n; [9 ]7 V2 k: t9 l' O3 \
Update OEDERS
% Q6 j+ ]1 ?" G0 d% l3 `0 [SET orderAmount = orderAmount *1.1
6 T" c& N* d! J. HFreight = Freight*1.03) L0 g2 y+ o y$ W# C, O6 V
Where ShipCountry = ‘UK’% F& M- T9 n8 }# ~) K; F
2 删除查询0 C+ W/ N1 H; x9 e0 ~
Delete子句可以使用户删除大量的过时的或冗于的数据." l2 N9 ?5 L0 X7 ]: L
注:删除查询的对象是整个记录." `7 y6 V+ ~) T; m3 g- G
Delete子句的语法:
1 C _5 r. F5 J* yDelete [表名.*] W. f8 e1 u8 v/ B( q1 N, a+ I. k
FROM 来源表, B# s; m. i, m! K; C7 R- q
Where 准则
# m1 }, ^7 t" D' D# L6 ]( C例: 要删除所有94年前的定单
* }: V' l( ?- i9 o# U& yDelete *
+ \% _9 M) x9 T: z. NFROM orders- |+ K- }8 g; \ v4 U. Y
Where orderData<#94-1-1#
" k( R% n7 u L2 V% I3 追加查询( M2 h8 {# U/ n) ^& V$ l! m
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
& K* ?3 Q& ~# S+ l6 {! vINTO 子句指定接受新记录的表2 _2 M) }+ ]( a% p5 w! P, `* ^
valueS 关键字指定新记录所包含的数据值.- B9 A M+ D/ k) \
Insert 子句的语法:" x9 q% B: `% p* V. E' R0 F5 J
INSETR INTO 目的表或查询(字段1,字段2,…): x/ Y. f9 |- B; _3 d" T7 J* [
valueS(数值1,数值2,…)
# u4 S7 ` y. Z" ?5 R! E例:增加一个客户7 I9 u: f: m* I# m3 C! l& N2 ^, B6 o
Insert INTO Employees(FirstName,LastName,title): _& H5 l7 j( s) M% y2 g5 W
valueS(‘Harry’,’Washington’,’Trainee’)
2 s `* @, I, m4 生成表查询; l7 O2 `! D' ^. A1 m
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
$ M: N- y% J/ W RSelect INTO子句用来创建生成表查询语法:6 x9 |4 }7 U8 n7 R7 x. v8 i
Select 字段1,字段2,…$ d# I$ L& q$ w2 f" |. o
INTO 新表[IN 外部数据库] f. i' H k+ @. r9 m: B" J
FROM 来源数据库
6 v2 c' Y' Y0 X7 uWhere 准则
& E/ E/ i) H, s: [例:为定单制作一个存档备份
7 o+ ~- q0 U1 T6 H8 ZSelect *
! z6 e, L7 E! h- X& aINTO ordersArchive1 u+ v5 t3 B' f
FROM orders) V+ W- C2 A! j9 s C
八. 联合查询
" G M' {# `& ZUNION运算可以把多个查询的结果合并到一个结果集里显示.
" G3 k' [. L7 b, x N }- c; ZUNION运算的一般语法:3 w% t; I4 a5 c; M- m& D6 O7 P
[表]查询1 UNION [ALL]查询2 UNION …
* c5 Q- _& o. }+ p5 |例:返回巴西所有供给商和客户的名字和城市
, X2 b/ J0 s* [& E r: [Select CompanyName,City
, ^; u g! {: M: I/ M6 f! j! MFROM Suppliers, }1 ^4 m, S7 f$ _7 E9 R* x
Where Country = ‘Brazil’" L* F" n4 K2 |+ J5 j
UNION* y% G9 T e( |. |6 t( n, v
Select CompanyName,City
# j$ k/ e4 B# l3 J' I( KFROM Customers
. l) E$ d- [% G8 ?. xWhere Country = ‘Brazil’% P3 F9 ]3 Y5 Q2 [$ }( x. I
注:
3 F+ U! i$ k Y& P缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
0 q& ` | W$ oUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
! q# [) p6 \4 D; }! I6 o每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
7 R. e; J; M k9 M( l九. 交叉查询
/ X) t2 h' ?; i8 {2 w. r/ {2 y交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部./ ]2 m9 U7 V9 t7 c
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:' B( l( c7 A$ F0 d) C) P b
TRANSFORM aggfunction
7 F. ^6 s9 Y" V7 C# F# E% qSelect 语句4 d' ^7 u2 j K( Y) X' K. q) g9 s2 g
GROUP BY 子句
+ E. r* ?% x- F _4 wPIVOT pivotfield[IN(value1 [,value2[,…]]) ]5 t: ~! F. C, l7 `+ g
Aggfounction指SQL聚积函数,
# B- P# r# \, }- C8 e" MSelect语句选择作为标题的的字段,, Y" t: Q/ e5 G1 k2 c9 W
GROUP BY 分组- M# d. O/ I- S, J* m: t$ U
说明:) X0 |2 {: I8 p
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值." \: l& K( u* t) S
value代表创建列标题的固定值.! {3 C& z7 D# S$ g- E
例:显示在1996年里每一季度每一位员工所接的定单的数目:
& r. t2 c: b3 M, |, \ |$ a0 YTRANSFORM Count(OrderID)) k0 c. t$ m+ I. y7 s
Select FirstName&’’&LastName AS FullName. \2 X1 u- \2 I
FROM Employees INNER JOIN orders# E. D+ q" B& g! ]
ON Employees.EmployeeID = orders.EmployeeID8 `% [. A8 Y0 U* w+ b! R
Where DatePart(“yyyy”,OrderDate)= ‘1996’
5 E5 r7 t. Z5 o) ^1 ZGROUP BY FirstName&’’&LastName
; S7 n: i1 |% Q2 h6 D! \' DorDER BY FirstName&’’&LastName8 j; D5 P& Z# Z3 ~, B
POVOT DatePart(“q”,OrderDate)&’季度’
1 O+ V0 X }& O; V: Y4 O十 .子查询' I M: U' ]& d1 a+ l
子查询可以理解为 套查询.子查询是一个Select语句.
" U6 U1 m( ]4 _0 `4 q `6 Q3 Z6 E1 表达式的值与子查询返回的单一值做比较
$ c7 u8 o! @' k: A0 @/ S7 v语法:
/ ]9 z3 E- D- A表达式 comparision [ANY|ALL|SOME](子查询)- T, T& h8 u O) f2 t
说明:. v7 o" q$ A+ G2 E- E5 I. f( k: J2 U
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
- ]: \% N- ^! ~# J6 ?; W% V* G例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
! w2 V8 f$ K! s. r& bSelect * FROM Products3 O2 |$ s) V& b. J
Where UnitPrice>ANY
1 D) e+ ~# [8 t& |9 C1 ?) B# C(Select UnitPrice FROM[Order Details] Where Discount>0.25)
" q* R5 B7 [/ M7 {/ V2 检查表达式的值是否匹配子查询返回的一组值的某个值3 ]* g o+ e. x/ e$ }# G7 D
语法:
9 |4 j, P8 v4 ?+ @: X5 A0 {3 l[NOT]IN(子查询)
: M) w6 \* ^' T: D, t0 W/ c例:返回库存价值大于等于1000的产品.
% G2 @; U) p6 J3 g- ^$ VSelect ProductName FROM Products
, [! S2 `: T7 Z7 Q4 {4 O4 TWhere ProductID IN% g9 u# N" I b, p7 I
(Select PrdoctID FROM [Order DEtails] S B: k8 q8 a! g" k! \
Where UnitPrice*Quantity>= 1000)
+ `5 x( [- h( \3检测子查询是否返回任何记录8 w% r! | w& Q1 A( X8 X+ p4 t ~. C
语法:! @( P8 Z, F! W! u. V7 x9 K5 ]& k1 Q2 J
[NOT]EXISTS (子查询)
9 U' R7 t$ _. ^7 D例:用EXISTS检索英国的客户8 f* n# b) F& {' q* W1 h! O
Select ComPanyName,ContactName
5 C) }1 _: N& o$ p/ oFROM orders
% `: P7 ?" ^( l5 r5 a7 u, S6 kWhere EXISTS. A: c2 H/ e3 d# E
(Select *
, i9 S) k% U( L. w+ Q g& |FROM Customers# o% d8 H4 j+ b3 \" E8 R, y
Where Country = ‘UK’ AND' r+ V; f) q# J. I) a* b' l2 _! H [
Customers.CustomerID= orders.CustomerID) |
|