- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法8 l. }6 K0 g. [0 `8 j h& a# X
; A9 W2 s* l) w9 w" M. K
select distinct 字段 from 表名0 d6 u6 U. S" I- B* t; s7 s
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
2 A/ [6 |& R) X0 o: u一.Select语句的完整语法为:
& ]/ a# w0 J' rSelect[ALL|DISTINCT|DISTINCTROW|TOP] F1 L- j: O9 `
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}" g( u" J7 Y( u; A& ^
FROM tablee xpression[,…][IN externaldatabase]
( O! [* i8 v4 Z[Where…]
+ s& G' s% C- V6 j[GROUP BY…]
/ x2 M* S7 C1 Q( P[HAVING…]7 r) ~/ m& ?3 Q" T
[ORDER BY…]+ U/ ?/ n! i( d" O9 w; ]
[WITH OWNERACCESS OPTION]8 Q* d: G) ?+ R5 c8 T/ V4 f
说明:/ N4 B3 j- \8 B5 Q9 u
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
6 D5 _& R+ V, y0 C( E) _8 d7 V9 H1 FROM子句) u( U" h* j8 z0 M1 _* S: M
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。6 k" |7 D4 {5 i- \. f3 t" S
例:下列SQL语句返回所有有定单的客户:
& ]+ w7 P$ F1 w0 \Select orderID,Customer.customerID7 [. g5 o( B1 [% |
FROM orders Customers5 }7 V+ L# _3 t6 C
Where orders.CustomerID=Customers.CustomeersID
$ Y) e& Q$ M3 J7 K2 ALL、DISTINCT、DISTINCTROW、TOP谓词5 V' B# b# S+ r' z* j% z
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。; i9 R1 ~, r- O- t4 F7 z$ q6 V
例:Select ALL FirstName,LastName
0 x9 Q7 Q' y7 v, |, `& EFROM Employees
5 a/ j, I9 d- I6 x9 y(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。* l. d- d7 ~% R4 H$ B3 N! i
(3) DISTINCTROW 如果有重复的记录,只返回一个, p! d* o1 K: \3 O4 p
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)( ^; [3 l: Z& v5 n% l7 a' Q; l2 L* Q
例:返回5%定货额最大的定单& O5 ^7 r4 L& B6 X: N/ f1 N0 ^: U
Select TOP 5 PERCENT*6 k8 @5 N" | H* V) d; o4 T( J2 r
FROM [ order Details]. y4 ~* E- h% N/ v4 w
orDER BY UnitPrice*Quantity*(1-Discount) DESC
6 ?" S+ _" T6 A3 Q' g$ P3 用 AS 子句为字段取别名$ S; D9 u! G* i3 L
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
. V7 b7 S7 s+ ~$ K- V" U例:返回FirstName字段取别名为NickName' T9 ^# Z3 F$ U3 f: g
Select FirstName AS NickName ,LastName ,City
. ?3 z# z+ Y; Q" M* vFROM Employees
S: i+ }7 J1 T* N J Q0 a. d" M例:返回新的一列显示库存价值
$ p3 |& K) `" e" S1 @1 q( ZSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock: l9 Y; D, N j+ a" ]
FROM Products+ R1 z9 }. m {% W# b( p
二 .Where 子句指定查询条件# B$ b0 i( |: S2 L) ]* X2 B0 K% A6 c
1 比较运算符
+ B" u' b0 i" N. `# f1 y( t比较运算符 含义: ]- U/ m2 u7 Z. K
= 等于
+ I$ q& j" K$ A2 E5 k1 }> 大于
3 C+ R; B( P. L* l3 A& x< 小于3 R0 ]1 ~# ^ U! V
>= 大于等于4 T! n( g) s, }$ y& f# s% F
<= 小于等于
% Z3 S9 v1 T8 G [' f: L<> 不等于) u& g# {* p- E, U/ Y! w; D
!> 不大于
( C# J$ c( s; e, c6 q6 Y$ W& P!< 不小于0 P& |8 D2 B5 S! ?+ |- S( F1 e
例:返回96年1月的定单 V9 j6 U# u& m& `+ {' R
Select orderID, CustomerID, orderDate2 C" w* }+ x& Q
FROM orders
+ y. q+ Q& W: T5 o% iWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
U& L8 m( d1 c' A- i注意:
! q" P/ D/ f5 m D% kMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。+ N/ B$ o7 R" Q9 G8 m9 A- S. Y% h
例:8 i8 E. Y9 X& ~1 \+ j( I
Where orderDate>#96-1-1#
, g7 Y) E! ?& H# S也可以表示为:
* r4 \+ f* R `. Q- `/ N: W2 r8 ~Where orderDate>Datevalue(‘1/1/96’)
$ o) }! E9 l6 K$ X. \' N" Z使用 NOT 表达式求反。
- c* c4 A( K5 W0 l9 x; p例:查看96年1月1日以后的定单% X) Z6 `2 ]: g! y8 L& ~* o7 w
Where Not orderDate<=#1/1/96#* o- a3 R; E$ a
2 范围(BETWEEN 和 NOT BETWEEN)& ?# z* q" R0 B3 \
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
) K: }7 _& W" L/ `% ^例:返回96年1月到96年2月的定单。
" {1 U2 f- ] g3 u! R$ B2 `Where orderDate Between #1/1/96# And #2/1/96#9 t/ |# z! g. Z% i8 I( i
3 列表(IN ,NOT IN)
- i* f+ ]- H* w5 B7 A3 ]6 zIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。6 \* o+ y! P# z8 y7 p
例:要找出住在 London、Paris或Berlin的所有客户8 y: m+ t. P* B
Select CustomerID, CompanyName, ContactName, City
# P4 X+ W: H, hFROM Customers
5 ?, M. R c5 I- r- SWhere City In(‘London’,’ Paris’,’ Berlin’)4 {0 P' t- X+ R3 M% L0 E2 F
4 模式匹配(LIKE)4 f8 R& [& K3 D- ^( S
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。% y: L" h# D- r8 C' H
LIKE运算符里使用的通配符
( S/ M4 E% I# W) ?& F通配符 含义' y2 E) {7 ~4 v2 r$ E
? 任何一个单一的字符
. z% s& l8 M2 B- R% l6 G* 任意长度的字符
( z3 B2 [) U0 W; Z7 b( s' H8 g) I# 0~9之间的单一数字0 h3 h: W: a5 O; v: g
[字符列表] 在字符列表里的任一值
( g; V$ a2 Y. A' V: |[!字符列表] 不在字符列表里的任一值7 ]1 r' m' Z0 @" N* G$ r4 L
- 指定字符范围,两边的值分别为其上下限3 q' {$ F: L {, T9 R" W7 Z' y
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户$ Q8 u N- d* o; L- _1 x
Select CustomerID ,CompanyName,City,Phone, N2 ?1 o# m! H$ h. N: z
FROM Customers
, g! z$ @3 Q& o$ rWhere Phone Like ‘(171)555-####’) \: L/ s& x! J7 F6 P
LIKE运算符的一些样式及含义
6 e& f y: ~2 R6 V% O! `# ]样式 含义 不符合* A% R" |. I5 A
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255+ V4 u! M: I8 {5 r+ M
# LIKE’5’ 5*5 555
# [: H" \# M; L7 I/ s; VLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
1 {- l) t: Q' u$ x* m' NLIKE’5##5’ 5235,5005 5kd5,5346
3 N# }6 k- g# ]- _LIKE’
7 b% i5 U2 r/ B) \[a-z]’ a-z间的任意一个字符 5,% n" x3 f8 E5 `! h# [/ k# D8 F# n
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
+ x# {- G6 |9 \. T2 T$ NLIKE’[[]’ 1,*
( g+ G! j/ c* X( J/ Y1 i, X三 .用ORDER BY子句排序结果
1 Q7 Z) m$ L$ rorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。1 B3 N4 B1 l. v' M
orDER子句中定义了多个字段,则按照字段的先后顺序排序。% t- p7 v; h/ U* S
例:) k- g2 {7 \$ D1 f2 ]
Select ProductName,UnitPrice, UnitInStock( Q0 _0 W) e4 w2 T$ t6 _4 Z0 k' A
FROM Products
1 W% d9 R: y& _1 ^; @3 gorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
. m4 Q0 j ~. D5 x [6 B+ A- torDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。& p- i* p9 ]) k3 a, X& F- b' v
例:下面的语句产生与上列相同的效果。
3 q3 r5 `# G+ {3 oSelect ProductName,UnitPrice, UnitInStock
a/ Q/ J$ E& [5 o' bFROM Products
: X! b! ?. w. L8 f. IorDER BY 1 DESC , 2 DESC,3, _, v" L x: @3 R/ Q( u9 ^
四 .运用连接关系实现多表查询- h& r+ S; H" d
例:找出同一个城市中供应商和客户的名字$ }! @9 y) P; t) L) A
Select Customers.CompanyName, Suppliers.ComPany.Name
5 O1 o7 r* n# J) I+ [FROM Customers, Suppliers4 o# m+ X/ r" I f
Where Customers.City=Suppliers.City
) R# E8 V' ]) w5 k4 c/ a% f) G* J例:找出产品库存量大于同一种产品的定单的数量的产品和定单, _* g! J' R. s4 s! R# x
Select ProductName,OrderID, UnitInStock, Quantity7 F- _' i$ t2 I$ M; M
FROM Products, [Order Deails]$ q! q; R. M) L* |9 i6 s
Where Product.productID=[Order Details].ProductID
' i* ]) F7 L" P1 A* ?9 H; DAND UnitsInStock>Quantity9 E0 f4 z; y+ t. {2 ?- U- }+ l
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN0 A4 Y, e- p0 n' s9 t% h" A0 w( p
语法:8 b9 e. P! N# y/ F
FROM table1 INNER JOIN table2
3 k# e9 J1 F8 P( w# }ON table1.field1 comparision table2.field2
( L! Q. _$ d/ c/ P. R2 b& A8 d其中comparision 就是前面Where子句用到的比较运算符。1 u+ @' ^( i8 c/ S( l. J
Select FirstName,lastName,OrderID,CustomerID,OrderDate( n6 B O/ j1 @
FROM Employees
- O/ b" i( j' t6 Y0 B' nINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
- u4 z8 z; _. c* q* y; Z/ v注意:6 H/ P! F/ V0 H4 T4 T# d
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
% i( P9 Z8 e1 Y( L: A4 J4 R6 ~3 W在一个JOIN语句中连接多个ON子句+ m2 S+ Z; x" V' E* v/ F
语法:9 p% J3 I/ ` i: O4 |
Select fields/ }5 t8 ?2 d' L3 Q$ Q: P
FROM table1 INNER JOIN table2
' v# n; m; x+ p$ kON table1.field1 compopr table2.field1 AND& H& C( Y% y( a: \3 J6 N
ON table1.field2 compopr table2.field2 or2 e+ R" g. `( I7 I9 q% B& z
ON table1.field3 compopr table2.field3
# |0 R( t2 U9 R2 {9 L |* e也可以% s' s) ^" E y7 P! @
Select fields' N7 c( y6 @$ F
FROM table1 INNER JOIN
. o1 w. D7 E( S! j' U8 P(table2 INNER JOIN [( ]table3
6 O2 d8 ]2 X) ?! E! n2 I' |7 L. e[INNER JOER] [( ]tablex[INNER JOIN]
; p! W& s! ]6 v3 dON table1.field1 compopr table2.field1
1 @* j! T! T# G0 GON table1.field2 compopr table2.field25 J S. \6 M7 j3 n4 [0 O+ n! ?$ x+ e7 |
ON table1.field3 compopr table2.field3
: W# }+ ^8 D$ m! }外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
) d9 B E% K( P" `# K2 kFROM table [LEFT|RIGHT]JOIN table2
: a+ \4 M- y4 Y% ^$ ]ON table1.field1comparision table.field2
* ^7 q# j1 W) b9 d) p& q$ [8 q; i# c用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据" I' w" q4 ]$ W: J" Y4 X* X" L
例:不管有没有定货量,返回所有商品' @6 I' j7 M; G2 M+ H
Select ProductName ,OrderID
* m" J% Z+ C2 |' g3 ZFROM Products& S6 O0 D. N/ w
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
% d+ d$ v+ P3 g a右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
' U( o7 b* D/ w1 [例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。. }- I# B3 o6 [$ Y5 v
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。2 @# T9 {' W: d8 g2 f, Z' p
Select *
' o% v/ b% }! h& M, R% HFROM talbe1
' A6 W w7 \+ mLEFT JOIN table2 ON table1.a=table2.c
2 P/ ]: C' b# \1 连接查询中使用Iif函数实现以0值显示空值% [* S6 P( }" ^
Iif表达式: Iif(IsNull(Amount,0,Amout)3 ]) z; N1 x3 | g* q
例:无论定货大于或小于¥50,都要返回一个标志。; ~% |4 Y0 R' t4 _0 P# f
Iif([Amount]>50,?Big order?,?Small order?)
/ T1 ]) n* R3 Y7 G) T P, B五. 分组和总结查询结果8 X) e8 S9 k2 E3 X# T/ u! q! M8 H
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
6 s! @4 D& w3 c- e, ]4 [GROUP BY 子句的语法
+ @# c- e' T& c/ J8 lSelect fidldlist+ c4 _ `/ r$ E" q0 s% l
FROM table
* t8 w7 k t& M5 ~' K; @Where criteria3 h5 \3 M( _4 S& Y% n
[GROUP BY groupfieldlist [HAVING groupcriteria]]
! u6 b# g7 ?; ]6 D# b注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
4 L7 H; d, V1 z0 B8 s" {" xGROUP BY字段中的Null值以备分组但是不能被省略。
$ p0 A# b+ T3 ^. N7 r在任何SQL合计函数中不计算Null值。
: _; v# `. r0 C5 M! _GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。9 W6 s) w" ?/ W$ N% I/ O% F. s
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
+ e# Z- L, X3 V; M* q( ^8 q( H2 v6 JSelect Title ,Count(Title) as Total
* J) N) o- J! \9 Q) l& l8 SFROM Employees
2 s8 k) Q t8 J2 c1 zWhere Region = ‘WA’) M& p, M5 \6 i4 `5 O
GROUP BY Title! u# j6 o b# M* j. E7 a
HAVING Count(Title)>1
7 p- c W+ W# Y! h. @JET SQL 中的聚积函数
# H/ X) p+ W$ l3 Y" V" J聚集函数 意义
: \% ]8 O4 U% g& V4 }' ^SUM ( ) 求和, P7 H$ H6 H6 [7 v
AVG ( ) 平均值( j' j% ?) |6 s( f! |
COUNT ( ) 表达式中记录的数目
2 c' p* {0 L5 g. m2 c9 ~COUNT (* ) 计算记录的数目. R* ~2 f' N& H& \7 m/ S/ O
MAX 最大值
9 r, T3 E9 a4 ~9 o* `5 z( L! ^MIN 最小值, `& X) v9 |/ \. s0 ?2 ?* g' K
VAR 方差
, p- g/ T9 H1 Q& pSTDEV 标准误差
- |! U$ R8 H" R' _/ Q5 [% qFIRST 第一个值# o7 j7 Y/ |& @. j/ w* j% @
LAST 最后一个值4 |! H& j$ {6 J/ b6 ^" `
六. 用Parameters声明创建参数查询
# k8 F& l! X) J. J& x7 {Parameters声明的语法:8 i! K+ D5 P2 k" x0 j5 D& N
PARAMETERS name datatype[,name datatype[, …]]0 }! @+ b$ M. F' q# \% v$ _7 f
其中name 是参数的标志符,可以通过标志符引用参数.: g: ^( V9 `( p9 d L( o
Datatype说明参数的数据类型.. x" a6 t' M/ S0 ~2 e( y' M
使用时要把PARAMETERS 声明置于任何其他语句之前.% O6 K3 m( m. X `- M$ p% Q
例:
8 m% N# {; z* B! Y* }' Q% QPARAMETERS[Low price] Currency,[Beginning date]datatime! H. z3 O5 q# O L0 w: q/ V
Select orderID ,OrderAmount
0 W) B; h: F% m7 s DFROM orders
4 l2 y) [* T8 r0 u1 wWhere orderAMount>[low price]
& ?" R7 P( j5 S4 n% fAND orderDate>=[Beginning date]
% t }7 O: J( N B- I8 N七. 功能查询6 \3 V Z) i2 W+ d3 a: R0 c7 _
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.+ Q8 C) }+ H1 x
1 更新查询+ a5 o6 T5 s [3 V. x
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
7 A9 T* b9 o/ P更新查询语法:
' a1 X& J1 m+ _) Y) ~8 z; {8 FUpdate 表名- f7 t4 D( F R8 h" d6 [$ y$ V
SET 新值, v# ]/ t Y2 i, ?1 ]% J$ u
Where 准则
% \+ c8 K e" _% e例:英国客户的定货量增加5%,货运量增加3%
9 ^/ y6 A4 N* s: S/ SUpdate OEDERS
# Z% T6 |# u* KSET orderAmount = orderAmount *1.14 e1 k4 H! Z7 D( T% U
Freight = Freight*1.03
0 S' o+ d" I* ~9 j7 x$ o" y. I# g2 TWhere ShipCountry = ‘UK’. _& U& G }. V/ N: G
2 删除查询. M' s- O$ v# ]) k% C! \
Delete子句可以使用户删除大量的过时的或冗于的数据.
! F: L$ c; ^& u5 Z) L注:删除查询的对象是整个记录.: G4 p% B+ x( J! c" D
Delete子句的语法:
- T. W/ i+ v% o: P$ l7 YDelete [表名.*]
% i7 y7 q8 O# j# DFROM 来源表5 h* t2 l1 `) G: B3 s; K6 B) d/ L
Where 准则
, Z5 T+ D' Y5 ]例: 要删除所有94年前的定单
7 [; }8 E- p' g7 O! A! k, c) _! y4 e$ sDelete */ `8 I, b, ~9 S9 }7 s
FROM orders
6 D! w7 J: l, f0 x/ ]! g. k, X6 F0 YWhere orderData<#94-1-1#. ^; g) p; R/ o, c5 }3 ~
3 追加查询
5 j# l) `- y( W7 L% iInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
: l; K% Y. ]- K: \2 @INTO 子句指定接受新记录的表) i$ @/ \" A1 T: Q% ?" Q4 q
valueS 关键字指定新记录所包含的数据值.
0 U+ u% I3 M( j5 ~Insert 子句的语法:
5 i( \( w; T0 q4 fINSETR INTO 目的表或查询(字段1,字段2,…)
8 U" f! P) z4 N; }valueS(数值1,数值2,…)
5 j: Z/ K. Q+ B$ A. [! s例:增加一个客户
" h+ L+ n1 n; _# t0 gInsert INTO Employees(FirstName,LastName,title)
* i( M. `/ O& C. T6 _3 f( lvalueS(‘Harry’,’Washington’,’Trainee’)/ _6 Q2 v% U% J8 h, r- t+ z3 C
4 生成表查询
8 X9 g# A: `- m: G% J7 k' F5 U8 K6 N可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
& K1 f9 v% {8 |* i+ OSelect INTO子句用来创建生成表查询语法:
8 S: A9 z) _/ F! j+ vSelect 字段1,字段2,…, L; j( b- h( `5 y {( {
INTO 新表[IN 外部数据库]8 G, \- R. L. f) z9 h2 v# g
FROM 来源数据库
! g) g# U& K$ h7 u$ X2 jWhere 准则- F7 y1 v0 K' g/ g9 i1 ?. B$ a/ Y
例:为定单制作一个存档备份3 h3 |3 M& T. R. J# Y% a+ e
Select *
1 E9 {/ ]: S$ J2 p, _0 V+ d4 \INTO ordersArchive' t" K" h0 Q% v2 `; k; l, Q0 ]
FROM orders/ B- j" q3 g L4 z: [, ?
八. 联合查询: I) w* k" D+ K( O, E
UNION运算可以把多个查询的结果合并到一个结果集里显示.
' R+ l0 v. } @ sUNION运算的一般语法:
7 _: u: l; j3 q6 U# J* a[表]查询1 UNION [ALL]查询2 UNION …, }. q) q' t7 ?* N( h: w
例:返回巴西所有供给商和客户的名字和城市
( T' K# f3 L1 G" ~* L: V# `, o2 XSelect CompanyName,City
# a4 z/ ^6 f7 `8 ZFROM Suppliers3 P" i3 U1 P4 z4 f
Where Country = ‘Brazil’
& @% T& m) h- U, yUNION
3 ~* Q; q7 l2 o1 h r" x0 w8 lSelect CompanyName,City# m7 J' c- v" I' n, ~! u; f
FROM Customers( n/ o4 f& [% Q: d$ O
Where Country = ‘Brazil’
, \$ T( d r9 `. d注:
) V" Q) R3 y& {) |$ E5 c3 A% [缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项+ A; w/ t7 W ~: o
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
8 D, i/ D7 ]" V- l: X, J每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
( t! K+ P+ i9 d* Y( _! l0 n; d九. 交叉查询
$ p0 Y- ~/ w0 m2 n! ^, s交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部./ d% t% H; _2 I( S. G; S+ l+ N
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法: j! T, D% U: X4 W
TRANSFORM aggfunction
& X6 n: N' q+ Y6 O3 PSelect 语句
2 z: V' m" O) h8 ]+ UGROUP BY 子句
/ c2 E1 I& D- u& V+ \PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
# E2 i. h0 T* K+ t) w% j( sAggfounction指SQL聚积函数,5 {/ F6 d4 X3 \4 Y) t; E* h- ^6 Z
Select语句选择作为标题的的字段,( x( Z/ o/ O8 N5 B' m" m8 {5 n5 F
GROUP BY 分组
7 i, Z g$ I. g2 a! B说明:* {6 D4 w- U# F
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
0 [' p* O# X- `value代表创建列标题的固定值.
, O& Y0 m# T; J$ t m% h例:显示在1996年里每一季度每一位员工所接的定单的数目:9 R0 K* r/ s+ e. @
TRANSFORM Count(OrderID)
8 i; o' A5 |- X8 @! V1 Y8 t5 ~3 @Select FirstName&’’&LastName AS FullName* v7 a* a% h7 m+ Y3 P x
FROM Employees INNER JOIN orders
8 S7 @" a/ ?% n4 L! r0 `+ uON Employees.EmployeeID = orders.EmployeeID
6 t" ?8 v- F; v* f) ?Where DatePart(“yyyy”,OrderDate)= ‘1996’
1 [: D. N5 d* b9 Y, F' x. u! `GROUP BY FirstName&’’&LastName1 r2 J; g" ?1 Q9 O: m! u
orDER BY FirstName&’’&LastName
+ Q6 g& ?: r1 i0 @/ R5 O% `5 JPOVOT DatePart(“q”,OrderDate)&’季度’
% L" K) k7 D/ J6 ?1 ^9 U' m十 .子查询
h* i1 W6 l% Q: v5 |6 F0 B C子查询可以理解为 套查询.子查询是一个Select语句.
% `# \! m. e. V) d1 表达式的值与子查询返回的单一值做比较
5 F n& h4 I# ?) r语法:
9 m* j4 I/ P" B) Q! T6 d8 f) p表达式 comparision [ANY|ALL|SOME](子查询)
+ @1 l- e7 e) h; J3 i. c. b: N' F说明:* u; \; q2 w2 s: ?/ ?
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.4 X/ d; k0 j) w8 B8 K
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
' ~' E6 k( Y6 M6 D) CSelect * FROM Products5 ^9 h6 J# q- t z
Where UnitPrice>ANY
+ o7 P' b+ p" r5 u. o(Select UnitPrice FROM[Order Details] Where Discount>0.25)
: b6 P; ~9 I8 r1 k; d2 检查表达式的值是否匹配子查询返回的一组值的某个值! T5 g; v* z: ]! E4 o) [
语法:; ~/ [' K4 Z# m% C. i) i/ S, f
[NOT]IN(子查询)2 u; l; f4 E- ?( ?* |# B
例:返回库存价值大于等于1000的产品.
* A4 r( s7 x4 h& X; J: |Select ProductName FROM Products o- u; }4 I# w5 f" M9 h! k( P5 G
Where ProductID IN
* E9 y0 n7 i" h: ~$ |( e(Select PrdoctID FROM [Order DEtails]
' u) J2 q1 q# ~- DWhere UnitPrice*Quantity>= 1000)
" \0 B( r1 a& p( t8 u3检测子查询是否返回任何记录8 f! f2 m! b3 Q. e7 l
语法:
4 U# \' V, T. r. u5 }0 C- P[NOT]EXISTS (子查询)
( h% r) ^& n" `) i例:用EXISTS检索英国的客户
/ E1 j& }3 K+ j. Z2 @) n$ i8 \Select ComPanyName,ContactName
, \" _6 v: j; g/ eFROM orders
+ v! i/ C: q4 |3 X0 I$ z) DWhere EXISTS
/ I8 u6 J% @' s0 S2 o(Select *
! F7 T2 `3 A- J2 K- gFROM Customers
( {' M; j& P% A4 r KWhere Country = ‘UK’ AND
; R) E' W& D9 e( J* o$ a5 t3 DCustomers.CustomerID= orders.CustomerID) |
|