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

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

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

Access如何筛选重复数据以及Select语句的完整语法
! q1 d4 t. P& S7 {# y
, [2 P% d( E, D8 Rselect distinct 字段 from 表名3 M8 g0 [+ E( j( r' l) c* K+ h
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。" x- n$ \7 l2 w# E) f7 E
一.Select语句的完整语法为:
+ p/ K4 w2 q' f3 _9 b+ lSelect[ALL|DISTINCT|DISTINCTROW|TOP]
2 Z, t6 ~$ n4 R{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}( ^7 S; d. |: o- P7 r& D
FROM tablee xpression[,…][IN externaldatabase]
# H: w( A( a# a; E3 B[Where…]
2 m. T9 Q, `' X2 ?  ?' ~+ W  p[GROUP BY…]
$ u5 o  g1 s! i9 l' |+ y' a[HAVING…]
6 R7 ~+ E2 c9 G  E[ORDER BY…]
' ^8 f/ j. k, J+ S( s2 F[WITH OWNERACCESS OPTION]
2 A8 i7 @: O* x0 \; c* A说明:
; C- Z$ _, x& h用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。8 L1 q. P+ r" F- u( X3 _
1 FROM子句9 r* E' j# c+ {
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
9 l7 P- R5 S1 ]5 e) m: g8 a例:下列SQL语句返回所有有定单的客户:
; n* ]: Q4 Y3 q+ H+ n( MSelect orderID,Customer.customerID* b9 H; p, t* ~6 R
FROM orders Customers# \  {6 z# ^& f* u2 }. y
Where orders.CustomerID=Customers.CustomeersID* L, ?( W+ }! i0 m7 r7 N: D
2 ALL、DISTINCT、DISTINCTROW、TOP谓词6 n6 f! Z5 A; b2 R# ^4 _7 D/ {( M
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。% _2 z4 N" \/ `4 G( O
例:Select ALL FirstName,LastName
  \. {# q" W, u% q% e; j' W  `FROM Employees6 W0 ^( _: ?9 \  ?! t
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
3 ?! s$ y3 v. @3 T+ z(3) DISTINCTROW 如果有重复的记录,只返回一个
* ?! s3 ~$ I) t6 @5 b, T  b(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
$ U7 m2 I, b* @' ^例:返回5%定货额最大的定单  I( }6 O8 Y7 q- c1 i( o* K
Select TOP 5 PERCENT*
- Y6 M; {4 V8 TFROM [ order Details]
1 X: Q: ?* S0 e( ]. TorDER BY UnitPrice*Quantity*(1-Discount) DESC
) P4 u, T8 l1 }( P" S* n# G3 用 AS 子句为字段取别名
# _9 Y: ]7 Y0 [1 D7 R如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
1 Y/ l" _- r6 p$ m7 a+ a0 Y例:返回FirstName字段取别名为NickName
: [4 ?$ c1 t  W) e  w' q- _+ J, gSelect FirstName AS NickName ,LastName ,City
( O. g3 L9 p4 Y1 cFROM Employees; H) V: i  D- t! x
例:返回新的一列显示库存价值) T4 b) j" q# \2 t
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock& k) K$ S9 P+ L6 ^7 c/ \4 P! c
FROM Products
7 {5 E+ O' n8 d二 .Where 子句指定查询条件
9 L" ?2 p2 C, y, s' m* p) ?2 q. T1 比较运算符
9 u5 a- L% D0 Z0 L9 C# G7 y" b比较运算符 含义" Y8 o7 r  r0 q! ?$ F& c  q
= 等于" G4 D& ?  a1 p; V
> 大于. R, \4 m# Q# i' S
< 小于3 Y+ n0 d3 B" a/ c9 Z, x2 [
>= 大于等于
) M8 I7 M; T: n<= 小于等于
# q# F  l% Q2 x! @<> 不等于9 i3 d) a3 o% Q9 `6 h6 V
!> 不大于0 h; o; V) M0 V* a  b& d% Z
!< 不小于* S! M9 {. w9 E& J- H/ D( k
例:返回96年1月的定单
% T, e' A# K( w" l% QSelect orderID, CustomerID, orderDate7 G5 q# o2 U7 t- `/ g  f
FROM orders
2 L# w% d+ G0 {2 \  R& K/ y+ D6 JWhere orderDate>#1/1/96# AND orderDate<#1/30/96#! \/ |1 \% p4 @- R* z2 U6 o
注意:3 `' g8 e8 K7 E4 ]/ p0 P  E
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。* t9 \' s+ A" C5 {6 r9 K- A1 e$ t
例:
7 c9 y0 ^  |5 t8 [, T0 aWhere orderDate>#96-1-1#0 o4 J1 f+ [+ K- i- v
也可以表示为:
8 f% R6 c* F, Q$ M: P8 d. u. {& D* mWhere orderDate>Datevalue(‘1/1/96’), d+ _' N8 w6 K2 G# k
使用 NOT 表达式求反。" ^3 Q+ m9 z, o& b7 P* l7 ]1 z$ R
例:查看96年1月1日以后的定单  n8 ]8 Y( H& s0 `1 F" e
Where Not orderDate<=#1/1/96#1 `7 B" c8 e$ D' c
2 范围(BETWEEN 和 NOT BETWEEN)1 |! K& C, W& t
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
+ w0 z( y& g3 t$ Y$ X- p% j例:返回96年1月到96年2月的定单。
' K- @8 F8 I0 U; BWhere orderDate Between #1/1/96# And #2/1/96#
6 K- `( r& X0 d* W0 K" `3 列表(IN ,NOT IN)8 p9 u( M1 h0 H
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
3 n5 B' f& t. m- e2 E- k/ [例:要找出住在 London、Paris或Berlin的所有客户& S9 [, W: E  L0 D( ^3 f
Select CustomerID, CompanyName, ContactName, City+ [# d  g9 P$ R$ R
FROM Customers/ \  _# l, b' p8 I  I
Where City In(‘London’,’ Paris’,’ Berlin’)
; n) w4 X0 v8 r, A* z5 \6 J( H4 模式匹配(LIKE)
: Y9 l' ?7 G7 G& z. \LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。' b  w/ Z! I; T  u
LIKE运算符里使用的通配符
6 b! B9 K" j& |通配符 含义
7 C' n0 [4 z* L1 H) W7 q- q4 m? 任何一个单一的字符! S5 J# P5 m$ Y+ P5 I
* 任意长度的字符
/ P- V+ j; G  U9 k# z, F; D# 0~9之间的单一数字+ X0 l1 P) V7 D0 m
[字符列表] 在字符列表里的任一值
0 N- i5 o" R6 \  L+ z9 \) n( u[!字符列表] 不在字符列表里的任一值
- d- h6 X1 R" V+ |7 B% ]! p- 指定字符范围,两边的值分别为其上下限8 _6 j, Q) h7 y" i
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
" Q* y5 ~5 I9 J6 Q4 b# J/ ZSelect CustomerID ,CompanyName,City,Phone
5 Z0 x, f, k& ]2 p$ eFROM Customers
4 m1 S+ Z3 U9 KWhere Phone Like ‘(171)555-####’# {! G0 H! H+ e
LIKE运算符的一些样式及含义9 w. v3 \1 O0 |( n
样式 含义 不符合
4 w1 ]8 j) Q/ F% Q7 GLIKE ‘A*’ A后跟任意长度的字符 Bc,c255' w- i4 S, Y( o8 n9 d; O; Z
# LIKE’5’ 5*5 5552 j1 i3 h+ i6 K, p4 ?* U
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5* f- J" B' ~) \$ c! _6 [/ Z9 i0 |
LIKE’5##5’ 5235,5005 5kd5,5346
' M' b. s& n" m4 v5 H, U2 |LIKE’; K5 E2 ~% p3 f: n& `, k' |
[a-z]’ a-z间的任意一个字符 5,%8 o# I, V0 j' g/ U* K2 t$ C
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
: P* {  h$ o1 }: ~LIKE’[[]’ 1,*. Z- `/ q) ^4 d/ X4 }$ d3 ^
三 .用ORDER BY子句排序结果
' M/ F5 Y2 P' E- GorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
; z1 s7 y/ s9 Y8 HorDER子句中定义了多个字段,则按照字段的先后顺序排序。
  J: e! B% F0 y- K: ~9 x" S例:
6 c- ~( W4 I. ?8 U/ o6 `1 MSelect ProductName,UnitPrice, UnitInStock
+ i& c: A0 _/ Y' x: ?9 NFROM Products6 _+ y) C* w1 H* e3 b* `" t6 x
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
$ F' G( V, E: A2 C+ I6 b/ forDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
$ L9 ~/ D5 u8 q0 g" l% D0 l例:下面的语句产生与上列相同的效果。
* O, P" l8 J5 h: l( T3 ~, i7 b& W! bSelect ProductName,UnitPrice, UnitInStock/ k  v4 I% H/ Z6 M& O; x
FROM Products; P1 k4 g( ~" v, {- Z
orDER BY 1 DESC , 2 DESC,3$ M. b1 o" y- ~& C$ [! ?
四 .运用连接关系实现多表查询2 R4 j+ f% [1 f( f( h
例:找出同一个城市中供应商和客户的名字
3 e! i, q$ n! @, Q+ F, GSelect Customers.CompanyName, Suppliers.ComPany.Name2 T4 r/ R" i% F$ U
FROM Customers, Suppliers
$ @# |& B5 L% f' g- i+ t) O% @Where Customers.City=Suppliers.City5 O+ H& t$ e, u( c  c& J, |* J; ?
例:找出产品库存量大于同一种产品的定单的数量的产品和定单' }7 T7 C$ D& H  E4 Y: O& M
Select ProductName,OrderID, UnitInStock, Quantity
) D. p5 r. W  ]" [& JFROM Products, [Order Deails]
, R( K9 g, s- f% G1 p) bWhere Product.productID=[Order Details].ProductID- ~" D) l) T6 \8 ~
AND UnitsInStock>Quantity$ A& M! O0 ]) j2 F% B9 s! d$ p
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN1 {& }( ~8 g" o8 O. Y0 J- G
语法:
: E5 J: C9 w. G# Y  h4 QFROM table1 INNER JOIN table2
8 B% ?) @6 m* {% V' w/ kON table1.field1 comparision table2.field29 H! I) I9 K8 ^2 `4 ]( W
其中comparision 就是前面Where子句用到的比较运算符。9 x8 V! I  o. [- S
Select FirstName,lastName,OrderID,CustomerID,OrderDate" v/ l  j" b+ W$ C$ {: m, T# h
FROM Employees
; b7 b8 |+ {6 m' D- s1 \; KINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID/ j8 `, g. S. k! w  y
注意:
6 r' G' s) a1 g! W9 ^' bINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。" ?7 Z+ v% S4 q2 n* T/ M
在一个JOIN语句中连接多个ON子句' J+ I" I  w9 j/ D
语法:1 K2 }3 o: n" ?
Select fields
3 Y. w  p, R" T2 m1 V5 ^FROM table1 INNER JOIN table2
5 z/ g6 D  W! _# c8 J* n: XON table1.field1 compopr table2.field1 AND
$ E. M# _2 @1 x3 c0 G# h; V9 _ON table1.field2 compopr table2.field2 or
: i, B( j, W) l3 ]3 l. z, }ON table1.field3 compopr table2.field3. p' ?" P  c: H1 `4 `# k6 v1 H
也可以) X1 `5 `3 O; r4 z' {" o3 H
Select fields
3 u4 w' O( B4 X; c& h& ZFROM table1 INNER JOIN
& G: j8 c9 h+ r3 Y4 F(table2 INNER JOIN [( ]table3
$ o4 J: K- O9 w( k[INNER JOER] [( ]tablex[INNER JOIN]
0 {5 Z3 o7 k+ b4 xON table1.field1 compopr table2.field1
% w5 U" ]8 o" U# q/ YON table1.field2 compopr table2.field25 l7 y) n8 g6 x+ N) ~
ON table1.field3 compopr table2.field3
  F) i7 r0 M3 `" v; S  O5 N, Y& w& t外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。8 p6 N$ T4 h# ^5 v7 y" q
FROM table [LEFT|RIGHT]JOIN table2- r7 F+ M2 A9 k- M6 u" N5 b
ON table1.field1comparision table.field23 u! ?+ j  R6 g# I. i
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据" ?( Y. l0 [  w
例:不管有没有定货量,返回所有商品
1 o" e, r& G- `0 i: I5 K5 ~Select ProductName ,OrderID
9 C: f; P+ t* G  S5 w: t9 A! LFROM Products
% o/ R$ t* N% d$ r9 vLEFT JOIN orders ON Products.PrductsID=Orders.ProductID5 Z- n; o) L9 m, W; S: c& x3 X
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
$ _% C7 S1 \. F1 A: X例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
9 @5 H- V4 }) L0 C6 D3 ~( ~: T. e空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
2 P0 B# l3 V$ Y" G; n1 }Select *
, N! z) C4 W# w. OFROM talbe1
, f7 _0 ?# z! |0 gLEFT JOIN table2 ON table1.a=table2.c
9 @5 N% H2 |; ^6 D7 \( ~1 连接查询中使用Iif函数实现以0值显示空值
5 j; Z+ z5 C7 z- r9 Z; M+ k( I% IIif表达式: Iif(IsNull(Amount,0,Amout)
9 c6 Z4 Q3 x) X7 m& \7 G例:无论定货大于或小于¥50,都要返回一个标志。
! D" h' Q: k" K" dIif([Amount]>50,?Big order?,?Small order?): |  u" }- K6 @4 f. k
五. 分组和总结查询结果
/ g) E8 E' M, O# w- v  e在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。4 f/ H! p; y. G, P9 @; ~9 E( ?3 ?
GROUP BY 子句的语法
( R$ o5 Y; [; R/ X+ S( p9 @/ `Select fidldlist
- L- Q) Q2 q; V4 F) L8 l2 NFROM table) E0 d1 u! }  n# E1 x( ~
Where criteria. e& g. O) J, r  Z6 q  g
[GROUP BY groupfieldlist [HAVING groupcriteria]]: _, J, K5 m, f. W8 Q* F
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。! v9 X# x. H( p; f' ^
GROUP BY字段中的Null值以备分组但是不能被省略。/ b. ?4 ^9 A$ K/ V5 T
在任何SQL合计函数中不计算Null值。
' D! r5 A! h) m, ]$ n9 ^  nGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。" E+ g4 I4 C/ m2 P' U
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
* h( o+ R/ L! V: W5 q- XSelect Title ,Count(Title) as Total% U# z; ~* D# i# u0 }0 z% n
FROM Employees+ U6 F5 N: m9 h/ q- |( h5 s
Where Region = ‘WA’+ I, \. d1 I; Y5 I' j# n( V
GROUP BY Title
  u3 d& y/ T* J# L- H1 kHAVING Count(Title)>1
+ M9 l! f' h  K; xJET SQL 中的聚积函数
: z1 d% B# A  F& N3 i聚集函数 意义
& ?  v  |5 w7 X' jSUM ( ) 求和
7 c6 I& D6 N0 h$ qAVG ( ) 平均值
" _3 \" j2 m% ?7 F0 OCOUNT ( ) 表达式中记录的数目. W( _* E/ V' u7 C1 o' R+ E
COUNT (* ) 计算记录的数目
& r6 e6 J: R. ~- }MAX 最大值
/ X% G- g. |" e- vMIN 最小值
# `7 e  [  o0 B: i* s' s# LVAR 方差
7 M; l% `; ^; V/ B* U2 cSTDEV 标准误差
$ E4 x+ S2 k% W. [3 W: C1 V! P3 }FIRST 第一个值
+ ]! n" X  ^/ [' t# @2 zLAST 最后一个值
$ ]. Y: ?8 x' }9 l5 p9 y六. 用Parameters声明创建参数查询: Y' c4 T# {0 |* I, |8 O
Parameters声明的语法:$ ^1 J. D) w4 K' f* }. U4 ]  F
PARAMETERS name datatype[,name datatype[, …]]5 r2 ]9 i" Q8 ?
其中name 是参数的标志符,可以通过标志符引用参数.0 m: G. B( b4 b: i
Datatype说明参数的数据类型., b3 \5 H( D4 V. @9 A: @- T
使用时要把PARAMETERS 声明置于任何其他语句之前.7 ^- s& I' Q6 b( z- _
例:
1 Z' c0 H- L; l2 G3 v; j0 TPARAMETERS[Low price] Currency,[Beginning date]datatime
# o. k* U( }" {% V" WSelect orderID ,OrderAmount/ M3 s; ^4 u; ]- e$ k; [" E
FROM orders
6 E, T! o* x9 `% cWhere orderAMount>[low price]9 K) y$ O9 Z# r$ x# M2 {& J
AND orderDate>=[Beginning date]0 Z( M2 T. O: M8 g! y, K& k+ K
七. 功能查询
2 d0 z! S# f& c% }+ E# O$ L所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
1 k* l3 D. M! c1 更新查询
0 S$ e7 w5 z( r7 N  g7 jUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.- x9 w( A5 t- @6 T: X6 y
更新查询语法:! J- I8 T( n. c& L
Update 表名
# ?" w' X' y# c  @4 V5 qSET 新值3 Z; A! |3 H( G+ j7 B/ V
Where 准则  n4 s) U4 `5 j+ i9 u
例:英国客户的定货量增加5%,货运量增加3%
% Y1 z5 u$ h0 k1 }4 s( r6 HUpdate OEDERS
' x5 l8 K% ^! E  J6 |SET orderAmount = orderAmount *1.1
8 a4 K( E. M8 ^! J, E/ V, sFreight = Freight*1.03
" |: T# Y  u* f% V- K1 fWhere ShipCountry = ‘UK’
' Y. L4 c1 A# F) ?, f8 y5 {; i5 Q2 删除查询: v+ t; g" i  b9 v0 |3 h
Delete子句可以使用户删除大量的过时的或冗于的数据.
, b% z2 g& Q3 t1 g注:删除查询的对象是整个记录.2 @& P* K5 u, a6 o3 i, U
Delete子句的语法:/ T; m9 B& u$ ]/ j
Delete [表名.*]* \3 l& x' j( k" O: _# \
FROM 来源表2 D' d+ ~. l- z; Q* K7 q6 y
Where 准则( c3 ~" P8 z* A% i" R
例: 要删除所有94年前的定单' \' A2 ]/ P+ Y( G$ c
Delete *
7 I( ^1 B* ?( \, f4 T! }FROM orders( |% q2 c* Y$ ?- H# s4 |' {/ @
Where orderData<#94-1-1#
* _7 N1 R0 F2 e+ g% ^  \) a: }$ G3 追加查询# f$ H; _" ^* n. Q! j: @
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.! p7 P0 O/ r6 S+ E+ H0 E0 V8 m
INTO 子句指定接受新记录的表
5 M" e* s6 [# b- vvalueS 关键字指定新记录所包含的数据值.! V( ?+ z$ g8 w0 w# }
Insert 子句的语法:
9 w6 s4 e0 q6 K4 z4 \; p: B6 B; YINSETR INTO 目的表或查询(字段1,字段2,…)
" y0 P) i8 e, B: i+ e0 SvalueS(数值1,数值2,…)
1 I: r) n$ [3 M" F( y9 P例:增加一个客户
: t: |! D) b. {& r5 j" sInsert INTO Employees(FirstName,LastName,title)
2 U+ f2 {" t1 i( k8 V5 ]8 YvalueS(‘Harry’,’Washington’,’Trainee’)
6 B4 Q3 X0 U2 I/ P; r4 生成表查询
' w- f" F# |! z$ e% U0 M可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.0 d3 M0 W+ |0 {+ {
Select INTO子句用来创建生成表查询语法:
4 {6 n! ]; }4 Q. g& B% W, P0 rSelect 字段1,字段2,…
6 a( f: T' Y; V5 `! KINTO 新表[IN 外部数据库]
3 F. N9 u# G  h- r: `7 }9 v& }: pFROM 来源数据库
, ?  |0 b0 W$ z0 }* c4 N! E, j! uWhere 准则# H6 K" M$ W8 s" [
例:为定单制作一个存档备份
' W- j( c) f4 {: K+ W1 \Select *
& O2 }# x) Z8 _( B8 e1 T6 _INTO ordersArchive" A" a) \) S: L. s& x
FROM orders
( C1 R6 J9 @) c  J# K八. 联合查询
: @; C) }$ G6 H) oUNION运算可以把多个查询的结果合并到一个结果集里显示.
; T) N# i) p) N1 i3 Z) I0 xUNION运算的一般语法:
0 {( T0 D6 }6 p. x1 W- l6 J% u[表]查询1 UNION [ALL]查询2 UNION …- f; b7 E9 e- O0 K
例:返回巴西所有供给商和客户的名字和城市
2 x4 B5 L( s# S, Z: P: t: ESelect CompanyName,City
3 _3 y. I5 k# @3 h2 h" zFROM Suppliers! Q6 L! I9 Y0 V, k: a" c. ]
Where Country = ‘Brazil’: x; k( E3 v# f6 b9 a* i
UNION5 F  w" U5 B2 q6 c; d# O! g& F) g* ~
Select CompanyName,City
% d% a5 A1 Z( p+ Y; g8 ^  Y" wFROM Customers) s% P% z3 I. i5 w: o! v
Where Country = ‘Brazil’
6 u1 {- E) L' L: D+ \) b注:
& C6 a& X& J4 i6 C1 _/ p) m缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
. \3 D# f# f$ o* FUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.  t5 m- h& x0 p2 H( n
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.5 g8 v/ j- K5 H1 V. k- J' x: R; p! \
九. 交叉查询9 f$ ~2 @  `* l
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
# h" |, G$ @* \, H2 N' j" `Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
9 U. z+ w- L: t7 @# J+ mTRANSFORM aggfunction' q/ S& ?* ^& j
Select 语句+ X4 S8 w2 A, c' ^& `
GROUP BY 子句
2 j' S) O! n$ APIVOT pivotfield[IN(value1 [,value2[,…]]) ]
" _2 l  |! ]. ^3 oAggfounction指SQL聚积函数,& k* g3 c% \1 n, B
Select语句选择作为标题的的字段,
( V: X& A# @2 A" f' j; C+ DGROUP BY 分组
* M. O6 @" D. ^; o说明:
; d" i& R0 W2 cPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
  I7 U! Y& W; I! h; {5 D5 {value代表创建列标题的固定值.* {. b+ g$ Z& B& Y
例:显示在1996年里每一季度每一位员工所接的定单的数目:
8 A: \$ A4 ~$ X8 t$ S) [, ETRANSFORM Count(OrderID)
$ Y  Z! E& n% J9 ?# b9 t; jSelect FirstName&’’&LastName AS FullName
5 w' u4 e8 y8 r" [* OFROM Employees INNER JOIN orders
2 N8 i3 o, P9 G/ Y" bON Employees.EmployeeID = orders.EmployeeID
" H. e. E1 ]6 e/ N6 g0 tWhere DatePart(“yyyy”,OrderDate)= ‘1996’6 i( K* G- r6 }0 c# l
GROUP BY FirstName&’’&LastName
; P' U: E, J2 }/ j5 ~- r8 Y( i) iorDER BY FirstName&’’&LastName- {8 ?$ C) ?, o  F9 o/ ]# |. f# S
POVOT DatePart(“q”,OrderDate)&’季度’
* N$ b& Z2 Z5 o. C2 Q十 .子查询- `8 I! t/ Q  x; R$ O1 K1 X
子查询可以理解为 套查询.子查询是一个Select语句.& b4 U. j5 `. g2 W$ Q# I
1 表达式的值与子查询返回的单一值做比较
4 X" ]9 u  H! I) f! C语法:' @+ A" x+ I* Y3 |: v6 x# i
表达式 comparision [ANY|ALL|SOME](子查询)2 A. O0 }7 p1 `: q) _, T
说明:- S* r% ~$ Q% i( l
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
8 @* `' Z1 d5 `% `$ {例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品# M; I: B1 t" `0 E
Select * FROM Products7 r9 N/ j1 z5 a. _; M
Where UnitPrice>ANY' L" i  e( Y3 x7 ^
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
; l  I6 w0 [* F8 \. h2 检查表达式的值是否匹配子查询返回的一组值的某个值  V; ?7 S0 ~1 Q
语法:9 z" H5 y. {0 n1 T
[NOT]IN(子查询)
7 u& k; h. D& N* p3 a2 \( O/ s3 G5 Q例:返回库存价值大于等于1000的产品.
1 x! g* q' u# T; S; U- `Select ProductName FROM Products
7 N- U$ h' W, `+ s5 E5 Y( FWhere ProductID IN
* R$ |0 o: _* p+ Z(Select PrdoctID FROM [Order DEtails]+ z$ K3 l* _. h4 j0 @. T3 e: V3 h* k
Where UnitPrice*Quantity>= 1000)
) G) c# T, r5 F2 d3检测子查询是否返回任何记录
4 {) N8 a& A# r4 \1 z; S语法:
5 h6 k3 P* `8 H' k. T4 J4 ?; z4 i2 W[NOT]EXISTS (子查询)$ r; N& o, z+ o: a7 ?% |
例:用EXISTS检索英国的客户) ?- u, e0 y; \
Select ComPanyName,ContactName
; D9 W3 q  c8 E* k* |7 JFROM orders
: z3 v; y  t" A9 V* W: vWhere EXISTS  l4 ~# `* i5 l" w0 A9 s; x0 n
(Select *
& _) l+ ~, v) e9 b, QFROM Customers
; W1 f. Q7 }* T4 i) \. P  H3 S% x( O9 T. {Where Country = ‘UK’ AND
" a  ^5 `# T% R1 jCustomers.CustomerID= orders.CustomerID)




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