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