- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法
, ?# G i" [/ C" E8 d" c4 n
6 H# b% p2 f8 E# ^) fselect distinct 字段 from 表名 ? e' ?5 j1 k' M0 y3 V1 @3 x" l
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。 } n4 x- P6 ?' m5 O$ T% j' Z
一.Select语句的完整语法为:! k: M8 m; [" K: R" u; g$ `# R
Select[ALL|DISTINCT|DISTINCTROW|TOP]
, X( g# p0 n$ m8 n1 _$ m* {{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
. l) c \( ~5 g' E# S, IFROM tablee xpression[,…][IN externaldatabase]% ]8 [2 ~2 L( i2 n* D! R
[Where…]
+ v" Q1 ^' ?6 O+ V[GROUP BY…]) G0 U0 o0 P4 K4 n2 H* i
[HAVING…]
% ?1 H% M, W+ M) {. _4 h; c[ORDER BY…]& L0 @ P/ U' I5 }
[WITH OWNERACCESS OPTION]
0 L3 M% n, C: e8 t6 |( k+ @2 q说明:) O2 @2 ]6 o2 A q" S/ J: {
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。5 t/ v, v5 K) J6 B) q j, B
1 FROM子句- j4 A3 R2 ?7 U1 l# P
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
* r1 s# X1 R. e# R例:下列SQL语句返回所有有定单的客户:
+ z. L ~4 w' X9 M0 QSelect orderID,Customer.customerID3 |( |, h" b1 B: s0 h
FROM orders Customers4 X2 n! U E$ Q5 E9 G
Where orders.CustomerID=Customers.CustomeersID3 M) M; ~) X) x- r
2 ALL、DISTINCT、DISTINCTROW、TOP谓词, K0 g( D# Q1 b5 u' @8 q! r
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。) c9 p2 O& \( l. o# @* R
例:Select ALL FirstName,LastName% R7 [& l' U: r8 K6 [: o
FROM Employees- ^) N: a f, I# V( t: ?/ t& I
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
% S# a7 v, }$ k) J(3) DISTINCTROW 如果有重复的记录,只返回一个" s- j+ }- _7 B6 G
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)4 w1 W; ]) p* D, M; o7 H
例:返回5%定货额最大的定单8 m2 v( q9 N$ H6 Z' X8 W7 r
Select TOP 5 PERCENT*7 H7 p3 p) \# C3 J
FROM [ order Details]
" A3 U9 ?/ N2 p; r# R) EorDER BY UnitPrice*Quantity*(1-Discount) DESC
0 h) ?) D* y/ x! p3 用 AS 子句为字段取别名
! d6 E2 z1 s7 P3 M如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。# _1 g: r2 f0 N3 d0 P
例:返回FirstName字段取别名为NickName
) i6 U( u& |* L8 E+ N# M4 P- jSelect FirstName AS NickName ,LastName ,City
- E+ v5 @& M4 v0 v( ~# @FROM Employees# U1 p+ D2 h0 A$ i3 @
例:返回新的一列显示库存价值/ r2 B4 ?0 J: i/ _
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock* A& D. R- d8 V( e- N
FROM Products
; q" f" Y6 r$ Q) X, Y0 L0 h8 l- Z二 .Where 子句指定查询条件- h/ T9 }& r1 T2 {
1 比较运算符
$ A% P/ v9 y# r I0 n比较运算符 含义
7 f7 J2 }% y/ l= 等于) N* f, q& A5 S y- Q
> 大于 {# F4 y% p' \ b$ G7 {( Q3 f
< 小于
$ [* w7 R% m$ }6 S$ u>= 大于等于4 u; L1 Z' f8 ~7 u5 q
<= 小于等于 W% O( s G7 b- L& O+ @7 e
<> 不等于
2 R9 q9 U. b% i: }' f, J!> 不大于
# p+ O. Q S1 G5 n/ ?!< 不小于/ y) |5 k9 U) l! l8 ]
例:返回96年1月的定单8 W( c& v1 D: r7 @; ^7 U2 o! q; ?
Select orderID, CustomerID, orderDate& _6 z/ p( o8 }: {* ^/ H& A x
FROM orders
/ U8 F9 D" b0 V+ ]2 |Where orderDate>#1/1/96# AND orderDate<#1/30/96#. y' `6 |6 b. K& [; ?" Z/ k
注意:" p; ~- O6 Q Z- V3 b
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
( i. R& G" f L, Q5 ^9 Z0 e例:
: V% G8 x: C- N! A, |Where orderDate>#96-1-1#" C: q Q# {; W" M0 F
也可以表示为:+ z4 y5 S. T2 `1 f' g- b+ v& X5 @
Where orderDate>Datevalue(‘1/1/96’)# B. c m5 Y x" r. @
使用 NOT 表达式求反。
; {( i* F X0 L, x/ d+ P例:查看96年1月1日以后的定单
+ T0 y6 H9 q1 ]& t2 s' Y; YWhere Not orderDate<=#1/1/96#+ \3 N+ @& c: v0 J. w; c4 y* o
2 范围(BETWEEN 和 NOT BETWEEN)
0 c( \ b! g, K* h! O' P1 B6 lBETWEEN …AND…运算符指定了要搜索的一个闭区间。
" w% X! d2 p5 N. H1 G" D例:返回96年1月到96年2月的定单。
; O& \6 `1 G- Z' h" IWhere orderDate Between #1/1/96# And #2/1/96#/ H4 B1 F/ X n8 I9 A8 K
3 列表(IN ,NOT IN)
1 j* C) t' E. @+ s8 QIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。8 N3 p3 K3 Z9 J+ U
例:要找出住在 London、Paris或Berlin的所有客户5 o# s7 u3 P# g2 D* M
Select CustomerID, CompanyName, ContactName, City y+ I3 X/ X) I6 Z2 {
FROM Customers
$ `9 D* G1 ?+ A% V+ G1 uWhere City In(‘London’,’ Paris’,’ Berlin’)- ~3 Y8 l4 v/ H) M5 q3 y
4 模式匹配(LIKE) I8 ]. c9 t0 u2 }) u! T- b2 T
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
% E2 ] W/ B7 j5 Y* j2 o$ Y- mLIKE运算符里使用的通配符
. \% ?3 J7 l; f8 m- h7 m通配符 含义
1 I# [' U/ H4 G8 F1 J0 X? 任何一个单一的字符
4 g) w4 w+ A( R6 A0 ]* 任意长度的字符
+ C' y- T% X6 t5 v" i& B# 0~9之间的单一数字
9 S+ H) `3 I' _+ Z& D. v! A8 [& x[字符列表] 在字符列表里的任一值; f8 u' ^ n, _1 }) Q! P# O: G, t
[!字符列表] 不在字符列表里的任一值* G) m8 j) }6 ~9 Z$ Q, F# F5 m" f
- 指定字符范围,两边的值分别为其上下限
: M3 I( g/ N$ \0 @例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户' l# {9 H5 N, A6 Q M5 r% c
Select CustomerID ,CompanyName,City,Phone
2 Z$ h' U: u# C5 O* UFROM Customers* n3 }1 s5 x C W# P
Where Phone Like ‘(171)555-####’$ V7 v5 z% E- h$ d8 D: l, C5 G
LIKE运算符的一些样式及含义/ {' d3 y; Y. Y y6 d
样式 含义 不符合
# ^) u g9 A, ~+ T5 ?" cLIKE ‘A*’ A后跟任意长度的字符 Bc,c255" q% A, ?' X( r$ ^
# LIKE’5’ 5*5 555% X B+ r% x7 S" b( W3 d( x
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
, O6 J# r4 E. }6 ]; y% j5 qLIKE’5##5’ 5235,5005 5kd5,5346
\( u. O2 ]8 l- iLIKE’5 u+ V" E0 ?! U4 S2 J' f* z
[a-z]’ a-z间的任意一个字符 5,%/ |9 l9 i7 \' I. j. W8 B. @
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
4 f# N( M: D2 r: I- U0 u. kLIKE’[[]’ 1,*" w. R$ s) N# q2 b
三 .用ORDER BY子句排序结果
$ q9 u$ }4 d0 z; v. i+ U+ W! q7 vorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
9 U# ~5 A1 @# o( N. GorDER子句中定义了多个字段,则按照字段的先后顺序排序。, ?& I* L* f/ L/ u5 m- v( L( X
例:
3 y! Q( T q3 `- L* L. sSelect ProductName,UnitPrice, UnitInStock( h: \* z B6 @' J1 T
FROM Products- _4 j2 m7 s J9 }. ?+ u* V
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
$ u: f, \0 Y) M/ uorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。8 R. ~3 b- j" A
例:下面的语句产生与上列相同的效果。( Y' N) L8 l4 Y' E3 }- [: j
Select ProductName,UnitPrice, UnitInStock
; `" ~' `/ A" b+ ~5 JFROM Products
5 @4 G6 E3 d$ D6 `5 [, oorDER BY 1 DESC , 2 DESC,3
: |4 t! D) O: y. A四 .运用连接关系实现多表查询5 ?, d6 h6 {) f. @& ~" i1 C ?7 ~7 B
例:找出同一个城市中供应商和客户的名字4 k) b8 G+ I o3 C5 n% x& S
Select Customers.CompanyName, Suppliers.ComPany.Name4 w3 d4 [( e3 d( e
FROM Customers, Suppliers
{7 P: v8 W, y7 V' R# m) JWhere Customers.City=Suppliers.City
* [& V( D/ r2 {. f; d例:找出产品库存量大于同一种产品的定单的数量的产品和定单6 ~3 [+ [! o, b2 K
Select ProductName,OrderID, UnitInStock, Quantity
) t" G: {' s* G( O0 _6 j; B* t6 qFROM Products, [Order Deails]0 k+ X$ T# D0 g" x' e% @
Where Product.productID=[Order Details].ProductID5 F7 N! X _8 \
AND UnitsInStock>Quantity
/ G( E4 y. t! ^, f' p+ l+ r- L另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN( z; i8 m. T: }( N8 @4 ^
语法: `& G5 W* D" J5 f& ^) Q1 e
FROM table1 INNER JOIN table2
- G% z$ \% p% h: N0 Z5 L8 V4 kON table1.field1 comparision table2.field2
( o5 P4 m/ E* f+ U其中comparision 就是前面Where子句用到的比较运算符。
( Y7 K' Y, }- K% Z$ e6 NSelect FirstName,lastName,OrderID,CustomerID,OrderDate9 [0 `. k" c) b! r! t% J, K
FROM Employees! @1 ^8 l5 Z. y5 ^- z
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID9 k2 V' {, R7 K$ q7 P
注意:2 e2 D: E; Z: @- f W2 h
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
4 G' Z0 w# q" P' G8 y1 a在一个JOIN语句中连接多个ON子句
& A( M# \& N- q$ i1 d3 }语法:. A- o# s' I6 ^* X: M
Select fields
( Y( J, x& A2 }/ r% U* [3 fFROM table1 INNER JOIN table2( l% X5 N" c& j" h, t+ T
ON table1.field1 compopr table2.field1 AND
# l6 y; H: J/ S& I5 EON table1.field2 compopr table2.field2 or
% G4 o( C! d1 c' j/ B5 VON table1.field3 compopr table2.field3" i/ e4 O0 f' g x" D; E Z5 K
也可以: d6 T+ i0 K; k/ n! F
Select fields- u5 M8 u m/ w8 U0 H1 I
FROM table1 INNER JOIN; R- D4 O4 n/ }
(table2 INNER JOIN [( ]table3" M1 ]7 T8 Z( Y7 u5 \
[INNER JOER] [( ]tablex[INNER JOIN]: ]/ S; H+ t5 k9 f/ U4 f
ON table1.field1 compopr table2.field15 F( K: M+ T0 W0 U% m) n
ON table1.field2 compopr table2.field21 Z1 _# ~( L3 V' X' i
ON table1.field3 compopr table2.field36 J6 K# y; |$ |" Y/ B1 H
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
$ y, w- f2 E+ t; E) e- P/ MFROM table [LEFT|RIGHT]JOIN table20 q" d1 s9 r3 k( @& R2 x
ON table1.field1comparision table.field2
1 z0 u0 z) Y1 }: \# r6 A5 G4 L b9 q用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据! a/ V7 w5 g. V
例:不管有没有定货量,返回所有商品
+ m5 D8 P, ~1 VSelect ProductName ,OrderID
. b% u7 W* K5 |7 g: q* l4 NFROM Products* u( u0 w5 o6 C& _# h" o
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID, {) ?" F8 ~. c* s' l9 R# y. V
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
5 K/ R; Z) S& p: c例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。( _/ ?" {5 [ {0 @3 c
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。8 ~2 B( l# i" T) o. i0 C8 W1 X/ n
Select *2 m& b1 G$ T' t% h' k! X
FROM talbe1, Q& K% v0 j, }$ m, |- p# n' h
LEFT JOIN table2 ON table1.a=table2.c, H# @& Z# _3 a% Z
1 连接查询中使用Iif函数实现以0值显示空值
% _5 J: W3 b) X& D/ ^! TIif表达式: Iif(IsNull(Amount,0,Amout)# C3 t. @& W8 V4 O2 r
例:无论定货大于或小于¥50,都要返回一个标志。
$ y8 g" S, ?) G" x, b z' k" zIif([Amount]>50,?Big order?,?Small order?)
) J! n9 ]$ R, q8 M8 N% n) q五. 分组和总结查询结果
' S; y1 w0 _& h( S- @8 E: V在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
' S& {' I6 O) S2 g! J( yGROUP BY 子句的语法
+ p7 z# B, O: G& \! uSelect fidldlist
1 g* X @6 N$ ^5 v: b+ aFROM table
# x3 T# n: c7 C1 y" dWhere criteria/ H, @: i/ ^! {$ S9 ?
[GROUP BY groupfieldlist [HAVING groupcriteria]]1 R6 D9 n7 t. j7 M: L
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
; E$ X0 o! T! A/ MGROUP BY字段中的Null值以备分组但是不能被省略。3 m$ e' w) i5 v4 t
在任何SQL合计函数中不计算Null值。
, L' {! i: e J _( V8 [! D5 [GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。7 g" X2 A: O) k; ?* S9 P
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。% Q5 v& {4 Z# y7 B/ `% V- t& x
Select Title ,Count(Title) as Total3 W7 x3 x$ ^1 {4 ^6 I' k/ r
FROM Employees
$ I2 v7 a2 `7 S. B. S6 e6 @, ~Where Region = ‘WA’" }' D) [0 I$ `% o, ~+ q5 J
GROUP BY Title$ y, A: o+ r$ W( A4 r, N, ^3 Q
HAVING Count(Title)>1
0 j) @2 H- u% M0 }JET SQL 中的聚积函数4 d: I7 L( J& Q
聚集函数 意义+ u4 \- E& v4 v
SUM ( ) 求和& E' ]4 f) g0 e+ p3 ]
AVG ( ) 平均值7 z7 Z' S; y( L6 @
COUNT ( ) 表达式中记录的数目# N% t' t. v: ?, \# B+ M% |* r
COUNT (* ) 计算记录的数目8 @# n# @5 f2 _0 f: [ }
MAX 最大值
# G! U, P" H) RMIN 最小值
7 `& {: u- L" V$ Y8 J* bVAR 方差
) ^$ ^9 }9 p' t$ Y' sSTDEV 标准误差
$ S. H2 h+ C/ Y+ Q- lFIRST 第一个值
' l' o0 ^+ g+ W9 p# h; gLAST 最后一个值
/ ^& Z& w: Q! R6 M" n% k. p1 V六. 用Parameters声明创建参数查询
0 W# P+ R' j% D) DParameters声明的语法:' E) ^8 \+ J( s( ]" }5 H
PARAMETERS name datatype[,name datatype[, …]]- w4 r+ b t5 J, F
其中name 是参数的标志符,可以通过标志符引用参数.
" r8 d3 g4 k( u. @" EDatatype说明参数的数据类型.; [4 {* P, F5 M8 v
使用时要把PARAMETERS 声明置于任何其他语句之前.
" u5 _% [& U5 W7 B例:
8 x9 ?4 ]6 g/ hPARAMETERS[Low price] Currency,[Beginning date]datatime$ a- U, j+ C- N1 R. }& P
Select orderID ,OrderAmount
7 E) `* E7 x- m. kFROM orders0 J0 ^: s/ ? t) i
Where orderAMount>[low price]7 q4 h" H$ l8 A7 a* Q$ m& h
AND orderDate>=[Beginning date]
9 d: G6 A& W2 t. W8 _0 r- n- i七. 功能查询
7 k! H( \& k9 A5 @. V! i/ z% t1 [7 @2 l所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
, s, K( E' e8 {# b% f1 更新查询/ T+ {1 ~0 ~# g0 T9 t4 [- K
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.% }8 d8 W1 y# |+ x9 V- r
更新查询语法:3 E) N' d' H a. a
Update 表名
% t5 E" o+ W" W. hSET 新值
; {- F+ W, X% ^Where 准则. j0 x8 H3 I, O5 E
例:英国客户的定货量增加5%,货运量增加3%
( a# D7 S8 u8 }: D: u6 bUpdate OEDERS. @2 B: ^2 l: d" s- ?
SET orderAmount = orderAmount *1.12 d b1 {/ l1 p; q1 A; {
Freight = Freight*1.03
4 v+ `1 z% f* S6 pWhere ShipCountry = ‘UK’
6 I; {: p; ^7 R: T- E' X( e2 删除查询
" x0 w9 d/ K s% bDelete子句可以使用户删除大量的过时的或冗于的数据.2 Q0 s+ ?3 g5 j7 S
注:删除查询的对象是整个记录.0 a/ t5 ~1 [! [! S
Delete子句的语法:4 j! C3 B9 a I- }6 X
Delete [表名.*]* a4 V2 b# r2 q7 h
FROM 来源表- o7 W; M' V, n8 m' z. ^8 U
Where 准则
) g( h) r- k4 t" o/ D1 ^例: 要删除所有94年前的定单7 C* ?& ~, ~+ l9 s; ^/ i
Delete *& y4 Q" g# L2 Y2 ?! x- }
FROM orders$ T2 A3 B9 B! k" A6 x; {! \ T
Where orderData<#94-1-1#+ } w; x+ t1 A' t1 O* b8 P
3 追加查询
8 S& y8 v$ C. P4 @- MInsert子句可以将一个或一组记录追加到一个或多个表的尾部.5 g0 C' M& k6 h* ~
INTO 子句指定接受新记录的表
; }2 Z/ Q# E! Z( l9 a" [) X9 [valueS 关键字指定新记录所包含的数据值.
+ g2 M# y5 x! {1 aInsert 子句的语法:
' q% u2 e# G7 iINSETR INTO 目的表或查询(字段1,字段2,…)
# O5 v, V4 u; y0 uvalueS(数值1,数值2,…)
6 D8 P, h# |) B4 o$ I例:增加一个客户
& ^0 z- M7 V0 U4 t0 i: RInsert INTO Employees(FirstName,LastName,title) }9 V+ v( f9 _# {! B' D
valueS(‘Harry’,’Washington’,’Trainee’)
. q1 M; \( t, e4 生成表查询4 @2 A$ K+ c* K
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.! [$ A6 v2 p7 O! u3 \# S
Select INTO子句用来创建生成表查询语法:
0 u7 @" I0 D& h) j- T+ K* FSelect 字段1,字段2,…
9 S0 X* ~" ~0 s% l3 AINTO 新表[IN 外部数据库]1 `/ ~) |% f' J
FROM 来源数据库
! g# p- Q/ S3 e T6 w% GWhere 准则
; D2 Q/ b6 U- B; {例:为定单制作一个存档备份
1 I% F8 ]' S- t+ U, F; A5 pSelect *
5 B( b: B9 u8 u4 MINTO ordersArchive
4 e' z4 N; b/ H4 uFROM orders
% Z n8 I, _. M. |& f0 [八. 联合查询
) U& H! e1 k: d- e+ t6 E3 MUNION运算可以把多个查询的结果合并到一个结果集里显示.
% B( I: r; [ C* f/ z$ r$ LUNION运算的一般语法:
+ i; Q& I3 y/ f. ]8 O[表]查询1 UNION [ALL]查询2 UNION …4 C: k' g! F% _* M# b& \
例:返回巴西所有供给商和客户的名字和城市% Z! ^/ R' V- o; v
Select CompanyName,City: E2 z5 x* g; B) v7 V% |4 g
FROM Suppliers
8 k( R/ _7 o$ t) LWhere Country = ‘Brazil’
: n& ~% o4 u) _6 w6 t1 v( f6 oUNION8 C2 A ?5 w9 T: t8 I- L
Select CompanyName,City V0 ~% X6 d' Z5 T
FROM Customers
) G9 r, W4 y& Z* K/ J+ J$ |# r- aWhere Country = ‘Brazil’
% l& N1 O9 \; w' q0 L; v注:
( N( J$ W p3 i p- Y) b缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项. x" k3 c H1 N2 g+ p5 Q# j9 B& D
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
* x- W% Z* O3 _/ f9 }每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
3 n) u7 K: `0 ]) Y, X j九. 交叉查询3 u5 \9 Y' `( G6 y# q5 d4 ` \
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
5 R8 ]3 n, G/ P9 j9 }/ EMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
$ k5 I- I- b- k7 }TRANSFORM aggfunction
5 R! n' U. L) H OSelect 语句- ~" r& J7 c% k+ ]; p9 T
GROUP BY 子句
6 l8 \+ _* ^& D& WPIVOT pivotfield[IN(value1 [,value2[,…]]) ]' ^ p9 L8 Z( t- h5 J
Aggfounction指SQL聚积函数,( n. n; d# b7 u8 L" ^' K
Select语句选择作为标题的的字段,9 T2 ?: D) }3 L6 F
GROUP BY 分组' a2 D; M# h+ B3 _
说明:( [* [0 [1 w' B% }9 [' l0 @- Z
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
7 n4 P" b4 g, ~value代表创建列标题的固定值.
+ Q, O0 j4 { Q: \7 F+ n' A例:显示在1996年里每一季度每一位员工所接的定单的数目:
7 Y& h9 P' L) X8 X/ m, B- D0 UTRANSFORM Count(OrderID)' i$ Z# E# T& I" M
Select FirstName&’’&LastName AS FullName* B1 a3 X( s- E& S% Y
FROM Employees INNER JOIN orders$ B0 [; H1 [4 z+ _- d
ON Employees.EmployeeID = orders.EmployeeID
# q; V7 |7 W; l1 y6 qWhere DatePart(“yyyy”,OrderDate)= ‘1996’
) j& K3 w- y% A" O9 qGROUP BY FirstName&’’&LastName- r D- g. M( S/ P4 s& N q
orDER BY FirstName&’’&LastName
& S( T) c- u) Y% Q [8 aPOVOT DatePart(“q”,OrderDate)&’季度’
{# V" ^+ A& ~: {1 J: E十 .子查询
% M: k* h! a' U" i% |, j8 w+ L子查询可以理解为 套查询.子查询是一个Select语句.
6 _, R- V2 N) i$ {- N1 表达式的值与子查询返回的单一值做比较
8 v, S O9 H; x0 W4 v4 |% k) f1 B4 L* C语法:
9 Q3 f' g- E" L0 R" x. ?表达式 comparision [ANY|ALL|SOME](子查询)
4 p2 F7 Z4 f4 o+ y说明:9 M/ T5 ?' f7 v/ R/ n
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.( e V! Q, W4 [9 |- R
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
2 s$ ^! K+ P9 t# o# |. vSelect * FROM Products% Z9 j9 z$ [2 ` v2 Q( k
Where UnitPrice>ANY
2 r F3 y( W* O% Y1 o4 {' b b(Select UnitPrice FROM[Order Details] Where Discount>0.25)
5 B' z7 r: D6 h9 `2 检查表达式的值是否匹配子查询返回的一组值的某个值
6 }2 ?' l" y# i* X语法:- L6 g' A& g+ |& C! e0 R
[NOT]IN(子查询)
6 _3 ]0 @0 H2 Q$ p a) x例:返回库存价值大于等于1000的产品.
: Z' W( O0 d/ q! SSelect ProductName FROM Products
) W; _) r, }$ X8 y) B5 y! aWhere ProductID IN
+ n4 @% y0 M9 U5 n( E6 P(Select PrdoctID FROM [Order DEtails]
4 Y4 u: ]# u) f {) m/ h! n4 ?3 b1 wWhere UnitPrice*Quantity>= 1000)
/ z- A3 l$ y' Y: \) Q* O9 g3检测子查询是否返回任何记录. T0 X& R, @; x5 _2 U
语法:5 Y1 ?7 T$ v# p' ]. x9 l
[NOT]EXISTS (子查询)
" u9 U, H( @) C- ?3 x例:用EXISTS检索英国的客户" \* Y" A+ ^8 u
Select ComPanyName,ContactName
5 ~* S3 ~2 ^$ H* U7 c5 o& z( zFROM orders) |; h0 f8 m! M* Y/ n
Where EXISTS
# |5 A; @; d! Q2 `/ x5 s. m' C9 `(Select *! `$ o4 R( x; T
FROM Customers
2 J4 t: w/ p, ~) ?Where Country = ‘UK’ AND
) f0 ]1 W) V9 |6 o* m& CCustomers.CustomerID= orders.CustomerID) |
|