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