- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法* g$ }% ^2 W& \
h0 X8 M. \- S4 D6 m+ O2 oselect distinct 字段 from 表名
, B* F5 J% ^+ d0 B/ n8 L$ |distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。* W l ^- \8 Z# g, u: V+ c
一.Select语句的完整语法为:9 B8 Z! m( z! m6 |3 l3 Z
Select[ALL|DISTINCT|DISTINCTROW|TOP]
1 C8 r! p/ l, ~. T0 |{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} F1 A' q% P+ v7 b' m, i V+ D
FROM tablee xpression[,…][IN externaldatabase]
" m& x; \0 W3 |! i[Where…]
7 {8 `0 i( V9 V7 K[GROUP BY…]$ X3 D, B' }4 V; r% W7 x% f% R$ w
[HAVING…], m, s2 `" o: c: N8 ?' {
[ORDER BY…]
% a% ~4 B! D! G$ C) Z[WITH OWNERACCESS OPTION]9 F) S* d7 @+ Q. T+ @' j9 v
说明:) t. p$ _. c- h7 \
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
% {% C; u- |8 E- ~9 r8 k8 y1 FROM子句
p3 M }. ]4 J% y8 EFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
0 h" o6 Q4 z! [$ X例:下列SQL语句返回所有有定单的客户:
- g H9 }; O' f1 ? XSelect orderID,Customer.customerID6 p2 C* O, k: }, ]
FROM orders Customers
, g/ [3 G$ _/ Z8 zWhere orders.CustomerID=Customers.CustomeersID
! ^: [2 \1 z+ T7 {3 l, A7 Q2 ALL、DISTINCT、DISTINCTROW、TOP谓词
~% X+ F; n7 A( f3 `* s(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
% }8 `& O8 z2 N5 g例:Select ALL FirstName,LastName
* i0 P6 @$ P; TFROM Employees
" i2 t" {3 y3 S2 d2 e/ M [/ A(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。. B$ f7 E6 l& y S Q4 f- t
(3) DISTINCTROW 如果有重复的记录,只返回一个% r: u1 w: e& R* X8 u2 `) u+ a; W5 ]9 c
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
0 b3 s3 u+ u4 R" m4 }0 w例:返回5%定货额最大的定单6 J" x7 g8 R; d& E* J
Select TOP 5 PERCENT*
$ s. }$ Y. l; |: Y6 mFROM [ order Details]; c+ a2 c8 w. g5 q& X
orDER BY UnitPrice*Quantity*(1-Discount) DESC, F) {* S! {& }# M
3 用 AS 子句为字段取别名
# @* W3 F6 c6 V+ c/ p) Y; s如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
H4 ~, u8 K! t6 R ]5 M例:返回FirstName字段取别名为NickName
& a* q9 l* w8 N, S& o8 JSelect FirstName AS NickName ,LastName ,City
2 T Z% O r, BFROM Employees
0 u2 }( m! ~& h! i% D# n例:返回新的一列显示库存价值$ z+ [( ^" N; J+ R
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
% E9 Q9 K2 {- x" E0 AFROM Products
! {7 T7 A0 B; X& n8 u二 .Where 子句指定查询条件
: o8 s, W3 l) l+ a4 h- c1 比较运算符4 B0 k4 s$ ]. N9 E
比较运算符 含义
( T3 e6 |! ^6 b4 ?! C' K$ L6 ~9 H- o= 等于
6 t" T8 X, u* |# k; q: S> 大于
5 L! j$ L- b( x: X t* U& u< 小于5 y# P: A- t- I! h
>= 大于等于6 V2 q8 l7 ~6 P% l- p1 N9 P! i
<= 小于等于% y5 E4 \( ]: W- R
<> 不等于
2 Q( m& V6 H. v0 ^* W% c: D3 j: Y!> 不大于: }4 c, {4 P/ q/ i8 [% d6 t
!< 不小于
% P8 O$ |' G" c: l M例:返回96年1月的定单
1 c. N8 ]* S! VSelect orderID, CustomerID, orderDate7 k5 x% d4 L0 Q2 E( N
FROM orders
- T6 M7 V; W: e% ~8 L9 qWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
& g" b' W/ {# A; K注意:- }" ^$ a5 G( N# N2 P
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。# q1 D5 P2 W `4 v
例:5 d; P9 c) S' f6 [) [
Where orderDate>#96-1-1#- A0 I& D7 C$ F! e! D; f
也可以表示为:
. J1 o4 K1 Z* p# |Where orderDate>Datevalue(‘1/1/96’)
1 W9 L* I4 r) @4 w$ p使用 NOT 表达式求反。
& O8 e7 R- x2 I9 r例:查看96年1月1日以后的定单9 v- G2 U1 n4 @" b/ @
Where Not orderDate<=#1/1/96#6 w- E4 _1 u! P N! F3 E! _
2 范围(BETWEEN 和 NOT BETWEEN)' ^0 s' w% w& c* |1 ]
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
0 |) q! M" ^6 V4 c0 V. ]# P例:返回96年1月到96年2月的定单。
3 \+ K7 d* v' |- \Where orderDate Between #1/1/96# And #2/1/96#
) R2 O1 q: {+ m- a; I. F3 列表(IN ,NOT IN)
3 O1 d4 @6 \# B. n4 hIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
6 j+ ~. P6 @2 \, w; N' V- u8 h例:要找出住在 London、Paris或Berlin的所有客户- s4 @( F1 {' y% T7 j1 j
Select CustomerID, CompanyName, ContactName, City
\$ j1 a5 t3 B6 y9 c! y T f( \& LFROM Customers" ~: u( {5 X0 _) E( ^5 E" A
Where City In(‘London’,’ Paris’,’ Berlin’)
6 b( N, O9 x0 j; ^4 模式匹配(LIKE)
) O+ y5 V5 U1 b! J4 h3 zLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。1 K2 j( P" I& R) r
LIKE运算符里使用的通配符
4 O- G. s4 F2 \* f6 J7 B% L U通配符 含义
& q0 r/ m2 |, u: C; [3 @7 S8 i? 任何一个单一的字符
6 M7 Q" A" x5 ?9 i; _* 任意长度的字符
7 [2 b7 Q6 G8 k- b- R# 0~9之间的单一数字9 o* O3 o) w1 C1 G; }" E" k
[字符列表] 在字符列表里的任一值- h L; r, s ?7 m9 V, |
[!字符列表] 不在字符列表里的任一值" c& e9 H8 W5 l: z& E3 A( }
- 指定字符范围,两边的值分别为其上下限
0 w6 a0 W. j# r L1 D' Z. |9 ^' Z3 R! @例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
7 {+ ~0 y' r' s0 y' n8 }Select CustomerID ,CompanyName,City,Phone
: i5 n. Y( u4 i$ FFROM Customers/ y" y, h$ e" i6 C( ?
Where Phone Like ‘(171)555-####’
A1 r4 O* v! ]4 C; D5 e7 YLIKE运算符的一些样式及含义* @) R& }. j, |1 \- d
样式 含义 不符合
& M7 r8 T7 y9 N' b3 a' @LIKE ‘A*’ A后跟任意长度的字符 Bc,c255+ @5 o8 H+ e0 ]& Q; p" ~
# LIKE’5’ 5*5 555. h4 }, Z; o5 C" H
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5& u, h: W% _ K7 S& B
LIKE’5##5’ 5235,5005 5kd5,5346
6 l* ^/ N9 c2 {# ^1 I' BLIKE’( \$ Y# M( C9 R5 Z- p3 J6 _
[a-z]’ a-z间的任意一个字符 5,%! r, r% W8 C3 v4 {) N
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
4 W3 U* L9 S! L, P! {LIKE’[[]’ 1,*
! `, a, O* s5 {" X2 s. W三 .用ORDER BY子句排序结果( c8 J# z+ N5 _' [
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。7 y7 I3 F# s! @! w6 l
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
8 R$ N' P. K# x3 m例:
8 j V. S) a. ^& ]Select ProductName,UnitPrice, UnitInStock5 P0 |! ^( X, w* ]% R
FROM Products
" a; c& d7 Z7 Q3 v' rorDER BY UnitInStock DESC , UnitPrice DESC, ProductName% X% E0 t7 p: N" `7 D9 [- f
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。5 \4 e! p6 H( ]& H
例:下面的语句产生与上列相同的效果。3 P. G' a1 J0 [' Q3 y$ }% ]; U! Y
Select ProductName,UnitPrice, UnitInStock9 W* z1 P' f) Y) {
FROM Products
+ Y, Q% C9 S% o+ y6 S$ o8 eorDER BY 1 DESC , 2 DESC,34 m+ U f) |. ^& ]# @6 X
四 .运用连接关系实现多表查询
( q- N1 e- h/ Y# J7 u1 B6 H9 W; j例:找出同一个城市中供应商和客户的名字3 ~ r# N% J+ D1 z& f
Select Customers.CompanyName, Suppliers.ComPany.Name4 E9 B+ o6 Q# k4 ]
FROM Customers, Suppliers& O" p+ o/ f9 X* m" A$ }
Where Customers.City=Suppliers.City
3 @. T3 `; f c2 x0 m: D' D例:找出产品库存量大于同一种产品的定单的数量的产品和定单
1 I: g2 v7 e( Y; T2 q! bSelect ProductName,OrderID, UnitInStock, Quantity
) f. n+ j# I* X# W5 WFROM Products, [Order Deails]
: ^& e) {8 [2 p' wWhere Product.productID=[Order Details].ProductID( ?1 |- {" O$ J: I# j
AND UnitsInStock>Quantity! E# a2 Y0 I5 T' ?+ g
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN2 R- `7 ^5 K7 y
语法:2 f2 i' a7 W9 `) y! H$ V: n
FROM table1 INNER JOIN table2" c2 i3 a& P/ J$ h' M+ h9 O9 e
ON table1.field1 comparision table2.field2
9 j- o% _7 t C4 P( Y其中comparision 就是前面Where子句用到的比较运算符。5 z; y% x, r& I
Select FirstName,lastName,OrderID,CustomerID,OrderDate
4 S, a& R- F& GFROM Employees
V+ T$ s/ ?) D; x& f" jINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID3 g/ i# S$ W/ G3 U @
注意:: `& z+ L# e' f6 } q
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。$ i' ?- d! D# k
在一个JOIN语句中连接多个ON子句! O# m7 X5 U# ?' a
语法:
" `" M! J* y, F2 d" jSelect fields5 i# L+ W6 I1 I& \, D
FROM table1 INNER JOIN table27 l3 [/ N' t; m% f
ON table1.field1 compopr table2.field1 AND
9 E) q+ h$ c! hON table1.field2 compopr table2.field2 or! c; M- A! _1 V% g# T. t) y
ON table1.field3 compopr table2.field3
, H1 j# C) d& o1 V, `也可以
, K2 A2 v; Y0 h% b- p- v( f. S: R) JSelect fields
2 L& o6 q( u& W1 h2 ZFROM table1 INNER JOIN2 c$ g" O* Q' D2 u
(table2 INNER JOIN [( ]table3: \! |7 {& i$ Q
[INNER JOER] [( ]tablex[INNER JOIN]
$ Z) \, `8 p2 g3 a4 i# hON table1.field1 compopr table2.field16 T4 b+ P$ I( ^
ON table1.field2 compopr table2.field2% t ?$ Z. @. g4 |
ON table1.field3 compopr table2.field3/ U+ z2 ]0 a r R2 `8 F
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。* B" }/ {6 _+ o& u8 Z
FROM table [LEFT|RIGHT]JOIN table2+ _5 K& ~* s( ^$ G' R+ @
ON table1.field1comparision table.field20 R: \2 _. U* L8 z+ W6 }% G
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据# m' W4 Z y5 S' f4 ?
例:不管有没有定货量,返回所有商品6 ?. m7 j3 S/ n9 u/ m
Select ProductName ,OrderID
S: u$ y# n6 T$ N9 s& ^' r6 u0 DFROM Products
& ?5 `- x1 x( b- D m" [LEFT JOIN orders ON Products.PrductsID=Orders.ProductID7 u/ z8 L( T2 U/ c
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。7 u; T) F8 B* \0 {3 {3 ^- l
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。' c+ Z/ U$ o& J0 ^' D
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。) U5 S4 D! @; [& u% S
Select */ C- O9 \$ } ^
FROM talbe11 Y* b) u. P# h$ X
LEFT JOIN table2 ON table1.a=table2.c. D" z5 T6 H( @' s( A
1 连接查询中使用Iif函数实现以0值显示空值3 S0 s6 p0 E2 }
Iif表达式: Iif(IsNull(Amount,0,Amout): J3 ^, S* k m) f; I
例:无论定货大于或小于¥50,都要返回一个标志。
" B9 C( F7 J4 ~ GIif([Amount]>50,?Big order?,?Small order?)
0 d0 a( M$ w' O9 r五. 分组和总结查询结果
( \5 d; o8 ~; k% [" P在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。( f, ]. Y4 V8 h+ B! d
GROUP BY 子句的语法
# v& W! N2 R9 f LSelect fidldlist% i/ |: y% o9 b2 V* x: _
FROM table4 g4 Q2 S8 H) i3 |8 q* ~
Where criteria
5 e2 `3 v: Z2 V( G[GROUP BY groupfieldlist [HAVING groupcriteria]]; N% C w! L% m2 G- h7 x
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。; p" F( C& r3 C0 \) I+ v0 m* x9 r
GROUP BY字段中的Null值以备分组但是不能被省略。
% g( B+ d8 t7 M j在任何SQL合计函数中不计算Null值。/ V: L4 w1 V$ J& ], |" D0 S4 E
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。; `; C7 Z* v t" G* D! b
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。3 i: r2 |$ n2 u
Select Title ,Count(Title) as Total6 {: x5 i0 W% b/ d' R6 B& J8 z
FROM Employees
3 Q7 N, E4 T a# H& i1 ZWhere Region = ‘WA’
5 @$ a1 Z3 Q6 s1 JGROUP BY Title( H( b9 i% z1 C f
HAVING Count(Title)>19 v' j: c5 W$ F+ X" Q: e4 [# X
JET SQL 中的聚积函数, q/ p1 H; j$ f# o1 _0 a+ i/ U
聚集函数 意义
( ]0 L5 U0 ]) L, i4 D1 a; ~SUM ( ) 求和8 R# ^/ i4 Z& N
AVG ( ) 平均值
8 V% | Q; b0 ^& qCOUNT ( ) 表达式中记录的数目6 p$ W; k# e5 b: ~+ \$ w
COUNT (* ) 计算记录的数目1 X+ k& d X2 w" m3 z: E
MAX 最大值
# c1 U. E; P# L8 YMIN 最小值
( D; t5 L9 P* G* ]% B) EVAR 方差% m$ ^% ^( U/ r: A; y. a2 a
STDEV 标准误差
( k+ e$ p/ U$ N- {! QFIRST 第一个值7 w$ O6 O% | O
LAST 最后一个值; N$ }9 P: w2 {; _! Q- t3 |1 B
六. 用Parameters声明创建参数查询
3 ?) W0 P B1 P1 Z; d0 @1 `Parameters声明的语法:
* D* I* |' w% gPARAMETERS name datatype[,name datatype[, …]]' D( q9 ~3 W' U0 u* }0 j$ c" A
其中name 是参数的标志符,可以通过标志符引用参数.! a3 B7 X, S+ }+ _6 _
Datatype说明参数的数据类型.
* _6 C$ p0 O+ [使用时要把PARAMETERS 声明置于任何其他语句之前.9 ^9 E p- h4 G5 d; \5 ~! |
例:
4 d9 j3 j2 ?) J& \2 Q% aPARAMETERS[Low price] Currency,[Beginning date]datatime
+ m+ P) a7 x9 FSelect orderID ,OrderAmount
|$ s$ u% k7 C/ gFROM orders$ d/ j9 @4 Z7 U4 y) O Q* ^! h
Where orderAMount>[low price]
3 X- B/ ], R& |+ iAND orderDate>=[Beginning date]8 ~. F! Y0 r, K3 \9 A
七. 功能查询4 }* h0 J9 I2 j7 T y& C5 [) o
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
; _' I+ ?5 o5 ]7 E- I* }" ^+ E+ c z1 更新查询! W' F, s4 N0 E8 f, R% j6 L
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
" Z# Z3 y; A m% V7 i; k' [更新查询语法:) H0 N7 u. H1 e6 m, L3 ]
Update 表名
2 _$ u; z4 Z8 y/ n7 RSET 新值
0 k9 |$ r7 }0 O, z4 ?2 _. u/ w8 T+ sWhere 准则/ g. d& b2 C! y* J, w, x$ T9 i8 e
例:英国客户的定货量增加5%,货运量增加3%
! n* z3 L9 b1 e" O) OUpdate OEDERS
$ \9 R8 N; k# f! r) B0 }6 uSET orderAmount = orderAmount *1.1! ?* \- b0 C( i
Freight = Freight*1.03
( a: X; }* X6 a/ mWhere ShipCountry = ‘UK’
$ y3 ?8 H ~) a2 l( p2 删除查询
% X2 i- c- c# P- HDelete子句可以使用户删除大量的过时的或冗于的数据.0 i3 ] g% j" S
注:删除查询的对象是整个记录.
[3 e. c. l4 `$ I. I J9 X( v' kDelete子句的语法:) b3 |+ r' W* I$ }) E/ M5 L
Delete [表名.*]3 j$ o: d, R3 G- T! @0 ?
FROM 来源表
' b @0 z4 D5 FWhere 准则
8 B& r# t- r2 N, z# \3 b) F例: 要删除所有94年前的定单# Z& G1 e* c: o1 K+ }
Delete *$ \% u5 n( x) m8 @
FROM orders) A# P1 }& F, r1 C7 J
Where orderData<#94-1-1#
, N5 g4 `# F% y2 c8 m3 v3 追加查询
7 |2 @1 g8 q0 s9 B' \Insert子句可以将一个或一组记录追加到一个或多个表的尾部.( v! ?+ j8 [ r) w$ s; R4 l
INTO 子句指定接受新记录的表
) q W7 O9 ]# ?, }: z3 XvalueS 关键字指定新记录所包含的数据值.
3 z. d( P8 ]; ?9 eInsert 子句的语法:% ?2 ~/ `( r+ h
INSETR INTO 目的表或查询(字段1,字段2,…) h( e Q7 | K2 a
valueS(数值1,数值2,…)
* z) L& R8 \2 k例:增加一个客户
" R% K' E7 V+ i* q) uInsert INTO Employees(FirstName,LastName,title)
0 H3 f2 K0 k# v8 }valueS(‘Harry’,’Washington’,’Trainee’)8 H: w/ ?1 w. y( G& X# _6 F
4 生成表查询# s- u1 o6 Z+ J; Y5 ~6 K
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
# s8 s( s4 E l4 e3 @' _3 V& F8 W* f2 USelect INTO子句用来创建生成表查询语法:
7 g- o/ V( a6 I9 r/ mSelect 字段1,字段2,…
+ |$ a2 _; l7 t+ I& Q& Z5 ?0 cINTO 新表[IN 外部数据库]* J" h9 h# z, k4 o4 u% _# p
FROM 来源数据库0 j# {* }0 c5 l/ y! m
Where 准则 A. Y5 `. ]& h7 E( s( Q
例:为定单制作一个存档备份) u+ s; w) X+ L T- K/ f V
Select *3 p/ p$ F: O- \
INTO ordersArchive
+ ?7 P x2 Y" r8 m$ d: h- L! bFROM orders' j2 E& ?* R) \* M
八. 联合查询2 y2 c+ ^1 \ A4 Q `0 U
UNION运算可以把多个查询的结果合并到一个结果集里显示.; R5 L2 p4 P* z+ C8 f% z Z
UNION运算的一般语法:
^/ X( T r2 m) `3 Q( o# \[表]查询1 UNION [ALL]查询2 UNION …
+ J/ H! f6 A; e+ d% s; m例:返回巴西所有供给商和客户的名字和城市
7 R8 T4 {4 @8 W- g! WSelect CompanyName,City- x! n/ Y5 _. M* f
FROM Suppliers& z/ W$ g+ p) M7 t
Where Country = ‘Brazil’
' I5 ]$ c3 B: WUNION0 E, _) t6 @6 Z6 [' [. X
Select CompanyName,City
0 d* }3 a+ j; Y4 l3 KFROM Customers
: H+ `& b5 U& L4 NWhere Country = ‘Brazil’; x( x7 x/ V1 D, z$ \ r1 [" h0 ?( U
注:
* [* ]& V" M* E缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项$ [( J) c/ X9 @4 @$ F3 y2 g. I
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
1 m3 V8 f r/ g/ N) @+ U- P! A每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.9 i1 r; G- T& _$ q0 j4 z9 L
九. 交叉查询
6 H( ?! o, y' b交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.: P- v! G' t& B5 V3 E
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
0 w- O& t2 K8 P q ~TRANSFORM aggfunction" j# \6 c! T# e3 k s
Select 语句6 t; x0 Z) ]4 R% N& Y. t! q
GROUP BY 子句6 T5 Z& ?# \- a' u
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]/ E) K9 K' A; e U
Aggfounction指SQL聚积函数,; i+ d' t9 }! x! r+ w: d3 ^
Select语句选择作为标题的的字段,
7 v, V! F( R0 V6 b9 `; b$ AGROUP BY 分组
9 H d/ @ w! A! c) d说明:! \4 L& x4 e' L/ Q
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.1 v6 t/ ~" ~: v! |0 M5 d: o- k% r
value代表创建列标题的固定值.
% @* i* l% L, h. U0 b7 I! K例:显示在1996年里每一季度每一位员工所接的定单的数目:
7 Q" ^) v/ [0 L& `TRANSFORM Count(OrderID)
+ b; c7 p! `5 OSelect FirstName&’’&LastName AS FullName
8 z! p, ~& i0 qFROM Employees INNER JOIN orders
, O' ^" x2 A7 k, r, k4 M& ION Employees.EmployeeID = orders.EmployeeID) _2 y X+ {3 Y" H
Where DatePart(“yyyy”,OrderDate)= ‘1996’7 E5 N! U# p4 }2 X7 j, V. H
GROUP BY FirstName&’’&LastName
0 D; y; p* ]* f' {7 {5 _, dorDER BY FirstName&’’&LastName7 G* M$ G( S" \$ t. }! \& w6 @ M
POVOT DatePart(“q”,OrderDate)&’季度’
S$ Y$ J/ E1 N) |. B十 .子查询, v, B6 D/ ~# m! r, {4 I: W
子查询可以理解为 套查询.子查询是一个Select语句.
( N) p5 Q1 Z6 U- T; p1 表达式的值与子查询返回的单一值做比较% T# m1 n+ {" ]* |3 U! N' h/ [
语法:% ?5 ~1 }0 ]0 A9 R5 f
表达式 comparision [ANY|ALL|SOME](子查询)" P: e m# K: ?# F# M
说明:
' ^" l: a) h6 i# g+ v+ SANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
# d8 [) n2 c0 i% d! m例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
, B& Q! g$ b) uSelect * FROM Products8 A5 _9 x2 L0 T# I. T. R- ~
Where UnitPrice>ANY" y( J) _- G/ Z
(Select UnitPrice FROM[Order Details] Where Discount>0.25)/ R/ J0 f) l& v3 {& [3 ]8 }2 _
2 检查表达式的值是否匹配子查询返回的一组值的某个值
2 ^- `* Y, N$ M! z1 p1 v, S语法:
+ G$ d& n- R: K8 p* N[NOT]IN(子查询)8 I9 B: ]; O5 c! g3 Y
例:返回库存价值大于等于1000的产品.
/ \2 _& P* F+ ~; v0 USelect ProductName FROM Products5 V# F* M5 }! |2 e- j. a! |7 [
Where ProductID IN
( \: l. ^8 g: W L' n" g" t(Select PrdoctID FROM [Order DEtails]
, w0 Q4 u* W# c* ]! eWhere UnitPrice*Quantity>= 1000)0 t D( N7 Y, X5 M* B+ ]$ R ^
3检测子查询是否返回任何记录
% e G+ Y0 V7 {4 S1 f语法:
$ k' P5 f1 J: a6 Z/ g[NOT]EXISTS (子查询)" ]( K) D9 J# k8 m
例:用EXISTS检索英国的客户
3 Q A$ Y& ~ r8 V! |( _Select ComPanyName,ContactName
& ?1 ]2 }# S* [2 C( D& `FROM orders
$ V8 }- t& L m, LWhere EXISTS
* O7 n/ l! ~8 S(Select *
! h2 v! D9 ^- {0 zFROM Customers
9 S( z+ x# ^5 Y" aWhere Country = ‘UK’ AND
" Y8 _+ T. m7 Z. K% k; |Customers.CustomerID= orders.CustomerID) |
|