- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法1 N! w! f0 T# S
! \( v8 Z" ]1 X, D" Y
select distinct 字段 from 表名
+ T) q) x9 J, S1 ldistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。* N$ u6 k7 |( Z5 S' L
一.Select语句的完整语法为:
- \0 P/ A# H! E% ]5 @Select[ALL|DISTINCT|DISTINCTROW|TOP]' X B5 c- D' s, m4 D" {/ L
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
+ }: q" q5 X" |5 i# I6 JFROM tablee xpression[,…][IN externaldatabase]
1 P# P7 _0 R) i0 M8 r4 @" q[Where…]3 p0 L" T e. r0 \& y5 E. S4 N( y( c
[GROUP BY…]! L/ _: a; l# i" O \; t) `
[HAVING…]
! ~5 t) v9 \. R[ORDER BY…]9 U4 @8 S ^$ o. h( W4 z
[WITH OWNERACCESS OPTION]2 B$ h7 I# z1 G4 ?
说明:
1 h: } w* C2 P% }用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。4 z" n4 I3 |! w, p. E" y, p% F' g
1 FROM子句
/ k9 W, d2 Q) a) ^ KFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。4 P" R# ^- v6 P# I3 a0 h2 r5 ]
例:下列SQL语句返回所有有定单的客户:4 `/ x Q% ^. s5 Q7 o, n
Select orderID,Customer.customerID4 Y6 D7 T) B6 p+ z
FROM orders Customers! q* g8 J& t$ ^- ^& n/ R9 k% o5 ?
Where orders.CustomerID=Customers.CustomeersID
, X a9 R, L. {# S, `; o2 ALL、DISTINCT、DISTINCTROW、TOP谓词7 \5 b+ }' v/ f
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。: }2 D0 z, L/ E0 w, P4 Z& `* r& A
例:Select ALL FirstName,LastName
0 l+ B( d& M; C9 {: q" H3 LFROM Employees
5 ]6 R2 N* C: }) n(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。" Z* @" H& t+ H% N9 o2 C
(3) DISTINCTROW 如果有重复的记录,只返回一个4 G1 _/ h: j5 T& G
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)5 `/ L2 B4 I! Q' F& X1 W% X+ Z) _+ x
例:返回5%定货额最大的定单4 f( A; \- @8 S$ i% [* r
Select TOP 5 PERCENT* v$ J- [+ t1 @( D2 B* g6 D
FROM [ order Details]
/ Y8 w# d9 g5 z0 E2 h' QorDER BY UnitPrice*Quantity*(1-Discount) DESC: u R. \' `! R1 N8 S1 G
3 用 AS 子句为字段取别名
0 d; Z4 g0 z: z6 f9 i* v4 P6 |% H- e如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。( t, L/ R& D. g2 [( z( X
例:返回FirstName字段取别名为NickName
5 |. P( f: g( o5 U7 nSelect FirstName AS NickName ,LastName ,City
0 s7 Z3 [( a% c. j- sFROM Employees
) B" B( H' Z4 r4 b例:返回新的一列显示库存价值
$ T q2 R$ e r8 ~( pSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock& W! N! w1 U+ g; x% D2 t g) R
FROM Products
* q( {$ @' j0 s) J( R7 [8 X3 M二 .Where 子句指定查询条件# y$ E8 i3 H6 r( y" H" i1 Q, S
1 比较运算符: {, n7 _; I w$ u {
比较运算符 含义) {* a" ~* ~! @, D
= 等于
' X% J- s) H6 `> 大于% `3 W% i2 |4 _( T9 w& O( m' K
< 小于
1 Q0 |# O' z, z5 T' ~+ A>= 大于等于
4 Q5 Q+ f2 |0 v1 a( S- ~5 s1 I<= 小于等于
0 ~, U. C7 A4 H c<> 不等于2 e4 e/ q+ V) F8 ^
!> 不大于
" n% i5 o: t, e$ P+ d$ |( \!< 不小于$ P y% C* p- f. Y
例:返回96年1月的定单
2 N2 _) A% L9 `8 K) oSelect orderID, CustomerID, orderDate X# `. \3 }# A$ I& J! M# k4 |; @6 b! a
FROM orders
4 X" X! f3 O: @ s2 R# S' K, n: `1 yWhere orderDate>#1/1/96# AND orderDate<#1/30/96#3 ]. ^3 s) H, {' F$ p" L" O0 m
注意:% l6 P8 S* F/ W4 {% |4 R0 \
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。 G; ?* h+ X+ G* ^% E/ A
例:( b& B6 l# s' p3 q- `. @9 g
Where orderDate>#96-1-1#
- x; i* B2 r" z+ b. P, c5 a; C( A! ^- c也可以表示为:
& e: h! g9 r3 h4 W& qWhere orderDate>Datevalue(‘1/1/96’)0 r( d, m+ m, Y' f+ |# f
使用 NOT 表达式求反。
* a, |! A( l+ R$ d. }& x例:查看96年1月1日以后的定单
+ k# Q5 t% ?5 A. I/ x1 ]1 ~Where Not orderDate<=#1/1/96## G* H1 f) R3 `# m- f4 `3 ?3 t
2 范围(BETWEEN 和 NOT BETWEEN)2 r E% S h7 \+ N7 f- Z$ t m9 N) Z
BETWEEN …AND…运算符指定了要搜索的一个闭区间。5 ?' b; |2 I+ e* c
例:返回96年1月到96年2月的定单。
) ]6 W- F, l1 y9 u y5 e7 sWhere orderDate Between #1/1/96# And #2/1/96#% O0 M- o, E5 s# n M W
3 列表(IN ,NOT IN)/ A* J6 v% o1 d+ X+ M! k# M2 y, k
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。* k8 \1 B* U$ M4 J% M/ U6 v0 v
例:要找出住在 London、Paris或Berlin的所有客户
* \% a# J @' w. o7 I' |- rSelect CustomerID, CompanyName, ContactName, City$ V/ _/ @: V- @0 m6 x
FROM Customers
+ V) x8 j: W' w2 z7 D' {! VWhere City In(‘London’,’ Paris’,’ Berlin’)- v p g5 X/ G# k/ F! h; S
4 模式匹配(LIKE)
# w2 e) i9 W3 U" \LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。" c" Y' d8 |" C* Z# }! a6 K
LIKE运算符里使用的通配符7 a% k3 i' x- B& |4 h/ }. Z0 K/ ~; c% ?
通配符 含义+ M! O; W' n6 T$ |) y" E
? 任何一个单一的字符 M+ z) y# Q) W+ U4 Z
* 任意长度的字符
/ b( v9 W" b' Y' F/ F6 g# 0~9之间的单一数字
& |. U6 r6 x* Z+ W! A/ m# b1 b) i" C" l[字符列表] 在字符列表里的任一值: T. @7 o3 N- s4 w+ Z$ w
[!字符列表] 不在字符列表里的任一值
( g% L' Z! V& U+ k4 p1 d; z; V- 指定字符范围,两边的值分别为其上下限
1 u1 d* k+ ^' t例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
/ S0 E/ f1 }0 TSelect CustomerID ,CompanyName,City,Phone
f: J( p& k0 m( q; ~' WFROM Customers
6 M' ^; d5 S% V$ t+ B1 k. SWhere Phone Like ‘(171)555-####’
8 _8 g: Q% i/ H0 J; lLIKE运算符的一些样式及含义! Y4 X6 Z4 k1 Z- v
样式 含义 不符合: {* A" q; `0 w# z |; _2 {
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255& |. z; F9 z1 H
# LIKE’5’ 5*5 555. ? [7 Z% }! i4 \* m. `
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer57 `8 m3 g# p; `
LIKE’5##5’ 5235,5005 5kd5,5346, `/ {. @' z- U* S# ?0 c
LIKE’
$ |$ @3 T$ w; K( Q) x[a-z]’ a-z间的任意一个字符 5,%
; c" C/ J1 F% }LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
: {9 z5 V' X gLIKE’[[]’ 1,*
7 m: } j, B5 [- r- ^7 ~* P三 .用ORDER BY子句排序结果
9 E: I, m& v0 \( ?9 D: Q" B! eorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
- v5 o3 E4 C3 {$ @: j0 F( y3 b; CorDER子句中定义了多个字段,则按照字段的先后顺序排序。2 d, E0 K+ [6 J6 b! B: a3 o
例:
* j+ P) b$ A4 J1 D1 N) pSelect ProductName,UnitPrice, UnitInStock' o2 q/ x/ U' P& b6 R; t
FROM Products0 c: C# w0 E7 w/ w) I1 R W
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
* D7 V8 Y( R9 S N3 e, c" ]orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
1 S8 N& H# E0 u# D例:下面的语句产生与上列相同的效果。
2 Z/ ^/ f- n# g. f1 z( T& PSelect ProductName,UnitPrice, UnitInStock
H0 F( d" A1 a$ c/ eFROM Products# } P/ R7 H& s" x6 A; e
orDER BY 1 DESC , 2 DESC,3
! ^$ ]+ {1 t* k r$ h+ T0 [四 .运用连接关系实现多表查询
2 V0 t, h, `& b; I* P; B/ n例:找出同一个城市中供应商和客户的名字
; F2 F6 l3 |6 x- n L N0 CSelect Customers.CompanyName, Suppliers.ComPany.Name
/ |3 l8 s) v9 K6 ~& q: w2 L1 _FROM Customers, Suppliers+ s" w( m, A4 f; Y- }% Z0 i
Where Customers.City=Suppliers.City2 A: @; h/ q. G
例:找出产品库存量大于同一种产品的定单的数量的产品和定单6 d1 [! _4 T- m
Select ProductName,OrderID, UnitInStock, Quantity3 J! e% a8 L* O0 `% J1 K$ m
FROM Products, [Order Deails]' M! \- {: r0 ~9 X# _' x
Where Product.productID=[Order Details].ProductID
, p% d3 `9 H3 S3 n" E. nAND UnitsInStock>Quantity
+ ?: {2 t: ^5 i6 \+ K6 n7 U9 h另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
; ?+ W" }9 M+ Q, S5 N语法:
( Q& ^' V3 F3 q3 pFROM table1 INNER JOIN table27 J5 [( }2 r2 G4 B4 _7 _) F
ON table1.field1 comparision table2.field2
$ ?) J1 X1 t: \& Z其中comparision 就是前面Where子句用到的比较运算符。
" |' c. i2 T" i0 q5 r$ L) U! ESelect FirstName,lastName,OrderID,CustomerID,OrderDate7 ]' u$ S' x2 K; S+ {
FROM Employees
. v3 W- S" o) J& \: D; LINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID1 D6 u2 J% y; U
注意:
* u4 b" _6 @# ]' G4 S5 fINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
" w. R( O7 Q9 m' o8 I# _: m在一个JOIN语句中连接多个ON子句
% j% ^8 w& M# h语法:* V7 K5 V. B# ]5 M: }
Select fields
! M- y! m) G, W: p: hFROM table1 INNER JOIN table2
# U; k3 S, a9 J/ z, nON table1.field1 compopr table2.field1 AND
b, q. D5 D$ g( E- X7 aON table1.field2 compopr table2.field2 or
2 [0 K0 |# X8 s% oON table1.field3 compopr table2.field3
* |( U! t! K- f: ^* s. G也可以
7 S5 j# P# O$ w9 O2 _; B3 a" pSelect fields) }, x: j, t; X/ ^
FROM table1 INNER JOIN
3 V% K J v1 I w; @9 }; ^(table2 INNER JOIN [( ]table38 h+ S1 f9 h) x2 m, h: k6 y
[INNER JOER] [( ]tablex[INNER JOIN]
. Q* C: K! l/ G0 m, f f" j) l2 AON table1.field1 compopr table2.field1
8 j( e/ u$ U$ X" D' M+ yON table1.field2 compopr table2.field27 Q! `8 q# o8 W+ E& _6 a7 _
ON table1.field3 compopr table2.field3! d4 e( E+ O7 I: O
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。' {8 P4 W0 n( E- @+ s+ h3 U
FROM table [LEFT|RIGHT]JOIN table2
7 _: m7 }5 @8 X; p$ aON table1.field1comparision table.field2
. x. v% \1 T% p1 h' m2 n用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据( Y; ?3 t4 E1 }
例:不管有没有定货量,返回所有商品/ {! R' B& p) Z4 O" j5 F
Select ProductName ,OrderID' _1 G! e8 ~% Z# u' q. _8 \
FROM Products5 l, x+ S. c5 h7 n& n1 t8 @
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
2 Y% h( V& R- l5 r右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。* E: [$ W! E6 b) T& B9 o6 M# c* \
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。# b8 L* j4 K7 q: e2 ^2 H
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
- N8 q7 j9 U+ |2 a, e( d& \7 OSelect *
! A; F+ ~3 D, U$ x; A8 ~0 Y$ aFROM talbe1: \8 y% s+ f2 o- ^% H6 a
LEFT JOIN table2 ON table1.a=table2.c; z. h3 @$ o) f3 t
1 连接查询中使用Iif函数实现以0值显示空值
. n3 v2 f( n# A, b8 ~ PIif表达式: Iif(IsNull(Amount,0,Amout)
: g' C0 D& T. t k% P例:无论定货大于或小于¥50,都要返回一个标志。
- m8 c7 }5 w Z$ z" QIif([Amount]>50,?Big order?,?Small order?)
: N' ]! |' {/ i& c五. 分组和总结查询结果/ A/ }6 k9 _' }5 y) [8 Z
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。- f0 k$ b0 q5 j
GROUP BY 子句的语法; G5 K' Z: d4 Y" E
Select fidldlist
" u, W# W4 c8 M' W3 W ?FROM table
+ I$ O+ ?/ \* K _Where criteria4 ^% W# f9 [4 W+ u
[GROUP BY groupfieldlist [HAVING groupcriteria]]
7 L4 V2 J8 g" B6 {9 O注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。/ }' {% o% N% T0 x" o6 [
GROUP BY字段中的Null值以备分组但是不能被省略。
! @+ {, a( y0 @6 T2 L6 W( Z在任何SQL合计函数中不计算Null值。5 {" `' ?7 L: i
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。0 i m3 d6 z1 a* q% b- d+ G
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。, T0 M1 p$ p; I) C
Select Title ,Count(Title) as Total5 P* G7 n: Y! Z: o5 S
FROM Employees( D5 |% x' p6 z* F& H1 t$ T# P
Where Region = ‘WA’; @$ l" T7 n$ Q5 L2 P# |" I& t; H
GROUP BY Title1 t5 ]# y4 e: R
HAVING Count(Title)>1
' c. R: R' B4 J; ?4 {+ }JET SQL 中的聚积函数
9 ~# O! c) M3 y- J# Q聚集函数 意义 o p/ O+ o( \
SUM ( ) 求和3 R* g7 d( r1 T; ]6 ?' M$ [6 s8 r. Q
AVG ( ) 平均值
* D7 l3 f7 O" s( c, F7 d& oCOUNT ( ) 表达式中记录的数目 f$ x6 z: ]& Z+ c) D2 h& ~
COUNT (* ) 计算记录的数目
+ D5 g" w( J/ y IMAX 最大值8 a; L3 V1 u4 `! Q
MIN 最小值
5 b/ d5 m) u! K- wVAR 方差. n3 P7 Z, n, d9 ^
STDEV 标准误差
! ]2 S5 t! K1 t! y- `FIRST 第一个值6 T0 X) f$ [( E2 ^8 N$ G2 O
LAST 最后一个值5 w" M& u/ D) @# h1 P
六. 用Parameters声明创建参数查询+ Z* F* p6 o: t9 ^" N2 Z/ X5 c
Parameters声明的语法:
1 N! P" m5 D8 a8 d3 `9 G; r9 JPARAMETERS name datatype[,name datatype[, …]]
W$ i6 G( o- F/ [4 |其中name 是参数的标志符,可以通过标志符引用参数.3 \8 U7 ?6 n; q& l
Datatype说明参数的数据类型.3 [: z! x% y, M) i5 l6 \9 U
使用时要把PARAMETERS 声明置于任何其他语句之前." a" |6 _" t& f* n7 T
例:
& R: g/ U |+ jPARAMETERS[Low price] Currency,[Beginning date]datatime6 B# {. i9 ]1 m( d4 ~
Select orderID ,OrderAmount
4 |% p; w- m, [2 H% O# e3 |FROM orders z5 B$ `+ Q9 C; s
Where orderAMount>[low price]
1 V9 p. A1 H" P0 A, u7 Z7 NAND orderDate>=[Beginning date]
4 R) J7 x/ j" ]6 O七. 功能查询. ~7 P1 ^. R3 \
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询. ^7 d0 E4 T8 y* Z( T" z. D
1 更新查询
3 x* Q [+ e! ^( C4 b$ j- |8 a; n+ dUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
1 c# r5 m& J0 i9 a2 f% s- B& I更新查询语法:% R# a7 B! f3 `4 D& t
Update 表名9 ], N9 y, e% k
SET 新值; i8 [4 i& F9 l0 W
Where 准则
( D" z7 e1 ]4 @' g8 \4 X/ Q" f例:英国客户的定货量增加5%,货运量增加3%
: m; k2 S2 U, y0 u- }- E+ b; ?9 MUpdate OEDERS
: \0 n- ?6 x/ v/ f# _# ~0 {! B' eSET orderAmount = orderAmount *1.1
8 S4 `0 ^1 d# \: z: ]Freight = Freight*1.03& p p+ \ c. ^3 @- j7 [/ D
Where ShipCountry = ‘UK’
" M5 g" r q8 M2 删除查询
Z) S7 @5 `! n" S9 S9 n, SDelete子句可以使用户删除大量的过时的或冗于的数据.
" E$ X9 J- A, n5 Q注:删除查询的对象是整个记录. C# l- i) G8 d7 R
Delete子句的语法:/ d3 E+ W' C, F/ {% k
Delete [表名.*]# S+ r/ V1 d0 c! x
FROM 来源表( _: C: K+ ~9 q% x5 ?1 ^
Where 准则
7 _) ?6 Y- K! |/ k- |* z ?例: 要删除所有94年前的定单0 [; u- A8 u3 x
Delete *7 E o. K6 _3 }+ c) f3 }- `
FROM orders; k! N2 i; l* u8 l6 u# p, ?* d1 [
Where orderData<#94-1-1#
+ X3 e2 X3 z7 e* T2 z3 h3 追加查询3 f3 I( ^# R4 L$ \. d3 D
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.1 Y" D5 U, A* S0 h
INTO 子句指定接受新记录的表) }/ c. Y5 O2 q, m5 M& V
valueS 关键字指定新记录所包含的数据值.
) C: ^! D t2 [! IInsert 子句的语法:; g) j: U9 h# E8 V6 j* U
INSETR INTO 目的表或查询(字段1,字段2,…)% K: g9 ~' f3 k" L# l) v
valueS(数值1,数值2,…): e. ? \0 z; X' ^2 L5 A
例:增加一个客户
# W) ?& [! z# |( h1 ^7 GInsert INTO Employees(FirstName,LastName,title)2 H7 S5 E3 }/ G% H1 @1 C& a; a
valueS(‘Harry’,’Washington’,’Trainee’)
) L2 E, ?4 s3 m4 生成表查询. o0 A- c3 Z* h$ ^) ]
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
& j1 f0 p0 j4 |' w& z/ ZSelect INTO子句用来创建生成表查询语法:% ?, E% Y& O$ n1 w. w3 y3 G8 G
Select 字段1,字段2,…
?$ ]' e7 N6 t) S* `% \INTO 新表[IN 外部数据库]
9 y- d1 s5 z- `8 ]5 W1 VFROM 来源数据库' O( W1 P7 \4 I4 O2 H* L0 O& U) p
Where 准则9 m/ k( x0 W* e0 Z
例:为定单制作一个存档备份9 r- k2 h; E ?7 m2 d5 E
Select *9 I9 I: ~* Y7 z4 O) h
INTO ordersArchive( k9 g0 @& i8 y4 ?8 c& I
FROM orders
" J1 m& u/ l% q! Z; _* g八. 联合查询! S( Y' r/ @7 Q" c! r! A" _8 W/ e
UNION运算可以把多个查询的结果合并到一个结果集里显示.
' M1 Z0 @2 y3 C- L3 JUNION运算的一般语法:
7 x% X/ ?- T8 S% Q[表]查询1 UNION [ALL]查询2 UNION …
: w7 b' C& P2 x K例:返回巴西所有供给商和客户的名字和城市% G9 B5 I8 e* i G1 b" x
Select CompanyName,City+ m/ `5 I. ]# F. _9 T( `; g2 D
FROM Suppliers) x8 Z3 O) z! {. e; ?
Where Country = ‘Brazil’& [5 }2 ~) f: {
UNION
R! u$ H" Z7 M. q) m) vSelect CompanyName,City% e8 ^3 U! _+ t' Q- x
FROM Customers
0 v2 F8 z/ K% k$ Y( _Where Country = ‘Brazil’, k7 B* a( ?, X1 D- F
注:
3 J+ N; d3 N7 P/ f, U+ N; P$ a缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项& S& u/ [4 h8 [
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同./ S' n2 s& M' L
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
" @9 z$ B9 D. c- S8 M- H! C九. 交叉查询
9 d7 j# g. D9 `% [* w( Y& E9 t- Q交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
3 g- J1 H- k8 n0 `' I# H* sMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
2 i( W8 I, l' \" QTRANSFORM aggfunction
5 p! A N& q# F5 @Select 语句
& A3 `" O" p- hGROUP BY 子句
6 ^2 ?, C: I' V' \. ]3 SPIVOT pivotfield[IN(value1 [,value2[,…]]) ]2 f6 c) m' _/ m3 _
Aggfounction指SQL聚积函数,$ T3 y R, L( j( L
Select语句选择作为标题的的字段,) B" ?) Y' [% ?6 c# D
GROUP BY 分组1 u) J2 ]/ h/ V. F; V @
说明:( O: g h/ x& q3 H) f3 r
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.3 i9 D5 w! V" k& y
value代表创建列标题的固定值.
! r; N5 ]& I, p7 p6 r9 m- b* S6 \例:显示在1996年里每一季度每一位员工所接的定单的数目:
7 H$ B1 h. t5 f$ ?' i3 \TRANSFORM Count(OrderID)0 C" M7 O4 b/ y
Select FirstName&’’&LastName AS FullName
7 ?& S+ q3 D: `' xFROM Employees INNER JOIN orders2 `3 k) k f9 s" ?* p
ON Employees.EmployeeID = orders.EmployeeID
+ y- r/ R) b% Y+ o/ n B) D' e8 ], @Where DatePart(“yyyy”,OrderDate)= ‘1996’
# f) x5 O5 v: t( ]! t$ LGROUP BY FirstName&’’&LastName/ R* t: B- a! \
orDER BY FirstName&’’&LastName* I3 M# \4 l/ {+ I! g& t( i
POVOT DatePart(“q”,OrderDate)&’季度’+ u. s- s0 t' b4 ^5 T! I
十 .子查询
4 h7 X+ J2 e: v" d4 y$ ^, o. x子查询可以理解为 套查询.子查询是一个Select语句.7 ^( e6 Z/ h* O+ J
1 表达式的值与子查询返回的单一值做比较2 a; v; {; ^7 e( e+ C( Y$ d
语法:2 E& _. a& r7 ^: i
表达式 comparision [ANY|ALL|SOME](子查询)
8 c( u8 F4 W# K6 W. r5 _9 H$ i说明:
% \/ }6 ^$ _" x' ^1 j) hANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.: f) _2 k2 i; ~. t. f Q
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
1 u6 |# l) I* U% P2 USelect * FROM Products4 m' T" m- M1 S7 U% }4 v
Where UnitPrice>ANY o' Q( F6 t: |# y
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
* w! c" k5 p# r! V$ K% r2 检查表达式的值是否匹配子查询返回的一组值的某个值! t8 a Z/ T7 A/ E
语法:
! o+ G0 n+ f* \# `: {* T[NOT]IN(子查询)
* I+ V" P: ~& r: ]9 u例:返回库存价值大于等于1000的产品.9 u3 i) S" {2 ~
Select ProductName FROM Products9 O1 H0 Z1 `% J5 o5 m$ d$ D, o5 P
Where ProductID IN
2 j, h" H6 n# ^( a2 \3 i(Select PrdoctID FROM [Order DEtails]! ~/ O, |4 T+ o' L
Where UnitPrice*Quantity>= 1000)& f& O, t3 |$ }3 s
3检测子查询是否返回任何记录
4 q# Z8 I& ]3 }/ f9 q, m语法:
9 T2 L, P Y" f2 I$ k[NOT]EXISTS (子查询)
3 x5 F3 r3 H: k. \ }. Q例:用EXISTS检索英国的客户
" v7 s6 {4 f7 f# TSelect ComPanyName,ContactName% N) e. F. K0 |/ J+ l5 j' R
FROM orders
, a- \! N) q3 rWhere EXISTS
5 i1 d. l" B/ s( T(Select *: J+ ^7 D+ R" R1 W+ S7 s; Z
FROM Customers
& a# V) b. g$ ?* ~6 UWhere Country = ‘UK’ AND
8 J$ d5 O: m" R% V; WCustomers.CustomerID= orders.CustomerID) |
|