- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法
6 l0 M {. Z: [8 R2 L4 U
8 H" W% H6 ^7 p) ~+ Wselect distinct 字段 from 表名1 a/ B8 j8 w3 W m0 y& ~
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
) ~6 H1 O) `& d一.Select语句的完整语法为:1 ]! x0 y& [9 Z: W, M
Select[ALL|DISTINCT|DISTINCTROW|TOP]
- ?9 @( x) R% h{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}$ A* v" F7 f) l& k" a
FROM tablee xpression[,…][IN externaldatabase]! z: E$ H& p% k. k3 W1 s9 K- B
[Where…]7 D# K' _5 ^1 C I
[GROUP BY…]
4 L7 b" V+ _! \4 j x7 D; V0 }/ _/ T[HAVING…]
3 w# k+ n( u* x: k( A[ORDER BY…]
/ K6 V5 T# c+ }[WITH OWNERACCESS OPTION]
6 m& S% G( ^& L1 q( J% Q说明:
3 \" ?) }% K5 z+ T* _用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
! K6 g) c4 m1 Q0 ?1 FROM子句9 m# z. ]0 j3 [; V
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
; g0 ]7 Q2 _7 w# W/ V例:下列SQL语句返回所有有定单的客户:
( a& W' \ y; B& F5 v) }4 @Select orderID,Customer.customerID
! P8 @9 T6 A* c, FFROM orders Customers0 X0 v7 _" B; ^( h; \. h" m
Where orders.CustomerID=Customers.CustomeersID
7 V8 i% r) H5 Q( E; a2 ALL、DISTINCT、DISTINCTROW、TOP谓词
- u5 Q9 Z% F7 K# A# C' U(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
5 b- b( z$ \9 r/ ~: M9 g) v例:Select ALL FirstName,LastName( ?, i5 t6 f6 ?$ d
FROM Employees
; M; ^. d3 _1 \' }$ W4 W5 B(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
+ J$ c k, p8 L+ x8 y' f' i4 C(3) DISTINCTROW 如果有重复的记录,只返回一个
6 l3 J8 v s; b) O2 F# ?. u( c; ]9 p(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
! y3 W# U- p/ ?: d( c* @( m* N+ h例:返回5%定货额最大的定单
2 h0 j/ i+ @0 x; v- I- F4 eSelect TOP 5 PERCENT*9 N# Z# X; V3 i
FROM [ order Details]* N) c0 B8 O+ T
orDER BY UnitPrice*Quantity*(1-Discount) DESC
2 X# [% R' O) D1 b3 用 AS 子句为字段取别名3 o' c- Q* l4 O1 v1 W% Q
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。) ^8 p5 E% H6 |& |- p7 s Q/ S- @
例:返回FirstName字段取别名为NickName
8 S' Y. h4 _& E. a1 }Select FirstName AS NickName ,LastName ,City
3 K" q% } c* B" L* BFROM Employees
: \; E) {/ k- L. c" D* Z; E3 s例:返回新的一列显示库存价值+ a0 n( i* y7 q2 H" E& R
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
, L9 D/ \" ]# y4 ~3 E" s/ XFROM Products* j$ y7 e& Q* ^; |: [* \
二 .Where 子句指定查询条件. _( M) i3 l! }. X% a# |
1 比较运算符
8 C; y* s" Z' y# W% n4 C% e比较运算符 含义
9 r, H( y4 ~& \! l= 等于
5 _ R2 T( S8 B$ t, O7 N6 Z> 大于
: I# r' g L7 z< 小于6 m; g) ]* G. q8 g. C9 f
>= 大于等于, o3 Z. s" T3 o2 F9 \1 j
<= 小于等于( ~- _9 D- M5 X$ _
<> 不等于
) p# H O1 u u* B!> 不大于/ M; |; i- T* Y% y
!< 不小于9 j4 J. t- U, G/ P0 t9 h" E- n
例:返回96年1月的定单
4 Z# W& j. K% _% u# |4 B" L; qSelect orderID, CustomerID, orderDate2 k3 W6 J* ?" p7 @5 t+ M* B
FROM orders+ `3 ?$ k( q1 r/ a4 E/ m9 m& u
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
) p c4 ?0 X* T" w1 K注意:
1 r% ]& h9 C1 D( u* f, `$ ?' t6 JMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。: ]0 ]/ t: d: b# c& i1 U) w
例:
: ]& Z" o. P5 h- E: gWhere orderDate>#96-1-1#
1 A$ j! j& \0 `$ H8 q也可以表示为:: }( y) J0 _, C% I& W. u
Where orderDate>Datevalue(‘1/1/96’)
3 V/ n5 `; Y1 @( ]1 Z" D使用 NOT 表达式求反。+ a( f* L+ }, b6 \$ p3 ]* [: Y! ?7 B0 {
例:查看96年1月1日以后的定单
" ^# `( d) U7 rWhere Not orderDate<=#1/1/96#
* I/ o% @' |, C: o* h# V' b2 范围(BETWEEN 和 NOT BETWEEN)9 Z- K6 C( |6 B" t3 d. }+ p6 A
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
1 A# A* m5 [+ c例:返回96年1月到96年2月的定单。2 R. L9 r6 Q, Z0 e7 y3 h
Where orderDate Between #1/1/96# And #2/1/96#
8 B6 R9 q6 P0 r3 列表(IN ,NOT IN), p* B# m5 `$ O5 u: `% @, v1 Z
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
6 m! V0 d* [) G3 V/ Q- S$ I例:要找出住在 London、Paris或Berlin的所有客户$ ~0 G$ Z& v( S9 N
Select CustomerID, CompanyName, ContactName, City% [) Y6 J- j3 O
FROM Customers
3 F u0 e3 w3 X$ i9 }Where City In(‘London’,’ Paris’,’ Berlin’)
! m6 T1 j+ U1 l. g- s2 h7 y4 模式匹配(LIKE)! d% P# c0 F& S+ N
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。5 {/ {8 m$ q! \6 b2 ^
LIKE运算符里使用的通配符
8 L$ t) F* n. T/ Y0 b: F* T# g通配符 含义4 t1 N- e7 ~ Q* ]" }4 p
? 任何一个单一的字符9 v! } ^: G# v8 U4 C
* 任意长度的字符. s/ y: a# r: y' w( e8 Z
# 0~9之间的单一数字
1 T+ i. e" \& ~; F/ q% e; [9 P[字符列表] 在字符列表里的任一值
! _4 Z0 [* ~6 M" I7 f) E2 L[!字符列表] 不在字符列表里的任一值3 c9 d5 G% r* _# d2 e! I
- 指定字符范围,两边的值分别为其上下限5 a% \5 c3 S- g( o) z' x
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户( e$ c9 J! {$ G6 v1 B( b
Select CustomerID ,CompanyName,City,Phone* P1 R* a( z" u2 ]3 M
FROM Customers
/ y8 L: ]4 U8 n- B8 l; F6 K6 EWhere Phone Like ‘(171)555-####’, e) a2 C' c' V
LIKE运算符的一些样式及含义" H, a+ e( |: Y; o' d& z" _, W
样式 含义 不符合
6 B: W [$ j, K% \; A1 x5 F- M6 CLIKE ‘A*’ A后跟任意长度的字符 Bc,c2550 }- w+ l0 V8 a! t
# LIKE’5’ 5*5 555
* Q( e- e" @1 T9 F2 u' t2 _# |( G$ v8 U2 TLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
, d) L/ J0 d' q- C& F) e( X/ JLIKE’5##5’ 5235,5005 5kd5,5346$ v+ i' e W: h" u, }
LIKE’
% E2 @& l! i6 W9 j1 @; @0 l[a-z]’ a-z间的任意一个字符 5,%4 o$ j* B5 Z1 S! v. e3 n
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,10 A. W, u3 @ Y' B3 X
LIKE’[[]’ 1,*
1 o" p. [8 V R8 x0 N+ c. O三 .用ORDER BY子句排序结果
2 H1 v+ [ w7 L& U5 E' E5 j. ~orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
# ?# X" D% c2 P% {& CorDER子句中定义了多个字段,则按照字段的先后顺序排序。6 r* |2 _- W' U7 @4 I/ R6 Q
例:
4 d) p( U, b# ^Select ProductName,UnitPrice, UnitInStock
4 @* p1 e. {: L6 O0 \FROM Products+ `: o& ~1 }+ f! I" y5 `- V7 G) X
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName; \# ~( U' m7 w; r
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。 |7 Y8 c X9 K1 V
例:下面的语句产生与上列相同的效果。
, r8 j6 z: v; O9 u9 |Select ProductName,UnitPrice, UnitInStock V0 b4 K2 x# t# E
FROM Products" h" }3 f8 I; h
orDER BY 1 DESC , 2 DESC,3+ t3 J D. Z8 |2 I* {, V
四 .运用连接关系实现多表查询! `0 `8 q1 a3 B( E+ T& i! ~
例:找出同一个城市中供应商和客户的名字# X2 S( z4 H* q7 ]* X+ o$ B' g
Select Customers.CompanyName, Suppliers.ComPany.Name
f! w R! s& b: E, I5 l+ o: ]FROM Customers, Suppliers) L1 R) _% e5 h) J, Y+ x& V1 p
Where Customers.City=Suppliers.City" } O) A' p' z# T. G+ O% Q3 J+ n: @' h
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
$ M4 R" j! C" [+ mSelect ProductName,OrderID, UnitInStock, Quantity1 r; z, D, I$ R
FROM Products, [Order Deails]
3 A ^/ j9 E$ R- S4 UWhere Product.productID=[Order Details].ProductID- B/ Q2 }4 @, {6 \! @+ `! a9 A
AND UnitsInStock>Quantity) b6 M) B( S9 w6 W5 r) e" c
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
7 ?6 o* ]) x% E8 E0 P3 D: Y语法:1 e u+ l/ V6 ?1 s: \( d7 c+ C6 h; ^. C# u
FROM table1 INNER JOIN table2% H; {* W. a+ ` ~: |$ ^
ON table1.field1 comparision table2.field2
; P. K) {# Q) g* q# o8 }; @ T# k其中comparision 就是前面Where子句用到的比较运算符。, B) y) c. V3 p3 F1 {1 z
Select FirstName,lastName,OrderID,CustomerID,OrderDate6 ? E' v8 n& z; r' n5 \
FROM Employees
; m Z# [$ C4 R4 V7 Q$ {. a+ C* xINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
/ R: |+ \! j1 i* H注意:
. A5 _: X7 r5 EINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。0 h. z. P8 D8 y& S9 c
在一个JOIN语句中连接多个ON子句5 A* w! k1 R. E/ E" K, v2 N8 X% @$ U
语法:
d; k( T: F1 J( W8 c' pSelect fields0 {+ f- u( A; K. y( ~" U
FROM table1 INNER JOIN table2; _" L; d/ T; q4 h. W H( g0 J
ON table1.field1 compopr table2.field1 AND' J' O+ O, x. X% a% ]
ON table1.field2 compopr table2.field2 or& r% _ ^, [7 _) V6 e9 ]
ON table1.field3 compopr table2.field3- e% ]& J" `9 b: U2 c/ e
也可以
; F9 J9 _3 A+ i, k8 s, h& g/ XSelect fields F0 Q$ X, e3 L4 V% z9 X
FROM table1 INNER JOIN
' u, U3 l1 J3 D8 g( a: h. I+ f(table2 INNER JOIN [( ]table3! |' b$ q: k S" z4 M% Y
[INNER JOER] [( ]tablex[INNER JOIN]3 `3 u7 Z! @+ x* L' J5 w/ y5 U
ON table1.field1 compopr table2.field1
* @0 G- W" v( \% k' ^. ~2 V7 YON table1.field2 compopr table2.field27 H' Z# k7 J3 ^9 l1 t) \6 x. L
ON table1.field3 compopr table2.field3
5 a- r, H+ { `8 h* B) Y6 z外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。& B8 W( K+ K/ o. ~
FROM table [LEFT|RIGHT]JOIN table2' i8 @, p5 G4 _( G
ON table1.field1comparision table.field2
' G; M( P! z) f1 a用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
5 t, C+ @) s. b' t! n( e/ D/ t0 F8 s例:不管有没有定货量,返回所有商品
( ~9 a V5 g) [" A2 |Select ProductName ,OrderID
; Y& |) [- Q" ]' [% M- [7 L. lFROM Products7 v |" j W# D) ]" P4 D) {7 N: p
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID- u. r7 d6 u! @" N7 r
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
6 P$ u$ I9 A$ ^/ M/ [1 w例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。' Y- B; s: P5 \8 v5 Q
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
# b/ n, r+ i8 P; O' ^Select ** A: u) @ W( M6 i9 t+ S& r9 y0 L
FROM talbe1/ e1 U$ m: y) U; u: t" I
LEFT JOIN table2 ON table1.a=table2.c8 ^9 n: y% @) }6 p
1 连接查询中使用Iif函数实现以0值显示空值% Z+ W, B8 m& L9 Y8 \+ M
Iif表达式: Iif(IsNull(Amount,0,Amout)$ l1 m- c( v8 S
例:无论定货大于或小于¥50,都要返回一个标志。
1 D# B, J, R4 `8 {1 y Z PIif([Amount]>50,?Big order?,?Small order?)+ X5 i2 r& [$ m! x+ A
五. 分组和总结查询结果2 A( g" C1 Q# D7 f0 v$ {
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
4 j' o" B0 j8 t' @) IGROUP BY 子句的语法( {, X# l( G/ d$ v
Select fidldlist
4 ?, Y) J* t/ |* a7 b) O* fFROM table
- B- A. c0 d c' I8 nWhere criteria
' [5 C# B6 N, ~1 T: x6 e% {[GROUP BY groupfieldlist [HAVING groupcriteria]]5 `) z4 ?% ^3 h4 S( `) I; G
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
5 B% l3 y' A: D5 M" J: |. D0 aGROUP BY字段中的Null值以备分组但是不能被省略。" @! d# ?- c+ d1 E
在任何SQL合计函数中不计算Null值。
- G5 q$ {- Z8 d$ F7 u/ \GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。8 u, H7 H: C) {( [
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
% o% p5 c7 Z4 ^9 M( zSelect Title ,Count(Title) as Total
% {, y3 ]$ ^4 F- W! K+ s" M9 `FROM Employees& }2 j( V/ p3 ~$ u$ i3 V* _0 J8 w& U
Where Region = ‘WA’
' z& F0 V/ _' Q4 P S* [GROUP BY Title
9 k1 J z Y9 @. }2 _HAVING Count(Title)>1! |/ A5 }$ S; H4 t5 X
JET SQL 中的聚积函数
: |7 l/ R% S O" J聚集函数 意义+ O" |0 j" W2 ]8 e% I: Q
SUM ( ) 求和
& t7 e$ k8 n1 CAVG ( ) 平均值
# f) i/ w3 n% iCOUNT ( ) 表达式中记录的数目3 q2 H: m) J0 ?1 ~( Y. |
COUNT (* ) 计算记录的数目2 s5 z1 ~5 u& w! U, Y& n/ z, o
MAX 最大值6 ~6 ]/ @# @9 p7 `3 D3 L$ A
MIN 最小值* D7 p$ r& x" K, s3 E# C4 U$ T+ g
VAR 方差/ R5 t) }+ @' N
STDEV 标准误差
- b8 E5 |. e, T( \1 r; v: ^FIRST 第一个值
3 M7 n) N7 l$ `; iLAST 最后一个值) n7 R3 R8 B6 @. V3 @9 r
六. 用Parameters声明创建参数查询
6 g* l+ z( J3 v* c$ L4 lParameters声明的语法:
1 c' k2 h. N( s# {PARAMETERS name datatype[,name datatype[, …]]
+ F, u$ }" s5 {% ^其中name 是参数的标志符,可以通过标志符引用参数.) d: Z- V2 s D/ c# S% N9 h
Datatype说明参数的数据类型.$ ]% W4 { f0 U- t* D" Z
使用时要把PARAMETERS 声明置于任何其他语句之前.
9 l: D9 h g- h; u" E, a$ X例:; [$ O. a6 J! U9 g7 W
PARAMETERS[Low price] Currency,[Beginning date]datatime$ V2 t* a7 h0 f% ~0 V. V7 m* r
Select orderID ,OrderAmount
1 P2 M* X$ z: JFROM orders
' c7 S! T6 E9 bWhere orderAMount>[low price]
% l' w! m7 `* l5 zAND orderDate>=[Beginning date]
$ p- O; W, \4 X6 t) @; F七. 功能查询1 ?1 x4 i" V' C R" D
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
9 B5 B2 y/ d/ X2 F1 更新查询+ a: Q3 K- z% K0 S* W# f/ }. B
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.* x# Z* n: g+ g" t P
更新查询语法:
3 a, |1 `$ \1 p- CUpdate 表名
/ v* Q# n6 \+ M2 E+ s. Y( _) J" SSET 新值
! Q! @: x+ @+ m, D+ iWhere 准则
$ W0 X* y& F |+ O& ^7 r6 g! J例:英国客户的定货量增加5%,货运量增加3%0 H$ |- x# D# @" Z1 j, o
Update OEDERS( Q' N4 J! L7 N% M% _1 ~
SET orderAmount = orderAmount *1.1- Z" ]7 q" @; k7 J7 B! E
Freight = Freight*1.03
. `2 Q- x) W0 v2 b8 kWhere ShipCountry = ‘UK’
4 X3 F/ O+ P/ h3 `0 W+ u2 删除查询$ x7 |' g7 |5 H5 e% a
Delete子句可以使用户删除大量的过时的或冗于的数据.
: e* u- r. t4 n注:删除查询的对象是整个记录.8 G2 f2 q x$ i* u5 \
Delete子句的语法:* g& Q. v: M' z/ o. @
Delete [表名.*]
1 e7 B' S* S% Q BFROM 来源表, D# k! T E4 B3 H s2 G
Where 准则; F' o. \' p6 f/ a# m0 E* ~
例: 要删除所有94年前的定单5 C1 y* z. T6 u, C! {; {1 n
Delete *
6 B4 f' i1 K0 HFROM orders7 ^: a' R3 \& B* T& J% f
Where orderData<#94-1-1#
- M$ m) K3 T0 O+ `3 追加查询: G8 C; A) ^" v2 b1 P ^% M7 B! Y
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.7 P; z. t) L M2 }+ T
INTO 子句指定接受新记录的表
+ {" E1 {- n/ M! T+ vvalueS 关键字指定新记录所包含的数据值.) ]1 J1 S G+ I8 P) ?4 Y+ n8 |1 w
Insert 子句的语法:
' ~8 d0 b- [9 [) l+ x* e, R. N) kINSETR INTO 目的表或查询(字段1,字段2,…)
# ^$ e0 c& }2 t( F* p TvalueS(数值1,数值2,…); Z6 Y2 K, M8 C/ V( L
例:增加一个客户: m0 x1 ` ]0 n* {. D
Insert INTO Employees(FirstName,LastName,title)
: |% A. J& X$ A# a1 u7 f) s( `valueS(‘Harry’,’Washington’,’Trainee’)/ o! z9 R% | j# y* S9 d' D
4 生成表查询. e7 i- ]) J% M4 J# f; J7 }
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
; F! h+ b% \$ d. ]; jSelect INTO子句用来创建生成表查询语法:
, d. S( ]( }2 A% M* c9 H' R8 OSelect 字段1,字段2,…% w4 c6 B7 H. K% z7 n( J. s$ t
INTO 新表[IN 外部数据库]
5 Y" o& W- K/ _FROM 来源数据库9 P7 S% O; U* a
Where 准则* R2 D6 O6 z8 O" k9 f2 L' m
例:为定单制作一个存档备份
/ m& l. I& [% MSelect *
* K$ l" X0 Z: {) U3 m! L: IINTO ordersArchive4 ?' V- K0 c7 y1 e3 Q' X- J
FROM orders
$ t/ W1 F; i8 V( }4 I; T: y八. 联合查询8 Q) y3 A# c7 h7 O
UNION运算可以把多个查询的结果合并到一个结果集里显示.
1 \4 L: p; s' x I1 Q- y6 \3 IUNION运算的一般语法:
0 Y. u/ o C4 M) y[表]查询1 UNION [ALL]查询2 UNION …
( c4 G0 l9 v' b1 i: A) X例:返回巴西所有供给商和客户的名字和城市
! z7 Y! a# J3 B. w! nSelect CompanyName,City7 Q% q! s. L. G7 {$ u, T
FROM Suppliers2 g$ F: G4 q; n4 l
Where Country = ‘Brazil’
# v$ Y+ ~( e% z1 Z3 YUNION
( u. r1 e) m. E9 T, {$ m4 |0 ]Select CompanyName,City
) \, b) `, F1 dFROM Customers$ N, P4 K4 f( d2 d6 u e- S7 l, `
Where Country = ‘Brazil’
, X# ^( N `! j, D8 e注:
# h6 G" a$ M; M1 q: z* k缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
7 G6 |8 F$ a0 H& W5 z; p' _UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
/ d& L$ d* k0 t每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
! R% S* o% ~# G7 f. P) o九. 交叉查询
' y, ~' J& Z* w+ W& }# ~& T+ Q交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.: d% b9 H9 D8 J5 ~, M s3 N
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:' e) o/ n, {" Z" D T/ n: ^' N0 y3 m
TRANSFORM aggfunction0 w: d: o2 D3 M/ ^ D6 Z1 {
Select 语句
: v, ^2 \/ j+ Q) |# c( T' oGROUP BY 子句0 E9 g/ m. Z) J# X: Z) @- d9 H$ S
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
! z0 M5 V& F9 }$ F; u" z* u2 C2 i) _Aggfounction指SQL聚积函数,+ {' Q+ S! G! M
Select语句选择作为标题的的字段,
6 a8 V1 i1 |3 y. a! sGROUP BY 分组5 F3 F F. a+ q7 H; N" N
说明:
0 L( X7 J2 c5 h8 ^1 n% cPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.2 M2 _1 I$ E4 I, ]' z; m/ t( {
value代表创建列标题的固定值.. f/ m& I1 m0 |
例:显示在1996年里每一季度每一位员工所接的定单的数目:
3 @& j7 t! ~: i# \. w5 ATRANSFORM Count(OrderID)
$ f3 h9 k* ^2 c' L- }Select FirstName&’’&LastName AS FullName
; Q+ C+ K( l% OFROM Employees INNER JOIN orders; p# h$ u# G. Q
ON Employees.EmployeeID = orders.EmployeeID8 o0 {$ w; S; x& N# F4 Z
Where DatePart(“yyyy”,OrderDate)= ‘1996’
8 b/ [9 P( l# D; H* N' J1 U$ QGROUP BY FirstName&’’&LastName
+ ]: R9 O. u3 m0 k9 R- R- T- ?orDER BY FirstName&’’&LastName( N2 k. Q$ B- o, c5 ?9 f# ?; ~% A
POVOT DatePart(“q”,OrderDate)&’季度’7 M0 B4 T' J- s& u0 Z6 X9 w' R& ^/ Z
十 .子查询0 S* Q' c) M9 T* ]5 `) ~
子查询可以理解为 套查询.子查询是一个Select语句.' X# g# e9 X1 u! C$ H2 f) v# I) t
1 表达式的值与子查询返回的单一值做比较7 C2 f% [' D; S3 ?% w2 L9 j
语法:
5 H( B+ u% N! k0 n4 P- C( u" ^表达式 comparision [ANY|ALL|SOME](子查询)
+ {* u, [- P8 c" z8 E说明:5 ]/ Y- z8 `8 C" `
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
) n8 F, L7 m: T. b5 k6 z/ ?/ W例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
% Z3 {; E/ f& G5 ?0 _Select * FROM Products# J0 o2 b+ Y/ |5 M' ^
Where UnitPrice>ANY* i Q: K$ D. G' r$ `
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
; Z' g5 z: G9 Q/ T2 检查表达式的值是否匹配子查询返回的一组值的某个值# Z+ Q! f. y% ]% H
语法:
" g; d' b4 R9 Z# Q0 s- [[NOT]IN(子查询) |5 ~/ W. L! A: r/ x+ T( Q F
例:返回库存价值大于等于1000的产品.
: G- _0 w- _8 F; |6 C) ZSelect ProductName FROM Products2 G P( @7 Z ]; z$ t* O ]- O
Where ProductID IN6 p" n0 R2 s" R
(Select PrdoctID FROM [Order DEtails]2 {- s3 C$ }3 d6 D1 x' G. ^
Where UnitPrice*Quantity>= 1000)- Y+ |; K. u' Z* o% ]
3检测子查询是否返回任何记录
$ t# u% z2 N# {: b" I# R语法:0 i8 ?5 u" w. H# F
[NOT]EXISTS (子查询)
( `6 a% f' t9 z, P- f* K例:用EXISTS检索英国的客户1 X' B4 G3 X. s4 Y' s1 A4 u
Select ComPanyName,ContactName+ w0 P% I1 b8 W) {
FROM orders
! I8 a% ~ f( S6 t1 kWhere EXISTS
) V: O8 E9 ?/ S2 v(Select *
5 S, R5 h) e5 L! pFROM Customers
5 K( q* ?& U" NWhere Country = ‘UK’ AND
3 j; k" |* z8 i& Y# ]Customers.CustomerID= orders.CustomerID) |
|