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

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

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

Access如何筛选重复数据以及Select语句的完整语法
* F' }/ E6 H! P; S/ Q/ K) D' K6 p  A
9 [  Y7 C- O6 B7 r. ]select distinct 字段 from 表名
7 c* Q& Z6 G. P0 e& X/ J3 rdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。- Y5 ~/ W9 X4 F) F; R5 B9 f
一.Select语句的完整语法为:
5 ^2 }' r* I& {( c" E& q) E) hSelect[ALL|DISTINCT|DISTINCTROW|TOP]
8 ?  d2 h) M5 f8 v" U) l; y{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
" Y7 c: o. J( V% [1 BFROM tablee xpression[,…][IN externaldatabase]' f5 ^3 X- V) ^% C: ?* N
[Where…]
7 c; W, J+ \. ][GROUP BY…]
  N1 T$ K/ m$ q( [( J# t3 V0 A[HAVING…]# e( |# }. K, V9 h8 ]
[ORDER BY…]4 u6 b  J6 S) P2 o( \1 I
[WITH OWNERACCESS OPTION]! G3 b# U* M( t
说明:5 @( t" }/ T  F, G' g3 a8 _
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。* Z' A7 G) B& A$ |% H
1 FROM子句0 n1 t+ D) R3 s" o3 D
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。6 {( L  |% y+ V9 T$ q7 g
例:下列SQL语句返回所有有定单的客户:9 @, S; J1 e! m" z* z2 `: M$ \
Select orderID,Customer.customerID
9 l4 u0 j* h; H5 }FROM orders Customers
7 W7 A, ~# f0 O1 M2 y% J  E/ yWhere orders.CustomerID=Customers.CustomeersID
% C3 o7 F7 @% i# G2 ALL、DISTINCT、DISTINCTROW、TOP谓词
" s; l2 K7 I( s- v(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
8 y$ q5 q* Y# U4 j7 T例:Select ALL FirstName,LastName3 C% u& |6 p9 \4 Y
FROM Employees
6 l0 \& M9 @$ D; O, n' k5 I(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
2 [7 d0 [8 |/ t5 J1 R(3) DISTINCTROW 如果有重复的记录,只返回一个# B* ]) a1 W) }2 q& r
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
4 s8 D6 H' d. Z. `( v例:返回5%定货额最大的定单
, o8 i; u" x' Q* y! RSelect TOP 5 PERCENT*
  {  T1 c, e1 {) A6 Y& ~2 F  HFROM [ order Details]
3 D  p4 L* t; J4 V+ l; l) morDER BY UnitPrice*Quantity*(1-Discount) DESC* a# v- v/ ^' `7 a3 W, o# d% ^/ O
3 用 AS 子句为字段取别名
9 C  r% E( }# O# g5 ?% q9 B3 N0 x如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
) H, D+ {5 W/ B9 Q6 o+ K8 B8 a例:返回FirstName字段取别名为NickName: y2 k# r; O% o/ E0 u8 [1 p; f# a# {
Select FirstName AS NickName ,LastName ,City0 P. c, W/ V7 H, l# w  Q8 F% j
FROM Employees. h$ m) W9 v+ B$ K) f* N
例:返回新的一列显示库存价值
6 S' v! \# j$ ?: Y4 f1 TSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock1 P1 i9 M4 H6 F' n" f
FROM Products
$ W: X) r2 k" m% K( x! d* y# F- f' g二 .Where 子句指定查询条件7 t# e$ G% E" [5 v- f
1 比较运算符4 ?4 q7 L' E$ @0 `+ G+ e. Q
比较运算符 含义# M( ?8 U% G$ l9 H6 R
= 等于
) v% J& J' _7 o" |: @( s> 大于4 {8 `: V, S3 j4 w
< 小于
1 o+ l% R$ p6 d; m>= 大于等于9 P7 }" c1 h" I; r: m
<= 小于等于0 @  }/ J' W# x2 M) T( t' a" v6 s
<> 不等于
3 @+ s0 l# j$ y% n, F# }!> 不大于4 `! Y* f+ S! u" J
!< 不小于
1 |& ~! K9 H( J- p8 W, r, v例:返回96年1月的定单
( ^5 d* ]4 ^3 f  L5 S2 p1 C1 gSelect orderID, CustomerID, orderDate
) A7 a& G4 ^- ?# ]; xFROM orders- V4 f5 e, P+ Y! V6 D- k& U
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
( `( D$ I( {& k6 {% U注意:' ~: J6 D7 r$ d: |. z! H
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。+ f9 f/ I. x  w+ b& Y5 @
例:
: w  ]3 o  x6 \! [6 R8 o7 ^Where orderDate>#96-1-1#& a9 @, t1 _$ A5 H7 }; E
也可以表示为:+ d8 ?2 S0 d% M! r0 d
Where orderDate>Datevalue(‘1/1/96’)
  @8 ^, k- S% h8 @使用 NOT 表达式求反。' I0 U+ n" ^0 p: ~$ ]; t# N. B4 V
例:查看96年1月1日以后的定单
1 m* O5 F9 M+ P' y% BWhere Not orderDate<=#1/1/96#
3 I8 ], I/ k# O' D2 范围(BETWEEN 和 NOT BETWEEN)
2 Y* z0 z1 i# YBETWEEN …AND…运算符指定了要搜索的一个闭区间。
9 P/ V$ c- B5 x* _+ n1 `例:返回96年1月到96年2月的定单。
& N8 w( ~0 P  l: k3 @/ }Where orderDate Between #1/1/96# And #2/1/96#
# }% Z( c( z, L" }% T! D& p- s3 列表(IN ,NOT IN)
7 h& J4 f% l1 J4 e; z/ ?IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。5 h; d3 |, ?' h, |
例:要找出住在 London、Paris或Berlin的所有客户
" W- ~% n0 g8 W- T; f" |Select CustomerID, CompanyName, ContactName, City
) t9 n- V; H3 ^4 zFROM Customers
% ~* b5 s( A5 E% w6 ^& t6 [Where City In(‘London’,’ Paris’,’ Berlin’)
& C" ^* ?. I" ?- s/ j# M  m4 模式匹配(LIKE)
( a0 t, c' h5 m; i( KLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
# K( u( L0 O3 n) ULIKE运算符里使用的通配符
! _& w7 _! ?" W通配符 含义
+ J. A, `' W/ U4 t? 任何一个单一的字符
5 R$ J# g; N# t8 u# r+ g* 任意长度的字符( c7 h; H/ e+ a7 k# `, P
# 0~9之间的单一数字; G: E6 ?2 \. a1 w% d: ]6 y
[字符列表] 在字符列表里的任一值2 I- ^* Y) q# E4 r
[!字符列表] 不在字符列表里的任一值- X2 j; T7 z$ l
- 指定字符范围,两边的值分别为其上下限
1 b5 D8 d' I  E例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
. C2 L$ b1 J7 [Select CustomerID ,CompanyName,City,Phone" H! \. B4 K+ e1 N
FROM Customers
) j# e" {# X) k8 e9 hWhere Phone Like ‘(171)555-####’
/ o$ f  `% e3 K2 b4 sLIKE运算符的一些样式及含义
6 c6 T# |) w+ k, r' z8 i4 D样式 含义 不符合/ ?' _. h+ H( ?, U5 a, L
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255! A* f+ \! Z# i- r! |0 {
# LIKE’5’ 5*5 555) E5 T# S8 ]8 ^* A* n% c
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer59 }3 E* y! o* ]' w' \/ h9 L0 Q1 m
LIKE’5##5’ 5235,5005 5kd5,53468 t$ `( j% C4 E# n
LIKE’, C  {9 C( d, i( H/ u! A8 c* ^
[a-z]’ a-z间的任意一个字符 5,%  X; U' p/ [, f6 X% M" |8 _7 y2 N
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
; m0 @$ t9 j6 S+ X$ o5 BLIKE’[[]’ 1,*, ?. k$ A, q, o+ y4 R
三 .用ORDER BY子句排序结果5 c& g4 @6 P% s: G- I  q
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
( O3 `$ |" ~7 u; P6 @" `& oorDER子句中定义了多个字段,则按照字段的先后顺序排序。
8 e& |4 _$ L7 M0 f8 M例:+ G- b- {1 ?' c
Select ProductName,UnitPrice, UnitInStock( O: n' F6 U/ h# o& ^  c% u
FROM Products% g, [' }+ ^# y( }) ]6 r
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
# y" u  w  t9 q. h6 Y& M' ^2 PorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。8 Z; W" f+ q) `3 J" H
例:下面的语句产生与上列相同的效果。4 G# U6 L2 J) I
Select ProductName,UnitPrice, UnitInStock$ A; R' H& k' C' P/ [3 a+ [8 o( `
FROM Products0 y/ ^4 X5 }6 D; ^, G% d, G. o
orDER BY 1 DESC , 2 DESC,3
0 i" ^( @$ u! j: e2 v四 .运用连接关系实现多表查询
! P, J2 a- Y+ I例:找出同一个城市中供应商和客户的名字, {. f/ ^) I/ A1 x
Select Customers.CompanyName, Suppliers.ComPany.Name. B7 j7 l- L" O
FROM Customers, Suppliers
; q$ S+ B9 X& ^: d+ z8 k( RWhere Customers.City=Suppliers.City
2 Y; ?2 X8 S: z9 \例:找出产品库存量大于同一种产品的定单的数量的产品和定单
9 ?) }" K/ F5 A* Q* S! qSelect ProductName,OrderID, UnitInStock, Quantity/ S" _: k# L5 K0 z2 y1 |; f
FROM Products, [Order Deails]
# o/ N; W& Y: y4 K$ D6 aWhere Product.productID=[Order Details].ProductID: s2 |: d: U' V# E
AND UnitsInStock>Quantity
# J6 G; s* f* v5 |) n' S另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
/ _" Z1 ?1 n; K( f3 j语法:4 i, c" C5 P9 s# h
FROM table1 INNER JOIN table2
3 S, `: C3 v. C$ \) H! dON table1.field1 comparision table2.field2
' q5 j; ~9 \: {- ^其中comparision 就是前面Where子句用到的比较运算符。7 g+ B3 J, y% p1 x7 X: c
Select FirstName,lastName,OrderID,CustomerID,OrderDate6 Q2 O2 J" H5 n. Z: p# ~" K
FROM Employees
9 u$ B/ S0 z  e$ a+ l/ NINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
9 E' @7 l) f$ u5 i- n0 j4 m注意:
; h6 N  e$ F- Z; w4 E6 U% qINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。: w4 u% G0 l8 U
在一个JOIN语句中连接多个ON子句
. r7 s# q4 |) [/ O语法:
- m) q) E1 T% S) vSelect fields; W4 e! x4 ?- ]# t2 n
FROM table1 INNER JOIN table2" U9 u+ C7 U9 W( v1 ?1 Y
ON table1.field1 compopr table2.field1 AND/ T$ x7 k/ H/ u
ON table1.field2 compopr table2.field2 or) p  n7 ~& E5 |% |8 v; S
ON table1.field3 compopr table2.field3
0 p8 d# ?* G) g- l- Q( C: [2 Y& \' N也可以4 w; \. B( S% e$ \6 R
Select fields
2 |* q& w6 F& H, N4 D2 X. i0 [FROM table1 INNER JOIN* Q/ P- Z9 l* B$ I) \- y& |% U
(table2 INNER JOIN [( ]table3
6 E9 `$ h/ p6 r. `, ^; V[INNER JOER] [( ]tablex[INNER JOIN]
0 a1 g0 e$ L* w. C2 V6 {% H9 yON table1.field1 compopr table2.field1
8 B( T, K9 c0 d& yON table1.field2 compopr table2.field2- B8 d" k3 b* a9 C$ w5 }
ON table1.field3 compopr table2.field3" W4 }8 H4 o! W" M
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
0 o/ x1 u  I5 ^9 D# m( zFROM table [LEFT|RIGHT]JOIN table20 g% V8 ~8 H% p/ P6 Y+ D7 y& L
ON table1.field1comparision table.field2! V) H1 s) S  @, n6 \
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据8 a2 k. J* P& z# }6 V) u# p
例:不管有没有定货量,返回所有商品0 _0 y  t3 H+ `4 I" {7 z, w0 n
Select ProductName ,OrderID
* x* e% T- ?  u# |/ m) ^6 hFROM Products" }( R( L- U' ^0 Q+ _+ n0 G
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
; E( E& ^( ?: v4 N0 f# H& {6 G右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。" U; Y6 T9 e1 |2 w: s
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
4 r7 g# t6 \- @2 h  Y空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。' ?2 g7 N1 L! |2 {% [* p
Select *% Q2 a0 L1 q! A' i5 B. c8 v
FROM talbe1
$ _0 P) P% ~6 WLEFT JOIN table2 ON table1.a=table2.c
2 x1 I1 x! L, o3 t, g0 [1 连接查询中使用Iif函数实现以0值显示空值
5 m+ L, p0 Q" D3 G/ T3 mIif表达式: Iif(IsNull(Amount,0,Amout)
" a" V) T& {  Y' G1 g例:无论定货大于或小于¥50,都要返回一个标志。
' R) B4 ^: ^) l* |+ s: {! zIif([Amount]>50,?Big order?,?Small order?)
" I$ p# w# T) M1 m4 ?. ^7 O5 @/ h五. 分组和总结查询结果  Y( V" s+ h! d8 F) n9 S5 k1 i
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
# @9 C  y0 F( [  y+ u" ZGROUP BY 子句的语法
# g7 O: f$ }+ B2 S- P4 R* I' t2 c  LSelect fidldlist
* L. l; Q7 l. M# [$ c. d' CFROM table
7 }/ V7 ^  ^6 o4 l0 d; NWhere criteria
5 ]  ]! ?( U( Z- B[GROUP BY groupfieldlist [HAVING groupcriteria]]
' B4 f, M4 t* f注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
& o2 L4 m. H! E: \5 Q: Q& dGROUP BY字段中的Null值以备分组但是不能被省略。$ U, T+ k- n' J1 X5 @* S
在任何SQL合计函数中不计算Null值。  g) G$ n, w0 @8 h6 F" u, b& ^
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。8 y* J* e7 v( T; t1 i2 i6 `
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
$ V2 I2 F" H) B+ w& w6 B6 _$ _! HSelect Title ,Count(Title) as Total
# p9 g1 S9 P% Z6 r  e0 D3 UFROM Employees
' q8 T& ]& c% w6 H5 cWhere Region = ‘WA’
" z2 W5 D3 ?& d; B$ NGROUP BY Title
8 A8 {9 U$ U" K* G! x! KHAVING Count(Title)>1! r+ f! `, k; j
JET SQL 中的聚积函数
6 R" V& Y4 F3 M& m9 K; ]9 l6 Q聚集函数 意义- S, F7 o$ k6 Y( Y: Y, n- D
SUM ( ) 求和
/ W; z. Z% S" W) |AVG ( ) 平均值) {- |, C" t' n! J, r( x
COUNT ( ) 表达式中记录的数目/ U) I0 @. C* U& _
COUNT (* ) 计算记录的数目8 g4 N4 `+ s- ]8 B5 F
MAX 最大值1 B' y- e" {8 F" T( Y/ O1 B
MIN 最小值
9 E7 {* C2 {0 Y/ S: x6 ]/ zVAR 方差, I& T% U0 A& o4 \( W4 K4 g7 e
STDEV 标准误差
) U  h7 [) c3 W  o  R) IFIRST 第一个值
+ z: j2 q! e& yLAST 最后一个值
3 }' I' y* E% Y/ J. X) W六. 用Parameters声明创建参数查询( X. w: B* c  ~7 X# O
Parameters声明的语法:
: r8 R9 d/ V( U% h6 QPARAMETERS name datatype[,name datatype[, …]]
5 j+ m: ^6 g7 E/ ?其中name 是参数的标志符,可以通过标志符引用参数.
5 `7 {+ e5 f- |5 Z4 pDatatype说明参数的数据类型.3 o; d3 y* Z" l: o+ Y/ R
使用时要把PARAMETERS 声明置于任何其他语句之前., W/ m) t5 \' V. W( {; k# _
例:4 L6 M" _- [% Z7 j' x+ L2 p# o. o
PARAMETERS[Low price] Currency,[Beginning date]datatime
5 [- _- N( g; L9 L+ y# iSelect orderID ,OrderAmount
5 Z4 `) g1 C" s6 k* iFROM orders4 D. {/ V, m1 V% G* |: f3 N
Where orderAMount>[low price]$ }: a7 D, C7 Z9 J. A1 T
AND orderDate>=[Beginning date]4 \- B7 _$ w1 @/ s
七. 功能查询
$ f* Q: T, y9 {& f, u" s所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
2 L! K6 N9 W( k# K; h  k/ M, P1 更新查询2 W! j+ K+ B+ Z7 V
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.  d% C% `; c4 K9 h+ }8 P, s
更新查询语法:
3 f% I+ c3 [7 T! t( JUpdate 表名/ b/ A* u# C, f
SET 新值
$ l0 L: u2 S' kWhere 准则
; D8 }" O2 n7 E$ P: O例:英国客户的定货量增加5%,货运量增加3%- g6 n$ d- d/ ~+ o+ G
Update OEDERS5 z/ x  @9 H0 d2 ~% O
SET orderAmount = orderAmount *1.1( b- v# \5 ^8 H7 }: B2 c+ {
Freight = Freight*1.039 V& x8 V" _+ }! F5 ~
Where ShipCountry = ‘UK’/ J8 d2 h* F' x% v" [
2 删除查询
+ c# |/ l- K: t' Z4 A: U6 z' }1 oDelete子句可以使用户删除大量的过时的或冗于的数据.3 t6 v0 C( B% T" k, A4 g  _
注:删除查询的对象是整个记录.6 R4 H4 U$ T! f, Z: v/ a- f
Delete子句的语法:8 U/ l0 n! }2 B- M
Delete [表名.*]5 ^. \$ b5 e' n3 j
FROM 来源表
3 Q/ m' W1 ~5 [1 T9 \Where 准则) {7 d2 U, r, m9 e6 W
例: 要删除所有94年前的定单+ S5 ?* M: {* q3 \- @
Delete ** ~# K3 U& B7 `( F1 i) i
FROM orders
- W1 _# f' S; s: |2 F8 dWhere orderData<#94-1-1#
$ Z0 Y: Q8 }% C7 X4 |3 追加查询* K3 `( {  z# p. L1 R" p
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.6 u  h+ u% {( N& I# g$ p/ F, R. d
INTO 子句指定接受新记录的表
) v* h; b, |- J( C+ yvalueS 关键字指定新记录所包含的数据值.8 n; }- W, A9 x& z! g2 _
Insert 子句的语法:! F/ p1 Y" n- |- i( d
INSETR INTO 目的表或查询(字段1,字段2,…)
" f: }! O0 n$ RvalueS(数值1,数值2,…)" w& @: Z! E' ]" j/ @) f8 t
例:增加一个客户+ D: b- n$ z3 \( q6 @7 ^
Insert INTO Employees(FirstName,LastName,title)) S. K: F7 [" s2 E, ]& z3 }% U1 n
valueS(‘Harry’,’Washington’,’Trainee’)
5 L4 M4 A4 a2 l4 L* S5 D, R4 生成表查询
! d3 k4 E& O: q4 @可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.6 r) u& u& }6 l+ X
Select INTO子句用来创建生成表查询语法:
' M6 a0 O4 O' @2 xSelect 字段1,字段2,…
. D. r4 z2 g6 u% v9 c2 P6 K& sINTO 新表[IN 外部数据库]/ V: E6 O; Y1 t& p4 d
FROM 来源数据库
7 ~3 m: O5 S5 ?  g8 wWhere 准则
' W7 T& d: w1 c! L  g# B例:为定单制作一个存档备份
* D, [# r: Z! b7 j  ESelect *
8 U9 P% n$ U7 _" C6 p) K3 YINTO ordersArchive
2 Z, b' ?; n- k! }- x2 l' l, CFROM orders- }* Y( b' M, _6 |
八. 联合查询1 g; r1 _% z. z4 D
UNION运算可以把多个查询的结果合并到一个结果集里显示.9 t, [' I* N/ h/ L$ Z! E. }5 Q) w
UNION运算的一般语法:8 K) f, e9 E$ J. L1 j+ V
[表]查询1 UNION [ALL]查询2 UNION …0 T  K  T) f% ^) d' @2 u" [% V0 Q
例:返回巴西所有供给商和客户的名字和城市3 {0 d' T& z% F6 [. {; ?
Select CompanyName,City+ X2 u0 t4 |9 G! T9 [+ u4 j' ?
FROM Suppliers
/ Z" ]  N  d3 h1 `7 tWhere Country = ‘Brazil’5 G$ Z# I! L5 o. S% H* ~" V
UNION
3 O- w6 w, Z! ?" e4 D' T/ U0 V% _Select CompanyName,City$ C! Z; v  n/ h8 A, O) o3 l
FROM Customers
4 t: Y, j$ g4 @1 d: O  m1 ?5 PWhere Country = ‘Brazil’
9 A' F: A' w. }, l) `注:
  U" h1 A/ f+ [: t1 k缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
1 j9 C/ x, n; ?4 eUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
( ]5 V6 z  A4 `每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.; ?$ l- v9 j+ u* S+ b" g1 X
九. 交叉查询
7 N% [9 b" S$ i8 [8 p; v交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.5 \) p# m4 c: L; S
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
/ j+ }3 v2 a# C- ^# x; e, _0 sTRANSFORM aggfunction
  J5 ^1 q4 j8 s: |$ g7 O. |Select 语句  K/ j  u. [: ?8 i
GROUP BY 子句
; R3 V& E+ S$ i. I* Z6 z' f% I' ~PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
* w- s3 J$ L1 _+ w( R4 d9 VAggfounction指SQL聚积函数,: K0 @  b2 D# F  K! g3 }
Select语句选择作为标题的的字段,
  Y# \; y4 [) PGROUP BY 分组
1 F1 G# Y$ Q& }) i说明:
5 J! o8 H: `% J/ l, _+ EPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.+ u. R6 E+ g9 o' T
value代表创建列标题的固定值.2 T& y5 x5 F; d! b* U
例:显示在1996年里每一季度每一位员工所接的定单的数目:
- V# X# j  m) J7 P% t  \/ \TRANSFORM Count(OrderID)
' K  |2 n- l' z$ ?& ZSelect FirstName&’’&LastName AS FullName. _" c$ h, y2 m; e
FROM Employees INNER JOIN orders' h0 K7 R, q- P% C
ON Employees.EmployeeID = orders.EmployeeID* {, Q8 g8 e+ W4 v9 Q2 O( r5 }* P
Where DatePart(“yyyy”,OrderDate)= ‘1996’
. O0 A$ g9 `* d' H8 g$ BGROUP BY FirstName&’’&LastName4 L) X# o; Y9 N' Y! C
orDER BY FirstName&’’&LastName
6 V# b7 C4 j8 {4 Q1 hPOVOT DatePart(“q”,OrderDate)&’季度’& k  O6 \- P: d' B: E8 v( h3 g$ @
十 .子查询
! }& l6 N) V: Z  \- p  N) _子查询可以理解为 套查询.子查询是一个Select语句.' P$ n( d+ x; A* w0 s; o: T/ O
1 表达式的值与子查询返回的单一值做比较, X. N/ x, r  ~5 S9 }4 n" @
语法:
2 e8 N! Z# x% d$ ]: G4 B6 y# U表达式 comparision [ANY|ALL|SOME](子查询)
1 K' e0 ^' L$ l* O说明:" |4 I% `( }, p3 j6 H1 n( h5 r
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.; i8 P( s( \$ }6 Y
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
$ k1 _2 B9 P. m! r9 e4 w9 J. b# s! RSelect * FROM Products; z$ O/ k; D! J$ d6 @: r
Where UnitPrice>ANY
' U' Q: ?9 T$ l5 B(Select UnitPrice FROM[Order Details] Where Discount>0.25); {( @7 _+ C7 T
2 检查表达式的值是否匹配子查询返回的一组值的某个值$ t6 @* ?5 A% S' u3 b
语法:
8 w2 Z0 h  K$ Z3 a+ S! K4 A[NOT]IN(子查询)
) A9 o! ^  P$ H9 u9 h例:返回库存价值大于等于1000的产品.
9 l! e( E+ P) WSelect ProductName FROM Products& x. P- e- ?; X6 v. Q3 ~4 k! i4 k
Where ProductID IN/ M2 G2 x( o0 N1 v5 E' Y
(Select PrdoctID FROM [Order DEtails]
# y2 y+ c8 ^6 ^8 f% w: q3 rWhere UnitPrice*Quantity>= 1000)+ r" w; G( _; X1 T
3检测子查询是否返回任何记录
( q' S% X+ w9 y+ |1 S- z4 m语法:
! t  ?9 e; r$ I1 Y" q# N$ F3 P[NOT]EXISTS (子查询)
% N% `- J9 d; m) W& u7 G7 ^8 G例:用EXISTS检索英国的客户
' Q- H6 m& K; I8 WSelect ComPanyName,ContactName
; J6 Q3 Y* o- p7 a% kFROM orders
* v; D& t% L: U+ T! a7 ?Where EXISTS+ J- o4 j$ u  u  D
(Select *
' p& w* g$ e  |$ T9 _8 s7 I: ]FROM Customers5 i7 ]# K. u9 T- I0 h. s3 T" }
Where Country = ‘UK’ AND" J4 K0 C. p5 z' G
Customers.CustomerID= orders.CustomerID)




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