航空论坛_航空翻译_民航英语翻译_飞行翻译
标题:
Access如何筛选重复数据以及Select语句的完整语法
[打印本页]
作者:
帅哥
时间:
2009-11-10 10:28:12
标题:
Access如何筛选重复数据以及Select语句的完整语法
Access如何筛选重复数据以及Select语句的完整语法
! q1 d4 t. P& S7 {# y
, [2 P% d( E, D8 R
select distinct 字段 from 表名
3 M8 g0 [+ E( j( r' l) c* K+ h
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
" x- n$ \7 l2 w# E) f7 E
一.Select语句的完整语法为:
+ p/ K4 w2 q' f3 _9 b+ l
Select[ALL|DISTINCT|DISTINCTROW|TOP]
2 Z, t6 ~$ n4 R
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
( ^7 S; d. |: o- P7 r& D
FROM tablee xpression[,…][IN externaldatabase]
# H: w( A( a# a; E3 B
[Where…]
2 m. T9 Q, `' X2 ? ?' ~+ W p
[GROUP BY…]
$ u5 o g1 s! i9 l' |+ y' a
[HAVING…]
6 R7 ~+ E2 c9 G E
[ORDER BY…]
' ^8 f/ j. k, J+ S( s2 F
[WITH OWNERACCESS OPTION]
2 A8 i7 @: O* x0 \; c* A
说明:
; C- Z$ _, x& h
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
8 L1 q. P+ r" F- u( X3 _
1 FROM子句
9 r* E' j# c+ {
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
9 l7 P- R5 S1 ]5 e) m: g8 a
例:下列SQL语句返回所有有定单的客户:
; n* ]: Q4 Y3 q+ H+ n( M
Select orderID,Customer.customerID
* b9 H; p, t* ~6 R
FROM orders Customers
# \ {6 z# ^& f* u2 }. y
Where orders.CustomerID=Customers.CustomeersID
* L, ?( W+ }! i0 m7 r7 N: D
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
6 n6 f! Z5 A; b2 R# ^4 _7 D/ {( M
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
% _2 z4 N" \/ `4 G( O
例:Select ALL FirstName,LastName
\. {# q" W, u% q% e; j' W `
FROM Employees
6 W0 ^( _: ?9 \ ?! t
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
3 ?! s$ y3 v. @3 T+ z
(3) DISTINCTROW 如果有重复的记录,只返回一个
* ?! s3 ~$ I) t6 @5 b, T b
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
$ U7 m2 I, b* @' ^
例:返回5%定货额最大的定单
I( }6 O8 Y7 q- c1 i( o* K
Select TOP 5 PERCENT*
- Y6 M; {4 V8 T
FROM [ order Details]
1 X: Q: ?* S0 e( ]. T
orDER BY UnitPrice*Quantity*(1-Discount) DESC
) P4 u, T8 l1 }( P" S* n# G
3 用 AS 子句为字段取别名
# _9 Y: ]7 Y0 [1 D7 R
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
1 Y/ l" _- r6 p$ m7 a+ a0 Y
例:返回FirstName字段取别名为NickName
: [4 ?$ c1 t W) e w' q- _+ J, g
Select FirstName AS NickName ,LastName ,City
( O. g3 L9 p4 Y1 c
FROM Employees
; H) V: i D- t! x
例:返回新的一列显示库存价值
) T4 b) j" q# \2 t
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
& k) K$ S9 P+ L6 ^7 c/ \4 P! c
FROM Products
7 {5 E+ O' n8 d
二 .Where 子句指定查询条件
9 L" ?2 p2 C, y, s' m* p) ?2 q. T
1 比较运算符
9 u5 a- L% D0 Z0 L9 C# G7 y" b
比较运算符 含义
" Y8 o7 r r0 q! ?$ F& c q
= 等于
" G4 D& ? a1 p; V
> 大于
. R, \4 m# Q# i' S
< 小于
3 Y+ n0 d3 B" a/ c9 Z, x2 [
>= 大于等于
) M8 I7 M; T: n
<= 小于等于
# q# F l% Q2 x! @
<> 不等于
9 i3 d) a3 o% Q9 `6 h6 V
!> 不大于
0 h; o; V) M0 V* a b& d% Z
!< 不小于
* S! M9 {. w9 E& J- H/ D( k
例:返回96年1月的定单
% T, e' A# K( w" l% Q
Select orderID, CustomerID, orderDate
7 G5 q# o2 U7 t- `/ g f
FROM orders
2 L# w% d+ G0 {2 \ R& K/ y+ D6 J
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
! \/ |1 \% p4 @- R* z2 U6 o
注意:
3 `' g8 e8 K7 E4 ]/ p0 P E
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
* t9 \' s+ A" C5 {6 r9 K- A1 e$ t
例:
7 c9 y0 ^ |5 t8 [, T0 a
Where orderDate>#96-1-1#
0 o4 J1 f+ [+ K- i- v
也可以表示为:
8 f% R6 c* F, Q$ M: P8 d. u. {& D* m
Where orderDate>Datevalue(‘1/1/96’)
, d+ _' N8 w6 K2 G# k
使用 NOT 表达式求反。
" ^3 Q+ m9 z, o& b7 P* l7 ]1 z$ R
例:查看96年1月1日以后的定单
n8 ]8 Y( H& s0 `1 F" e
Where Not orderDate<=#1/1/96#
1 `7 B" c8 e$ D' c
2 范围(BETWEEN 和 NOT BETWEEN)
1 |! K& C, W& t
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
+ w0 z( y& g3 t$ Y$ X- p% j
例:返回96年1月到96年2月的定单。
' K- @8 F8 I0 U; B
Where orderDate Between #1/1/96# And #2/1/96#
6 K- `( r& X0 d* W0 K" `
3 列表(IN ,NOT IN)
8 p9 u( M1 h0 H
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
3 n5 B' f& t. m- e2 E- k/ [
例:要找出住在 London、Paris或Berlin的所有客户
& S9 [, W: E L0 D( ^3 f
Select CustomerID, CompanyName, ContactName, City
+ [# d g9 P$ R$ R
FROM Customers
/ \ _# l, b' p8 I I
Where City In(‘London’,’ Paris’,’ Berlin’)
; n) w4 X0 v8 r, A* z5 \6 J( H
4 模式匹配(LIKE)
: Y9 l' ?7 G7 G& z. \
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
' b w/ Z! I; T u
LIKE运算符里使用的通配符
6 b! B9 K" j& |
通配符 含义
7 C' n0 [4 z* L1 H) W7 q- q4 m
? 任何一个单一的字符
! S5 J# P5 m$ Y+ P5 I
* 任意长度的字符
/ P- V+ j; G U9 k# z, F; D
# 0~9之间的单一数字
+ X0 l1 P) V7 D0 m
[字符列表] 在字符列表里的任一值
0 N- i5 o" R6 \ L+ z9 \) n( u
[!字符列表] 不在字符列表里的任一值
- d- h6 X1 R" V+ |7 B% ]! p
- 指定字符范围,两边的值分别为其上下限
8 _6 j, Q) h7 y" i
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
" Q* y5 ~5 I9 J6 Q4 b# J/ Z
Select CustomerID ,CompanyName,City,Phone
5 Z0 x, f, k& ]2 p$ e
FROM Customers
4 m1 S+ Z3 U9 K
Where Phone Like ‘(171)555-####’
# {! G0 H! H+ e
LIKE运算符的一些样式及含义
9 w. v3 \1 O0 |( n
样式 含义 不符合
4 w1 ]8 j) Q/ F% Q7 G
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
' w- i4 S, Y( o8 n9 d; O; Z
# LIKE’5’ 5*5 555
2 j1 i3 h+ i6 K, p4 ?* U
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
* f- J" B' ~) \$ c! _6 [/ Z9 i0 |
LIKE’5##5’ 5235,5005 5kd5,5346
' M' b. s& n" m4 v5 H, U2 |
LIKE’
; K5 E2 ~% p3 f: n& `, k' |
[a-z]’ a-z间的任意一个字符 5,%
8 o# I, V0 j' g/ U* K2 t$ C
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
: P* { h$ o1 }: ~
LIKE’[[]’ 1,*
. Z- `/ q) ^4 d/ X4 }$ d3 ^
三 .用ORDER BY子句排序结果
' M/ F5 Y2 P' E- G
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
; z1 s7 y/ s9 Y8 H
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
J: e! B% F0 y- K: ~9 x" S
例:
6 c- ~( W4 I. ?8 U/ o6 `1 M
Select ProductName,UnitPrice, UnitInStock
+ i& c: A0 _/ Y' x: ?9 N
FROM Products
6 _+ y) C* w1 H* e3 b* `" t6 x
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
$ F' G( V, E: A2 C+ I6 b/ f
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
$ L9 ~/ D5 u8 q0 g" l% D0 l
例:下面的语句产生与上列相同的效果。
* O, P" l8 J5 h: l( T3 ~, i7 b& W! b
Select ProductName,UnitPrice, UnitInStock
/ k v4 I% H/ Z6 M& O; x
FROM Products
; P1 k4 g( ~" v, {- Z
orDER BY 1 DESC , 2 DESC,3
$ M. b1 o" y- ~& C$ [! ?
四 .运用连接关系实现多表查询
2 R4 j+ f% [1 f( f( h
例:找出同一个城市中供应商和客户的名字
3 e! i, q$ n! @, Q+ F, G
Select Customers.CompanyName, Suppliers.ComPany.Name
2 T4 r/ R" i% F$ U
FROM Customers, Suppliers
$ @# |& B5 L% f' g- i+ t) O% @
Where Customers.City=Suppliers.City
5 O+ H& t$ e, u( c c& J, |* J; ?
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
' }7 T7 C$ D& H E4 Y: O& M
Select ProductName,OrderID, UnitInStock, Quantity
) D. p5 r. W ]" [& J
FROM Products, [Order Deails]
, R( K9 g, s- f% G1 p) b
Where Product.productID=[Order Details].ProductID
- ~" D) l) T6 \8 ~
AND UnitsInStock>Quantity
$ A& M! O0 ]) j2 F% B9 s! d$ p
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
1 {& }( ~8 g" o8 O. Y0 J- G
语法:
: E5 J: C9 w. G# Y h4 Q
FROM table1 INNER JOIN table2
8 B% ?) @6 m* {% V' w/ k
ON table1.field1 comparision table2.field2
9 H! I) I9 K8 ^2 `4 ]( W
其中comparision 就是前面Where子句用到的比较运算符。
9 x8 V! I o. [- S
Select FirstName,lastName,OrderID,CustomerID,OrderDate
" v/ l j" b+ W$ C$ {: m, T# h
FROM Employees
; b7 b8 |+ {6 m' D- s1 \; K
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
/ j8 `, g. S. k! w y
注意:
6 r' G' s) a1 g! W9 ^' b
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
" ?7 Z+ v% S4 q2 n* T/ M
在一个JOIN语句中连接多个ON子句
' J+ I" I w9 j/ D
语法:
1 K2 }3 o: n" ?
Select fields
3 Y. w p, R" T2 m1 V5 ^
FROM table1 INNER JOIN table2
5 z/ g6 D W! _# c8 J* n: X
ON table1.field1 compopr table2.field1 AND
$ E. M# _2 @1 x3 c0 G# h; V9 _
ON table1.field2 compopr table2.field2 or
: i, B( j, W) l3 ]3 l. z, }
ON table1.field3 compopr table2.field3
. p' ?" P c: H1 `4 `# k6 v1 H
也可以
) X1 `5 `3 O; r4 z' {" o3 H
Select fields
3 u4 w' O( B4 X; c& h& Z
FROM table1 INNER JOIN
& G: j8 c9 h+ r3 Y4 F
(table2 INNER JOIN [( ]table3
$ o4 J: K- O9 w( k
[INNER JOER] [( ]tablex[INNER JOIN]
0 {5 Z3 o7 k+ b4 x
ON table1.field1 compopr table2.field1
% w5 U" ]8 o" U# q/ Y
ON table1.field2 compopr table2.field2
5 l7 y) n8 g6 x+ N) ~
ON table1.field3 compopr table2.field3
F) i7 r0 M3 `" v; S O5 N, Y& w& t
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
8 p6 N$ T4 h# ^5 v7 y" q
FROM table [LEFT|RIGHT]JOIN table2
- r7 F+ M2 A9 k- M6 u" N5 b
ON table1.field1comparision table.field2
3 u! ?+ j R6 g# I. i
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
" ?( Y. l0 [ w
例:不管有没有定货量,返回所有商品
1 o" e, r& G- `0 i: I5 K5 ~
Select ProductName ,OrderID
9 C: f; P+ t* G S5 w: t9 A! L
FROM Products
% o/ R$ t* N% d$ r9 v
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
5 Z- n; o) L9 m, W; S: c& x3 X
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
$ _% C7 S1 \. F1 A: X
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
9 @5 H- V4 }) L0 C6 D3 ~( ~: T. e
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
2 P0 B# l3 V$ Y" G; n1 }
Select *
, N! z) C4 W# w. O
FROM talbe1
, f7 _0 ?# z! |0 g
LEFT JOIN table2 ON table1.a=table2.c
9 @5 N% H2 |; ^6 D7 \( ~
1 连接查询中使用Iif函数实现以0值显示空值
5 j; Z+ z5 C7 z- r9 Z; M+ k( I% I
Iif表达式: Iif(IsNull(Amount,0,Amout)
9 c6 Z4 Q3 x) X7 m& \7 G
例:无论定货大于或小于¥50,都要返回一个标志。
! D" h' Q: k" K" d
Iif([Amount]>50,?Big order?,?Small order?)
: | u" }- K6 @4 f. k
五. 分组和总结查询结果
/ g) E8 E' M, O# w- v e
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
4 f/ H! p; y. G, P9 @; ~9 E( ?3 ?
GROUP BY 子句的语法
( R$ o5 Y; [; R/ X+ S( p9 @/ `
Select fidldlist
- L- Q) Q2 q; V4 F) L8 l2 N
FROM table
) E0 d1 u! } n# E1 x( ~
Where criteria
. e& g. O) J, r Z6 q g
[GROUP BY groupfieldlist [HAVING groupcriteria]]
: _, J, K5 m, f. W8 Q* F
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
! v9 X# x. H( p; f' ^
GROUP BY字段中的Null值以备分组但是不能被省略。
/ b. ?4 ^9 A$ K/ V5 T
在任何SQL合计函数中不计算Null值。
' D! r5 A! h) m, ]$ n9 ^ n
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
" E+ g4 I4 C/ m2 P' U
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
* h( o+ R/ L! V: W5 q- X
Select Title ,Count(Title) as Total
% U# z; ~* D# i# u0 }0 z% n
FROM Employees
+ U6 F5 N: m9 h/ q- |( h5 s
Where Region = ‘WA’
+ I, \. d1 I; Y5 I' j# n( V
GROUP BY Title
u3 d& y/ T* J# L- H1 k
HAVING Count(Title)>1
+ M9 l! f' h K; x
JET SQL 中的聚积函数
: z1 d% B# A F& N3 i
聚集函数 意义
& ? v |5 w7 X' j
SUM ( ) 求和
7 c6 I& D6 N0 h$ q
AVG ( ) 平均值
" _3 \" j2 m% ?7 F0 O
COUNT ( ) 表达式中记录的数目
. W( _* E/ V' u7 C1 o' R+ E
COUNT (* ) 计算记录的数目
& r6 e6 J: R. ~- }
MAX 最大值
/ X% G- g. |" e- v
MIN 最小值
# `7 e [ o0 B: i* s' s# L
VAR 方差
7 M; l% `; ^; V/ B* U2 c
STDEV 标准误差
$ E4 x+ S2 k% W. [3 W: C1 V! P3 }
FIRST 第一个值
+ ]! n" X ^/ [' t# @2 z
LAST 最后一个值
$ ]. Y: ?8 x' }9 l5 p9 y
六. 用Parameters声明创建参数查询
: Y' c4 T# {0 |* I, |8 O
Parameters声明的语法:
$ ^1 J. D) w4 K' f* }. U4 ] F
PARAMETERS name datatype[,name datatype[, …]]
5 r2 ]9 i" Q8 ?
其中name 是参数的标志符,可以通过标志符引用参数.
0 m: G. B( b4 b: i
Datatype说明参数的数据类型.
, b3 \5 H( D4 V. @9 A: @- T
使用时要把PARAMETERS 声明置于任何其他语句之前.
7 ^- s& I' Q6 b( z- _
例:
1 Z' c0 H- L; l2 G3 v; j0 T
PARAMETERS[Low price] Currency,[Beginning date]datatime
# o. k* U( }" {% V" W
Select orderID ,OrderAmount
/ M3 s; ^4 u; ]- e$ k; [" E
FROM orders
6 E, T! o* x9 `% c
Where orderAMount>[low price]
9 K) y$ O9 Z# r$ x# M2 {& J
AND orderDate>=[Beginning date]
0 Z( M2 T. O: M8 g! y, K& k+ K
七. 功能查询
2 d0 z! S# f& c% }+ E# O$ L
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
1 k* l3 D. M! c
1 更新查询
0 S$ e7 w5 z( r7 N g7 j
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
- x9 w( A5 t- @6 T: X6 y
更新查询语法:
! J- I8 T( n. c& L
Update 表名
# ?" w' X' y# c @4 V5 q
SET 新值
3 Z; A! |3 H( G+ j7 B/ V
Where 准则
n4 s) U4 `5 j+ i9 u
例:英国客户的定货量增加5%,货运量增加3%
% Y1 z5 u$ h0 k1 }4 s( r6 H
Update OEDERS
' x5 l8 K% ^! E J6 |
SET orderAmount = orderAmount *1.1
8 a4 K( E. M8 ^! J, E/ V, s
Freight = Freight*1.03
" |: T# Y u* f% V- K1 f
Where ShipCountry = ‘UK’
' Y. L4 c1 A# F) ?, f8 y5 {; i5 Q
2 删除查询
: v+ t; g" i b9 v0 |3 h
Delete子句可以使用户删除大量的过时的或冗于的数据.
, b% z2 g& Q3 t1 g
注:删除查询的对象是整个记录.
2 @& P* K5 u, a6 o3 i, U
Delete子句的语法:
/ T; m9 B& u$ ]/ j
Delete [表名.*]
* \3 l& x' j( k" O: _# \
FROM 来源表
2 D' d+ ~. l- z; Q* K7 q6 y
Where 准则
( c3 ~" P8 z* A% i" R
例: 要删除所有94年前的定单
' \' A2 ]/ P+ Y( G$ c
Delete *
7 I( ^1 B* ?( \, f4 T! }
FROM orders
( |% q2 c* Y$ ?- H# s4 |' {/ @
Where orderData<#94-1-1#
* _7 N1 R0 F2 e+ g% ^ \) a: }$ G
3 追加查询
# f$ H; _" ^* n. Q! j: @
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
! p7 P0 O/ r6 S+ E+ H0 E0 V8 m
INTO 子句指定接受新记录的表
5 M" e* s6 [# b- v
valueS 关键字指定新记录所包含的数据值.
! V( ?+ z$ g8 w0 w# }
Insert 子句的语法:
9 w6 s4 e0 q6 K4 z4 \; p: B6 B; Y
INSETR INTO 目的表或查询(字段1,字段2,…)
" y0 P) i8 e, B: i+ e0 S
valueS(数值1,数值2,…)
1 I: r) n$ [3 M" F( y9 P
例:增加一个客户
: t: |! D) b. {& r5 j" s
Insert INTO Employees(FirstName,LastName,title)
2 U+ f2 {" t1 i( k8 V5 ]8 Y
valueS(‘Harry’,’Washington’,’Trainee’)
6 B4 Q3 X0 U2 I/ P; r
4 生成表查询
' w- f" F# |! z$ e% U0 M
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
0 d3 M0 W+ |0 {+ {
Select INTO子句用来创建生成表查询语法:
4 {6 n! ]; }4 Q. g& B% W, P0 r
Select 字段1,字段2,…
6 a( f: T' Y; V5 `! K
INTO 新表[IN 外部数据库]
3 F. N9 u# G h- r: `7 }9 v& }: p
FROM 来源数据库
, ? |0 b0 W$ z0 }* c4 N! E, j! u
Where 准则
# H6 K" M$ W8 s" [
例:为定单制作一个存档备份
' W- j( c) f4 {: K+ W1 \
Select *
& O2 }# x) Z8 _( B8 e1 T6 _
INTO ordersArchive
" A" a) \) S: L. s& x
FROM orders
( C1 R6 J9 @) c J# K
八. 联合查询
: @; C) }$ G6 H) o
UNION运算可以把多个查询的结果合并到一个结果集里显示.
; T) N# i) p) N1 i3 Z) I0 x
UNION运算的一般语法:
0 {( T0 D6 }6 p. x1 W- l6 J% u
[表]查询1 UNION [ALL]查询2 UNION …
- f; b7 E9 e- O0 K
例:返回巴西所有供给商和客户的名字和城市
2 x4 B5 L( s# S, Z: P: t: E
Select CompanyName,City
3 _3 y. I5 k# @3 h2 h" z
FROM Suppliers
! Q6 L! I9 Y0 V, k: a" c. ]
Where Country = ‘Brazil’
: x; k( E3 v# f6 b9 a* i
UNION
5 F w" U5 B2 q6 c; d# O! g& F) g* ~
Select CompanyName,City
% d% a5 A1 Z( p+ Y; g8 ^ Y" w
FROM Customers
) s% P% z3 I. i5 w: o! v
Where Country = ‘Brazil’
6 u1 {- E) L' L: D+ \) b
注:
& C6 a& X& J4 i6 C1 _/ p) m
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
. \3 D# f# f$ o* F
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
t5 m- h& x0 p2 H( n
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
5 g8 v/ j- K5 H1 V. k- J' x: R; p! \
九. 交叉查询
9 f$ ~2 @ `* l
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
# h" |, G$ @* \, H2 N' j" `
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
9 U. z+ w- L: t7 @# J+ m
TRANSFORM aggfunction
' q/ S& ?* ^& j
Select 语句
+ X4 S8 w2 A, c' ^& `
GROUP BY 子句
2 j' S) O! n$ A
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
" _2 l |! ]. ^3 o
Aggfounction指SQL聚积函数,
& k* g3 c% \1 n, B
Select语句选择作为标题的的字段,
( V: X& A# @2 A" f' j; C+ D
GROUP BY 分组
* M. O6 @" D. ^; o
说明:
; d" i& R0 W2 c
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
I7 U! Y& W; I! h; {5 D5 {
value代表创建列标题的固定值.
* {. b+ g$ Z& B& Y
例:显示在1996年里每一季度每一位员工所接的定单的数目:
8 A: \$ A4 ~$ X8 t$ S) [, E
TRANSFORM Count(OrderID)
$ Y Z! E& n% J9 ?# b9 t; j
Select FirstName&’’&LastName AS FullName
5 w' u4 e8 y8 r" [* O
FROM Employees INNER JOIN orders
2 N8 i3 o, P9 G/ Y" b
ON Employees.EmployeeID = orders.EmployeeID
" H. e. E1 ]6 e/ N6 g0 t
Where DatePart(“yyyy”,OrderDate)= ‘1996’
6 i( K* G- r6 }0 c# l
GROUP BY FirstName&’’&LastName
; P' U: E, J2 }/ j5 ~- r8 Y( i) i
orDER BY FirstName&’’&LastName
- {8 ?$ C) ?, o F9 o/ ]# |. f# S
POVOT DatePart(“q”,OrderDate)&’季度’
* N$ b& Z2 Z5 o. C2 Q
十 .子查询
- `8 I! t/ Q x; R$ O1 K1 X
子查询可以理解为 套查询.子查询是一个Select语句.
& b4 U. j5 `. g2 W$ Q# I
1 表达式的值与子查询返回的单一值做比较
4 X" ]9 u H! I) f! C
语法:
' @+ A" x+ I* Y3 |: v6 x# i
表达式 comparision [ANY|ALL|SOME](子查询)
2 A. O0 }7 p1 `: q) _, T
说明:
- S* r% ~$ Q% i( l
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
8 @* `' Z1 d5 `% `$ {
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
# M; I: B1 t" `0 E
Select * FROM Products
7 r9 N/ j1 z5 a. _; M
Where UnitPrice>ANY
' L" i e( Y3 x7 ^
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
; l I6 w0 [* F8 \. h
2 检查表达式的值是否匹配子查询返回的一组值的某个值
V; ?7 S0 ~1 Q
语法:
9 z" H5 y. {0 n1 T
[NOT]IN(子查询)
7 u& k; h. D& N* p3 a2 \( O/ s3 G5 Q
例:返回库存价值大于等于1000的产品.
1 x! g* q' u# T; S; U- `
Select ProductName FROM Products
7 N- U$ h' W, `+ s5 E5 Y( F
Where ProductID IN
* R$ |0 o: _* p+ Z
(Select PrdoctID FROM [Order DEtails]
+ z$ K3 l* _. h4 j0 @. T3 e: V3 h* k
Where UnitPrice*Quantity>= 1000)
) G) c# T, r5 F2 d
3检测子查询是否返回任何记录
4 {) N8 a& A# r4 \1 z; S
语法:
5 h6 k3 P* `8 H' k. T4 J4 ?; z4 i2 W
[NOT]EXISTS (子查询)
$ r; N& o, z+ o: a7 ?% |
例:用EXISTS检索英国的客户
) ?- u, e0 y; \
Select ComPanyName,ContactName
; D9 W3 q c8 E* k* |7 J
FROM orders
: z3 v; y t" A9 V* W: v
Where EXISTS
l4 ~# `* i5 l" w0 A9 s; x0 n
(Select *
& _) l+ ~, v) e9 b, Q
FROM Customers
; W1 f. Q7 }* T4 i) \. P H3 S% x( O9 T. {
Where Country = ‘UK’ AND
" a ^5 `# T% R1 j
Customers.CustomerID= orders.CustomerID)
欢迎光临 航空论坛_航空翻译_民航英语翻译_飞行翻译 (http://bbs.aero.cn/)
Powered by Discuz! X2