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