- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法 U* t- S4 l/ W- g+ t. `% @
4 Q& W* r8 x; P. }# H& ?select distinct 字段 from 表名3 d( l! Q7 o/ P
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。# x2 l9 V+ |$ C4 ]2 D
一.Select语句的完整语法为:' m3 l# p& @) _: e8 t5 k* s
Select[ALL|DISTINCT|DISTINCTROW|TOP]
1 \3 M7 L3 Q% G; _8 u+ `{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}, Z$ x A! v6 Q7 q
FROM tablee xpression[,…][IN externaldatabase]7 I1 X0 G& E1 k( b1 l- `7 \9 m
[Where…]( J% P0 c- h7 A0 i2 V7 `
[GROUP BY…]
4 w, |( C7 ^- ?3 }! U[HAVING…]8 w( [3 R9 G! C
[ORDER BY…], U6 p2 y1 |" T' g
[WITH OWNERACCESS OPTION]
5 d9 P x( y$ p- j1 Z+ Z说明:; L9 r6 S! @8 W! z( `' {. Z
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
; D* _# F/ I' X3 {. e! G# g, V# ?2 x1 FROM子句
( H/ v2 b5 C0 z- Y$ E6 z) \# _FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。) e0 N) w) h9 ?8 G- C& s* U
例:下列SQL语句返回所有有定单的客户:
8 G, O1 [, T3 o6 \Select orderID,Customer.customerID. E) ^8 I* t# {7 A; y
FROM orders Customers! s) [: c/ n. p$ [4 ]+ s& Q
Where orders.CustomerID=Customers.CustomeersID8 q! o Z# J2 f C
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
4 J; _- z$ s* g- u- D' J(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。; c0 A, E H$ _, l
例:Select ALL FirstName,LastName
! Q* W+ Q' i1 x7 |' t$ E. GFROM Employees
6 Q+ C8 [ H y8 v; y(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
$ Q |7 r+ S. b" j(3) DISTINCTROW 如果有重复的记录,只返回一个; M1 [4 O* r1 e
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
2 A. ^8 I/ G$ R% J1 ~2 K例:返回5%定货额最大的定单
; B c7 S3 c4 F$ ^Select TOP 5 PERCENT*8 |6 ] y$ d. p# k7 y9 d
FROM [ order Details]4 a' G: X! ?& o: H
orDER BY UnitPrice*Quantity*(1-Discount) DESC
% _. ]3 R# m+ w+ }% P3 用 AS 子句为字段取别名
4 P5 [9 d7 _% q' q如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
4 l2 y J# [' ^- o+ p5 p$ \+ T, V例:返回FirstName字段取别名为NickName2 v& c0 A6 P, {( x9 I4 D# A7 L4 Y
Select FirstName AS NickName ,LastName ,City
+ X( i8 U! U' ]. EFROM Employees$ c3 t/ _" h) T, t3 `
例:返回新的一列显示库存价值: k& A0 Q! @* ~5 l; t' p0 M
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
( b! b' h$ F" I4 WFROM Products( g ]" Y8 t- c# k: q P( u5 q# T6 X
二 .Where 子句指定查询条件
; @( q* k8 h% r: m5 a' Y3 A7 a9 D1 比较运算符2 y9 D) q9 t, y# t$ K; u- M
比较运算符 含义
2 y8 f2 V! A5 {' j7 ^) f6 T" r= 等于. j. c& O: J# _, Z' ?
> 大于
# R! }+ F* f) f' J7 V< 小于; W# z7 H9 x, N, z# `
>= 大于等于
( U& A5 {7 w) ^" e- [<= 小于等于
7 N8 N: [$ g0 X2 r& z/ C9 P& f0 Q<> 不等于
+ L" e3 J- B( p) g!> 不大于% n$ {+ x' D# r
!< 不小于) b, F- V2 o7 Y1 P3 n2 B
例:返回96年1月的定单
& t( J% v' F" w0 s u+ pSelect orderID, CustomerID, orderDate
5 j2 V2 E9 _ Q0 A7 mFROM orders# Q: B6 P3 e! p: _/ V( F( F
Where orderDate>#1/1/96# AND orderDate<#1/30/96#6 B; B0 h' Q m! ^- Y
注意:
2 c% j5 G _& r) }( BMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。; G) G% l, a: y. Z
例:+ H! F4 Q* u# n# ~
Where orderDate>#96-1-1#
) I7 n! Z/ Y6 t( F也可以表示为:+ _2 o5 F* `/ w" D. G5 [4 \
Where orderDate>Datevalue(‘1/1/96’)1 A4 v1 Q! V- u% F( X. r
使用 NOT 表达式求反。; j, l* s# N/ _ E# d$ C
例:查看96年1月1日以后的定单
3 L4 |% v8 v* O& ^0 y7 W/ jWhere Not orderDate<=#1/1/96#
o( e) q& e5 P) Q3 A$ i' f2 范围(BETWEEN 和 NOT BETWEEN)
4 e$ n% U! M; C$ Y) ABETWEEN …AND…运算符指定了要搜索的一个闭区间。
( l6 q( ?6 M6 {9 S3 H例:返回96年1月到96年2月的定单。+ [3 S& m( \6 C" a
Where orderDate Between #1/1/96# And #2/1/96#. N( [/ e: k7 P2 h
3 列表(IN ,NOT IN)
H* a1 R. l& B" k6 lIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
# r8 A2 t) b: K `, n# b例:要找出住在 London、Paris或Berlin的所有客户8 Q" n0 \( z: H! ~
Select CustomerID, CompanyName, ContactName, City
) `3 ^7 Y# F% _FROM Customers$ X% ~0 ]$ O2 J' M' K' S( y9 Y. D
Where City In(‘London’,’ Paris’,’ Berlin’): V, K& ^; e. g$ E
4 模式匹配(LIKE)' g8 R. `6 d3 A/ b7 y& U0 o, d& \
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。# Z A2 x4 G9 r: t) E8 s F
LIKE运算符里使用的通配符
' _* @& {* j+ q, R通配符 含义! a; y9 w% f/ X: g7 i0 d1 z
? 任何一个单一的字符/ u. h5 c) {1 o- P5 A
* 任意长度的字符
6 w5 @1 r+ t+ u5 G1 E# 0~9之间的单一数字. h5 L O3 V3 \
[字符列表] 在字符列表里的任一值7 t k5 E1 v. k4 w& _4 w3 f) y0 z( j
[!字符列表] 不在字符列表里的任一值
( N' D$ G6 U0 Y+ Y- 指定字符范围,两边的值分别为其上下限
3 P" Z9 }4 r6 L% i R. U/ m例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
* R0 b: z& u g! \Select CustomerID ,CompanyName,City,Phone% q$ h5 F8 c- V/ F# `
FROM Customers
$ R1 }; N W+ ^/ ^5 t8 ZWhere Phone Like ‘(171)555-####’
: s6 H$ t5 L0 _' s0 k# aLIKE运算符的一些样式及含义 l! g( E' E4 f& Z" K5 J- v. e' e7 ]
样式 含义 不符合7 D+ v0 `2 g) A+ U/ k6 ~4 t0 k' v
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255* v1 P/ W5 P% [) E0 K
# LIKE’5’ 5*5 555- V. N$ h& k6 v: [
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5; g. v1 g7 r# B3 t8 d2 g
LIKE’5##5’ 5235,5005 5kd5,5346
8 j' X' Q! `; t4 v. HLIKE’" I- C" K% R8 c$ e2 u- Z0 y
[a-z]’ a-z间的任意一个字符 5,%& i! W# n: u1 V4 l$ o. {
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1) y% f0 {8 n5 j3 t$ b( G
LIKE’[[]’ 1,*
8 J) n; }% B2 M7 S$ |三 .用ORDER BY子句排序结果2 c9 q& f. z. Y) |
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。: i% c; c' v. h$ M& X3 ?
orDER子句中定义了多个字段,则按照字段的先后顺序排序。: ~7 ^# W. `$ d6 C d
例:
0 _4 D5 j+ ~1 L0 X7 p$ P7 Q* rSelect ProductName,UnitPrice, UnitInStock1 i- v6 n( H3 U( I) g0 O
FROM Products3 Z, P. y" g8 Y6 b3 \4 p: W5 O
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName1 y7 ` f5 H/ e+ a" M$ {: n% D
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
. Y: a' Z+ _2 [例:下面的语句产生与上列相同的效果。! R' [* d& z( w8 ~2 o: R! I; [+ F1 E
Select ProductName,UnitPrice, UnitInStock, l J9 c; _. y/ F" L7 a
FROM Products
4 I8 H& T8 ~$ |4 WorDER BY 1 DESC , 2 DESC,3
7 b) ]9 |4 \4 p/ L* C* H四 .运用连接关系实现多表查询6 O: d) m& o+ d7 z, @+ X4 Z9 C
例:找出同一个城市中供应商和客户的名字
4 _* v) m, r8 y' NSelect Customers.CompanyName, Suppliers.ComPany.Name
+ G8 |; z# z7 S( J Y! k( aFROM Customers, Suppliers
0 m3 I8 D( C& G) }4 J! K9 K. x: UWhere Customers.City=Suppliers.City) K$ v& ?. s. ~- @1 Z T% M+ M7 J. ]! t
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
& ?1 f3 S! f$ d/ s3 PSelect ProductName,OrderID, UnitInStock, Quantity/ z* G3 C$ v$ m5 K' F
FROM Products, [Order Deails]# ~2 [ k$ @( h _1 m
Where Product.productID=[Order Details].ProductID( r( c/ {4 ~+ w- V
AND UnitsInStock>Quantity
3 {; e* h$ R! a8 j+ V. c另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN& x/ L1 F' z i
语法:
9 Q Z5 P$ Q" p5 M4 n. Z4 f8 c/ YFROM table1 INNER JOIN table2. F/ v8 o$ N9 w6 M' B, ]9 v( a7 k& V8 U
ON table1.field1 comparision table2.field28 ]1 m2 O) }4 i; y
其中comparision 就是前面Where子句用到的比较运算符。
& Y) k( c4 r& [, I- J& n" r- e8 pSelect FirstName,lastName,OrderID,CustomerID,OrderDate
; K! V! P, \9 g5 X1 c; OFROM Employees) I# G% i0 m7 X; D& _
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
* F5 d9 J( d3 ~) @$ v1 U' h5 |# p注意:3 G" C$ G4 d* g7 I+ O
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。+ i0 N: x4 R' v- E% c8 h
在一个JOIN语句中连接多个ON子句1 u; g }' }& t+ ~; C
语法:
4 ], |0 L6 x5 N9 n2 Y9 m( fSelect fields' k8 \% _. M9 \. G2 z- F
FROM table1 INNER JOIN table24 v1 k1 P9 }# z: n
ON table1.field1 compopr table2.field1 AND/ W: s7 K4 j* G6 U; [+ A
ON table1.field2 compopr table2.field2 or( ]. g/ q1 P& c1 M7 H
ON table1.field3 compopr table2.field3
, R. }, [" r3 f) y# b也可以
- G- K% B9 @" M# } {8 lSelect fields
2 x% L2 a/ N) R4 Z9 l; g' \FROM table1 INNER JOIN
. @. `. C: L9 X- }/ i( W2 g, s(table2 INNER JOIN [( ]table3
& v2 N: r# t, K+ L3 {4 L3 B6 @ j[INNER JOER] [( ]tablex[INNER JOIN]
8 @% q2 T2 W8 c2 r2 c- M, q% y# V& g8 yON table1.field1 compopr table2.field1
* Q+ w$ k" H+ k6 w, gON table1.field2 compopr table2.field2
' O9 f, y* ?6 B8 `8 i9 `8 A' lON table1.field3 compopr table2.field3: ?& U$ N) z$ l3 g
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
& o, ^6 G) t( C9 e2 o `: R6 QFROM table [LEFT|RIGHT]JOIN table2
# A) |/ j+ K) q2 s6 w0 kON table1.field1comparision table.field2
+ W. S7 c& Q; a: O6 p3 X用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据9 |7 q3 p5 q$ I J5 p5 ]# K( d4 t
例:不管有没有定货量,返回所有商品3 v- d" [; w9 X) Y
Select ProductName ,OrderID( d7 s* F/ J+ g
FROM Products f/ u& ^+ q/ e
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID! K+ Y/ }& h K" z7 u* X! U* f3 Z
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。9 d% ]2 m, L6 c% ? U4 e
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
1 K. x$ A3 Q) ?# X2 c- ?空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。9 y4 ^0 z% j j1 o6 T6 w
Select *, S+ A: g4 k J1 X' A
FROM talbe1' l) R* o" p3 b& l' }! T
LEFT JOIN table2 ON table1.a=table2.c0 z2 Y7 _. R; @3 `* D: z" e% B v
1 连接查询中使用Iif函数实现以0值显示空值
. X# l: h4 W% H( w! PIif表达式: Iif(IsNull(Amount,0,Amout)# i I4 G0 Q+ d9 `8 g( u
例:无论定货大于或小于¥50,都要返回一个标志。8 t! E: j, g: r$ }4 c: a
Iif([Amount]>50,?Big order?,?Small order?)+ q" |$ z9 o2 d
五. 分组和总结查询结果
4 _$ c& P& J6 T+ U' I0 Q在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。$ w, {- o# C4 U( A6 @! |5 Y& m
GROUP BY 子句的语法8 _. \9 n7 \9 T2 B0 T
Select fidldlist
7 E7 i+ X0 \4 \! I5 n/ Y5 YFROM table6 U8 [: N( n) d$ o( `. E$ Z
Where criteria7 i) c0 ~9 |) o
[GROUP BY groupfieldlist [HAVING groupcriteria]]
- i" K: w, {: V. H! [6 @注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。% u: L) K1 [3 B+ v
GROUP BY字段中的Null值以备分组但是不能被省略。
' o: S8 b* |3 N: c. {% k在任何SQL合计函数中不计算Null值。
) D; s' [2 }4 H! s) c# UGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。, Q- ]/ s- _& b2 Q& N4 v
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。5 A! T4 h# r) I; {7 H. `
Select Title ,Count(Title) as Total
Z' R- v% d @8 ~6 T ? H, n5 [0 j6 @FROM Employees
5 K/ J2 S! d& ]8 L8 Z; L2 ~* j1 }$ C) SWhere Region = ‘WA’9 C/ y J3 n! {# d' z/ _
GROUP BY Title
3 {1 T% d7 w- \/ v9 N3 \ sHAVING Count(Title)>1
! @6 `" D* E' AJET SQL 中的聚积函数7 ~- P5 l" ^9 |! ^+ o# b6 f
聚集函数 意义
6 y, K4 J2 A1 ^( G' {' q/ s, g# xSUM ( ) 求和
1 q; S0 U% J6 ^& `( }5 eAVG ( ) 平均值# L, B& }: {" L3 D
COUNT ( ) 表达式中记录的数目
& |; c" T* w& ^4 Q' m; g/ xCOUNT (* ) 计算记录的数目
8 N/ Y9 q& F: S2 L( IMAX 最大值
! h/ _( b9 a/ j. Z3 U& _MIN 最小值* J+ ^( W) w+ J$ c- X# C: R A3 z
VAR 方差
1 U% y5 E4 r6 Z" s8 v1 G7 J. WSTDEV 标准误差) g# x; w# j2 V- {* b
FIRST 第一个值, C* b3 l& R6 u4 N
LAST 最后一个值
. E+ L2 S# h7 n8 B4 t O/ ?六. 用Parameters声明创建参数查询
$ \9 v4 V" `: j ~0 S L7 K: {0 vParameters声明的语法:
3 A, `5 P! X- PPARAMETERS name datatype[,name datatype[, …]]
" L, m( u& Y$ Y) r$ l6 {) N其中name 是参数的标志符,可以通过标志符引用参数.
# @8 C7 f+ l2 Y: xDatatype说明参数的数据类型.
q$ b! P' j' }% V$ w使用时要把PARAMETERS 声明置于任何其他语句之前.
* r8 O D# y3 z1 F9 b+ g A1 t: V9 S例:9 L; k& P' J, i8 Q1 o
PARAMETERS[Low price] Currency,[Beginning date]datatime/ A$ s. u' x0 b( ^
Select orderID ,OrderAmount0 _, Z5 t/ d6 c+ U8 M" N- J
FROM orders2 o9 i2 K2 K' d( u8 Q0 n
Where orderAMount>[low price]; B' K1 F1 F5 a- p! q
AND orderDate>=[Beginning date]
) w0 I9 ]" T. i. ]1 i: w& F/ p0 {七. 功能查询8 k1 l+ A& ~* Q1 W5 m
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.* ~4 Z1 s- G: {1 m8 B, W
1 更新查询8 O/ X. @ u4 L: ]6 r8 ]* f! Z
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
' v( a0 @+ Y* q9 X0 ]: d更新查询语法:
0 ~7 y# x& K2 [$ ~9 B sUpdate 表名* c6 g3 n' K8 j. Z. ?
SET 新值
( o0 N+ f+ g/ Q- D2 d" ZWhere 准则
' ? t4 s/ ]# e- n; r( }例:英国客户的定货量增加5%,货运量增加3%
$ F9 ], B- C/ e5 o$ D7 tUpdate OEDERS7 k0 G0 Q. F/ ^
SET orderAmount = orderAmount *1.15 M- g {/ G6 V$ I0 \" J
Freight = Freight*1.036 }4 O$ j9 p2 v4 \" s% ]
Where ShipCountry = ‘UK’* F6 h; I8 b9 l4 g9 t
2 删除查询9 W( v& h9 s: Q9 ]& @& b* X6 u8 O& l" e
Delete子句可以使用户删除大量的过时的或冗于的数据.
4 [0 O4 _( f2 Y1 ]注:删除查询的对象是整个记录.8 b k# r: s3 C0 Y: T
Delete子句的语法:8 ^1 F' e8 I$ E1 y
Delete [表名.*]6 Z5 H: D$ M. p2 m$ n8 i* |
FROM 来源表* \: a, z4 p' M
Where 准则
# ]3 Y+ P$ K/ @* e例: 要删除所有94年前的定单
8 A5 S$ Q$ B: G" z0 {Delete *( v! m+ q" O/ o) W, U1 s
FROM orders5 O! [, \' Q1 G7 O1 |1 t, J
Where orderData<#94-1-1#2 \; J4 Q+ J* n I" A6 W+ q
3 追加查询
$ L6 G5 p' A! `- C- ~) sInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
i4 @$ }) ^3 z* |, ]3 x, L; hINTO 子句指定接受新记录的表
: q# C) @+ Q2 r0 e: tvalueS 关键字指定新记录所包含的数据值.
3 i1 M: W& m6 HInsert 子句的语法:! {3 p" m+ Q- P/ B' Y& r1 b
INSETR INTO 目的表或查询(字段1,字段2,…)
# d/ Q) \" [) G# Y G; X) ]* M) GvalueS(数值1,数值2,…)2 V+ D! k; x$ D6 N( o$ d
例:增加一个客户+ N# S) i3 N/ o3 C% L
Insert INTO Employees(FirstName,LastName,title)) p( u! ? _$ |
valueS(‘Harry’,’Washington’,’Trainee’)
- V$ n' z; k. ^4 生成表查询" F' t9 F, r0 f+ |. Y6 R
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础." s4 h. A* m5 j6 N. Q8 I; Q
Select INTO子句用来创建生成表查询语法:
3 A8 x% X" T& \3 CSelect 字段1,字段2,…
& G, Z2 ]# r+ e9 T, cINTO 新表[IN 外部数据库]
8 w' f* B% a. u& k: O( MFROM 来源数据库
- D9 M0 |4 Z4 E3 U( C! KWhere 准则7 y) I- l" F( M, X& u+ u& V2 O
例:为定单制作一个存档备份4 o5 k. |+ d) ^# C' J' Y5 i
Select *! \$ S4 l- k- q. {
INTO ordersArchive2 Q% z$ T$ K- U G/ ~
FROM orders
1 k6 Z# y0 ^& i2 L3 e/ s1 c" `: ?八. 联合查询+ }0 V7 C) }2 @1 L) W, S
UNION运算可以把多个查询的结果合并到一个结果集里显示.+ o! {3 ]7 R7 C1 b% F
UNION运算的一般语法:. k' I" P: u1 K' n9 @9 a
[表]查询1 UNION [ALL]查询2 UNION …
q* X3 r* j! C例:返回巴西所有供给商和客户的名字和城市
1 A/ J9 ]% }( k, }( WSelect CompanyName,City9 z" m3 M. Z* [
FROM Suppliers
" E. P! [) Y6 BWhere Country = ‘Brazil’3 j+ _1 t* R; ~" _. _4 t, s
UNION
+ y8 T" V+ }# q2 f* _1 }+ }Select CompanyName,City
. r8 G# ^6 u6 R- DFROM Customers
; j9 h' k* b0 W, ]$ U/ JWhere Country = ‘Brazil’. I; U# l9 J* v3 a% y9 Y4 d! b
注:
: V4 O$ }, J' W1 T2 G% W缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项$ H" d$ _7 v; t
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
! k- ~/ V5 P, V$ T# }& ]& [每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.# m7 d. c; t3 l4 X: |* n
九. 交叉查询
0 E0 M5 W- L* u& e交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
1 D0 s* ^1 i& y2 sMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:" j2 f B8 g- Q
TRANSFORM aggfunction5 P& z6 G5 L3 \
Select 语句, @2 H- t6 T8 c+ C" x# h1 z( w
GROUP BY 子句
2 A% R* `' x+ j" qPIVOT pivotfield[IN(value1 [,value2[,…]]) ], S. J3 S% n8 S9 o
Aggfounction指SQL聚积函数,
' q+ }, q& ]! I0 G/ OSelect语句选择作为标题的的字段,
6 V& C7 b; s$ R0 x2 X/ m$ {* B1 KGROUP BY 分组# S; `5 r' G7 o
说明:
* F, e9 r3 I. @5 f$ |4 U2 }2 L9 ZPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值." g: N2 l3 _4 `
value代表创建列标题的固定值., C c5 Q- P4 D# k. X- s4 t
例:显示在1996年里每一季度每一位员工所接的定单的数目:
% `* J0 x& U0 o* r5 MTRANSFORM Count(OrderID)
- j( q. c: p* Z) f! nSelect FirstName&’’&LastName AS FullName
9 E/ V5 i& u. U% TFROM Employees INNER JOIN orders
# i+ @6 Y1 G% GON Employees.EmployeeID = orders.EmployeeID, D4 g: I: P7 W/ M! ^! g
Where DatePart(“yyyy”,OrderDate)= ‘1996’
/ @1 S' x4 H9 z$ u& HGROUP BY FirstName&’’&LastName
' g7 ^0 o6 W: D9 XorDER BY FirstName&’’&LastName
1 h2 p8 Z- x V0 @1 x! rPOVOT DatePart(“q”,OrderDate)&’季度’
! `1 m& ~; \3 h2 E, P十 .子查询4 u( Z8 F: W' ^, }- l
子查询可以理解为 套查询.子查询是一个Select语句.% q3 l4 \: \# G$ a
1 表达式的值与子查询返回的单一值做比较3 r2 j& o9 G" c
语法:; s4 V1 t" N3 X' `% F+ ^
表达式 comparision [ANY|ALL|SOME](子查询)
+ i+ L1 }4 U- q. U3 e说明:
1 _. k* l+ p6 f' oANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
. o/ H9 d! q3 j, L7 z( u例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
8 E# [1 G$ P. Z# R' OSelect * FROM Products+ d6 l# t2 ~' V0 g' R8 l2 @
Where UnitPrice>ANY! h0 B( ^3 T1 e0 z. D
(Select UnitPrice FROM[Order Details] Where Discount>0.25)' ]" j8 r4 O% X9 V/ j5 @0 e4 w
2 检查表达式的值是否匹配子查询返回的一组值的某个值% P3 p! h1 v3 Y: V
语法:
! {- j. R3 H0 J: f# f6 }! T[NOT]IN(子查询)
) K. C1 S6 ^2 _8 N; o例:返回库存价值大于等于1000的产品.% c3 A. ~7 R6 `
Select ProductName FROM Products% Q- |$ I$ n$ b) U
Where ProductID IN
`# [* Z' \7 m$ N4 u* X3 k(Select PrdoctID FROM [Order DEtails]
4 ~; |. D& \, o, g8 z( T" [3 mWhere UnitPrice*Quantity>= 1000)2 x% p% H0 Q4 t( B1 n: ?
3检测子查询是否返回任何记录
4 \5 R$ _+ F* v. p5 c% S7 q语法:
* t! Z/ c" O! R! U+ j& m0 t[NOT]EXISTS (子查询)1 F& S0 T, ~; U' f# R2 q) C# B0 y
例:用EXISTS检索英国的客户
& G- ^7 j0 e3 K& Z c5 kSelect ComPanyName,ContactName+ O8 V2 ^' E/ c& O$ M
FROM orders
# J% v& ~. B* e7 |Where EXISTS4 H$ N, }9 N) B6 R; P
(Select *
$ w) c2 \$ _3 c" TFROM Customers6 e9 W9 P/ ^- z0 i+ C6 `! d( ^
Where Country = ‘UK’ AND
- c( N: a: R/ _7 o- m. O5 ]( ?) wCustomers.CustomerID= orders.CustomerID) |
|