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