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

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

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

Access如何筛选重复数据以及Select语句的完整语法
  ?( N' t: f. x" Z2 P$ d' E2 l  K* O) R3 X0 U
select distinct 字段 from 表名8 |% T* s# p6 c3 D
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
' k" ^% x$ S. b7 Z( t* K6 A# _一.Select语句的完整语法为:3 s7 I+ ^( Z; f& G4 ~+ n0 T% |
Select[ALL|DISTINCT|DISTINCTROW|TOP]
. b7 [4 ~* H( V8 Q6 Q9 g$ Y3 ?8 \{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}0 x% k0 [+ n# b7 w$ O/ F3 E
FROM tablee xpression[,…][IN externaldatabase]& J! m7 ?0 U/ r1 @3 W
[Where…]
0 I8 j0 p0 o$ o' r3 `+ ^[GROUP BY…]
9 ~# m  |; s6 M6 A- S6 B' r0 c[HAVING…]
. W0 n2 @% o2 Q6 l+ J" B. M[ORDER BY…]
5 I* Z4 {/ h9 \  i4 h* I/ V! Z! P- s4 E[WITH OWNERACCESS OPTION]
  q; ^6 z8 L# D, y, U说明:+ ^0 z1 d+ }9 E* X# b
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
( g" j5 {& |; W% D+ e$ @1 FROM子句
) q3 H9 S" Y  H3 P" P- y8 dFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。8 ^5 o9 k& g- u& {! l/ c: f
例:下列SQL语句返回所有有定单的客户:4 M& I! D* @4 W5 F) K
Select orderID,Customer.customerID
+ N9 K5 H9 y& \, JFROM orders Customers
( P7 S8 z& \0 g& A, [8 DWhere orders.CustomerID=Customers.CustomeersID. {( ]$ b5 T. A
2 ALL、DISTINCT、DISTINCTROW、TOP谓词1 }# y2 Z& Q- b/ N3 w3 l
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
0 B, S3 J& F* p, ]* A7 Y8 n例:Select ALL FirstName,LastName
7 w3 q/ v/ r0 h+ {( TFROM Employees9 a$ @/ ?, ~; P4 I
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。* J# H" {4 X1 u
(3) DISTINCTROW 如果有重复的记录,只返回一个
) r2 r$ {: W" E4 g5 |# R- Q( v(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
" a- g) ~7 Y/ q, R- L# g例:返回5%定货额最大的定单
. v) W: ]& |3 T) b, aSelect TOP 5 PERCENT*7 z$ [! \; p! {! `+ Z0 |
FROM [ order Details]
& Q0 K2 ?) V/ u/ Y) S0 B4 PorDER BY UnitPrice*Quantity*(1-Discount) DESC
# y5 `) v8 W2 X2 m  p% u7 O3 用 AS 子句为字段取别名, s+ I' C/ ]- o' T; e
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
- ]: V$ T2 q9 u. x" j. U1 ^7 y5 B例:返回FirstName字段取别名为NickName
( h) l# [5 d6 H9 y- t1 F/ H5 dSelect FirstName AS NickName ,LastName ,City
+ f- c- H; {! B# aFROM Employees1 `' J5 A) m# m7 T/ K( O
例:返回新的一列显示库存价值% K9 G1 {" a; d  H5 D
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
  W9 Q( G* F- GFROM Products
9 G% \! h6 ]  p6 p% L二 .Where 子句指定查询条件% F  T4 }8 C4 _* Y! i* Q
1 比较运算符% L7 B! Y& t1 ^) }0 D
比较运算符 含义7 ~& o2 `6 l2 K; X# e  V! m/ l8 o
= 等于7 V0 ?7 M$ o# P+ T" {$ l0 l3 Q- _8 \" @
> 大于% r  l9 X/ B$ x: I1 c/ D
< 小于
! e8 ^" M2 I. `9 d. L5 t& C* H>= 大于等于
; [! {2 m& y" Y<= 小于等于; @, p6 S8 R% o
<> 不等于
4 h. M1 _; i! K: K* X% t5 o!> 不大于
' Z! C$ e7 |+ j3 L4 T# E: ?1 K!< 不小于4 ]+ a6 R2 X+ y( [5 N+ a% v
例:返回96年1月的定单6 [, Y0 e' j9 B& k+ x3 P# X
Select orderID, CustomerID, orderDate( N# q/ v+ i% X6 [
FROM orders
& b1 p0 i, b% d# A% M6 XWhere orderDate>#1/1/96# AND orderDate<#1/30/96#% h5 D4 c  [7 p6 Y
注意:0 z: N% p4 Y; _7 m. `
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
- B) Z( d, Z+ {0 }例:
) n) E- ]$ p: D! gWhere orderDate>#96-1-1#
5 z8 c8 k7 ]  `8 k0 y9 s# {也可以表示为:8 P' I2 j# D) n7 r6 k6 q: Q
Where orderDate>Datevalue(‘1/1/96’)4 {* _6 a4 j( h3 j" {: R$ ^" r
使用 NOT 表达式求反。% k$ X9 }9 Y5 f. y6 [5 J) }
例:查看96年1月1日以后的定单
/ @- v, j: C+ G; e, z" SWhere Not orderDate<=#1/1/96#" }  y2 q9 O2 `% ?; D
2 范围(BETWEEN 和 NOT BETWEEN)
# G6 e9 J6 _( f9 b0 l6 }6 tBETWEEN …AND…运算符指定了要搜索的一个闭区间。5 p9 `# V) n  b9 B: m2 W% ^5 t# X2 L
例:返回96年1月到96年2月的定单。
- n2 I. X. I- ZWhere orderDate Between #1/1/96# And #2/1/96#
3 R" Z2 ?3 r: c/ q# |& Z1 F- |3 列表(IN ,NOT IN)
2 u+ g  @/ |- ^& Q/ KIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
1 Z5 q4 F: j8 z' s例:要找出住在 London、Paris或Berlin的所有客户: @. @1 D! _9 v2 V$ j. l7 {. y. L
Select CustomerID, CompanyName, ContactName, City5 m% V8 h% @: Z6 ?
FROM Customers8 A9 [0 o0 C' G2 k: o9 H
Where City In(‘London’,’ Paris’,’ Berlin’)5 A) _' f- v+ s! o. N
4 模式匹配(LIKE). T# C4 Y5 W4 z1 u5 R/ {" \
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。& S& G) x! E9 D, d% i/ R8 j
LIKE运算符里使用的通配符
( V+ e; q3 _/ d5 E通配符 含义* B  E9 X' p5 O. r6 P, z. N( ^
? 任何一个单一的字符5 C( X5 _2 a3 g2 ^
* 任意长度的字符
4 T6 q% y' F' `$ z# n% b# 0~9之间的单一数字
' F( w4 T* A; Y5 M5 D[字符列表] 在字符列表里的任一值
+ r3 n' c, g) R0 t. f[!字符列表] 不在字符列表里的任一值& i0 A2 k0 O: h, k! x! j
- 指定字符范围,两边的值分别为其上下限
( {  ]: l0 g; G. \! y# }& Z1 l例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
) `/ ?4 G* n  l- R+ N  {) n6 ISelect CustomerID ,CompanyName,City,Phone8 I: e" R- D* _5 w/ R/ p
FROM Customers, f. O* Y( |( a
Where Phone Like ‘(171)555-####’
: z2 W1 \% L" a# v  ILIKE运算符的一些样式及含义' l2 p1 x; s; x
样式 含义 不符合5 v+ f% _% c# U$ I2 Z+ L9 O5 d
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
, Z' x1 v. t- Z1 t: B- D) t; c2 a# LIKE’5’ 5*5 555
2 D' ?) W+ D' dLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5. l- O+ X, ?; {
LIKE’5##5’ 5235,5005 5kd5,5346  a  W, c3 o4 d" H, l* l) W
LIKE’
6 |, N8 d; ~( R5 Z' h# I0 ^+ @[a-z]’ a-z间的任意一个字符 5,%
- U6 v; l( f5 v" T) G: Z! OLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1' r# ]+ u! w9 K. T3 h
LIKE’[[]’ 1,*9 `* w( ~) H. f8 c/ V/ l& @, f7 K
三 .用ORDER BY子句排序结果
6 [) O/ g$ {: K7 u& c9 F5 f2 T! W! ^orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。1 |  @6 i" a3 F( o0 t' S& w
orDER子句中定义了多个字段,则按照字段的先后顺序排序。( V/ a/ X1 M; f9 O2 }4 R
例:7 r7 K. W/ f7 |3 w4 {+ Z2 g
Select ProductName,UnitPrice, UnitInStock
- d5 t2 [1 i) ?6 w* p5 H9 xFROM Products' w$ ?1 \% g$ y+ x
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
! g' W- F3 I6 m+ m+ l( RorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。- N# [; v( y7 i
例:下面的语句产生与上列相同的效果。
, z6 \4 G# {8 L- T' H$ W: `Select ProductName,UnitPrice, UnitInStock) M) |5 C6 `! D& t/ d
FROM Products
/ K$ X, u8 ^; VorDER BY 1 DESC , 2 DESC,3! ?0 @# i5 k. l# ^5 J( s
四 .运用连接关系实现多表查询
( q: \% B! A9 ^. E; U例:找出同一个城市中供应商和客户的名字
% u: _4 ]; c6 @6 e0 E* Z5 BSelect Customers.CompanyName, Suppliers.ComPany.Name4 P( c& x1 ?% n
FROM Customers, Suppliers
$ ?9 y6 X1 T0 ~" N# \  PWhere Customers.City=Suppliers.City
  R/ P9 j: [- d: \4 p2 h, C例:找出产品库存量大于同一种产品的定单的数量的产品和定单
6 k6 ]8 v& O/ q, q* ^. iSelect ProductName,OrderID, UnitInStock, Quantity
, |$ c0 }$ U! _- ^1 V; eFROM Products, [Order Deails]
. I7 E' H! |/ a/ PWhere Product.productID=[Order Details].ProductID- w; L5 `8 z+ W. l
AND UnitsInStock>Quantity
( c8 }& l4 o+ H另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
3 x' y4 i' f/ b' d' |7 q/ b8 M语法:
- f7 m: z. ]! a" d+ f; K, AFROM table1 INNER JOIN table26 Y* p6 z/ I' k* V
ON table1.field1 comparision table2.field23 D; c9 U4 ?) j" V
其中comparision 就是前面Where子句用到的比较运算符。
; j! Y* f5 Z# a* @! [  Z1 ^Select FirstName,lastName,OrderID,CustomerID,OrderDate
$ ^5 a2 [5 p8 j- zFROM Employees0 r( |7 ~5 o# \1 A" K# ]1 ?
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID4 X* B6 s2 o! c, {" e/ A
注意:# f# ^; t2 U. ^
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
- D' J7 `4 f* ^; \) D  j! v在一个JOIN语句中连接多个ON子句( d- j9 F+ Z1 F
语法:
" s. g. \, r4 N+ X& Y8 LSelect fields' ^  `4 L4 D; m3 N- ^
FROM table1 INNER JOIN table24 h: P9 w8 S6 h, D2 e! A: u0 Z
ON table1.field1 compopr table2.field1 AND
. O6 m& Z6 K4 P1 hON table1.field2 compopr table2.field2 or  _; B$ ^, O' x  @. W
ON table1.field3 compopr table2.field3
% a* g, T, }2 k& }+ Q# |也可以- ^6 R0 y& t+ f" m% b) o; q' P9 T
Select fields
- }* h6 w3 T% v+ k. BFROM table1 INNER JOIN
# i5 ], A8 Z* a(table2 INNER JOIN [( ]table3
. p% b8 b, f7 ]/ }+ t[INNER JOER] [( ]tablex[INNER JOIN], Y* G( {7 u  H0 ?8 E8 E
ON table1.field1 compopr table2.field1
4 n( W- ^+ s/ ION table1.field2 compopr table2.field2* M% K* z$ |) c, n
ON table1.field3 compopr table2.field37 D3 k; @$ G4 _& g
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。' h6 ?. F& Y1 v0 i5 R* w* i
FROM table [LEFT|RIGHT]JOIN table2
. T& G$ E& c- r( n/ D5 \! }2 @5 EON table1.field1comparision table.field2
2 ^0 j4 m4 D! Z$ R/ H9 x用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据( \2 J/ _+ Y+ s% M& {  Q5 }5 D7 }
例:不管有没有定货量,返回所有商品
% t! }. Z% f/ I2 {; e0 |0 ]Select ProductName ,OrderID
8 I8 f9 s8 v" z9 fFROM Products
5 o  [* L: @9 C& z, yLEFT JOIN orders ON Products.PrductsID=Orders.ProductID2 O6 H& z" x; Z/ ]( N
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。: y& L5 U$ d2 O. H' x/ K
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。% F" |. P* f* Z1 k$ a- L  w
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。) A( |/ i  ]" C1 F( s
Select *
$ p+ X( F# E% T( k8 {% TFROM talbe1
7 s' ?+ j6 c! \) M% I" Y6 F, p, K+ JLEFT JOIN table2 ON table1.a=table2.c
. |, f! W/ Y% u1 连接查询中使用Iif函数实现以0值显示空值
& [+ G) ^: i& zIif表达式: Iif(IsNull(Amount,0,Amout): F- V9 s1 K8 s) r( m, w
例:无论定货大于或小于¥50,都要返回一个标志。3 p, F# |6 j' O: M& [
Iif([Amount]>50,?Big order?,?Small order?)
% P7 p8 S% w$ ]6 h五. 分组和总结查询结果9 Z# x* v! H" f3 B: X) }
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
% G, R" ^  V" @% }' uGROUP BY 子句的语法8 e/ v# ^2 N8 X
Select fidldlist+ w/ H/ ^& }% w0 n) u/ u
FROM table
! L7 f/ A/ T) H! ]& }& @3 aWhere criteria0 J/ n0 F& s) P
[GROUP BY groupfieldlist [HAVING groupcriteria]]
  o/ [) a3 Q' s% _( |( C3 ~3 G注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
% m& N; y# {, C# V3 Z/ \( fGROUP BY字段中的Null值以备分组但是不能被省略。
" E" R2 A' J% c$ P# l6 A在任何SQL合计函数中不计算Null值。
: P# |& m: z  c( H0 B, I% }GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
0 |, c- W, t7 r  m; h例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
3 N  k, K: S; ^Select Title ,Count(Title) as Total4 ^+ K6 _$ q' A  e2 b) }3 a
FROM Employees
: j/ O" h: i* j! W: H% a( i6 kWhere Region = ‘WA’$ j! g5 ?8 M) Q( Y& _, `* s2 F
GROUP BY Title8 c& ?6 _3 ~9 a+ g
HAVING Count(Title)>1
4 Y: ]- W* R+ u, W$ F) d; Q6 zJET SQL 中的聚积函数
, C! V; b) x5 J/ T! t4 X聚集函数 意义
2 o' A; |5 F4 B4 q2 C# VSUM ( ) 求和
, a. Y' q3 s4 F, l0 YAVG ( ) 平均值) D$ z* _0 W" o7 y' @) y, c
COUNT ( ) 表达式中记录的数目) _: z4 i) J" [) ]4 x8 X; [2 X
COUNT (* ) 计算记录的数目+ L1 p& o, G! E: M, \  x+ J6 i
MAX 最大值8 b! a5 |7 W: Z5 g$ Z( r7 N9 J
MIN 最小值+ H+ n5 l' k2 Y/ D/ T4 R) B
VAR 方差
! _/ U6 d5 Z# D0 _' s4 NSTDEV 标准误差
, F, a: u7 k$ P; u* EFIRST 第一个值
( ]4 n- C7 V9 N" b6 {" uLAST 最后一个值  ^; ]7 `$ x2 }) w$ p
六. 用Parameters声明创建参数查询
1 x# o8 P2 Q4 i. MParameters声明的语法:3 h( E6 |% @7 P3 i9 X: A
PARAMETERS name datatype[,name datatype[, …]]
& _' t4 N' }; J, m其中name 是参数的标志符,可以通过标志符引用参数.
! x( _; z8 ~9 o0 h, Z& W8 t  YDatatype说明参数的数据类型.0 e. }  Z- ?# V5 E
使用时要把PARAMETERS 声明置于任何其他语句之前.6 Z. Z4 s' S& q" W6 X, a+ d
例:
4 L8 s( a/ w  l2 [4 E# MPARAMETERS[Low price] Currency,[Beginning date]datatime
! F1 T  L$ b" d: Q1 l9 E, T3 h$ z6 |Select orderID ,OrderAmount) L8 Y1 w4 {) M2 l+ l
FROM orders$ M; f' L# a3 T/ t6 N
Where orderAMount>[low price]* j: m2 m  K" H1 r- ?  N. e8 ?
AND orderDate>=[Beginning date]
1 n) [1 T7 T: B# c七. 功能查询
, H" c( D! a; ~% j4 g所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.3 Y3 s- S& O+ E# ^) I4 H; c% t
1 更新查询  M- d% Y4 G8 \' ~, [3 w) h
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
6 C% \1 [) ]! i' H5 z' T更新查询语法:2 C4 F) c+ y1 N) M; u
Update 表名
7 c0 e/ S4 f# N1 |; [4 LSET 新值) v0 b4 g) a3 ]; |5 D5 S
Where 准则$ Y+ g" [) [; u: I
例:英国客户的定货量增加5%,货运量增加3%
% j- p: V! j4 lUpdate OEDERS
  X+ [: K6 P0 ]/ b2 nSET orderAmount = orderAmount *1.1
6 n; a) H; F, AFreight = Freight*1.03
& `0 Y. y1 |( I  ~7 DWhere ShipCountry = ‘UK’. ^- H) _+ r9 i
2 删除查询
: r$ t8 M) x, S, k: s! J/ }$ TDelete子句可以使用户删除大量的过时的或冗于的数据.: `! w% F: u( F
注:删除查询的对象是整个记录.  Z; J5 j) o; |8 J3 G2 `/ I7 d
Delete子句的语法:3 G) B7 n$ `+ G- V
Delete [表名.*]6 p( z' q4 d' X) `$ \
FROM 来源表7 e$ b1 [+ W, x- M" O
Where 准则0 Q( s# z- x/ \0 \4 T( S4 ?5 `
例: 要删除所有94年前的定单. K0 X/ o  H, h  K6 p# ~& O1 f
Delete *1 E4 ~) R3 @" f6 O2 H0 \/ b4 s& ~- ~
FROM orders
6 E$ Q" G" Z" ]Where orderData<#94-1-1#
/ E6 C* [7 {2 W8 z) j& ]: z3 c3 追加查询
& ?1 g" v( k/ f9 o. H' T) sInsert子句可以将一个或一组记录追加到一个或多个表的尾部.( ?8 e0 s0 N. r
INTO 子句指定接受新记录的表
; \! W: T7 b+ kvalueS 关键字指定新记录所包含的数据值.
4 {6 o  A7 z- h; X" E4 c& iInsert 子句的语法:
" m8 K* U* l8 X' t, \4 B/ M& h( yINSETR INTO 目的表或查询(字段1,字段2,…)" o; B6 J% U' Z, O. Z; m& \
valueS(数值1,数值2,…)2 `" A* R+ ?( L+ l
例:增加一个客户
' L& p/ m' D  YInsert INTO Employees(FirstName,LastName,title)
- a: s; t" M/ L% r$ n- RvalueS(‘Harry’,’Washington’,’Trainee’): l9 s8 v( ~8 J, R+ y6 N
4 生成表查询! @( o, h! i( z0 T; ]
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
# E! x' ]  ^% c8 O$ n, K3 NSelect INTO子句用来创建生成表查询语法:1 ?0 W! ^4 ^2 |0 v; e
Select 字段1,字段2,…$ K: y5 S- m3 v  k) G; Y# a
INTO 新表[IN 外部数据库]$ e/ x5 F; o- n. _9 }" ^/ Z& u+ B4 \
FROM 来源数据库
' {0 @8 k+ K, U. _! H, YWhere 准则
2 e* j4 U; K& Q4 g6 f$ E# U例:为定单制作一个存档备份
( t8 c, @* y6 \2 u, a! iSelect *
9 w$ g4 O- C: u- Y; }INTO ordersArchive
& D, l  i% S2 o' TFROM orders
5 v, X. h6 v) w* u3 w3 P( K" ~八. 联合查询
4 J7 k9 J) B- g% ^UNION运算可以把多个查询的结果合并到一个结果集里显示.
& X7 P# K4 @- }( `& s  }+ sUNION运算的一般语法:
9 |( j* U+ k3 U( f. ?; `, c1 ^[表]查询1 UNION [ALL]查询2 UNION …, s3 V6 b; t" _* h
例:返回巴西所有供给商和客户的名字和城市: i, n# S5 e1 ^
Select CompanyName,City6 V' a4 J5 {# U* k
FROM Suppliers
& R, F3 D( C& \& b0 RWhere Country = ‘Brazil’6 R- q; P) t6 b$ n' G
UNION  Z+ s' x* s$ j! t% ?* W
Select CompanyName,City
: ^# o) h" n, m  W. k. gFROM Customers
* j: t; z+ r1 }  CWhere Country = ‘Brazil’) e; g1 r( K- V0 Z& E
注:6 {+ a8 l2 o  z7 i! Y) A
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
7 C/ ?% \6 d- U' H2 qUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
9 {9 n+ r+ _! e7 _每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
! y1 ?% h& m3 m; \3 c9 W& v九. 交叉查询
+ G( |$ y0 D5 i交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
" l3 [% l- X' I+ _' ^% u; `Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:2 z$ ?7 {, @8 i& T' k, G% T% ^
TRANSFORM aggfunction2 E: P2 C/ @. Z( R) ~6 B
Select 语句
- |3 O6 x! P( u$ r& s) p/ h- _% KGROUP BY 子句' V2 @  |( T( k* `: x! M
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
+ F  I; I6 n3 S& UAggfounction指SQL聚积函数,
, A0 w$ i9 ], F8 I1 _0 M# X/ r3 \Select语句选择作为标题的的字段,, z; p- Y7 {* r1 ?$ N
GROUP BY 分组
& c6 z* A7 g/ @6 f) v说明:
- X, s0 u4 e7 l- p& d6 CPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.1 x- I0 [: |2 h/ s8 N
value代表创建列标题的固定值.  A1 z1 T" w- ?- |, Z6 u
例:显示在1996年里每一季度每一位员工所接的定单的数目:
  I- J8 v2 M' Q  ^2 ^/ H( ~, a& mTRANSFORM Count(OrderID)
# ^: c0 h  I3 @7 _5 c$ ISelect FirstName&’’&LastName AS FullName# |: P+ @  J5 ~2 J2 ~1 O/ B
FROM Employees INNER JOIN orders
1 i4 H- o" K# c0 T) h0 c' O6 [; qON Employees.EmployeeID = orders.EmployeeID
& j2 T) ^: L" @& |Where DatePart(“yyyy”,OrderDate)= ‘1996’: m7 |% m! D4 u( d: k1 U* V
GROUP BY FirstName&’’&LastName
& U7 ]/ U& }/ o; XorDER BY FirstName&’’&LastName6 @6 W' C/ H5 v# R! ~3 N0 g, v
POVOT DatePart(“q”,OrderDate)&’季度’* t" c3 p3 g2 \) U6 Y" U8 P
十 .子查询* G$ h6 c) y1 j" ^9 \$ G: X
子查询可以理解为 套查询.子查询是一个Select语句." {& i6 s5 }/ M9 J& C6 i
1 表达式的值与子查询返回的单一值做比较' e9 C8 {& e$ |% W& `3 m
语法:
" [( x* c$ i8 I: \+ z+ {+ N5 y表达式 comparision [ANY|ALL|SOME](子查询)
( h$ T/ e! c% W$ \5 H& y说明:- p/ |' c, `# ^0 D
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
. v3 \+ e; ?# R8 S/ r* K5 D2 }例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品& ]) l0 X& Y0 }# V0 u' Q  D* n1 O
Select * FROM Products
/ `# ?  s( O% S3 C0 o: I8 lWhere UnitPrice>ANY
: j/ U9 N/ ]7 F- |/ m0 \(Select UnitPrice FROM[Order Details] Where Discount>0.25)( r8 ~0 w! d$ P3 }7 ^
2 检查表达式的值是否匹配子查询返回的一组值的某个值
& D0 ]5 M* v& w语法:
2 P8 B6 a$ P' B" p3 z$ L( ~# O, E9 y[NOT]IN(子查询)8 i# s" k* z% C1 L
例:返回库存价值大于等于1000的产品.
2 Y' }) N  S' o$ v+ O* H. ~Select ProductName FROM Products1 [" @. r2 s* G$ K/ u1 ?* G& ]; r
Where ProductID IN/ N& c) h, n7 S  y# e4 R+ Z4 e
(Select PrdoctID FROM [Order DEtails]  m3 q8 D  Z* d1 ]
Where UnitPrice*Quantity>= 1000)) d2 _: f6 w" ^1 W; \/ @  \
3检测子查询是否返回任何记录
" o, C6 k4 @* L7 u1 P; z8 h* z语法:# h& e/ [+ u7 Z' _5 P: v- _
[NOT]EXISTS (子查询)
, i6 F4 [6 U2 I/ h. e例:用EXISTS检索英国的客户9 s% i/ E( s$ q  T% \! Z# S
Select ComPanyName,ContactName1 R+ A" m& e7 C
FROM orders
: p( r! s5 M9 w5 @1 Q$ m$ LWhere EXISTS
4 Q/ o& b. b$ @3 p' V& k(Select *
; p) x/ H" x# B  ?4 u) ]FROM Customers
  [# X* ~& h/ X! h3 \: E# M3 ?7 pWhere Country = ‘UK’ AND' W* z/ J. ^. d7 e
Customers.CustomerID= orders.CustomerID)




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