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

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

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

Access如何筛选重复数据以及Select语句的完整语法$ ]( F4 A: o3 M1 |& z- ~* X

* ?' Y% m" x& eselect distinct 字段 from 表名
3 \+ b5 e$ ~/ \' ydistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
& 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 JSelect orderID,Customer.customerID
5 z; V! r$ v% h8 DFROM orders Customers
  i2 d7 W1 E, y; g- b0 `# V: ZWhere orders.CustomerID=Customers.CustomeersID2 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 AFROM 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$ `/ Z3 用 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( YFROM 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 G1 比较运算符, 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 bSelect orderID, CustomerID, orderDate5 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 AMcirosoft 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& Z2 范围(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 h4 模式匹配(LIKE), t; j; \  P9 d/ Z3 }# x: e
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
! h! W! d0 n! a) y, h# G, m. PLIKE运算符里使用的通配符* 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 Customers6 r0 X) D. @& P/ D
Where Phone Like ‘(171)555-####’
8 p+ j7 \4 T8 {, P( Q$ tLIKE运算符的一些样式及含义) _) `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" MLIKE’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* cLIKE’[!0-9]’ 非0-9间的任意一个字符 0,11 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! sSelect ProductName,UnitPrice, UnitInStock# O2 X/ s1 D% V7 b- Z, h! ^
FROM Products
' e7 S5 ]; ]: Y7 |4 NorDER 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. FSelect 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& dFROM 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$ rAND UnitsInStock>Quantity2 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 EON table1.field1 comparision table2.field2
' i9 w/ k( b' }其中comparision 就是前面Where子句用到的比较运算符。6 K$ w+ }  g6 x
Select FirstName,lastName,OrderID,CustomerID,OrderDate7 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+ AINNER 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, RSelect fields7 j* Z  Z+ b9 k+ ^  S# \; |
FROM table1 INNER JOIN table2
- m' e0 r8 d9 ]1 u, u. I; C& qON table1.field1 compopr table2.field1 AND% a- _5 S6 u! u& s* k% D
ON table1.field2 compopr table2.field2 or
% {. k) j5 M) |/ ^, cON table1.field3 compopr table2.field3% A! }% q) _6 r& S0 L
也可以
! g% A- _6 d! `8 f+ q& KSelect fields
9 I7 N- o# k, B" \" lFROM 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 tON table1.field1 compopr table2.field1
$ Z2 d& E/ f+ l3 N5 FON table1.field2 compopr table2.field2
& ]* G5 G2 r7 v0 l2 YON 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# QON 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 eSelect 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! nSelect *
8 r. Q, k" A0 L3 O- oFROM talbe1
8 \2 N% g. f6 q0 T- V( w" CLEFT JOIN table2 ON table1.a=table2.c
/ ~9 E$ U) G. e/ \7 h0 N3 @1 连接查询中使用Iif函数实现以0值显示空值
6 Q) U$ @+ w. W9 x! HIif表达式: Iif(IsNull(Amount,0,Amout)
/ O( x& j4 w. f$ k2 u$ A例:无论定货大于或小于¥50,都要返回一个标志。
5 b$ z$ c# ?9 J: i+ v3 uIif([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 |. DGROUP 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 Total2 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 rGROUP BY Title
) x9 b. K- M4 }/ G# H- }5 H) ]( THAVING Count(Title)>12 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: cAVG ( ) 平均值
3 t) V4 A8 W; X% R6 c, \; ~) h  {COUNT ( ) 表达式中记录的数目# {- R' ?' _  D  w
COUNT (* ) 计算记录的数目
$ I' O% s! t9 i6 l9 l9 Q. }; gMAX 最大值
# I, T" a3 y, L& d' tMIN 最小值- 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; sLAST 最后一个值
. 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 [; sPARAMETERS[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 kAND 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 OSET 新值% 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 ]' SSET orderAmount = orderAmount *1.1
; T" \" p* N2 O* R/ U% M3 hFreight = 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! ^& xDelete子句的语法:
$ 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 rDelete *, 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$ BvalueS 关键字指定新记录所包含的数据值.
; I6 d. G  J* p: YInsert 子句的语法:9 d0 f& h, ], ~3 l2 C
INSETR INTO 目的表或查询(字段1,字段2,…)
* C( _9 E0 D' J4 R; p' zvalueS(数值1,数值2,…). b7 x1 {; s( W6 I" `
例:增加一个客户
) [) P8 y; `8 {* qInsert 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; oSelect 字段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+ `: kINTO ordersArchive
" Z; z9 i& b. f+ A3 I( XFROM orders
9 H6 m& M, ~' u: n0 }# E八. 联合查询) _# Z, h* H: {, \/ r* z& j
UNION运算可以把多个查询的结果合并到一个结果集里显示.
/ T5 W( K! m1 L. }$ |* I4 GUNION运算的一般语法:
  y( F, Q0 ^/ |$ r! ?[表]查询1 UNION [ALL]查询2 UNION …( t. `) Y" E7 ?3 G6 \1 e5 C9 \& @
例:返回巴西所有供给商和客户的名字和城市
- z; m, \. y  h  Y: ?* O; @/ iSelect CompanyName,City
  m7 A3 E+ o, o- U( z" {4 Q- y  D2 {FROM Suppliers
! p6 Y6 F# E9 m( V% N0 Y+ G! KWhere 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% KFROM Customers
# ?# z; E  W5 PWhere 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 GGROUP BY 子句
( @- {# C: |! @" \* hPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
( R% X& A2 l" i# aAggfounction指SQL聚积函数,
8 K: [/ b6 v- b, x! z  g" eSelect语句选择作为标题的的字段," |, 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 QTRANSFORM Count(OrderID)
/ o$ c% }& y6 O; o8 f7 ?$ H& d; nSelect FirstName&’’&LastName AS FullName
8 _( J4 b' k1 w, uFROM Employees INNER JOIN orders* Y" t8 L, q, Q! G
ON Employees.EmployeeID = orders.EmployeeID9 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/ TPOVOT DatePart(“q”,OrderDate)&’季度’
* _6 ~9 {% h" y十 .子查询/ s2 M% P  Q  n# F
子查询可以理解为 套查询.子查询是一个Select语句.
8 W* l. _/ o- F$ r0 I3 E1 D1 表达式的值与子查询返回的单一值做比较  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 Products8 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  y2 检查表达式的值是否匹配子查询返回的一组值的某个值
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 Products3 ]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 rWhere UnitPrice*Quantity>= 1000)
- J0 s9 |5 {0 d8 Y% [! Z3检测子查询是否返回任何记录
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 sSelect ComPanyName,ContactName: W1 G. I  n& C" Z
FROM orders
3 @5 U6 ~) v8 ZWhere 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