航空论坛_航空翻译_民航英语翻译_飞行翻译

标题: Access如何筛选重复数据以及Select语句的完整语法 [打印本页]

作者: 帅哥    时间: 2009-11-10 10:28:12     标题: Access如何筛选重复数据以及Select语句的完整语法

Access如何筛选重复数据以及Select语句的完整语法
$ x$ `/ g8 y3 p2 v9 c0 p8 Z/ p  l. ]7 D- C
select distinct 字段 from 表名
' e0 p/ W, k0 k( X9 Kdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
  S; C+ h! D  ]9 a* ~一.Select语句的完整语法为:: s7 R; d# Q: o) j! f
Select[ALL|DISTINCT|DISTINCTROW|TOP]
5 B& l4 H7 s6 b! B/ |{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
* \9 O7 e/ B: o1 |9 wFROM tablee xpression[,…][IN externaldatabase]$ @# _  F* x4 i5 @9 @9 n' }
[Where…]3 d0 w$ ]; k7 y. U! C4 O: X3 c; ^
[GROUP BY…]
, S8 f8 K6 z* x4 q) j[HAVING…]4 H8 F$ y$ ?7 j) v( y5 }' K
[ORDER BY…]$ ~% y7 z! W7 H$ z
[WITH OWNERACCESS OPTION]: L1 p2 N% }- _; s8 ~
说明:
5 k/ X( ]: z- B用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。3 i6 D* j5 c4 L. a: w1 m  @
1 FROM子句1 \  o& }% v, ]+ @( p
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。$ g; U" p4 C: t3 T8 G
例:下列SQL语句返回所有有定单的客户:
' n# G% O/ H* @& C" x  \. GSelect orderID,Customer.customerID; ^  L7 M6 V2 B) N
FROM orders Customers6 U" j6 R5 d* z* @1 e, C
Where orders.CustomerID=Customers.CustomeersID
" _% L$ R4 Z4 ^: Q# K0 v" e( x2 ALL、DISTINCT、DISTINCTROW、TOP谓词
# n0 M* J8 e9 w( K6 I(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
* i  [* ]' [4 V( s) U. n* ], W例:Select ALL FirstName,LastName
- k: R: X$ q% D. R( }0 wFROM Employees
% x8 o3 l; ]2 `( T" _9 t/ d(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。1 X& `; ^& n, ]4 G5 c: U' K" A
(3) DISTINCTROW 如果有重复的记录,只返回一个
8 z- U5 c* X- M! M(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
8 G' J3 F6 r/ q例:返回5%定货额最大的定单
4 O' B! O% @' K2 l) O7 e- k0 j1 ySelect TOP 5 PERCENT*
& k- G. y( [+ W6 S: [FROM [ order Details]' K+ W8 y5 n  p! P. o
orDER BY UnitPrice*Quantity*(1-Discount) DESC
3 F* ]/ |: h" W' s  c( @: }" B# T7 q# r3 用 AS 子句为字段取别名# U7 [1 M: }# [: y
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。& H) y% a/ S: b. d& v
例:返回FirstName字段取别名为NickName& x+ Y' F* ]; H. j7 s* Y
Select FirstName AS NickName ,LastName ,City
* R5 V0 @" ^; X# zFROM Employees% k. S: G1 [! [8 f" G- W5 k
例:返回新的一列显示库存价值- G$ c2 y1 w! f- C  v5 A5 e6 i
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock) ?% f* d% d$ k( Y* l0 z% w
FROM Products& r, w9 L6 \2 O6 ~; C& V/ l( V
二 .Where 子句指定查询条件" _3 Y& }+ f. ^+ [' [" @- L* H: k  H
1 比较运算符
" F1 h& `4 W( _比较运算符 含义
  d" n6 |9 f$ f+ O) ~: G7 x= 等于; U7 |5 z) q5 L1 u
> 大于% {8 G6 p4 M' ~# l4 [# f
< 小于
8 p8 v5 P2 ^3 |' Z& T3 ^>= 大于等于
, t: M" h" r+ i) i. u<= 小于等于4 J/ O+ ]3 Q. O: J$ Q  f% x0 g
<> 不等于
2 r6 s/ \# N0 h4 W8 c!> 不大于
  V$ n+ g  A* i1 s& J* b+ v!< 不小于
" [- }8 @, y7 z7 |- |例:返回96年1月的定单& ]2 ]$ N9 |: `( ~- V
Select orderID, CustomerID, orderDate  Y# f) i( W  J% ]/ e: |0 r
FROM orders$ }9 b+ N5 p  H7 p
Where orderDate>#1/1/96# AND orderDate<#1/30/96#4 f' U2 I1 I& V9 X6 G
注意:
% ~8 _' b9 P' \* l$ x+ S2 EMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。5 T+ T; U. y6 H. K
例:
* Z. Y' A' }. n+ s9 V) d  j1 H$ @9 c. OWhere orderDate>#96-1-1#5 [0 v. P. V; f  D8 j
也可以表示为:1 z1 P9 X; k& I  u5 b# Q1 d# ^
Where orderDate>Datevalue(‘1/1/96’)2 G: c, }/ K# E, n- \: t
使用 NOT 表达式求反。9 i% c3 Q" e7 F8 ]* Q$ w
例:查看96年1月1日以后的定单! `1 \- P1 i3 F
Where Not orderDate<=#1/1/96#
. Q, v& K0 C6 g! \6 ]# ^1 ^2 范围(BETWEEN 和 NOT BETWEEN)
4 j( w* Y. G4 ~6 Z* T" }& VBETWEEN …AND…运算符指定了要搜索的一个闭区间。. `* |1 W; N% N! H
例:返回96年1月到96年2月的定单。
) Q) `! O# h8 F& nWhere orderDate Between #1/1/96# And #2/1/96#
9 U8 ~5 w7 @9 B- |: ?# N3 列表(IN ,NOT IN): l/ b8 n6 j/ h5 F' _: j
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。6 G5 C2 x$ V9 @# s
例:要找出住在 London、Paris或Berlin的所有客户7 x8 L7 I+ l% {1 f2 G) c
Select CustomerID, CompanyName, ContactName, City( d' ]$ L& ?6 M3 N' o% {& ?$ ]1 Z
FROM Customers
6 o+ N. `8 r5 k! h6 h5 b5 zWhere City In(‘London’,’ Paris’,’ Berlin’)8 u; b9 ~2 d8 W! I: {, j
4 模式匹配(LIKE)+ B- g% H. {& b9 J/ J$ _5 n
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
, M+ ?4 G7 k5 R, M+ lLIKE运算符里使用的通配符
6 ~6 \& b8 L9 V- X! B+ }通配符 含义
' |% G0 g' b& r0 V? 任何一个单一的字符- G6 Y7 s! R( l7 s9 D8 n* F4 u' u
* 任意长度的字符9 B/ g2 ?) Z0 j; Q0 Y" g$ ?. Y
# 0~9之间的单一数字/ q% K9 b/ \* h/ V; Q5 u
[字符列表] 在字符列表里的任一值; t$ h  H* I3 J8 b+ g
[!字符列表] 不在字符列表里的任一值
! X) J, B$ e8 ~: \" U! p. O9 b- 指定字符范围,两边的值分别为其上下限) U+ \. p' `" d3 P7 ~( Q1 X
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户9 l' ^2 _0 T9 m
Select CustomerID ,CompanyName,City,Phone$ b. X1 J3 c+ |0 b
FROM Customers; K. n6 z" |& n7 E8 M. c
Where Phone Like ‘(171)555-####’
+ q! x0 H0 i) |) V) X6 |0 ALIKE运算符的一些样式及含义
$ t5 W' Y- N' f6 W5 m. {$ H8 k样式 含义 不符合
  E- d' V" T* l1 g$ GLIKE ‘A*’ A后跟任意长度的字符 Bc,c255
; B% f' _7 Q3 d$ Z# LIKE’5’ 5*5 555
4 M0 h% G  b4 z$ p; CLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5( ~6 D, i# A; ?5 U5 J: R
LIKE’5##5’ 5235,5005 5kd5,5346$ d0 R# m! T# v+ H
LIKE’2 y+ A* }$ I" O7 C4 w
[a-z]’ a-z间的任意一个字符 5,%
( {) L& ~: E1 \2 e) G0 R0 nLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
0 q( a: C) J0 ~- F9 Y9 {% ^5 ?LIKE’[[]’ 1,*
% n" `+ I& q* l8 h" F$ f  @三 .用ORDER BY子句排序结果& Y1 O' E) R% A  }) o, }
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
; p# C; n# K, f0 I" _' {" r. I: g, {orDER子句中定义了多个字段,则按照字段的先后顺序排序。4 g! s9 ^8 E9 I( h4 G% }$ X- `
例:! {+ B% v5 X% r3 C) N
Select ProductName,UnitPrice, UnitInStock% v; J- m7 X$ M9 s3 b
FROM Products
! @7 g1 ~2 C1 S6 d+ J0 o" f- |orDER BY UnitInStock DESC , UnitPrice DESC, ProductName& s6 U  D9 g1 }3 Z4 `
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
$ s' y, m: [# Z* R' t例:下面的语句产生与上列相同的效果。
' L8 w6 }9 ~; F# ~6 d$ U3 D! NSelect ProductName,UnitPrice, UnitInStock# L0 A2 Q4 n- O5 d+ ]
FROM Products5 [- s, @( O( w- }
orDER BY 1 DESC , 2 DESC,3
, n+ \0 ?9 C+ C; R四 .运用连接关系实现多表查询, @- z  ^$ C1 O2 h. W% w8 N4 F7 U
例:找出同一个城市中供应商和客户的名字
# z7 `+ d0 l3 a& M  B4 jSelect Customers.CompanyName, Suppliers.ComPany.Name7 B# ]7 k9 G4 x- P
FROM Customers, Suppliers, ~) v( s; [2 b' O: Y! M% I, q
Where Customers.City=Suppliers.City& P/ J$ i7 F  v6 s0 v( W$ Z) s
例:找出产品库存量大于同一种产品的定单的数量的产品和定单! Y3 i5 b) a/ ?9 n
Select ProductName,OrderID, UnitInStock, Quantity0 Z. r$ D1 E$ e4 a2 X
FROM Products, [Order Deails]" N& |/ |& p, C/ s. {
Where Product.productID=[Order Details].ProductID8 R2 H. P' q$ [) N& A* E. K
AND UnitsInStock>Quantity
* ?5 ]$ a$ |' \/ t8 |另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN* ?% Z7 A% F3 F* S. o- k
语法:
" Q: D. X% Z" ], w/ V/ Z5 gFROM table1 INNER JOIN table2) W- ~8 i/ ?7 y! P4 A- s" N, u1 @
ON table1.field1 comparision table2.field2
' P: U, Z2 q4 g9 P5 }其中comparision 就是前面Where子句用到的比较运算符。$ x; c0 I0 W( a, H* Y7 P4 s& r- g
Select FirstName,lastName,OrderID,CustomerID,OrderDate+ A! c7 n. W9 S
FROM Employees
  {% J6 ~3 O! |INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
" Y) \! f: @* r3 F# U. ~" ]注意:
1 L1 x. ?" E7 OINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。$ K- f3 a5 o; E" B1 q3 R
在一个JOIN语句中连接多个ON子句
! Y% G, U8 A, `7 D( F语法:: f5 B0 I1 z& ]* y6 z* c
Select fields: ]+ N- r9 n. ?3 j
FROM table1 INNER JOIN table23 ]$ l1 f" u! f0 p
ON table1.field1 compopr table2.field1 AND/ a, w* F* n5 `9 P, f# P
ON table1.field2 compopr table2.field2 or
! G, w( \# v" F1 K/ y9 V- X/ \ON table1.field3 compopr table2.field3
5 d4 f( W, }8 e# {6 Q' j' ~+ I也可以1 b( [1 v3 y4 b" ^/ C. K
Select fields
- K# W* j* h5 P& TFROM table1 INNER JOIN- x2 u# w: a3 a
(table2 INNER JOIN [( ]table3
2 F8 A5 m+ e" s9 g4 T! F1 y9 h[INNER JOER] [( ]tablex[INNER JOIN]8 @( c0 Q# {& D! A/ z" e& [
ON table1.field1 compopr table2.field1
: y- u, L2 O5 w2 @" f2 SON table1.field2 compopr table2.field2
7 }1 P( Q, [7 ?/ t* qON table1.field3 compopr table2.field3
/ f+ V: C4 T* }7 v/ @% |外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。3 E% \' U; @9 Q9 J, q  W
FROM table [LEFT|RIGHT]JOIN table2( e- B7 H* ?& f' e. h9 Z+ @) j5 D
ON table1.field1comparision table.field2
4 n) T  K& u4 Y, L7 ]- s用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据: X0 b# z' K7 C" L
例:不管有没有定货量,返回所有商品5 W0 y7 U; f2 s0 W( C' Y7 m
Select ProductName ,OrderID+ y& C! {( f  b: {7 C2 f& N3 b- u4 G/ d
FROM Products
* w8 O4 N4 z& ]2 }LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
, b2 w( u( g+ U. Y! y右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
6 ~6 }, k% `& y  g2 I$ M/ W# [" \例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。2 W! F! f/ t  L( ^
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
+ O: k$ O' U; F# q7 YSelect *
( ?2 z; P, x2 r3 ]/ Z' DFROM talbe1) Y+ w3 v. r  Q# ?1 t1 U
LEFT JOIN table2 ON table1.a=table2.c
) Z; q4 h" M% o0 e3 ^1 连接查询中使用Iif函数实现以0值显示空值
+ C. \& g3 c2 ?4 e. p  lIif表达式: Iif(IsNull(Amount,0,Amout)
/ V  p, U0 d) D! y. f# u7 V7 ]# P例:无论定货大于或小于¥50,都要返回一个标志。
7 M9 O5 q3 s% I# Y3 @1 hIif([Amount]>50,?Big order?,?Small order?)
  H' s0 m. o8 @0 k' Z五. 分组和总结查询结果, v8 g' k. r9 b5 c' O0 Q5 s- Q
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。6 Y' Q- Y6 u2 q& b
GROUP BY 子句的语法9 d" n6 u/ ]/ c) v
Select fidldlist
4 i9 f/ O, f3 R. f) R& d5 @FROM table
  c- g1 a6 q7 N" g7 k/ h" \7 XWhere criteria+ |/ T, N1 o+ @4 A  s2 v7 [
[GROUP BY groupfieldlist [HAVING groupcriteria]]7 ?- W3 d  ?, b* e/ T
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
& e! L8 J6 I6 ZGROUP BY字段中的Null值以备分组但是不能被省略。
0 E. ~6 l2 v8 ~/ _0 F9 ^' k在任何SQL合计函数中不计算Null值。
* \. h# j" s+ r; Z& N0 O' \GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。6 I8 H' x1 a' q% r5 L9 A8 Z
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
) V8 l1 N3 G  \% i- O4 jSelect Title ,Count(Title) as Total* U; }2 n, E2 r" v
FROM Employees
2 h' E: q8 x# T; i  XWhere Region = ‘WA’* l1 V  M% y4 |: J
GROUP BY Title  w0 l$ n2 a/ y# n
HAVING Count(Title)>1, d: k. b  H, j- @2 p6 H; N& b6 ?2 n
JET SQL 中的聚积函数
5 d: d& ?: L/ o+ R8 d& o聚集函数 意义( W! u, ^- r: r( g& ~
SUM ( ) 求和4 p2 R/ L: J7 z8 j
AVG ( ) 平均值: j# N* @. L9 a6 S
COUNT ( ) 表达式中记录的数目
4 W; G) t# w4 P) y$ S/ a8 QCOUNT (* ) 计算记录的数目
- V; K+ r5 A5 R! }. F' j5 S4 _2 jMAX 最大值* A. y6 A% `% w7 Z4 F# D* I
MIN 最小值) a% F- B2 P- L+ R
VAR 方差# ~6 _6 B4 u( f! x, q$ E
STDEV 标准误差
! e1 E2 N9 f& f& q4 \FIRST 第一个值; a: W7 k: N  y6 G( A/ R% J
LAST 最后一个值
; P1 ^( N/ X  |& d: |  c3 D六. 用Parameters声明创建参数查询7 a3 G0 z7 A5 b. R& s
Parameters声明的语法:$ B9 R- H# D- {
PARAMETERS name datatype[,name datatype[, …]]7 `7 p( f* `4 w7 S' A' d
其中name 是参数的标志符,可以通过标志符引用参数.! c# d8 B+ G, ^. m7 ^. O
Datatype说明参数的数据类型.
  V  I) H8 s  b使用时要把PARAMETERS 声明置于任何其他语句之前.2 F1 V$ a/ g% T) D7 M# T8 ~
例:: t; C. Z" ~7 l5 V$ \% W7 p6 o" `0 @
PARAMETERS[Low price] Currency,[Beginning date]datatime( T2 [/ a! u" j3 Y5 H8 j7 l
Select orderID ,OrderAmount) ^) \+ D1 |& J- D- r- u% B8 r
FROM orders" Y) ~9 a4 l/ u6 g. a8 g
Where orderAMount>[low price]/ g5 ]& c; b* X  W% l; }
AND orderDate>=[Beginning date]  o2 t3 ]4 U; P9 Y; B. v# j# i& X
七. 功能查询3 c1 \0 ?) C( ]6 x. x/ ]
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
% h/ ^" }2 m& [. F5 N1 更新查询6 }% t, \! r# I# x. e
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.+ Q% d1 ^' W) K2 ?8 D8 P
更新查询语法:
' j  p9 V1 o0 Z( a5 e0 ~" r& mUpdate 表名3 S3 W1 o7 A" `9 H& K
SET 新值
$ c" V$ V0 z7 ]6 x' ZWhere 准则# e2 O9 f4 l/ Z0 a9 @% p+ L+ ~* F( h7 {
例:英国客户的定货量增加5%,货运量增加3%
3 o. Z( {% E$ m; J4 }' Z( K6 `Update OEDERS
* k" e. _7 C$ k6 R8 k8 L1 f8 CSET orderAmount = orderAmount *1.1. y, D; P4 k, _& m- v# g
Freight = Freight*1.03
5 a, z/ i4 q4 zWhere ShipCountry = ‘UK’1 D8 ^* P* G$ k: I8 G: p% e. j
2 删除查询0 y, D8 k0 }* G! Q. c; ^
Delete子句可以使用户删除大量的过时的或冗于的数据.
1 ^1 t. P( ?: F6 f+ A. x0 k9 F# {8 C注:删除查询的对象是整个记录.0 y6 N; C2 f8 s3 X
Delete子句的语法:
  i9 l: J) F5 ?  g$ cDelete [表名.*]
* N& b) `( ~& p2 x* K4 u; p2 nFROM 来源表
! i1 R  F  S8 B' z4 F( X9 [Where 准则
* Y" ?1 T! P& R9 c  N' A例: 要删除所有94年前的定单% O7 Z% y" B3 k! a" `' ^( U- ]
Delete */ S; a5 i6 \3 E
FROM orders
6 u: ~5 I  i7 Q* t! B3 m% i; t* wWhere orderData<#94-1-1## @) Q* O. U0 s; o
3 追加查询
" s4 F5 t2 V# U9 h: H4 bInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
2 \: X& w2 q9 H7 L$ l0 nINTO 子句指定接受新记录的表- @: c; _" D" A
valueS 关键字指定新记录所包含的数据值.6 d1 T5 O% V: R
Insert 子句的语法:
$ w$ A, i& I; n/ Q& zINSETR INTO 目的表或查询(字段1,字段2,…)
/ i0 _7 i: Q9 SvalueS(数值1,数值2,…)0 R; ^, L: s, \( R$ V1 t
例:增加一个客户
+ N9 z& O1 D; g# NInsert INTO Employees(FirstName,LastName,title)# h( }+ f& Z6 Y, i4 y1 C# g6 g
valueS(‘Harry’,’Washington’,’Trainee’)$ h  f4 x0 G0 u& E: y
4 生成表查询
1 x7 \! H0 u( q可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
: ^) l% ?0 D3 K; hSelect INTO子句用来创建生成表查询语法:  |3 Q  d* m- k! D2 o7 j9 E
Select 字段1,字段2,…& \; H1 j6 x& P6 g3 \: k0 i# b, ?
INTO 新表[IN 外部数据库]
( [" G/ V8 K. Q: b. c" n' v5 t1 uFROM 来源数据库
1 X) W! m; I5 g, b6 S3 z- d0 OWhere 准则
! b/ B) C+ k3 \7 c  r( |! z例:为定单制作一个存档备份6 b4 \; L; b4 U# d! J" R
Select *6 t+ z+ |5 x6 o/ Q: ]1 |
INTO ordersArchive% A5 M7 r, s2 i& `" [# u  T8 m5 y
FROM orders
" ]: n# S$ F, }- X6 H+ V6 x八. 联合查询
, J3 J/ ]1 l9 v5 J0 mUNION运算可以把多个查询的结果合并到一个结果集里显示.
# t2 F. K+ }! \UNION运算的一般语法:
- r2 g. V! [5 n4 d7 [" G1 E[表]查询1 UNION [ALL]查询2 UNION …
* [& `- t( n4 N/ D" I例:返回巴西所有供给商和客户的名字和城市
$ z+ l3 M0 D4 a- `0 z0 U) JSelect CompanyName,City' k" b( B: C* K3 @
FROM Suppliers
; }: E! g9 a6 L" X* s, f# Z  eWhere Country = ‘Brazil’7 r4 T/ Y/ t9 N+ W8 C$ @
UNION& H2 B' U# G8 w. l# Y. d5 w
Select CompanyName,City
8 A/ b7 `+ c0 Y! ~4 L8 }FROM Customers
2 ^3 j7 i4 S2 X. S: u; B/ e6 NWhere Country = ‘Brazil’1 w# x: U6 x* O1 z; J! q" Z
注:: T, h. J# D6 c/ W; {6 @0 w! L1 g
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
7 _' ?0 b3 W5 ?UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.: r$ p5 m! G; M$ k7 d/ D4 h
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.6 A3 F8 g$ ^" u% G& s  m
九. 交叉查询) Q) e8 A, X/ E. k. W
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.  V0 e2 y1 A2 j8 d+ `
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
3 U$ I8 I4 `3 h3 `TRANSFORM aggfunction
9 L! n& N. r( @: wSelect 语句& ?) W' k4 N- x% z* e) L
GROUP BY 子句3 _6 N, h" q% D, c0 V3 `
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
& n% k. n) h- o! y, c, uAggfounction指SQL聚积函数,! k5 c4 m3 W$ l/ v
Select语句选择作为标题的的字段,; c2 J/ Q2 q- ^: v- X
GROUP BY 分组/ H% N3 O8 A* l; k6 c2 R
说明:
: U  J1 Y) n4 }# k. |5 ZPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.! v( x6 m4 _+ U/ S3 p! ~  J0 P
value代表创建列标题的固定值.
- x8 M0 E; j8 g例:显示在1996年里每一季度每一位员工所接的定单的数目:
. ]1 ~! T) L3 u5 r3 m  |TRANSFORM Count(OrderID)2 Z( j3 K7 Q& n# s
Select FirstName&’’&LastName AS FullName1 P9 W) n5 M7 Q1 y& @& A1 r+ J
FROM Employees INNER JOIN orders
( u% F. n$ }- [7 u! L( CON Employees.EmployeeID = orders.EmployeeID
+ i9 q, i8 R. j) U/ cWhere DatePart(“yyyy”,OrderDate)= ‘1996’+ e8 E) A% S' y4 J( M
GROUP BY FirstName&’’&LastName
6 ?' f  ]+ [) ?6 Z7 Q% ^8 Q1 }orDER BY FirstName&’’&LastName/ ^* m$ }( [* N0 g0 K# G9 x7 a( s
POVOT DatePart(“q”,OrderDate)&’季度’
/ ^+ X  o* }' }- o十 .子查询3 f2 ^" D2 m* G: X8 }5 }% o
子查询可以理解为 套查询.子查询是一个Select语句.
7 W9 ]. K) F- B& _0 O1 表达式的值与子查询返回的单一值做比较
( l2 F; _' V& ~8 q& w7 L7 L' L- B+ p语法:
' w1 {6 K2 L1 e4 P+ T" {+ I0 T/ T! k表达式 comparision [ANY|ALL|SOME](子查询)4 H" n0 `& f, m; l; z  n( V, j; m7 {
说明:3 j; m+ m) Y8 k
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值./ I4 j3 U8 E0 n) r
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品3 w7 b$ b8 N8 \  a6 T( D
Select * FROM Products
' W# u, I9 v! s9 p6 k  w+ AWhere UnitPrice>ANY% U7 K& }: N6 n7 ?, F
(Select UnitPrice FROM[Order Details] Where Discount>0.25)0 N* ~* C& X0 C/ n& z0 u5 T' t- c
2 检查表达式的值是否匹配子查询返回的一组值的某个值  D# n( ~8 S( `7 h6 H
语法:
% B, @8 E) ~& A8 Y+ n8 B$ m, V[NOT]IN(子查询)% j  L9 |4 n5 a* ], Y$ Q
例:返回库存价值大于等于1000的产品.' |; I( c7 L3 {
Select ProductName FROM Products  e7 O( z3 ?2 z# S' ?- O9 B$ w& Q" z
Where ProductID IN8 g- j3 L# {/ G
(Select PrdoctID FROM [Order DEtails]: y, |4 q* M: y8 a2 o3 e
Where UnitPrice*Quantity>= 1000)
% \; H: \# M' G0 F* N& t) S3检测子查询是否返回任何记录
9 G0 D' a- A$ l& q语法:% X  b4 q# D7 l
[NOT]EXISTS (子查询)  [8 G' j: s* V: b+ B8 e3 i8 c
例:用EXISTS检索英国的客户
" j" Z  x1 [- _  _9 J1 e3 XSelect ComPanyName,ContactName6 Z  J+ _. Q* a: O
FROM orders8 Q- A# }$ A) i
Where EXISTS
, G! o; N: _1 j" f(Select *
2 R; C& i; \+ I/ i# V. yFROM Customers" E8 h  n! \, T
Where Country = ‘UK’ AND
) u2 u4 f* m4 ~( \Customers.CustomerID= orders.CustomerID)




欢迎光临 航空论坛_航空翻译_民航英语翻译_飞行翻译 (http://bbs.aero.cn/) Powered by Discuz! X2