- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法
7 [! o) F3 P/ z6 ~/ @# j/ V, [2 M6 `5 n% v& R( n/ G2 d7 r3 H: t/ D
select distinct 字段 from 表名0 g9 {9 ~# _+ j
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
% K, s; w- F4 W一.Select语句的完整语法为:
0 \: H/ e5 q! M7 u' o2 ]Select[ALL|DISTINCT|DISTINCTROW|TOP]+ h0 j+ ?- z3 D- l9 j
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
$ y& B1 i1 W# F9 j7 ? aFROM tablee xpression[,…][IN externaldatabase]. o. V" Y8 {- Z
[Where…]) a; C5 s' W4 l' L
[GROUP BY…]
3 V4 B: h5 e, T[HAVING…]7 P; _1 _5 N: E$ Z' o( f: p+ R* e2 j- @
[ORDER BY…]
0 Q n2 H9 A- g' W9 H8 ~ a[WITH OWNERACCESS OPTION]
4 {, d: E0 h$ J$ ]* m说明:
2 w n0 P8 U4 O8 A% h) a9 f用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。- C [$ f) X+ X5 o6 S$ Y3 c
1 FROM子句
5 f4 t, h$ u4 u$ U2 uFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。$ \6 N& x9 @2 Y) L1 k4 |% ?) C" w3 H
例:下列SQL语句返回所有有定单的客户:, a& I A' G& M: Y2 l
Select orderID,Customer.customerID3 C; G4 E! H4 Y# D H
FROM orders Customers. _1 L9 y& I7 g8 A) U! c0 Q+ F
Where orders.CustomerID=Customers.CustomeersID
- M+ } U1 p k& k# d6 S2 ALL、DISTINCT、DISTINCTROW、TOP谓词
* _2 _' G3 l* J(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。2 r' B# Y0 k* Y. z4 {8 }" G
例:Select ALL FirstName,LastName: u# m3 v) `3 b. z& t
FROM Employees
0 a1 ?8 j% ]. [(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
! E8 R' \ b: ~" a2 k: C(3) DISTINCTROW 如果有重复的记录,只返回一个/ d0 B+ C+ T/ A# X, D/ Z" U$ k
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)6 Z( ?! `0 k! E$ H* a. b$ D+ L
例:返回5%定货额最大的定单% |3 d9 E; V7 U# H
Select TOP 5 PERCENT*. E8 Y+ n; ^) M$ _) ~
FROM [ order Details]! x! P* V; d5 o) \* A' Y
orDER BY UnitPrice*Quantity*(1-Discount) DESC
) x* F1 E9 l( K5 \/ j3 用 AS 子句为字段取别名6 S2 O; }! R9 o
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
1 I. o3 e5 l' j例:返回FirstName字段取别名为NickName# y; [3 F7 Y8 c. S9 d
Select FirstName AS NickName ,LastName ,City+ B# e' W( g, A. d: S# ]8 @
FROM Employees
6 j8 `- O8 f1 J; Q例:返回新的一列显示库存价值
% l4 O2 i7 u0 ~# X1 W3 tSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
& g0 X8 T2 b7 [' V$ v' @1 r dFROM Products4 M* Q& ?% i4 ]6 v& q2 v1 f8 K6 [
二 .Where 子句指定查询条件
) C" i8 A" n' J$ y9 r4 b% A1 比较运算符3 d4 _: `5 l9 `; N1 M" u
比较运算符 含义 Q% u9 i6 z, L4 n1 p
= 等于1 L' v; e. d5 {; Q8 W. h
> 大于+ O* ^3 l- m4 j$ d* o. D
< 小于
, u+ y: _0 j. `: t( d( d>= 大于等于2 O& _8 F8 t0 }' B% r
<= 小于等于* I) H+ D' A% G! t' d: U3 I
<> 不等于
5 i6 B- S2 a$ r2 `5 u1 L B!> 不大于
( o4 X0 r7 ]; A* R g!< 不小于( O9 n8 E- x6 w0 P+ ~. q1 ~' I' ?8 @
例:返回96年1月的定单: j- p+ y3 D% U. [3 c. D
Select orderID, CustomerID, orderDate
* C6 Q( l# M6 y. M7 E- R' e' CFROM orders
5 x* {! z+ b! A" PWhere orderDate>#1/1/96# AND orderDate<#1/30/96#7 y8 u# p1 n1 c% k/ u
注意:
9 n+ ~$ l7 b" ^5 T* [2 RMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。$ I1 _& e: [2 o# V
例:
1 A/ B# V' `. V6 U; I+ ?" NWhere orderDate>#96-1-1#0 Y/ {& T- {. {, L! u
也可以表示为:
3 C/ N' f+ _% ~( J0 _4 M- CWhere orderDate>Datevalue(‘1/1/96’)# D5 F, K' G* g; l
使用 NOT 表达式求反。1 J( S# F, o; U, b2 c
例:查看96年1月1日以后的定单
) j3 V* g. q; ZWhere Not orderDate<=#1/1/96# C- X1 _2 O$ L: p7 C/ a% v
2 范围(BETWEEN 和 NOT BETWEEN)$ P3 f/ X1 s" X+ d7 R
BETWEEN …AND…运算符指定了要搜索的一个闭区间。2 c- P0 y# v3 e/ z$ B0 @& A, H
例:返回96年1月到96年2月的定单。
: U& |% V7 p0 h' ?/ h: AWhere orderDate Between #1/1/96# And #2/1/96#, J; k; N y1 X, P' V. v
3 列表(IN ,NOT IN)4 R( Z$ o5 o% @. Z9 T
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
# K( w# t4 M' |" K例:要找出住在 London、Paris或Berlin的所有客户
9 W* D) M' o" k# c0 r% G9 _Select CustomerID, CompanyName, ContactName, City
6 u8 e3 ~0 q) w* ^/ XFROM Customers
2 H* q- J! T/ ZWhere City In(‘London’,’ Paris’,’ Berlin’) T7 Q) J: W4 a' y( G/ L
4 模式匹配(LIKE)' J8 a( F/ r+ J6 N# W
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。. _. d( o# `( d- A/ f1 l+ k5 F3 ?
LIKE运算符里使用的通配符' g2 Y- S$ z: X9 B
通配符 含义
$ }/ T3 e2 g$ k/ C? 任何一个单一的字符
8 n7 S" i, v- L: ?$ {6 l! t( D* 任意长度的字符5 N% j- Y! ^/ y6 s: e# u4 M) E7 G
# 0~9之间的单一数字
: g- q5 s+ D4 _2 `1 v# B[字符列表] 在字符列表里的任一值1 ?$ d& g7 w- m) Y0 S: N, y- R- m
[!字符列表] 不在字符列表里的任一值
+ W; a# s: C, M+ T- 指定字符范围,两边的值分别为其上下限' D# M W0 X" g" c4 K
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户' T5 n" s7 u: e0 d& m. O0 \
Select CustomerID ,CompanyName,City,Phone
: S" p3 T* Y$ n: c3 n/ nFROM Customers( O* _' j) V( s6 x4 m4 W
Where Phone Like ‘(171)555-####’
; [" T, o, f, q& MLIKE运算符的一些样式及含义8 w9 F: O( \1 m/ \! w9 o! U8 [
样式 含义 不符合 x/ @" L1 Z K5 @
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
* C! x2 @5 ]" j# LIKE’5’ 5*5 5554 z$ M3 v. ~5 i% D
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
8 F* @& D4 h9 d( c8 K$ ?LIKE’5##5’ 5235,5005 5kd5,53468 _( t7 q- x9 X: a# P& P4 o6 M# t
LIKE’
: S. u- B. [; W3 O2 ]0 q- j[a-z]’ a-z间的任意一个字符 5,%5 c+ _: U3 v9 S! R! s8 ~1 r! t
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1( Z' j. W, g* C6 u
LIKE’[[]’ 1,*7 c) H9 _/ L- E
三 .用ORDER BY子句排序结果
+ L- w3 z) C2 K# [$ \orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
] {! n1 j/ porDER子句中定义了多个字段,则按照字段的先后顺序排序。5 }* A. g4 m2 ~, ]2 Z2 h& _+ ~& M1 D/ \- W
例:
( X2 K$ }: f) K! x4 OSelect ProductName,UnitPrice, UnitInStock) ~, W7 n9 ?5 K! d
FROM Products
) h+ S: W3 K$ u) b& K: B2 J$ horDER BY UnitInStock DESC , UnitPrice DESC, ProductName8 l7 B) R# v# Y* [* C, i
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。5 N# L, K0 O* r$ }
例:下面的语句产生与上列相同的效果。4 T8 k k! i( j" g) b6 C8 D
Select ProductName,UnitPrice, UnitInStock! u7 u' R" M5 A" y. [' ?9 @5 }3 A
FROM Products
; C! u) L0 u Q' H" ]) TorDER BY 1 DESC , 2 DESC,36 n$ w' @9 y9 W
四 .运用连接关系实现多表查询, ] n$ a# m/ o [2 h# Q: y7 R/ {) c2 e
例:找出同一个城市中供应商和客户的名字8 G5 ^" u! m" D- i2 Z
Select Customers.CompanyName, Suppliers.ComPany.Name
" X8 |6 _, W! v7 [7 o" g0 UFROM Customers, Suppliers
3 F S9 B0 O1 i; [! H8 C- V; ^Where Customers.City=Suppliers.City
( b' P8 E5 F. ?" V) w例:找出产品库存量大于同一种产品的定单的数量的产品和定单
, ]8 E. F, K Y0 |7 @* zSelect ProductName,OrderID, UnitInStock, Quantity5 j% @! P( ^/ A( V4 J$ ^
FROM Products, [Order Deails]
$ P# ~: Y% q7 kWhere Product.productID=[Order Details].ProductID
% ?$ A _: V6 Q+ P" oAND UnitsInStock>Quantity4 [: z! U5 A& Y. `4 O u
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
2 L' \/ H1 h5 V/ U. A9 @" e, a/ ]1 m语法:# d5 @1 D( r4 g* a# J* y# m
FROM table1 INNER JOIN table2: f$ S: d+ m% `
ON table1.field1 comparision table2.field24 x$ }; ~6 w S
其中comparision 就是前面Where子句用到的比较运算符。
1 e6 R0 C& {3 q. PSelect FirstName,lastName,OrderID,CustomerID,OrderDate
& y- Y2 f W' M% }2 qFROM Employees i- U+ P$ m; M0 a
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID# g; `, s) Q! P+ Y5 O
注意:
* m- M5 ^/ r- V4 y2 F# IINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
" V8 p4 A- g8 {/ g! [: u在一个JOIN语句中连接多个ON子句" S7 K% a$ d7 Q' x
语法:5 s5 L+ i8 z: b6 w8 p
Select fields
/ P- ~. z6 \' W, l4 t3 I6 sFROM table1 INNER JOIN table2% C1 Y: x5 D7 D/ s& s% g3 a
ON table1.field1 compopr table2.field1 AND
; H7 Q& m1 s$ S+ v+ ^ON table1.field2 compopr table2.field2 or
3 y# c r1 u! ~ON table1.field3 compopr table2.field3% C0 X# ?& N4 i9 \- t( D
也可以
& z" K! q$ ?; _- i% I7 f- E& I. WSelect fields
' B: L" z+ ]0 b- p9 v, h( VFROM table1 INNER JOIN
& i7 O- w% j* ?' B. n(table2 INNER JOIN [( ]table3. r2 O/ ]$ y7 }3 K' u, l
[INNER JOER] [( ]tablex[INNER JOIN]+ i* G& @7 u) x1 A4 w
ON table1.field1 compopr table2.field1
$ n0 D# [( x: i8 x* r4 HON table1.field2 compopr table2.field2
# W# M1 x- |5 G: ]6 w/ EON table1.field3 compopr table2.field3+ T- }4 m- y! t6 _. @
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。- C T1 ^$ f# m k* b
FROM table [LEFT|RIGHT]JOIN table2, q3 n+ n4 q( `3 [) t- e+ |6 b
ON table1.field1comparision table.field2 m3 F9 ?9 T( C4 `1 u. K4 T- u
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据4 w4 l; Y$ a# W- `4 k
例:不管有没有定货量,返回所有商品
8 {+ s7 I0 g0 `3 WSelect ProductName ,OrderID1 O ~8 ]* f% o
FROM Products
: m7 x0 \; b- t6 o* }LEFT JOIN orders ON Products.PrductsID=Orders.ProductID. |# s2 U" B! d6 ?9 M' S/ B' r
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。2 X% K, m l3 n$ D7 L
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。( K9 z$ q. E5 _: k& h. E
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。2 x' z. @* `1 n: s% ]- _/ X' @; }1 r( K( W
Select *% {* ]$ o( S! N0 m
FROM talbe1
& o# |6 I. I1 C- F2 TLEFT JOIN table2 ON table1.a=table2.c- Q" k0 l5 q, s. |! ^
1 连接查询中使用Iif函数实现以0值显示空值
- |! y* o8 A, j- JIif表达式: Iif(IsNull(Amount,0,Amout)
% F9 r! A, C, u, V- K例:无论定货大于或小于¥50,都要返回一个标志。
4 e `1 c5 w! b7 u! Z& e, D' uIif([Amount]>50,?Big order?,?Small order?)
; c0 X4 L8 m! s; R五. 分组和总结查询结果0 S( D* A3 y6 u2 L
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
3 ]% h9 D0 A: E+ N% X( @GROUP BY 子句的语法: d- W- P$ M5 N4 f+ R
Select fidldlist
8 \: F5 e6 F8 [FROM table1 O8 h. R+ D/ k- G4 ~( Y
Where criteria5 ~ }+ ^' r- X9 g; D
[GROUP BY groupfieldlist [HAVING groupcriteria]]
# t7 U1 B, Y- S2 \5 g( @+ N注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
5 [+ Y% r- x% YGROUP BY字段中的Null值以备分组但是不能被省略。, q: {# p5 W; y0 T2 `
在任何SQL合计函数中不计算Null值。/ t: e4 F! K8 [
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。1 q4 A+ H/ i& F: U" V$ Y. P6 o
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。' O# e y$ r& [% B0 O
Select Title ,Count(Title) as Total
& t/ \1 @1 C- ~6 H# [3 z d" F' FFROM Employees) f1 t& B3 C1 n
Where Region = ‘WA’5 q( j% Z g7 g
GROUP BY Title
: k0 O% W1 V; S, }; R$ ZHAVING Count(Title)>1) I) Q2 H6 u: B$ X8 {$ v
JET SQL 中的聚积函数3 O# X9 ~5 x9 r( h* l! Z {# y- ]- G
聚集函数 意义
5 L( w" j5 B- jSUM ( ) 求和' Y) o/ {; f; Y2 A- L
AVG ( ) 平均值
5 _& L* q$ u" v F) W$ wCOUNT ( ) 表达式中记录的数目
$ j" j# b9 S: O2 A6 J; C/ r- _COUNT (* ) 计算记录的数目2 D; T1 c6 d4 \3 f1 w4 v8 f# |
MAX 最大值
- ^7 C2 [7 w" KMIN 最小值: ?( N7 c2 P% p/ t. L0 N
VAR 方差$ K+ p" |' j' l5 n. R, s
STDEV 标准误差4 W# a4 ]6 a7 E6 H
FIRST 第一个值# d4 c$ N B- Q9 a5 }2 P+ M9 I
LAST 最后一个值
7 {2 l4 k3 `) w4 c, q' n. X1 s1 {六. 用Parameters声明创建参数查询
; B, o/ e- f9 }1 c3 hParameters声明的语法:
2 v4 v! E% {( @3 x9 D; |- Y4 OPARAMETERS name datatype[,name datatype[, …]]/ T0 _' C$ ~+ j/ F3 H
其中name 是参数的标志符,可以通过标志符引用参数.% {' X. j( \- J% e7 o4 z5 @, E- d
Datatype说明参数的数据类型." B6 X4 A. S; M0 s; g
使用时要把PARAMETERS 声明置于任何其他语句之前." G% E# W/ [+ K+ x' ~2 N
例:
- L8 ~; q, c; H4 H( GPARAMETERS[Low price] Currency,[Beginning date]datatime
8 m/ V% Q- y1 R; USelect orderID ,OrderAmount4 h2 q$ F( B2 j! m
FROM orders! r" R" Y3 N; k) U( r: U ?
Where orderAMount>[low price]3 l& T" \5 z8 E0 G
AND orderDate>=[Beginning date]( [1 c. i! V5 n5 o0 x$ q
七. 功能查询' D. J( S4 g, K/ [7 T4 V8 v4 _3 M
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.8 E# Q& n6 c9 ]: u+ H! v+ ^6 R$ N
1 更新查询 o1 u* S, f! l" v& l3 H+ P
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
2 ` b2 [2 N6 Q! l. H6 j! f B; C5 V更新查询语法:
4 @) E' D' N0 [* _* ]Update 表名
* Z: i$ H/ f+ hSET 新值
, v8 H/ i2 G' Z5 X9 sWhere 准则
6 S; C2 L% v: p2 }) w9 i6 v1 i例:英国客户的定货量增加5%,货运量增加3%8 p5 A, C; u" I* T
Update OEDERS
$ S& `- _& p& P- Y8 n: ]SET orderAmount = orderAmount *1.1% C/ ?" y+ y1 D$ B6 u% y, C2 H! Q( |
Freight = Freight*1.03
5 l/ g5 ?; ~0 x, o. BWhere ShipCountry = ‘UK’
% e. l4 p% s, P5 a2 删除查询' g `+ }/ h5 a5 ?* s' X
Delete子句可以使用户删除大量的过时的或冗于的数据.* [0 d2 Q0 R. d7 u4 }( e& G$ {
注:删除查询的对象是整个记录.) S1 }# M# c' v% c: @$ E, U2 F
Delete子句的语法:) R y( `, G, `* M3 o
Delete [表名.*]
, Z6 u$ n% _) GFROM 来源表" v* J# Z* _' A0 J3 ]
Where 准则# C# o1 z* _ s) o+ R. Q2 r
例: 要删除所有94年前的定单
6 H/ L: H8 x8 f8 {% g2 k8 S xDelete *$ g& Q7 O/ e% p' V' }5 d
FROM orders
( t+ u8 ]9 X* c5 A+ X3 Z- a% H E" gWhere orderData<#94-1-1#
, |, v R( s g, _5 B! g2 f3 追加查询
3 I% `! T) o- W, DInsert子句可以将一个或一组记录追加到一个或多个表的尾部.( Z" ~3 x$ j9 C: h) {9 q
INTO 子句指定接受新记录的表
: T9 R9 Y/ n z C& o: q- t7 KvalueS 关键字指定新记录所包含的数据值.
4 U0 }4 c1 v+ _* e! Y# iInsert 子句的语法:
5 u+ e9 u: J: C% mINSETR INTO 目的表或查询(字段1,字段2,…)5 B. f# Z# H# s
valueS(数值1,数值2,…)3 B- x& ]+ w! s: c" J m
例:增加一个客户
5 f, ^! T- ?) `( a0 K$ MInsert INTO Employees(FirstName,LastName,title)
7 P0 M0 `- p& PvalueS(‘Harry’,’Washington’,’Trainee’)
7 a. I. h) v( Y! k& b5 t4 生成表查询( A. b0 D- g) q) y
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.+ ]4 }3 u, _9 C5 m
Select INTO子句用来创建生成表查询语法:( m H. I0 g0 g: U4 h; q. S
Select 字段1,字段2,…
7 a5 b2 V7 l! q3 x2 N5 W" h+ s R4 s& jINTO 新表[IN 外部数据库]4 }! y+ q+ I: O! Y- D7 r0 \
FROM 来源数据库
7 P9 Z; }0 P/ B/ R! LWhere 准则 L* V7 R) z, z0 x
例:为定单制作一个存档备份
x- W. W) h0 ~( p$ b1 OSelect *
. z; h& _5 q) X7 }! o" Z$ uINTO ordersArchive
* P8 m" C; Q0 Q4 i; v, S, D9 gFROM orders
) s8 V) O) r. }八. 联合查询
4 _4 ?5 B5 s4 K& t; NUNION运算可以把多个查询的结果合并到一个结果集里显示. y; P4 y; s9 [: U9 g
UNION运算的一般语法:
( ]1 P- t! F( \( g# U8 q[表]查询1 UNION [ALL]查询2 UNION …! f) o3 ?; i) G& v# T
例:返回巴西所有供给商和客户的名字和城市
s) t4 Q/ ?* Y- ]# eSelect CompanyName,City
) P2 I& ^. U3 X, F0 L1 @8 |; IFROM Suppliers
( S x, I# [- b8 j& ]Where Country = ‘Brazil’
* V6 j# S8 Z4 u1 T- F- }9 t# ^UNION) ~" b" O# {& ^; E- \' U b1 e
Select CompanyName,City1 ~" F, }4 F1 J" j
FROM Customers1 m& K6 b3 c, s* y) e2 l, y) L
Where Country = ‘Brazil’
8 G3 e# M/ W+ e& T5 ]注:8 j6 O- \$ M" Y0 H
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
. o# }: q e4 g2 p, ~$ tUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
, x e5 g& B; O* F) g. l每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.( G' m& {, A& r$ \3 d
九. 交叉查询
$ U" J* _7 a6 x) y2 S5 q交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部./ _+ _9 m. [; G5 o9 r+ U- m5 c
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:) V3 k/ V; K/ Z
TRANSFORM aggfunction0 L) e ?0 R/ e
Select 语句: p& c3 m( `! {
GROUP BY 子句
- j1 L6 r+ l0 a5 FPIVOT pivotfield[IN(value1 [,value2[,…]]) ]1 F/ [) D0 @6 c
Aggfounction指SQL聚积函数, V- l; [9 f9 I2 B
Select语句选择作为标题的的字段,
, G" V6 a k' F0 O* nGROUP BY 分组1 r& q6 _3 h: a# B) q
说明:
/ E5 y1 B: L# C( d% T" t+ C2 ePivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
: e% c3 j, K) N# @5 _value代表创建列标题的固定值.+ R1 a6 D# a& i
例:显示在1996年里每一季度每一位员工所接的定单的数目:: H! k. S" t# d! i- _* R
TRANSFORM Count(OrderID)8 Q! E+ {+ u- `* m# O8 C0 n
Select FirstName&’’&LastName AS FullName
8 C% S+ i. a1 l+ @FROM Employees INNER JOIN orders/ W1 A; h2 r! }" \
ON Employees.EmployeeID = orders.EmployeeID
5 h! X8 B8 N: x( A( [1 t2 }Where DatePart(“yyyy”,OrderDate)= ‘1996’: o, _. `5 i7 G: M, Y+ p( _
GROUP BY FirstName&’’&LastName9 h& p, A# h$ _5 X ^
orDER BY FirstName&’’&LastName' D! C- F. L( ?' j
POVOT DatePart(“q”,OrderDate)&’季度’7 I$ \ \4 ^$ F* u: C, ^
十 .子查询
' k. [$ d5 p+ I7 U子查询可以理解为 套查询.子查询是一个Select语句.
8 v5 O, Q) o7 ^! G1 表达式的值与子查询返回的单一值做比较9 _, I# v; Z. t+ c3 v2 o4 | o2 T
语法:. {& ? W; b2 U) U9 R
表达式 comparision [ANY|ALL|SOME](子查询)
0 j( z- f1 n: g6 x说明:) f6 {4 c, U/ `
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
7 v: n$ `7 v# {# v2 r' K例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
4 H% N, ]3 ^2 g1 Y; dSelect * FROM Products
0 n, g U( F4 W" ?0 q% @4 E# sWhere UnitPrice>ANY
6 Z3 }) ~9 V+ D5 f3 t: O(Select UnitPrice FROM[Order Details] Where Discount>0.25)3 s; d- g# e2 L0 e% |1 }6 q
2 检查表达式的值是否匹配子查询返回的一组值的某个值$ b3 T( r9 d/ f. Y8 W ~' [5 ?4 c
语法:: v* z+ [; W* L9 C
[NOT]IN(子查询)
# g7 X! X# z% o4 X例:返回库存价值大于等于1000的产品.! S D" S/ ^6 L3 \
Select ProductName FROM Products/ o" E, b. Q. b( S+ q/ ~7 I
Where ProductID IN; v. S9 D+ k2 N! ^1 {8 Z' Y
(Select PrdoctID FROM [Order DEtails], s/ a7 ?& V7 Y% A5 f# ?7 R
Where UnitPrice*Quantity>= 1000)
" s" j0 |2 u! i/ ]. p$ p: B+ b3检测子查询是否返回任何记录
0 B5 Y$ u7 o" [ Y语法:: v; n/ \, c! N& t* r; z
[NOT]EXISTS (子查询)3 H- E1 c0 q% F# G8 U, [
例:用EXISTS检索英国的客户
# f* R# }2 _# Y! b1 X6 `4 ASelect ComPanyName,ContactName
; V# C7 N* e7 m1 xFROM orders
# Y+ N) V. \( [% HWhere EXISTS
( A4 M/ m+ D, ^) q' Y3 D( a(Select *
; k: e8 n% I z1 F, h# dFROM Customers
: \+ x/ @) w7 B9 v' YWhere Country = ‘UK’ AND1 ^3 j" ?6 f& |& O4 a2 f" h
Customers.CustomerID= orders.CustomerID) |
|