- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法6 P" o9 p j6 B8 U/ v
+ ~9 n8 N2 b% \0 t3 W$ Bselect distinct 字段 from 表名
* E8 X0 L( z- H7 Z( `distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。5 o) }! O7 {8 \
一.Select语句的完整语法为:
0 ~0 o$ k$ W6 W5 J9 MSelect[ALL|DISTINCT|DISTINCTROW|TOP]
! U) `" m4 r- S1 D{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
' B$ p6 Q9 F+ e% G2 S$ nFROM tablee xpression[,…][IN externaldatabase]% A4 {1 |- }1 {% o) v& P
[Where…]
3 e! ^6 p8 w: s6 r[GROUP BY…] O2 r- I, L) }/ k6 s# y, ?
[HAVING…]
8 w5 p4 z! y2 p/ h' b: S[ORDER BY…]9 y- }, }4 O h, O7 q! a
[WITH OWNERACCESS OPTION]0 c1 I% t! V" g9 \- f
说明:7 q" T5 ^8 z2 {. L
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。* _$ R% N! L8 j! y3 A3 A
1 FROM子句: j& l, g: L1 U& q) a0 b
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
7 G+ Z3 c) E" L1 t8 a. Z例:下列SQL语句返回所有有定单的客户:
1 d: v9 Y r3 @: x+ r" e2 g7 hSelect orderID,Customer.customerID. M- A" w3 ]: _) B& Y$ C
FROM orders Customers. d# W! r5 P5 c: ^
Where orders.CustomerID=Customers.CustomeersID
9 L) n2 A- k1 R1 v2 ALL、DISTINCT、DISTINCTROW、TOP谓词
, `; e6 L% o+ o(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
, U% e3 i( Z; }' { X, ^" ^例:Select ALL FirstName,LastName
% w* v/ N8 o$ j# Q) L- k! e& q# TFROM Employees
6 K% Q8 e4 h( S* S(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
& T! t- A, M8 J, z2 r9 x(3) DISTINCTROW 如果有重复的记录,只返回一个. e: g, N' z; X5 x0 L5 T F
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)! W9 j( y* V8 @7 y' C0 M% E
例:返回5%定货额最大的定单6 {& v2 ]9 K! Z6 B
Select TOP 5 PERCENT*4 M. E1 Y! I- p9 V. |
FROM [ order Details]8 A5 k8 c8 }) ?+ a: s
orDER BY UnitPrice*Quantity*(1-Discount) DESC% P+ k! B, j( a& c+ l8 O2 ^
3 用 AS 子句为字段取别名
+ j1 m* ~6 z! w如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。+ F8 z+ q2 n2 A5 D& t- [9 O8 j4 S
例:返回FirstName字段取别名为NickName' O2 F7 m' w2 \ G# H- K
Select FirstName AS NickName ,LastName ,City
! |, B* x3 }+ b; i2 G; WFROM Employees
: w% }; z' C) i$ I8 B1 r例:返回新的一列显示库存价值
( Y! D- N, j T* j% f5 _2 J) SSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
' q. g }8 s: \9 \& U( d; l& ?! B: P: CFROM Products
; b$ X3 B# p; n2 K) ]: W/ m% J二 .Where 子句指定查询条件6 B. W& Q, z3 F6 ^9 s1 G" ?2 d; f
1 比较运算符
; R, k: E9 C6 B; Y# a, L9 v. r比较运算符 含义
6 n5 z; k$ L/ k0 B/ f= 等于% Q7 ]5 U2 H. v3 T, b
> 大于
+ _0 D4 u9 z7 H7 D, Z3 e0 X7 @< 小于9 D1 w- g. c, _2 f* `/ f% p
>= 大于等于 P/ d2 q' O R2 I3 K. J
<= 小于等于# S0 x3 p$ Y& w3 z7 O z0 i9 C1 x
<> 不等于" P: A0 `7 h# v* c9 X8 P
!> 不大于( z! z5 z& F3 Y
!< 不小于0 d$ k' z3 w/ \5 I* K
例:返回96年1月的定单
- r) ? o6 t' W5 ^$ \Select orderID, CustomerID, orderDate2 H m" ]8 O" k
FROM orders
) |7 b d7 N; k6 @, U& }4 ZWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
$ h E+ z: d- V- D( T% w注意:4 l7 B3 F6 X* U) r. W# Y
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
+ U2 c0 i E- \例:
5 \- H# L# p2 b3 h: @# _" C8 wWhere orderDate>#96-1-1#
% G3 l$ Z# \3 k$ g( I也可以表示为:
1 V6 }: M, D/ T1 d ]! TWhere orderDate>Datevalue(‘1/1/96’)3 B/ _' C( C! `7 N: z. ~
使用 NOT 表达式求反。0 J; @, r# h; }+ K# t$ n
例:查看96年1月1日以后的定单
/ F9 c6 X, l2 v! tWhere Not orderDate<=#1/1/96#* J" E1 P' H$ Q$ _! ?* O+ I; y
2 范围(BETWEEN 和 NOT BETWEEN), L5 c L2 V9 N0 H
BETWEEN …AND…运算符指定了要搜索的一个闭区间。8 A1 [# Y1 T0 q. q
例:返回96年1月到96年2月的定单。/ D, r; o4 r2 Y* I/ D
Where orderDate Between #1/1/96# And #2/1/96#
' m. L! P" _5 f/ s2 o/ V3 列表(IN ,NOT IN)
) l) q% t8 E. CIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。$ w6 r0 {' i+ k# ]
例:要找出住在 London、Paris或Berlin的所有客户
& |5 q/ X# I" YSelect CustomerID, CompanyName, ContactName, City. i% S5 X c0 ?7 C) q [ L4 s
FROM Customers
" q0 M: x5 r- zWhere City In(‘London’,’ Paris’,’ Berlin’)3 K: @% E n; p6 ~8 p
4 模式匹配(LIKE)
+ n) d3 `9 {$ `8 m& ]4 H% P/ rLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。3 b9 m; u5 F/ w5 I* B! j, C
LIKE运算符里使用的通配符 x5 y6 A& W1 l+ f
通配符 含义* t2 ^* C6 P2 W2 I/ x* E
? 任何一个单一的字符1 E: r( m4 u8 s/ O( m2 T& J
* 任意长度的字符
F& O# F" Y( Z) X' p1 [& C# 0~9之间的单一数字
" \* \5 b2 A0 T+ e; s5 M1 t[字符列表] 在字符列表里的任一值
' V u/ N( B* Q% Q; h' r' S. y$ n[!字符列表] 不在字符列表里的任一值. ?0 r8 C# |- \; ]0 \
- 指定字符范围,两边的值分别为其上下限
8 I2 e) q7 W: K/ ]6 x. Q5 w$ Q例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
; }! b/ M' W, B& @" `$ r; f7 G, ?1 pSelect CustomerID ,CompanyName,City,Phone
6 v: u* z" v9 |8 T5 |* @; vFROM Customers$ H; W2 z; R) M5 `" a2 J
Where Phone Like ‘(171)555-####’
7 i7 Q" b, }" K" HLIKE运算符的一些样式及含义8 p' r! _" U% X: ]* T& |0 w; L7 u
样式 含义 不符合+ E6 q) R s1 H2 T5 d% t
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
( I" Y3 ?( G; g' U; u# LIKE’5’ 5*5 555. Q( y0 A0 s8 A! P
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5) k# U; r% ?0 H' R5 P
LIKE’5##5’ 5235,5005 5kd5,5346
, ]. F0 Q! Y% `' e0 tLIKE’; F# B% k* b. i* T
[a-z]’ a-z间的任意一个字符 5,%" t# L' I2 e+ p6 g5 J% |$ ~
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
, ^- J! E. `& }" p! jLIKE’[[]’ 1,*8 x- c! j2 ~. G$ l
三 .用ORDER BY子句排序结果
7 `0 I4 z. ^9 j: g3 _: D7 I0 |orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。* |; y* P* o" q0 W* O/ Y4 _6 {- I
orDER子句中定义了多个字段,则按照字段的先后顺序排序。3 \- o1 j l5 R
例:* T' g9 S. V' b# O9 z
Select ProductName,UnitPrice, UnitInStock
, \: y9 N: p+ U& u' v- g j/ D% jFROM Products
0 T( \* L. z6 n! V4 G8 RorDER BY UnitInStock DESC , UnitPrice DESC, ProductName" E- f8 U' K6 C: j: H. `
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
* W* ?4 M/ S* j& L例:下面的语句产生与上列相同的效果。1 I' c. o+ T! r
Select ProductName,UnitPrice, UnitInStock
5 V* ~6 m' d' FFROM Products( e4 w) J6 p6 ~1 W. K% ^1 _: B
orDER BY 1 DESC , 2 DESC,36 f" }1 l( o. K V# G! G9 t0 F
四 .运用连接关系实现多表查询5 M( I4 A# ^) ]; U& d% n
例:找出同一个城市中供应商和客户的名字
! ?0 u/ Q& [, y% v: Y! ]Select Customers.CompanyName, Suppliers.ComPany.Name
$ F/ G5 W% T+ B. p, ^ n! mFROM Customers, Suppliers+ a2 ?, C5 L2 |3 g4 Y0 w
Where Customers.City=Suppliers.City
6 l3 ?6 h" g8 v例:找出产品库存量大于同一种产品的定单的数量的产品和定单 M; b' O6 g- a0 K& s- y+ N( I
Select ProductName,OrderID, UnitInStock, Quantity x ^# ]" c% y1 U, K9 b
FROM Products, [Order Deails]2 b6 ~- U# d: q) S
Where Product.productID=[Order Details].ProductID
e& p. Y! `/ Y9 t0 W' OAND UnitsInStock>Quantity
" Z* f& b8 J) j* o) _6 X另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN; s1 d! f. E% L5 l6 @
语法:
" ~# q t# H# t5 v( V/ KFROM table1 INNER JOIN table28 Z2 N% E( n5 |1 Y5 F
ON table1.field1 comparision table2.field2
: O# j) ^" g& a9 C+ [+ P其中comparision 就是前面Where子句用到的比较运算符。7 v# @3 g3 b3 W% u6 O6 H' J9 E
Select FirstName,lastName,OrderID,CustomerID,OrderDate' m' e# y3 a- a
FROM Employees
5 o- P0 N7 w6 t* N" m: dINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID7 y( A X6 W; n7 J+ t& F
注意:
! M5 u. l2 S9 _$ d" g& `; CINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。7 J2 Z& n3 c% b1 X( e$ J/ U( W4 o
在一个JOIN语句中连接多个ON子句
7 x5 R+ y' n; ]语法:( K7 ]% a5 `- m
Select fields
4 J' J8 [# H+ C+ g q6 k7 MFROM table1 INNER JOIN table2
& i8 p8 u8 \7 `. m; v5 JON table1.field1 compopr table2.field1 AND
$ K1 W& l; S6 {0 g1 @9 A& t3 x3 f# }2 I6 YON table1.field2 compopr table2.field2 or
1 n( c8 ^7 H* F# c. Y nON table1.field3 compopr table2.field3: E; r! r, [' q$ j& d7 k
也可以% h& s$ r; H3 D, [
Select fields
* m& J! [8 Y H; E, u9 hFROM table1 INNER JOIN4 w6 T4 L8 p" s" P9 Q4 p/ D( i
(table2 INNER JOIN [( ]table3( y6 j- v" O$ c3 p: q% i
[INNER JOER] [( ]tablex[INNER JOIN]
* L: |& O0 q) K' o4 b7 ZON table1.field1 compopr table2.field12 A+ W5 L; Q8 ], V
ON table1.field2 compopr table2.field23 ?# R! o7 x6 g; d' E- `
ON table1.field3 compopr table2.field3( r6 t0 y, X+ v: p5 E# S
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。# D1 w( B! k5 x( N& [) D% d
FROM table [LEFT|RIGHT]JOIN table2 W! [2 d9 Y. F( }* v" e
ON table1.field1comparision table.field2
# }2 z0 X1 ]7 C) w用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
) M W( Z' R7 D# G* q8 |: A/ S例:不管有没有定货量,返回所有商品
9 a$ d; O+ [9 P# V9 o- |Select ProductName ,OrderID
; u ^3 m' V+ B" x) UFROM Products
7 ~5 ?! r5 P. |8 `5 @+ x" qLEFT JOIN orders ON Products.PrductsID=Orders.ProductID! `- w- P& \+ W) f
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。& O6 _) e! y0 p/ V( r; g4 m0 Q
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。3 t/ ?" ~! e0 i! }- h; v) w" R
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
2 f7 ^9 g2 K2 X$ U; p; WSelect *% F0 ^8 G' b, o: h
FROM talbe1
& p. [8 f' E6 \1 ALEFT JOIN table2 ON table1.a=table2.c, E. L" P& v$ ]+ B$ @% x
1 连接查询中使用Iif函数实现以0值显示空值
9 H2 B/ y' U3 }) ]9 x" QIif表达式: Iif(IsNull(Amount,0,Amout)
) {9 v9 |0 f6 e例:无论定货大于或小于¥50,都要返回一个标志。
, y/ {" F) l+ a; j U- mIif([Amount]>50,?Big order?,?Small order?), S6 h$ p: e( O1 W
五. 分组和总结查询结果0 E$ Z- j+ U) [. v; ?# G
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
9 ^6 n; w1 Z% [5 VGROUP BY 子句的语法
q" K; j- d& _( TSelect fidldlist
% K# H* \4 d+ ^% EFROM table
' ?$ i5 ]$ Z# A mWhere criteria
$ e" f( [0 m8 b( N9 W \0 W/ `[GROUP BY groupfieldlist [HAVING groupcriteria]]
p& D0 k7 @& E! o注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。7 F/ p0 W- F5 i
GROUP BY字段中的Null值以备分组但是不能被省略。+ m7 ]' F) }. e3 B
在任何SQL合计函数中不计算Null值。
G. n. z: b& F0 A! h6 t+ {GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。- x+ J1 Y8 G/ I" B o. A9 _
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
4 E- Z$ `( J: _: YSelect Title ,Count(Title) as Total
, q9 }: O( Z3 d; H( K. K( \6 @FROM Employees: u! ?% \' W5 S, ?2 I. N" n
Where Region = ‘WA’; U9 k4 m* S1 a1 d8 ], b* q
GROUP BY Title) ~& f4 H$ H& \* ^
HAVING Count(Title)>1
2 @% A% Z8 J8 J- i; ^/ T# YJET SQL 中的聚积函数
% ~; D4 y" M6 ^% p6 `% h2 Y2 V聚集函数 意义; d L0 b' b5 u1 ]- C0 U2 O- v5 \
SUM ( ) 求和; G; [( p; C. Y7 _
AVG ( ) 平均值
& w" F# r; [( H0 S9 P! n" D5 {+ kCOUNT ( ) 表达式中记录的数目
! P/ X+ K% E( zCOUNT (* ) 计算记录的数目
, l8 P) g' C0 E) t& j/ T1 l: jMAX 最大值0 _' a' K# ?0 V6 d# S& r
MIN 最小值4 |$ n* ]- }1 j
VAR 方差
" K% q* V4 B. K, T1 x% {STDEV 标准误差
4 S [2 Q8 ?) w5 {) [! xFIRST 第一个值7 |) P! N2 F0 Y$ O$ d9 w8 X
LAST 最后一个值
4 h E0 w9 N6 G6 s六. 用Parameters声明创建参数查询
+ t+ w; H0 X/ \# {/ gParameters声明的语法:+ i( k# n: L8 i/ V! j
PARAMETERS name datatype[,name datatype[, …]]
3 f0 u$ @, L# C其中name 是参数的标志符,可以通过标志符引用参数.
3 n: m% b$ q. Y. M! ADatatype说明参数的数据类型.
5 z6 S' | {* B% B: U使用时要把PARAMETERS 声明置于任何其他语句之前.
+ t# U8 V5 s# l. e- ]0 @% m; R例:( l9 m( X- E6 M! f- ~' q( o
PARAMETERS[Low price] Currency,[Beginning date]datatime
I6 e. ? ^- H: Y. L' n3 W) DSelect orderID ,OrderAmount! n- p0 ~4 R- J$ E
FROM orders F: Z2 q5 W# Q" }7 |) J3 v# O
Where orderAMount>[low price]
- g4 ?$ N0 z5 K. v6 [AND orderDate>=[Beginning date]0 [% M7 s) w t4 ~/ z
七. 功能查询
s3 H. x. a7 G/ y# X7 R- ^所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.! `5 y3 A. ~4 m
1 更新查询' b* L# O& A e: X
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.* V3 ~# x4 C6 g
更新查询语法:
" n* W; `( @0 qUpdate 表名7 h; ~2 E8 L8 m( y# n6 D
SET 新值
8 H9 G- V* e) y8 rWhere 准则
/ _$ N6 h {4 k4 @. K' L例:英国客户的定货量增加5%,货运量增加3%
% i- ]# b, j7 x, RUpdate OEDERS
7 ?: W" B" |, w4 @- R, nSET orderAmount = orderAmount *1.1; j6 k. _1 h3 R. v' R3 y
Freight = Freight*1.03
3 P; s5 L% B9 a( `Where ShipCountry = ‘UK’0 c0 D/ F4 v7 D& _
2 删除查询; F0 H% E$ D! S6 Q" G
Delete子句可以使用户删除大量的过时的或冗于的数据.
+ Q. Z% w" X. R, j$ M. O) Y1 D注:删除查询的对象是整个记录.; C0 _' f5 @* b3 f
Delete子句的语法:; |2 w$ ]+ X9 C
Delete [表名.*]& S( N( \( a0 q/ O3 |- q, H& `
FROM 来源表
2 {6 i! `. N! tWhere 准则# k7 i& n1 X* l8 Z# h( K* y
例: 要删除所有94年前的定单
% v [" z; d' _- zDelete *
~( K+ T' A1 Q2 }# X, _FROM orders) Z9 Z, I3 H& i( k8 a
Where orderData<#94-1-1#/ S+ M) |: l0 M) J3 Q9 W3 b
3 追加查询$ e% ?" X* u- Z# D
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.& B, x$ Z" H" ~; b' q
INTO 子句指定接受新记录的表
: c& n6 g% b% y2 `4 lvalueS 关键字指定新记录所包含的数据值.6 U5 K' h) _9 Q7 A( f3 \
Insert 子句的语法:
, T" `" X8 B% Y* H+ h0 [( |INSETR INTO 目的表或查询(字段1,字段2,…)
m5 E% o+ z" v9 Y: H+ r) a UvalueS(数值1,数值2,…)7 n& Y5 D% j/ q3 I* ]. {4 |$ F
例:增加一个客户9 e g, _- Y2 O
Insert INTO Employees(FirstName,LastName,title); |, W) p$ P. A7 a: m
valueS(‘Harry’,’Washington’,’Trainee’)
4 C' G$ g! v* k7 ^9 H4 生成表查询
# C6 Z) O* o" M" l% i6 Z Y8 k- _可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
% j0 |- c* H" m2 b6 xSelect INTO子句用来创建生成表查询语法:
: J) S0 B6 ?6 Y! vSelect 字段1,字段2,…3 c0 J. ^# C9 m* T9 O( P- m1 k
INTO 新表[IN 外部数据库]" w, f4 f( B) M* O }8 [4 q$ s9 \
FROM 来源数据库* \6 q' |; @* z/ S( N* x4 f$ C
Where 准则
! I- I0 X' J0 D9 j* N. Q例:为定单制作一个存档备份# ~5 F8 r, t; R# U& p
Select *
- X o; f& [ S1 L# d2 r" h& MINTO ordersArchive
# P& }( M+ c6 C& R- [- b7 HFROM orders% G- D6 {, W1 f
八. 联合查询" N3 h y! G4 ~5 h0 c" c
UNION运算可以把多个查询的结果合并到一个结果集里显示.' K1 K0 ?; d: a9 r
UNION运算的一般语法:& X( X8 _( K% H# L+ a+ S
[表]查询1 UNION [ALL]查询2 UNION …
8 b4 i( f9 J/ r$ G$ I% ~/ H例:返回巴西所有供给商和客户的名字和城市+ [% Z z g G# O% n# Y8 B2 N
Select CompanyName,City4 O" _$ w; E0 L0 S
FROM Suppliers
8 g! {: S2 a5 g/ s9 u. z. Y9 sWhere Country = ‘Brazil’; l* [" }5 Q: j
UNION
' r0 A3 ^+ F5 l4 L& u. s: g1 i3 GSelect CompanyName,City
" t) | x- q# U6 b) PFROM Customers
6 \0 L( k: x8 I) ~( ~7 ~4 UWhere Country = ‘Brazil’
- {5 b, x& k6 z: N0 N9 V! c6 \注:
* _7 |( c7 Q0 I5 j/ A; k* E z) X缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
! [2 Q, b% I; ~UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同./ @# Q' z/ v2 D: E' I
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.2 N/ K/ w+ l5 J2 r: C/ R. v: Q
九. 交叉查询
) Y7 d+ J* H3 ~: H1 o交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
- X' W6 q4 W) p, |- |. eMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:" M2 P' l" h& R+ q
TRANSFORM aggfunction
/ S" x; i6 g) r) w8 }, u+ E8 f# L7 BSelect 语句! R3 {( E; J8 w; Q' m
GROUP BY 子句
7 u' \% m% t, ]. F s- H8 y! x" KPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
+ \$ W7 F1 y% j4 cAggfounction指SQL聚积函数,- s X. e: ~; ?6 F9 V" V' S6 l
Select语句选择作为标题的的字段,$ Z6 j/ b7 d. z1 G/ O" a
GROUP BY 分组
; x' {# p$ |" L9 ?9 {' d+ X说明:. f2 ]+ f& X6 {* p) j
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
9 z; Z$ u! c) k! F; ^" gvalue代表创建列标题的固定值.7 P1 U0 |7 _+ |
例:显示在1996年里每一季度每一位员工所接的定单的数目:; J) Y1 W( a* c" N) A
TRANSFORM Count(OrderID)
6 {$ @% a9 T; ?Select FirstName&’’&LastName AS FullName
+ q! r1 }0 _5 c) H( M% C, [+ jFROM Employees INNER JOIN orders
2 R" `* M: T9 k7 P5 D, n# M2 UON Employees.EmployeeID = orders.EmployeeID
: Q9 C- U) V/ S* d* uWhere DatePart(“yyyy”,OrderDate)= ‘1996’
5 W5 ^5 f! t1 ` h2 `3 f- n9 r" vGROUP BY FirstName&’’&LastName- W& X1 q6 O: D* N- R" d* s
orDER BY FirstName&’’&LastName* ^% [# |, S# i& S0 i2 P* C, X
POVOT DatePart(“q”,OrderDate)&’季度’
* G2 j; X- V$ q十 .子查询7 \, g, f) w; N# J' P9 `0 C! k
子查询可以理解为 套查询.子查询是一个Select语句.5 @& d! L, |+ t9 X4 u
1 表达式的值与子查询返回的单一值做比较
* X7 O( a% y: K0 I8 L9 I4 m- k语法:
9 n! \4 W8 f" v. a表达式 comparision [ANY|ALL|SOME](子查询)
* u u$ M* o; S% W0 a; ?说明:& Q' O+ k8 S n: \
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
1 s& B% a7 ~1 D, i例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品) U% y6 O( x. p+ ?
Select * FROM Products
. w8 |& Y% {, V/ \% [: FWhere UnitPrice>ANY3 B' B- l: j' Q) m* b8 k
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
0 _! S y: d% W6 ]6 F, U- p* c2 检查表达式的值是否匹配子查询返回的一组值的某个值
, i$ _% A1 M; ~# a6 s' [语法:
! b0 }7 d. p, q; b9 N8 Z* U! `[NOT]IN(子查询)
) ~- |! e* Z! G( c/ r例:返回库存价值大于等于1000的产品.
- P5 z, R' o, n* \Select ProductName FROM Products( W3 M. m2 W8 i' {3 [
Where ProductID IN, s) @* O% K: _. y
(Select PrdoctID FROM [Order DEtails]0 T( v8 P. n G2 _, V. `
Where UnitPrice*Quantity>= 1000)+ R! f& u* a* E/ p+ z2 `4 p0 n! o9 a8 l ^
3检测子查询是否返回任何记录; v/ ]! y% L: _* H" `! n
语法:
& a* O- m% t/ G. Z- m0 E; g4 f3 V[NOT]EXISTS (子查询)/ V5 d" }/ [7 o* D- D2 G" J( M
例:用EXISTS检索英国的客户
4 W2 C0 |8 _) k, R4 dSelect ComPanyName,ContactName. q/ j% H% x8 E2 @3 u
FROM orders
- H4 W" R2 ^6 z2 f0 WWhere EXISTS
( C. e3 a' O% t4 S. p$ G6 d(Select *
$ L8 u m2 }/ @0 `. E( |FROM Customers
5 A2 ?. f5 c" i% W: {# rWhere Country = ‘UK’ AND5 X5 Q" x; v k3 t
Customers.CustomerID= orders.CustomerID) |
|