- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
Access如何筛选重复数据以及Select语句的完整语法5 a. q1 ?1 |& W; t* m
" f' L8 Q9 Z( xselect distinct 字段 from 表名
( K1 ?, m/ [, b* c) ?7 F# Idistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
( l# l. d W# h8 T* m& N4 s$ {. a一.Select语句的完整语法为:
, y8 v4 N& D7 c, P- {2 nSelect[ALL|DISTINCT|DISTINCTROW|TOP]$ ^/ h$ C" |) k% _$ Q
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
2 A1 Q% X9 F0 N) ], G; P* J: zFROM tablee xpression[,…][IN externaldatabase]3 `5 [6 s9 Z/ \6 c
[Where…]
+ \* T- O5 V2 D6 K% b! J. o[GROUP BY…]# {8 c1 A# f; G! n& ~6 P/ \) s
[HAVING…]
8 y; I% Y. B* I: N5 Q[ORDER BY…]) }4 ]' Z4 o* _+ S- o2 l! ?
[WITH OWNERACCESS OPTION]
- w" l4 f/ Y3 x3 o说明:3 a8 C: Q- W$ K8 u
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。2 E' t4 r" l! h5 m* u8 W, n
1 FROM子句; \# s& i: t- ]0 l) G' v. Y5 \. I
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
+ M- K( t5 z$ g' t$ A% d; y- @6 W例:下列SQL语句返回所有有定单的客户:
" z) X; X+ j& [0 w( j% _3 USelect orderID,Customer.customerID
; U& ?3 D0 c7 y" D8 B' q+ ^$ QFROM orders Customers9 L0 f% d6 E* d" I) H
Where orders.CustomerID=Customers.CustomeersID7 f- u1 y4 E. U* s9 h3 ]
2 ALL、DISTINCT、DISTINCTROW、TOP谓词) N. }" x2 Y( O) @2 G
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。2 n3 |& W6 ^! }" G1 }3 k- I3 q
例:Select ALL FirstName,LastName. e3 n' q! p- `9 r
FROM Employees
9 F/ O: W$ Y! F" K& P(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。3 D( {6 X: o( _6 ~
(3) DISTINCTROW 如果有重复的记录,只返回一个( Y1 n# T3 J- Y/ k4 ^
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)5 @0 V' z- _6 C0 i; q% U. Z
例:返回5%定货额最大的定单1 E( m8 i% P* Z' y# R1 b/ D7 x$ v
Select TOP 5 PERCENT*
( A8 h# q* l2 S: K2 ZFROM [ order Details]: g5 ]* ?6 w' m% |2 I) Y
orDER BY UnitPrice*Quantity*(1-Discount) DESC
7 \7 P( M! R. U. U y- o6 \3 用 AS 子句为字段取别名' b; `* v6 d/ K; |+ o% c; |5 o
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
! L, T. z: I# {3 l s例:返回FirstName字段取别名为NickName
1 y! I0 u, V( h Y' M& c# USelect FirstName AS NickName ,LastName ,City
* j9 ? j* ]/ kFROM Employees" C! N3 _- [$ T& g4 Y( n6 ?
例:返回新的一列显示库存价值
, _" X1 a- g% i8 `9 m2 ?; vSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock& `- N8 O$ Q$ B- r z; f
FROM Products9 ?# E$ u1 K' A f7 |$ s) ~1 T8 r. w% {
二 .Where 子句指定查询条件) D6 E* X- H5 s. U0 o
1 比较运算符
& r9 W5 ^- y& K+ G \& S2 S; X比较运算符 含义0 s* d1 G; J0 C* V
= 等于
6 R' b+ `. n) {3 B& \' _> 大于
; j: ]4 Y- w9 N5 B, W< 小于
6 b9 b# \& B+ A>= 大于等于
/ L& p. Z/ D# m) K# E: ~ ~- p<= 小于等于$ O/ G8 k3 G4 l' Y; k# m5 e
<> 不等于
7 N- ]! k) R$ w* l7 x0 v! g!> 不大于
) Z, W3 S* a+ D!< 不小于
5 m Q! S+ C: q* G* U ~# X例:返回96年1月的定单
6 Y6 P* T0 O( `2 y- C/ p0 VSelect orderID, CustomerID, orderDate' h/ n: m1 M5 D/ K/ x' A' w1 l
FROM orders
* J4 ]4 I" R$ @ bWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
9 I" K, O. \* v6 l% Y' G. F注意:
6 A6 \; `4 C; Z' [: ]Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。) t1 Z( k: {! A: r
例:2 K) @. W: b+ i+ m1 P9 Q& q" {
Where orderDate>#96-1-1#
$ D7 u/ C# U4 _0 \也可以表示为:, D* w, K: C' X" E+ J! i- g6 _
Where orderDate>Datevalue(‘1/1/96’)
9 H9 ^2 I* U5 t6 ^+ `使用 NOT 表达式求反。3 d: C; z9 ~3 R l2 g/ \# W! B
例:查看96年1月1日以后的定单
) v& a) h5 z$ d9 i- y& u$ l* AWhere Not orderDate<=#1/1/96#
3 c- u+ W }) W2 范围(BETWEEN 和 NOT BETWEEN)
: X2 O ?, p! e' d% d3 T- _BETWEEN …AND…运算符指定了要搜索的一个闭区间。- D9 S9 L9 T% @/ R1 ^! n- [
例:返回96年1月到96年2月的定单。6 r- N; d: |: f5 U; M
Where orderDate Between #1/1/96# And #2/1/96#* p8 W( [" @8 `9 G% Y
3 列表(IN ,NOT IN)) H8 R3 D. ?0 E% I4 N- `6 b
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
2 l/ x+ p) c; h: n" M; j* U例:要找出住在 London、Paris或Berlin的所有客户. \! x$ ~4 p4 i5 v' E
Select CustomerID, CompanyName, ContactName, City
4 f+ {( f4 w- O( F9 ], tFROM Customers
) V* n" e! [0 RWhere City In(‘London’,’ Paris’,’ Berlin’)$ h* ?1 k. e* V- ?& S4 C; \! L
4 模式匹配(LIKE)
" X# J" q2 E# L) \' |LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。' w* m+ G9 R2 w
LIKE运算符里使用的通配符+ j: [% p9 t# Y& {( t0 j
通配符 含义
+ J; D ?# s: M. f1 c? 任何一个单一的字符
5 K8 C0 Q! \( Q/ h! m0 n: p* 任意长度的字符- v6 {( i) \$ D# k D
# 0~9之间的单一数字: l7 T8 D/ B0 s/ Q# B% i3 } \3 [
[字符列表] 在字符列表里的任一值7 C# G' o3 i9 O6 S. |
[!字符列表] 不在字符列表里的任一值# O0 P3 U W/ B
- 指定字符范围,两边的值分别为其上下限4 s5 _5 w9 K+ ]2 @: N1 r
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户: s6 m: g. ?. F$ l, J6 S
Select CustomerID ,CompanyName,City,Phone
$ K* r M- e, T; W) `' T( r9 UFROM Customers
9 x2 l4 C. f3 KWhere Phone Like ‘(171)555-####’' g5 X5 P! d1 m$ c2 A
LIKE运算符的一些样式及含义4 R. B8 ~8 [6 r7 B
样式 含义 不符合
* I; ?& L1 F' C/ kLIKE ‘A*’ A后跟任意长度的字符 Bc,c2553 o2 Y; }8 j6 X9 f
# LIKE’5’ 5*5 555/ G6 T N7 F2 N3 ~8 n
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
, o9 M" h @* lLIKE’5##5’ 5235,5005 5kd5,5346 v0 ~0 {1 L' h0 I" T/ x% w
LIKE’. _9 @# ?/ S7 z
[a-z]’ a-z间的任意一个字符 5,%% s9 U/ M/ d) g# D' A
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
- _4 x" i. T0 ~% m+ d! Z% v. NLIKE’[[]’ 1,*) D* V7 c6 i2 f6 _
三 .用ORDER BY子句排序结果8 C- q9 B9 S) b& O
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
2 G5 N8 N" {1 m( V8 K* u: F4 lorDER子句中定义了多个字段,则按照字段的先后顺序排序。
$ U0 y! x7 M$ Z% d: t: k- U4 B例:7 i2 m# j& G$ W, W' H) h" f1 _; ?
Select ProductName,UnitPrice, UnitInStock7 h V+ d- w* n
FROM Products
W- s( y# W4 Z) k0 D0 HorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
- e' i7 }; U8 K: jorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。$ B# {! `$ J7 ~* ]; Y0 ]3 G5 R
例:下面的语句产生与上列相同的效果。
8 H$ Z e7 P) o1 E, K5 ASelect ProductName,UnitPrice, UnitInStock7 P& Y1 B3 H8 Y, [$ A3 f
FROM Products
0 I" C3 Y9 ~8 N/ n8 }2 S( LorDER BY 1 DESC , 2 DESC,33 b! V6 Q1 U$ X: X9 g
四 .运用连接关系实现多表查询8 O* d/ g' G, U3 z9 D' [
例:找出同一个城市中供应商和客户的名字
2 c( A* } c) A5 X" P. PSelect Customers.CompanyName, Suppliers.ComPany.Name+ d0 b- p1 l! g4 H
FROM Customers, Suppliers
. A/ f1 O2 Z8 S K; j) q* \. x; J$ PWhere Customers.City=Suppliers.City
* A# |. {( ~& _; ?$ t2 t例:找出产品库存量大于同一种产品的定单的数量的产品和定单& y( \" {: Y$ Z8 A/ Y2 y. I
Select ProductName,OrderID, UnitInStock, Quantity% q* b5 [1 r8 k+ N
FROM Products, [Order Deails]
& m; I W1 x0 E( @+ DWhere Product.productID=[Order Details].ProductID
8 E8 @7 o- ~" [) m4 R' C6 ?AND UnitsInStock>Quantity3 V9 _. A# Q1 Z4 s% m1 K8 h, C
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN# w$ f+ n0 d2 k3 c" [! Y: d
语法:! }1 p$ P% q: B" l; \; u) Y
FROM table1 INNER JOIN table2
3 v; Q9 m& F' e/ L# rON table1.field1 comparision table2.field2! |( J$ x5 n R9 R
其中comparision 就是前面Where子句用到的比较运算符。
4 f) i* ]- b6 i! m/ u) gSelect FirstName,lastName,OrderID,CustomerID,OrderDate
$ U+ _3 S# N/ h6 ZFROM Employees. x" M! G; |: U" Q! _+ k) P) b1 a
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
4 c' s3 O9 I W( ^* f7 u' q注意:
8 D$ G2 ]5 c ]" IINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
1 D, W! h' X& i在一个JOIN语句中连接多个ON子句
: B. ^, G }( }+ \2 ]" F0 y7 E语法:
- p. I! o9 Q; F( l& l2 } YSelect fields' f6 I# y# F6 H6 @6 d
FROM table1 INNER JOIN table2
! w" S" Y3 r& O, Q/ @ON table1.field1 compopr table2.field1 AND5 D7 L* {6 s% r, {# v5 L9 {
ON table1.field2 compopr table2.field2 or
7 I [1 G/ x9 s9 [0 kON table1.field3 compopr table2.field3
4 m9 j" ?; W5 |5 t7 O! q o) }1 [* Q也可以: Y! X) N* r5 r X* f) D
Select fields0 l3 C2 N+ X# j/ \& x
FROM table1 INNER JOIN/ l3 K$ s$ Y/ d& X8 t& N$ n
(table2 INNER JOIN [( ]table3
9 O8 [& C+ T7 {9 k/ f6 M" n+ e2 v8 U[INNER JOER] [( ]tablex[INNER JOIN]5 X9 W c7 G$ Z8 U% f4 k
ON table1.field1 compopr table2.field1
# `. t& G1 ], |! I SON table1.field2 compopr table2.field2
, t: c9 s' `: q1 zON table1.field3 compopr table2.field3
( d8 [$ ` H8 g1 R. _5 Y外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
% x" Z4 j6 h; h7 J3 CFROM table [LEFT|RIGHT]JOIN table2
5 W8 R4 ^, I$ m; L# GON table1.field1comparision table.field2
/ U6 i, Q g$ _$ P% u用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
" I- W& w; P# D, s! X例:不管有没有定货量,返回所有商品) k7 \" a4 [$ c1 J$ i" l
Select ProductName ,OrderID0 E. c; I; c L! Z: w. e7 e
FROM Products8 H5 t2 k& |# Z7 n2 A$ l/ |
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID& O$ ^. H; h# ?; e* z$ A% _
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
/ R: s& i- @# y, S# ?- Q% M例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
; X6 |( [2 r3 n5 j" J* p空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
% T6 i. p, v( k' _Select *
0 C3 m/ f% s: \$ qFROM talbe1& p5 E; v* I8 Q3 o
LEFT JOIN table2 ON table1.a=table2.c5 E, x3 }6 Q( Z0 `" `& `
1 连接查询中使用Iif函数实现以0值显示空值4 d. m' E$ O8 Q
Iif表达式: Iif(IsNull(Amount,0,Amout)7 e0 D( P! K; g
例:无论定货大于或小于¥50,都要返回一个标志。
9 [ k# C1 G( _! G" X" EIif([Amount]>50,?Big order?,?Small order?)
6 K2 E) r' N: c, e0 ]9 |* ?4 v五. 分组和总结查询结果
: }: N& M2 r! I4 P" R1 ]) i在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。9 f9 G( T8 k* U% S, V- X2 a" C
GROUP BY 子句的语法) I0 r1 e1 c1 R2 B8 Y
Select fidldlist5 f v' d2 P! U4 [4 ]# d1 U, b
FROM table% Y9 R; M! o7 U' d" o" y
Where criteria
5 {: V6 W& \4 N7 n/ X. R. T[GROUP BY groupfieldlist [HAVING groupcriteria]]
' t3 d) U, j" f q* T% @9 S注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。6 `+ \- ]3 |3 H! Z! G
GROUP BY字段中的Null值以备分组但是不能被省略。4 Q4 U: l8 `5 M/ N5 [) j
在任何SQL合计函数中不计算Null值。' V/ n' E* E8 F5 U: O
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
$ ]9 C# m+ K- s$ H% R5 \6 d" {例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
5 q. l2 t! g; g( G: t+ [$ i' P/ J5 N5 pSelect Title ,Count(Title) as Total. Z, z C1 y$ `- w, ~
FROM Employees
$ E4 Z1 J8 K \0 W8 cWhere Region = ‘WA’
9 `2 a5 a0 l! Z9 }# J+ ?1 m2 O* SGROUP BY Title
/ E* k5 W& c9 p( s7 yHAVING Count(Title)>1
6 F+ Z8 k4 g8 R! iJET SQL 中的聚积函数
6 N2 p% h. C0 q! z* R9 T聚集函数 意义 W0 k. Y! e9 J3 l$ I/ m
SUM ( ) 求和$ l' Y/ E7 R4 V0 l4 x$ @7 j
AVG ( ) 平均值- A& G! @1 s4 a8 L
COUNT ( ) 表达式中记录的数目0 ?, t. Q6 w) z
COUNT (* ) 计算记录的数目$ D$ Z1 n% J$ C7 w
MAX 最大值8 q+ P; ?$ x( S, z
MIN 最小值9 v( u% N$ w8 k+ k
VAR 方差: F* s: w. V8 I* ]( Z
STDEV 标准误差
. @. U3 m1 e+ N2 jFIRST 第一个值
' n* S: C ~/ I3 MLAST 最后一个值
" r( N0 t0 Y1 W六. 用Parameters声明创建参数查询- y- G4 t' ^. C, k1 H3 f, @# z
Parameters声明的语法:
3 a$ S3 x" T( d/ G( U" tPARAMETERS name datatype[,name datatype[, …]]
& K: P' B( _* s$ j其中name 是参数的标志符,可以通过标志符引用参数.
6 n/ m! t; |* l+ O3 E- C' qDatatype说明参数的数据类型.; {+ _: Q4 m4 }! Q
使用时要把PARAMETERS 声明置于任何其他语句之前./ x9 J( E a6 n
例:
5 L% H2 {% Y. L- ^ V( _. ^PARAMETERS[Low price] Currency,[Beginning date]datatime
' B; {) P! }! U) L1 JSelect orderID ,OrderAmount
) `$ N5 ^: m* g" {3 z% OFROM orders
3 d) W- E# S0 v' N' k. bWhere orderAMount>[low price]- V* l. S+ G% a1 s& O3 c
AND orderDate>=[Beginning date]* l7 Y, \; V' O1 A. H
七. 功能查询. m8 C8 M: T* E% S
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
0 V: d! F5 y* Q* ~) a1 更新查询5 P3 d7 e# G. Y. i# ]+ C
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.; J; @* @+ l/ w6 y6 h# W$ j
更新查询语法:
: |" W$ d( c$ {9 f) T2 GUpdate 表名9 G9 j% Y' p; \
SET 新值
8 J' z/ g% d9 P! l }; u7 u# NWhere 准则
. T; U- j0 Y$ w例:英国客户的定货量增加5%,货运量增加3%7 d9 g0 u+ e3 O( E
Update OEDERS
3 V4 i. P5 P- b( \: fSET orderAmount = orderAmount *1.1
* X# |5 d3 N6 ?" I! e6 CFreight = Freight*1.03
, ]" a. B Z8 tWhere ShipCountry = ‘UK’
9 H @6 y% {, `4 u6 i5 Q. Q, d2 删除查询* ^" l% R0 ~* C1 \
Delete子句可以使用户删除大量的过时的或冗于的数据.
: F8 e# P, g( o9 A+ Z注:删除查询的对象是整个记录.* r1 }% z8 Y, L. ~* \' A( p
Delete子句的语法:+ F+ v4 r8 y/ `! W q# _
Delete [表名.*]
1 r2 H% Q; g4 E9 s. [* S- S) kFROM 来源表6 o9 p" `: k: S1 v
Where 准则
: w& H& j, b" n$ l例: 要删除所有94年前的定单2 l% N0 c# T8 e' t9 o
Delete *
/ Q3 l/ g5 N% P# B5 tFROM orders
( d0 I" P+ Y( [6 F# K& p; lWhere orderData<#94-1-1#
& M4 U, y9 Z# \" x3 追加查询) e% |5 s: p6 X
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
) a: `6 N6 k8 Z. p( XINTO 子句指定接受新记录的表
7 I% M$ P. N( evalueS 关键字指定新记录所包含的数据值.
' j& @% ~9 r: `* c! J4 mInsert 子句的语法:( i" V+ ^1 w/ c4 e! R* n
INSETR INTO 目的表或查询(字段1,字段2,…), A4 r! V, g- v4 C
valueS(数值1,数值2,…). ?; t6 L% p* i+ F5 H% P2 E
例:增加一个客户0 t) U6 K; a7 ^- p6 H
Insert INTO Employees(FirstName,LastName,title)7 b" k# p! n- I) E& Q5 H- k! i$ I
valueS(‘Harry’,’Washington’,’Trainee’)+ h8 N2 ?* X9 l( n3 H' r" B. d$ V
4 生成表查询; B, Y; D' _ y- _% c6 l$ @3 j3 ?" J# X
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
" ~+ W ]$ ^7 j; X3 i4 b' l# SSelect INTO子句用来创建生成表查询语法:( Z+ S& E6 c) r# E
Select 字段1,字段2,…
3 q6 C6 e& E- ?+ F4 \* W! iINTO 新表[IN 外部数据库]
3 B# P" X+ t0 a7 kFROM 来源数据库
& y D" E- ~! RWhere 准则
$ w+ {& J, @, |9 i例:为定单制作一个存档备份
7 g9 b L; W. V8 C5 \Select *! N& A+ Y* F. Y* s, {4 T$ X3 l: \. S
INTO ordersArchive
+ h* M; m+ O( q3 B, l# p& _' tFROM orders
0 @, ^5 S; ?' ]0 s8 k1 K+ H% @6 D八. 联合查询% S2 g6 }! G \ j! L
UNION运算可以把多个查询的结果合并到一个结果集里显示.
; w2 @8 S) e) Z3 o2 @, uUNION运算的一般语法:7 _* |7 J5 Q2 Z$ p2 X! \. S
[表]查询1 UNION [ALL]查询2 UNION …
; {2 {& X" b4 Y! _2 L例:返回巴西所有供给商和客户的名字和城市6 C7 D7 S9 H0 A
Select CompanyName,City% M ^6 l0 I& ^: I- L7 E& X: Q ~
FROM Suppliers5 \/ g4 {% J, c$ K D" V# |0 ^
Where Country = ‘Brazil’
' q# f1 a U5 ^* b: HUNION/ l6 S: f" G& j9 v: l3 S
Select CompanyName,City
' }- C; \# m% `2 G0 }; SFROM Customers
' x3 S/ F. i! Z6 B9 y7 e; G& y5 EWhere Country = ‘Brazil’
" ~( u5 p0 n/ s9 |) q. E注:
/ a8 A' M' J- ]缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项- o% ]+ w& ]3 }( _# l/ A# @0 ]# D
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
1 x/ o, |8 C( l1 ]: n8 B每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句., ?& y% y6 U8 i. k+ i" T$ Q
九. 交叉查询; s& P8 O6 X% E# w) B! H
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
/ r" G4 S$ l" T- [Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:, R1 ?6 D) T4 r2 O! R4 h" \/ D
TRANSFORM aggfunction r1 C* m! A! R. i$ e
Select 语句
+ n' S' x1 U V Z6 e) M- }GROUP BY 子句5 z( F( D" o2 I1 B ~
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
4 P. T- t2 |) W4 EAggfounction指SQL聚积函数,1 G( q+ A% f% {5 {' I4 A
Select语句选择作为标题的的字段,# Y8 {$ Y+ m( ]4 P, F4 r
GROUP BY 分组/ D s; x( K4 T7 P2 f
说明:
" D* C' _1 T' G4 K5 u% P( JPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.0 W7 o+ [& `4 T2 I/ e
value代表创建列标题的固定值.* i2 o0 }6 {; [: L: S9 }. I0 l
例:显示在1996年里每一季度每一位员工所接的定单的数目:
4 U: c5 g3 U G3 P# `9 rTRANSFORM Count(OrderID)
0 _! V6 z1 l: ` ]( ]Select FirstName&’’&LastName AS FullName
7 |0 p' T; Q' ]+ B. IFROM Employees INNER JOIN orders
' L' s, h3 r# k! W" e3 J7 c' m* yON Employees.EmployeeID = orders.EmployeeID
8 n2 ]9 a! K9 E2 H4 D5 yWhere DatePart(“yyyy”,OrderDate)= ‘1996’
, g A; g. o7 V2 Z: T1 aGROUP BY FirstName&’’&LastName
, b& Y5 n8 j0 Z$ p4 P0 V* s ^orDER BY FirstName&’’&LastName
7 }+ @5 N, k$ l# f, ?POVOT DatePart(“q”,OrderDate)&’季度’
" w, y2 c" f- r' g- Y: G' W十 .子查询
, j+ M, z1 w- m7 P& i' u8 j: v子查询可以理解为 套查询.子查询是一个Select语句.# \# p v; m- B& W! m- `0 B5 D
1 表达式的值与子查询返回的单一值做比较
" Y. s d2 y! t( b1 F+ X语法:
+ P+ K9 t5 S/ [表达式 comparision [ANY|ALL|SOME](子查询)
+ f1 Y: ]1 ^" k( G说明:
2 M9 w2 y7 @7 `7 i ` g& N+ p) z" TANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.# `$ s3 v. e, P. Z9 F/ g7 c; R7 f' B
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
5 m+ B* T F. s+ bSelect * FROM Products
8 q6 ]6 W, [# V# Z( JWhere UnitPrice>ANY5 J' F: C+ Y. p& W
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
$ P" j) B& `8 D+ U0 L: d2 e3 j1 v. A2 ~2 检查表达式的值是否匹配子查询返回的一组值的某个值
- I8 {9 y3 O" F$ ]) q; D语法:
# ]( u/ k, J2 [& v1 [& p[NOT]IN(子查询)
. [8 h2 _. v1 j$ U% _4 n! k6 L例:返回库存价值大于等于1000的产品.
* z* f. i; [( O& P8 g9 g7 nSelect ProductName FROM Products
& y4 E4 D% g7 ~- j3 B& f0 R( sWhere ProductID IN# c& U& ]3 d" q+ C* g
(Select PrdoctID FROM [Order DEtails]
2 U" _, `* C. _1 tWhere UnitPrice*Quantity>= 1000)# F! L4 |1 N3 g4 B6 c4 Q! m
3检测子查询是否返回任何记录5 U/ C0 U1 g, z6 V* H8 `
语法:
/ ^) [6 {7 Z' o" c[NOT]EXISTS (子查询)
8 G; I1 Z5 p, n例:用EXISTS检索英国的客户3 w0 |# R$ D# {0 y: y$ k
Select ComPanyName,ContactName6 j" Q8 Z+ v. D
FROM orders8 V- q$ _ ?3 X/ `& `( U
Where EXISTS* Z5 x* w# R0 c' z
(Select *# D, c+ a$ k6 c. W
FROM Customers
8 r5 m( I \) X7 _8 G- aWhere Country = ‘UK’ AND: `$ b: v5 C8 }9 Y8 A, V
Customers.CustomerID= orders.CustomerID) |
|