- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
|
Access如何筛选重复数据以及Select语句的完整语法
6 c9 ?- E& w! q5 Y) ?
" {% K/ W. {" R* S @select distinct 字段 from 表名
# q( g7 l! y+ x( y7 l+ Zdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。2 G' A3 h& J+ n" ]
一.Select语句的完整语法为:" ?, H" e N. |2 v
Select[ALL|DISTINCT|DISTINCTROW|TOP]
/ Q4 D8 A$ j# i3 i{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}1 \: P# @: H5 J. M5 T5 ]; w
FROM tablee xpression[,…][IN externaldatabase]0 d5 Z: m- D% L) B( v4 N
[Where…]
3 g% Z6 P0 y0 d, @6 I[GROUP BY…]' ? k: [9 V% ^" b$ m
[HAVING…]
" ?6 w: n5 ], z' R( R' `# V1 @0 z0 |[ORDER BY…]
* l3 { _7 T- }[WITH OWNERACCESS OPTION]
/ I% J6 ^! ~$ |/ U6 E" a- w说明:! V8 B% H& n; v9 B$ j+ ^6 O# f
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。1 ]% j+ B2 P5 z4 f ]6 B
1 FROM子句
, ]' }) \: R% g6 V) H5 P8 TFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
1 w4 ]# m3 D) c例:下列SQL语句返回所有有定单的客户:
3 ~; \; v A6 ~8 P5 k. BSelect orderID,Customer.customerID
: a) ]: @! L, FFROM orders Customers
$ o8 ?) ?6 d4 VWhere orders.CustomerID=Customers.CustomeersID. e8 Z, O. y) w* a' {
2 ALL、DISTINCT、DISTINCTROW、TOP谓词% j+ P' w6 f9 i+ K/ a3 B
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。" ~+ U# q8 ^ Z) V
例:Select ALL FirstName,LastName
6 ^, g! E7 U! W% f2 [% f- L0 O* YFROM Employees" j) n m% K M4 \' M
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
$ T9 ^4 L0 F$ ^(3) DISTINCTROW 如果有重复的记录,只返回一个
* b- L* _% R3 r; w8 X(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)+ c$ }% x( l$ Z0 [
例:返回5%定货额最大的定单
7 M& o+ R. v: T! TSelect TOP 5 PERCENT*
% ]4 i4 J0 C/ F% O$ @FROM [ order Details]! c1 Q( w: y f$ n
orDER BY UnitPrice*Quantity*(1-Discount) DESC
# n: z" \# {" |3 W1 T/ z) r4 z' I$ E3 用 AS 子句为字段取别名
# r9 f1 A i7 ^如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
; X3 D. x- n/ K& |0 d例:返回FirstName字段取别名为NickName
, e3 y( l C$ U+ VSelect FirstName AS NickName ,LastName ,City
H" m2 H7 Y4 W" P3 K% {FROM Employees
( m0 @ v+ _7 h5 O" ?' a例:返回新的一列显示库存价值
6 g' Z& l% V1 L+ \9 D' {+ mSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock5 A% t+ w' {4 ]
FROM Products3 w- @* p1 W/ g
二 .Where 子句指定查询条件2 a. n y# u7 `0 w0 X, l
1 比较运算符
( y! @" ~5 m* L9 f2 M; Z; L, {9 N9 W比较运算符 含义; I( m7 s' N U$ N: y! D
= 等于
% y9 [) O! y& k; k> 大于
) _# D0 i' [$ C! e, c< 小于3 B8 z8 S1 J8 V7 i& h/ B9 A% F
>= 大于等于
- E/ X( N; z4 E4 @/ ^<= 小于等于; u+ i4 X( [2 i' H' O0 `) ~- ?
<> 不等于
0 r/ R( c5 d; \, s!> 不大于: A) r. v; M: h0 p, u8 T' k
!< 不小于
2 X5 ~* i( ?! T& {0 o4 o; J5 v* Y: U/ B例:返回96年1月的定单/ I4 Y% E+ D4 F5 X- r# T( k$ R
Select orderID, CustomerID, orderDate
8 V) G' U" b) Y% T! _! hFROM orders
: \$ d( u, J: L7 sWhere orderDate>#1/1/96# AND orderDate<#1/30/96#3 u9 T4 r4 l, \
注意:% z) n* n- e- x0 f2 E7 @
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
+ o* J U( \1 n5 n# a* F( D例:
( l/ H) k: U4 z# }# Z( z' n% _Where orderDate>#96-1-1#0 X& F' v+ d: Q. t/ H
也可以表示为:) S* Q' @# T& a1 P9 _' @7 z
Where orderDate>Datevalue(‘1/1/96’)
6 q1 X; ^! \% N. ^使用 NOT 表达式求反。
5 A0 H0 J+ @1 V) _$ C, d' i例:查看96年1月1日以后的定单/ ]8 V$ H" K1 h/ G
Where Not orderDate<=#1/1/96# v8 ?- _! o3 x C' d
2 范围(BETWEEN 和 NOT BETWEEN)
* l J5 a" _5 GBETWEEN …AND…运算符指定了要搜索的一个闭区间。6 o* k1 G# r$ q' C) F. n
例:返回96年1月到96年2月的定单。2 b: c( [5 I- ^
Where orderDate Between #1/1/96# And #2/1/96#$ w$ |) [* s) n% N. o. h
3 列表(IN ,NOT IN)
. j+ H. J4 ?8 yIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
5 c# C0 T3 ^8 H" V例:要找出住在 London、Paris或Berlin的所有客户
8 ]3 w2 h# u% l/ j. ySelect CustomerID, CompanyName, ContactName, City" {5 C" W- Z3 G4 A
FROM Customers
1 d3 g* F( v; {. eWhere City In(‘London’,’ Paris’,’ Berlin’)
+ u( t1 ~( s' m1 J' A' ?/ m+ ]2 |4 模式匹配(LIKE): ~. ~( t4 u8 @& f, H; Y# i
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。2 a! ?) F! P/ w) q, B4 O! }
LIKE运算符里使用的通配符; V# t. Y# o' @9 s& ~2 X) p% u
通配符 含义
/ h# y) s2 J- h e? 任何一个单一的字符
* H8 I, P9 f4 B7 _* 任意长度的字符4 A& V( X' v+ G6 L; U' T, ^
# 0~9之间的单一数字
+ f! x" W) ~7 X) W" y. n[字符列表] 在字符列表里的任一值
4 [8 [4 x& C5 E& G, R1 L+ `3 x[!字符列表] 不在字符列表里的任一值0 ~6 ~) r/ x0 _' t& B/ |% s; z N
- 指定字符范围,两边的值分别为其上下限# A- I$ v2 V0 E; e8 h+ A2 X2 t' Y
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
Q/ h' D2 q# R8 l6 j' g$ sSelect CustomerID ,CompanyName,City,Phone& ]7 T2 U& C( i4 N. l" K
FROM Customers
9 J& r" d7 J3 s* dWhere Phone Like ‘(171)555-####’0 r' x q Y0 ~, A: Q
LIKE运算符的一些样式及含义; V/ w; f1 F- T* L M2 ?3 [
样式 含义 不符合6 N; N) `' _% F- O- p, A. o
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
K5 g& s7 E R! d% s# {% G# LIKE’5’ 5*5 5559 t' s! |- Y; P, s0 ?
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer59 G1 ^5 c8 r, B7 r
LIKE’5##5’ 5235,5005 5kd5,53468 ]0 N7 E/ t2 }
LIKE’
7 b' V+ v# Z/ G. S: t1 Z" j6 {[a-z]’ a-z间的任意一个字符 5,%
2 ?. @( ]3 h( Y0 M7 o# A3 RLIKE’[!0-9]’ 非0-9间的任意一个字符 0,14 V' ^' D3 `- N
LIKE’[[]’ 1,*
, g V6 v0 S8 t* x三 .用ORDER BY子句排序结果, d- {) H) F0 |0 q+ ~% U' B
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。1 i' w1 J4 b0 d5 I
orDER子句中定义了多个字段,则按照字段的先后顺序排序。9 K _% ]! S/ P5 e/ `+ e
例:
`" V- A" V! }% o& h c: ASelect ProductName,UnitPrice, UnitInStock
6 _- K) y" ?3 N7 WFROM Products
% X9 u6 g$ Q& ]7 W# u, G9 ~/ J9 ~orDER BY UnitInStock DESC , UnitPrice DESC, ProductName7 X' Z, H! i6 A2 Q
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。( J! l0 _" [" C& ~% B( i2 |$ h; J- x
例:下面的语句产生与上列相同的效果。
/ z9 d0 B* z8 l' S( O# n( @" fSelect ProductName,UnitPrice, UnitInStock1 ^6 C! `) q$ Y* e5 }' Z' J
FROM Products$ i8 t Z& \3 H, ]8 `, E8 y
orDER BY 1 DESC , 2 DESC,37 Z7 ^0 m; w) O6 u5 T9 `- n6 }
四 .运用连接关系实现多表查询' ?2 v$ y7 R5 ^, V5 O' m. J/ w# Y
例:找出同一个城市中供应商和客户的名字
9 l6 K) t! E! g9 M" C& c* m# S$ ?Select Customers.CompanyName, Suppliers.ComPany.Name/ \% u2 C' O( L9 M7 w
FROM Customers, Suppliers
4 s. B7 ^$ S& s4 ~9 q- q% aWhere Customers.City=Suppliers.City! l8 R' C9 k2 s" G; u
例:找出产品库存量大于同一种产品的定单的数量的产品和定单 x# u* Y1 n; S$ Q9 e: j, `
Select ProductName,OrderID, UnitInStock, Quantity+ u& m5 r+ w d- H4 l, d
FROM Products, [Order Deails]" u# m' y& k* M1 c' t d
Where Product.productID=[Order Details].ProductID/ l) z# e* M1 v. M! Z
AND UnitsInStock>Quantity
+ X G2 O9 d0 r另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN, m) S9 W6 J* l/ Z B, h
语法:
' R# N. Y( o, `! xFROM table1 INNER JOIN table2
( p: ~+ y+ C( OON table1.field1 comparision table2.field2# [+ y- U' a7 T
其中comparision 就是前面Where子句用到的比较运算符。
% B0 e5 P, Z- [9 O% u$ J, B H- fSelect FirstName,lastName,OrderID,CustomerID,OrderDate* k; N* p- D3 H1 g3 U! } L
FROM Employees- w% _! J5 L; U
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID$ d2 O/ M$ L7 }8 H7 u5 \
注意: k$ v+ ?$ i) D6 [ R- }
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
) n# ?; U! x8 v+ g在一个JOIN语句中连接多个ON子句
+ ]! _( v/ H! F语法:
9 z1 _; `2 e' \% NSelect fields8 c3 `& f- Q5 d$ K* b A9 l
FROM table1 INNER JOIN table2+ M' G' ^4 o |( y3 G/ p
ON table1.field1 compopr table2.field1 AND
, F w: Q" G$ v% G$ z( iON table1.field2 compopr table2.field2 or9 i% d1 [7 j# h( J
ON table1.field3 compopr table2.field3
$ H' [. m2 K( R, H2 |也可以# I4 P3 v% c$ ~
Select fields# @0 u8 m& e" `9 i
FROM table1 INNER JOIN
# B. l( t4 G3 y* Y9 }" o(table2 INNER JOIN [( ]table34 `# O3 \6 e4 t
[INNER JOER] [( ]tablex[INNER JOIN]
~4 F7 W8 V" d( Y1 `3 a0 bON table1.field1 compopr table2.field1+ H- C- T6 B0 V2 t, l$ u' a$ r" ^9 u
ON table1.field2 compopr table2.field2- e2 ]6 f2 R; `4 p4 H& }
ON table1.field3 compopr table2.field36 p6 c% u# w" @: m. p
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。. m H, z+ C1 M! c+ J
FROM table [LEFT|RIGHT]JOIN table2
3 e, L# w2 W; X" [! @# mON table1.field1comparision table.field2
! E+ T' m" O' f% e# D# x: ?1 a用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
3 B" i+ }# q) e6 r例:不管有没有定货量,返回所有商品" n# |& s: T M& w
Select ProductName ,OrderID. J# M% e" p9 y
FROM Products
8 p; F/ G( p jLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
# c6 t0 ^' A: g, H) i/ _8 d' R右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
+ z* k0 t) s1 t/ ]) @" x- @例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。' }( z. A/ U3 g4 {: L+ b; C
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。1 s( A9 D/ R5 J3 Y4 W
Select *
% X' V4 X6 \0 I \FROM talbe1
$ t3 o% h; e/ BLEFT JOIN table2 ON table1.a=table2.c
4 h/ H4 h9 r0 F& w1 连接查询中使用Iif函数实现以0值显示空值6 `% J5 v: |% [; K* A- P* \, C
Iif表达式: Iif(IsNull(Amount,0,Amout)
- I6 Y6 `" g3 h! H8 I/ T* C# @* k例:无论定货大于或小于¥50,都要返回一个标志。
! F5 x' U( Y+ _* {/ M6 f" L6 @Iif([Amount]>50,?Big order?,?Small order?)( O& `4 A! w/ L4 K
五. 分组和总结查询结果
; R# e" n" F4 o在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
: m4 M! O, a! H+ \7 f+ @0 ~$ DGROUP BY 子句的语法9 t. Z5 L; W% e4 k3 B( {
Select fidldlist
2 t1 Q$ R/ m0 Z* n! Z" ZFROM table
" J9 G+ g: ~. k. f* M+ U- bWhere criteria. g5 x, ]; n; Z4 s( X' e
[GROUP BY groupfieldlist [HAVING groupcriteria]]
+ t) Y5 j9 X/ [/ T注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。/ a- G+ A( `6 ~" Y1 ?* ]1 j1 p
GROUP BY字段中的Null值以备分组但是不能被省略。3 i/ e# E9 d3 I; m; Y: k
在任何SQL合计函数中不计算Null值。
# G' Q; C/ Y( Y, N5 d4 TGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
/ y3 V+ n7 N! G" H8 Y" r# A例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
' q r: t4 [8 L1 S2 t7 ]" `4 DSelect Title ,Count(Title) as Total' r" u9 r L3 P2 t( k& v4 |2 j9 T
FROM Employees$ A: r, D6 s2 P. E9 e3 X
Where Region = ‘WA’
- Q- C X0 o- T( _' r! { b+ w2 zGROUP BY Title
: |, X3 O1 @0 s6 w! x+ kHAVING Count(Title)>1$ d M3 o' w0 E& q
JET SQL 中的聚积函数
- b5 U3 W1 a+ I+ z; j聚集函数 意义2 m' t- z+ y/ K7 x0 b
SUM ( ) 求和
2 m; O# v! {6 F5 \# {% D. RAVG ( ) 平均值
, `( a- X U$ D! H- r! JCOUNT ( ) 表达式中记录的数目, `. f' T1 d4 L1 B3 U
COUNT (* ) 计算记录的数目 D: `* y* P* e# r# [3 f# w
MAX 最大值: p1 c& u. h/ `7 W5 ]+ z
MIN 最小值9 u' z! U8 V- I8 D. l
VAR 方差5 x }( b9 ~4 e7 t( Q9 N+ o
STDEV 标准误差: j7 `% _" G3 @& Q
FIRST 第一个值
2 i% _! D* Y3 ?$ }7 HLAST 最后一个值
) _5 n# Q" r) z* z# N3 }六. 用Parameters声明创建参数查询: H4 r) S( U% x C% Y
Parameters声明的语法:
+ X$ c. A4 D: C8 ?) K& T8 gPARAMETERS name datatype[,name datatype[, …]]
3 ~: l; P! k; }$ D% K, L2 E- p0 _其中name 是参数的标志符,可以通过标志符引用参数.
& ?( R" U" f/ [( k' UDatatype说明参数的数据类型.
* w: t, u% |1 c! f1 X使用时要把PARAMETERS 声明置于任何其他语句之前.
/ r$ L1 F* L! j' d例:
{& C( v: L. ?0 W. V+ b1 ]5 yPARAMETERS[Low price] Currency,[Beginning date]datatime
- t) z4 h+ {4 m7 L; `Select orderID ,OrderAmount
; K; P) P4 S/ O0 r4 }- J6 hFROM orders
( e3 G' o+ c4 S- S8 f$ Q( ZWhere orderAMount>[low price]
8 s% }+ T8 m5 E& c- iAND orderDate>=[Beginning date]
}# T [& ~" h8 W: B; ]* F' |七. 功能查询
3 V! n. U; J6 g$ B所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
$ P' z7 k9 ]) D0 ]* g9 K1 更新查询; Q2 T! j9 E6 D. D3 @
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
8 D1 [; D9 _$ |5 Y/ v更新查询语法:
3 G! }2 B' T) r! I1 k8 lUpdate 表名4 ` ?! c$ ]- L+ k1 o- Q
SET 新值
- C# V; {4 q# `Where 准则$ ~ U7 N3 B" |0 W; T7 b: X4 T a2 X% w
例:英国客户的定货量增加5%,货运量增加3%
+ I4 Z) v6 W: n4 R6 s) O1 AUpdate OEDERS0 p; d, n8 y0 a2 W
SET orderAmount = orderAmount *1.1% W* M% E2 R8 V7 F2 e* T
Freight = Freight*1.03
' O% ?* X" [% T' RWhere ShipCountry = ‘UK’$ ?' D" O% V' t
2 删除查询! m! s+ ]" j `# c
Delete子句可以使用户删除大量的过时的或冗于的数据.9 w" b1 J3 ?" K6 x
注:删除查询的对象是整个记录.1 ^! u5 f& B! E& ^ M$ ^ h' a& [
Delete子句的语法:
( Z W* p6 x! ?. S1 W- v" A! UDelete [表名.*]9 R% V. _" Q# O6 j5 \
FROM 来源表
]/ d3 c( H$ lWhere 准则
: B0 Z5 V" l( u5 r" G: Q# O例: 要删除所有94年前的定单; ?& N0 i. {# `- F l- m
Delete *! x3 K C6 `9 [8 q
FROM orders
( \9 J9 h) N; B' T4 _- ~3 ~Where orderData<#94-1-1#. W4 k7 \/ b' g& {
3 追加查询, h6 V2 _( V; W! Z
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.$ G6 S/ s2 h, [3 t3 G: v
INTO 子句指定接受新记录的表0 M$ n) E: l% M$ Z
valueS 关键字指定新记录所包含的数据值., `% O8 g# z% \1 V% h2 h
Insert 子句的语法:2 D5 T2 o% Q2 \& ?" n
INSETR INTO 目的表或查询(字段1,字段2,…)
: b5 p. {# U% m- XvalueS(数值1,数值2,…)
8 }% g+ g7 P0 o- ~+ Q5 t例:增加一个客户
9 o, D* z( o! c! y7 w) NInsert INTO Employees(FirstName,LastName,title)
* d1 N! T& M+ M9 A7 h4 l+ |valueS(‘Harry’,’Washington’,’Trainee’)0 O. f2 f7 J9 e) C6 b, X
4 生成表查询
! U1 C! N7 U" u/ |& E0 u0 n可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.0 [5 W: m- L$ D7 b8 S* F" s
Select INTO子句用来创建生成表查询语法:
6 {( J# }; A/ W1 @! S7 WSelect 字段1,字段2,…& z* ^8 w' w! Z9 Y, o; O; h
INTO 新表[IN 外部数据库]
# I, ]6 s: t& B5 f: Z6 e9 `& VFROM 来源数据库( C! D; p% y( m0 F$ o2 g0 ^
Where 准则
+ I5 u7 F* U/ p* L. \+ g) h2 y& L例:为定单制作一个存档备份7 K; }$ C& u- t5 i- T
Select *
, n" y& p" D" tINTO ordersArchive
, `4 x3 j2 |- q; uFROM orders
, v( }7 @' d/ g1 J八. 联合查询& S( M3 H) f6 `# }+ y m; B4 f
UNION运算可以把多个查询的结果合并到一个结果集里显示.2 ?4 | c# K* E, r5 E: I
UNION运算的一般语法:* E5 n9 z& S; }
[表]查询1 UNION [ALL]查询2 UNION …, R* s: w( p* m7 z) V6 A
例:返回巴西所有供给商和客户的名字和城市
i" M0 c2 X5 }Select CompanyName,City! N* y: O- `1 o* _9 @ n
FROM Suppliers) M3 @5 ~/ x0 `! N" }
Where Country = ‘Brazil’$ c+ z0 Q. m$ s8 d# m
UNION$ Y0 ]6 o0 J# u* Y) y1 n0 [
Select CompanyName,City
( }6 ~; m3 Y2 H2 HFROM Customers
6 w5 o: I: u* m' H8 I9 y' L# jWhere Country = ‘Brazil’
$ x( n; o: I2 D' r7 ?3 S' L5 g注:
' O5 R' @1 \/ \# I缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
" R6 ^& M3 `% b8 N% Z4 vUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
& h" l+ q5 k% d6 v* t+ l) X每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.- x2 N# |3 H" E" k( E+ K
九. 交叉查询
7 P' ]/ K5 `$ B- H交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
) x: i. N: p; K+ O; J6 QMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
) Y+ R6 H8 r, Q' R& |$ d2 `TRANSFORM aggfunction9 {) Y u) n" i( n3 y1 D+ Y
Select 语句
* N( g, Q- r" ]; r$ @% D% [GROUP BY 子句) ~* q% l0 {+ V' h' ?
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]- u: z- l- d+ S) K* @* S8 d
Aggfounction指SQL聚积函数,# u6 }+ ]; J) {' J
Select语句选择作为标题的的字段,
N& X9 E7 s. e bGROUP BY 分组
1 s% b2 K" Y( l d3 [. m1 }9 p( N说明:9 N+ d* Y2 H+ N3 U4 r
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
' B/ [/ _5 E: T. @( V9 H# B: [/ yvalue代表创建列标题的固定值.& d) g6 ^) t2 t" m
例:显示在1996年里每一季度每一位员工所接的定单的数目:! M: |/ x6 F0 Z* X! C4 K! D7 S
TRANSFORM Count(OrderID)' K( N9 H# G9 F
Select FirstName&’’&LastName AS FullName8 n6 V0 i2 @, ]/ D" f G' i
FROM Employees INNER JOIN orders
2 i' M1 l8 o. T ]- vON Employees.EmployeeID = orders.EmployeeID0 E! d' c# e% C' L' W8 |, y
Where DatePart(“yyyy”,OrderDate)= ‘1996’, }1 s" K6 D: ?; V' R
GROUP BY FirstName&’’&LastName
9 D& }# ]( l3 E6 m! qorDER BY FirstName&’’&LastName
0 O% e/ G" Z9 K2 W. W6 p, NPOVOT DatePart(“q”,OrderDate)&’季度’, b1 Z7 _: i Q, h7 ~0 v# a
十 .子查询5 [: W' }2 m; O/ C/ {4 G
子查询可以理解为 套查询.子查询是一个Select语句.. w9 P t1 J3 \3 {& L5 w! J
1 表达式的值与子查询返回的单一值做比较
8 ]- ]- n$ J$ U4 O, M3 b, y0 H语法:
4 N! O% P) }4 ~* }% u5 \! F表达式 comparision [ANY|ALL|SOME](子查询); ]$ B+ x# w6 k- V
说明:# }2 o, k, K. D
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.5 V5 ~7 {) {% ]0 s$ O
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品; y( y! @( p9 S3 ]4 Q$ x0 f7 A
Select * FROM Products) t; a' Q4 U6 e' H
Where UnitPrice>ANY
d: a: L& o$ Y. H(Select UnitPrice FROM[Order Details] Where Discount>0.25)9 l: h2 n/ z4 Z9 N
2 检查表达式的值是否匹配子查询返回的一组值的某个值- A6 g. r; E* A" s, ]" a% V' F% F
语法:
! x+ y/ C5 s0 A' u. H[NOT]IN(子查询)
9 `. }3 o2 X& I3 R. I0 I例:返回库存价值大于等于1000的产品.
) \8 D8 z& z3 }/ N7 Y$ qSelect ProductName FROM Products
7 W8 O* Z9 I5 ?$ W, X+ u' [Where ProductID IN
, I. b3 x, Z, _8 S! o' n(Select PrdoctID FROM [Order DEtails]
/ ~- x" F- m1 \Where UnitPrice*Quantity>= 1000). t! E1 Z( w3 q$ p+ @
3检测子查询是否返回任何记录
+ m, p. }0 i$ b1 v8 ~5 E Y! H/ ~语法:: E1 d. |* ^& m# e" k
[NOT]EXISTS (子查询)
! J* {4 c- [3 b |例:用EXISTS检索英国的客户( \1 }0 P3 q# S: h1 v; L0 o3 ~. T$ W
Select ComPanyName,ContactName. N% Q, S# q! n; B, r3 T2 w, s
FROM orders
/ y3 J5 \2 c, m' C% \9 ]7 QWhere EXISTS' ^7 @; e2 \; ?5 x
(Select *
, a, n$ B6 N* s" G( iFROM Customers( { \. b7 ]4 p4 m6 r2 f
Where Country = ‘UK’ AND$ I0 Y, S# W+ w0 p. ~
Customers.CustomerID= orders.CustomerID) |
|