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

 找回密码
 注册
搜索
查看: 2088|回复: 0
打印 上一主题 下一主题

Access如何筛选重复数据以及Select语句的完整语法 [复制链接]

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |显示全部楼层 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法; V! V  ^* L7 a0 e

/ i' N8 r/ _' r; e( dselect distinct 字段 from 表名( h" \3 q, \1 M
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
' p3 ~8 f9 a" T  {8 C一.Select语句的完整语法为:
6 O9 B* h) P* hSelect[ALL|DISTINCT|DISTINCTROW|TOP]
. N- |2 H6 c+ N+ a5 e{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
) U; T% ~" w5 y. A  X0 {: SFROM tablee xpression[,…][IN externaldatabase]  ]/ L3 m# g; G% b- i
[Where…]
6 q  b8 F" n' x# V$ o[GROUP BY…]
/ H" g. q+ l0 r0 `% M- c[HAVING…]/ A# c) m5 y. m5 E) N' [9 Z' a/ p
[ORDER BY…]
0 A6 W' D- }) ~7 u, p. m1 T[WITH OWNERACCESS OPTION]4 D+ j1 K6 i5 P8 V0 O, E
说明:! ?6 Q. ^9 \. y8 G, j5 ^
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。& P; ~! ]6 N$ A* n; v2 T# V
1 FROM子句, A" Q, q3 ?! [9 F7 ?
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。) d" l8 A% t4 e2 |; E1 V# p- ^2 h
例:下列SQL语句返回所有有定单的客户:
$ E6 \9 C% o: M/ k  c# w4 W7 b6 y/ {Select orderID,Customer.customerID  ?( A! }3 w+ p$ M2 q
FROM orders Customers
$ o" s/ ?! [% }7 e7 LWhere orders.CustomerID=Customers.CustomeersID0 G9 H4 J; g2 J, K' t. J
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
8 v' E; l3 I( T- b+ @4 `(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
; A( [3 [3 v* R* K, b. E0 c8 D例:Select ALL FirstName,LastName4 m+ ?! @& q# J0 x; L+ ]
FROM Employees
! y* O- P: D$ W# V3 T! B(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。/ j( @" C! N0 O
(3) DISTINCTROW 如果有重复的记录,只返回一个; A" @2 x6 o* ?; d
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)! r5 ~% S# L3 z3 N3 a1 }
例:返回5%定货额最大的定单2 x, ~, u. P/ O% D8 I8 O
Select TOP 5 PERCENT*
( d2 |) B. l$ L( z2 X; \* k6 YFROM [ order Details]
9 O* C) m: M$ {5 n1 ^orDER BY UnitPrice*Quantity*(1-Discount) DESC0 u6 q2 N: s: r' }0 H8 L
3 用 AS 子句为字段取别名$ `; ^" Z. ?9 V" m1 `
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。- W& n% j% A- L) ]9 O/ _
例:返回FirstName字段取别名为NickName: ]& d; t/ N' Q
Select FirstName AS NickName ,LastName ,City
" j/ U' d9 ~4 y9 N! T0 g/ C2 gFROM Employees" W/ W2 @" D. b  [
例:返回新的一列显示库存价值3 B/ X( X% _3 A- T8 }
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock6 s/ F5 c* w1 y: w+ N0 _
FROM Products
! }% q  w0 u- B( l2 b8 H! l) |二 .Where 子句指定查询条件
! h! [1 A& U3 H0 Y- y, O: L1 比较运算符" E- f' |/ h6 Q# H! z
比较运算符 含义  Q2 W4 t4 Y# u% |
= 等于! a* E1 v* _3 V2 W( Y3 S$ m
> 大于
1 p3 V2 \/ w' w2 }< 小于
' V5 O- {4 _; G- w>= 大于等于9 G& l" g3 D' W2 {# f& S
<= 小于等于3 ]0 K. _  N+ w* n
<> 不等于, e/ T0 E4 B( i, M: o; q* U( p
!> 不大于8 P5 R! K! t; x
!< 不小于
" {; `0 H  l, D4 A0 C1 A0 {: y& k' t例:返回96年1月的定单
9 }* s' B) q* `! U' L5 ISelect orderID, CustomerID, orderDate
4 K- k; f" k5 y( |* Z. s* ~/ PFROM orders
, }' p( l( Q* i0 z9 L( C1 n5 b/ R7 LWhere orderDate>#1/1/96# AND orderDate<#1/30/96#( d3 ]  F" j# `8 Q% Z; y" T7 ~
注意:: @: L% t) s: y! u, N. X; J9 k
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
* ?2 F& I( j" w例:) E: x9 P) }- B; y# @2 P$ Q
Where orderDate>#96-1-1#
, g7 ~( h& p3 L3 y也可以表示为:/ y  s& [! Z9 f" l- o" S
Where orderDate>Datevalue(‘1/1/96’)
( [' S7 _4 w9 I: L使用 NOT 表达式求反。
1 M+ `1 `5 [8 g/ l# z5 f例:查看96年1月1日以后的定单
( w4 Y. M! P$ f' t2 r* m3 |6 xWhere Not orderDate<=#1/1/96#
5 d) K$ l6 ^! H% J2 范围(BETWEEN 和 NOT BETWEEN)
* H0 r! y( I# C' }  f6 `/ {BETWEEN …AND…运算符指定了要搜索的一个闭区间。5 n7 i  n. [( C' g
例:返回96年1月到96年2月的定单。5 X: L; w6 C0 P
Where orderDate Between #1/1/96# And #2/1/96#
# O% K3 n3 y, J" a3 列表(IN ,NOT IN)8 P$ a- k4 r6 e7 D
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
1 A! b# Y7 E4 s) m例:要找出住在 London、Paris或Berlin的所有客户
; Y" [" m% V3 `2 `5 y+ hSelect CustomerID, CompanyName, ContactName, City
1 Z- u+ v9 y( o, X7 fFROM Customers- n3 i4 Z" Q5 @1 N! C- f5 I9 n
Where City In(‘London’,’ Paris’,’ Berlin’)# s, A2 x# f0 j& H: K
4 模式匹配(LIKE)$ F; ^, J: a+ r% y" f( G/ X
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
; f, O) D" w# c6 \* yLIKE运算符里使用的通配符9 L$ N5 n/ }% B0 s, a* a
通配符 含义
& j, M. Y7 G9 y? 任何一个单一的字符% T/ R8 p9 b! e7 v/ x
* 任意长度的字符
( d9 n  }3 ~( p" R* g# 0~9之间的单一数字
8 @  p- e0 g' z; q4 }[字符列表] 在字符列表里的任一值: e' A! Y, T+ o' t0 h/ }
[!字符列表] 不在字符列表里的任一值, F& ]! }" `' _+ {& u: {: ~
- 指定字符范围,两边的值分别为其上下限. J# K0 G, A$ |: }+ b
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
) w1 m. |2 k4 [9 }& }7 s' Y, E/ }Select CustomerID ,CompanyName,City,Phone1 u+ ~) {7 y5 X
FROM Customers) u# O/ g7 A8 k, z( T9 {
Where Phone Like ‘(171)555-####’7 c' B; F$ f2 _9 F; f1 q# ~
LIKE运算符的一些样式及含义0 T# X/ w- N& b$ s( Y7 l1 j0 U6 |
样式 含义 不符合& m7 E3 f7 [+ ~. c/ I3 N
LIKE ‘A*’ A后跟任意长度的字符 Bc,c2553 z8 ]0 ~+ r7 U4 f# x( T
# LIKE’5’ 5*5 555+ s- J% K' E* ?0 t& i% p: m
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5- R7 k2 f- @1 q+ G, V9 B7 n! h
LIKE’5##5’ 5235,5005 5kd5,5346
8 Z# J9 v3 Y* h/ nLIKE’
  A$ A0 v* K) ^% {, M[a-z]’ a-z间的任意一个字符 5,%6 o( W% ?- ?+ |' w2 }; l
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
# ]- R  Q  C  A5 }LIKE’[[]’ 1,*
6 I! F- t) c0 K三 .用ORDER BY子句排序结果
& t8 I' a# ?8 j& m4 n1 eorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
0 G/ ?3 y1 y% ^! n9 E2 V" c8 ForDER子句中定义了多个字段,则按照字段的先后顺序排序。
* Z: I! [4 m( B( w例:
6 P; h; T) a, X& N: |3 f. O2 JSelect ProductName,UnitPrice, UnitInStock
$ z# D. |0 C3 }9 x9 e" m7 L7 L- T. lFROM Products
% K8 [/ V$ j' @# \orDER BY UnitInStock DESC , UnitPrice DESC, ProductName; t, Q* D" O+ e. n$ W4 J
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
0 U+ A$ r3 j( o. F1 m4 \0 _例:下面的语句产生与上列相同的效果。
) ?& W) W$ n8 l# Q; d3 lSelect ProductName,UnitPrice, UnitInStock  W& j; b0 z. l5 t, {
FROM Products- B5 P% V+ D4 L1 a  G' Z
orDER BY 1 DESC , 2 DESC,3% e2 \, h# U2 n
四 .运用连接关系实现多表查询$ Z% p0 U" b. @
例:找出同一个城市中供应商和客户的名字4 F% X/ p6 I" D
Select Customers.CompanyName, Suppliers.ComPany.Name
6 `6 _; }' z7 r2 N/ VFROM Customers, Suppliers
, Z, a7 z. G+ I+ v9 D  Y# |Where Customers.City=Suppliers.City0 \# W5 }! l- z: K: D7 `4 y0 s( G
例:找出产品库存量大于同一种产品的定单的数量的产品和定单( q( \: F9 H' p" D* v) p# x: @
Select ProductName,OrderID, UnitInStock, Quantity
% S9 _: a: `6 W0 }, ?) _# hFROM Products, [Order Deails]9 Q3 {9 b+ v, E; z7 _
Where Product.productID=[Order Details].ProductID$ i: @2 t9 }4 m; @
AND UnitsInStock>Quantity
2 ?$ u& p) `7 D: b1 f另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
5 a* s0 a& K  j语法:- F( y, S1 `3 c" k4 a
FROM table1 INNER JOIN table2& E( d) v1 L2 Z( p  M9 B8 M& |9 S) q; q
ON table1.field1 comparision table2.field2
4 P+ k; B5 `6 {8 z# n' C/ Y其中comparision 就是前面Where子句用到的比较运算符。
7 V9 Q7 j% T: G) g' n! z; n8 g  Z( WSelect FirstName,lastName,OrderID,CustomerID,OrderDate
$ r8 s( s( c' e+ TFROM Employees
; X( i. `5 h" t# GINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
4 b1 I0 k9 O( ?5 g4 a注意:) d. X" x' ~! [
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
* ~2 u3 C" G  w; C4 ^6 Z在一个JOIN语句中连接多个ON子句7 b% S  g' @5 X1 {5 O2 H
语法:. ~! E8 x! v' q4 w
Select fields- d  @1 w, Y! R9 `" e! Y6 l+ v
FROM table1 INNER JOIN table27 k' f7 {1 ~1 x( a
ON table1.field1 compopr table2.field1 AND
* l  P0 {* k% }7 `, w8 m+ j  ]ON table1.field2 compopr table2.field2 or9 S: ?( l( t  p& A5 c
ON table1.field3 compopr table2.field3
0 N, H9 b8 I/ x4 F+ a+ T也可以
8 @- Y% T$ u8 R6 u" U( bSelect fields* {. g- ^2 N( j
FROM table1 INNER JOIN- [& `. |% ]. M  b% w' X
(table2 INNER JOIN [( ]table3- R5 E6 ?* ]0 [
[INNER JOER] [( ]tablex[INNER JOIN]
, ~. _: D  w$ d3 b9 L: aON table1.field1 compopr table2.field1
$ L) O, T4 k& `ON table1.field2 compopr table2.field2
1 L4 D4 j4 O3 A. K/ j: jON table1.field3 compopr table2.field3/ F! D/ ]. I0 }3 G
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
3 J# m) q5 g) Y: m. ^# ?. g& C1 F# VFROM table [LEFT|RIGHT]JOIN table2: K- D$ T9 T- n/ g- ]7 M
ON table1.field1comparision table.field2* T0 d3 w% W2 z
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
  N- Q! Z9 d. Q" Y例:不管有没有定货量,返回所有商品
7 y4 A$ t, K9 C0 FSelect ProductName ,OrderID+ ]# G8 L) J# z. R
FROM Products
# e) S  R( ]8 A$ \  NLEFT JOIN orders ON Products.PrductsID=Orders.ProductID# P' y7 c; ~' T
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
$ v# p% ]) y  J$ s; B例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
2 ~) X# B3 T& ]. B5 m- p空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
- L2 ?& Z- Z) @! ~7 SSelect *6 [# ~) P4 f( T" Z+ |6 `
FROM talbe1
" E4 P. d" t' a4 a7 h" }LEFT JOIN table2 ON table1.a=table2.c
  ~7 N3 O& x8 a5 m  B1 连接查询中使用Iif函数实现以0值显示空值
2 ]/ Z8 _! o3 M& R" DIif表达式: Iif(IsNull(Amount,0,Amout)
, z1 N4 A3 ~# r+ ?/ o/ P4 V例:无论定货大于或小于¥50,都要返回一个标志。' d# P3 V- [1 T$ y$ ^- m6 u
Iif([Amount]>50,?Big order?,?Small order?)) ~4 a% P, \6 d9 A* H+ A. t% O
五. 分组和总结查询结果) o: N& D, w* U8 Q" P
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
& ^% q" C# d8 G# e7 ]GROUP BY 子句的语法% }- H* ~& k2 ~/ O- o
Select fidldlist! W; I+ M- r5 M! y" I% Z; e# s
FROM table
) ~, ]7 x% L% B. M' j9 N7 ~Where criteria1 h. F# f' D- g; X/ z! \
[GROUP BY groupfieldlist [HAVING groupcriteria]]4 K# S  f: [6 y# x% |5 n( {
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
: {( Q3 h8 Y, x- D/ KGROUP BY字段中的Null值以备分组但是不能被省略。  M1 j+ |& Z  l4 Z; `; }9 T
在任何SQL合计函数中不计算Null值。
6 M1 S0 z9 Y# L6 i" VGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。5 I* d- s) a- I. z* {# w- V9 F
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
# N0 U+ t: c, m* ]% u9 n! xSelect Title ,Count(Title) as Total
6 L* ]! b" N2 F/ p3 R0 k. }6 oFROM Employees$ Y3 N& O0 V) d4 g
Where Region = ‘WA’: d; [$ l7 f/ k( }' o' U; J# s
GROUP BY Title) M: ]( e# W! B2 T" }" C" s1 q: g
HAVING Count(Title)>1
4 g9 D8 T7 P3 L4 N/ rJET SQL 中的聚积函数' |4 g1 o$ ?6 R$ N6 o
聚集函数 意义2 k3 r* Z: r; {$ q
SUM ( ) 求和, `4 T  T( L/ G) Y) W. f: t4 e8 x
AVG ( ) 平均值# N; b! X+ Z8 g2 N. {' I8 |
COUNT ( ) 表达式中记录的数目
8 E" Y9 {6 Y- e) yCOUNT (* ) 计算记录的数目
- U9 |- B0 e/ I# l, K' C+ Y9 ~MAX 最大值
( T- m' m) ?* q3 O5 E0 R/ h9 }" xMIN 最小值
) z, G4 G2 C+ z) hVAR 方差
1 y) z% L" v+ S$ R) G2 A  g) CSTDEV 标准误差) `: [# n- _  w8 E" p/ n# D
FIRST 第一个值$ C! H) t, [; L
LAST 最后一个值1 k" o/ D" d) J( {/ Q; o' _
六. 用Parameters声明创建参数查询8 A2 Z, T4 s; j5 K+ q
Parameters声明的语法:
3 m' D& C* L- e1 x/ nPARAMETERS name datatype[,name datatype[, …]]. ^4 g: Y0 P: w9 Z2 k9 q
其中name 是参数的标志符,可以通过标志符引用参数.$ x. k1 X0 `8 U/ ^
Datatype说明参数的数据类型.
: _5 [, l4 A$ |, |" s# M# i使用时要把PARAMETERS 声明置于任何其他语句之前.
1 I, Y7 S5 `  ]例:, k# Y! X/ P& I" i+ y7 N
PARAMETERS[Low price] Currency,[Beginning date]datatime7 }" o* s* O1 I- O: ^# V) ^
Select orderID ,OrderAmount; ]* i4 Y, n7 [
FROM orders3 _) W. v9 k6 v9 N, n$ a: y0 w2 N& N
Where orderAMount>[low price]8 c9 g1 l! V% t7 |0 }) w( [, c
AND orderDate>=[Beginning date]$ s$ h, K9 v: Q
七. 功能查询& P: P. W9 c: @# n, b1 b& }) d4 ^6 [
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.  y. W7 N2 B1 O! F3 s1 }; z, p, \1 e  K
1 更新查询
7 V0 H; U" o' \6 L* |( aUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.1 T! u5 D& D0 E" n3 D0 L' w
更新查询语法:0 G: u" i4 x; A: q5 r
Update 表名
5 B1 Y1 {9 i5 l( c5 K" |; ^4 _: gSET 新值
% r+ @8 L0 m; l  \+ q6 IWhere 准则1 t. O& E, h3 H2 C* s
例:英国客户的定货量增加5%,货运量增加3%. U) B1 g1 }2 }& i4 F4 s1 v
Update OEDERS
/ r. N7 B& D! {SET orderAmount = orderAmount *1.12 t9 K# e( E' W. w* R  M+ q! Q
Freight = Freight*1.03
0 B  z8 |0 C6 c; `( uWhere ShipCountry = ‘UK’
1 q- i, L. F: S' W2 删除查询6 o9 f9 @0 t. ]* G- V+ |, Y
Delete子句可以使用户删除大量的过时的或冗于的数据.0 p; D% l' S; ?. [% J
注:删除查询的对象是整个记录.3 l$ E  r8 h- |) i* G3 O2 W
Delete子句的语法:
4 s* B0 o+ H) O2 EDelete [表名.*]  j* X/ U- q6 \5 f
FROM 来源表( [  M# Y* w" e) K# E9 h" \
Where 准则/ N$ H: ~% {1 W
例: 要删除所有94年前的定单
1 C$ R0 \+ b6 J& uDelete *
* [' J8 N' \8 D( ~. E! z2 I2 \7 fFROM orders
. @+ y% ?$ g* F8 m; \Where orderData<#94-1-1#
8 Q$ ]2 t, T3 A) G4 I2 B3 追加查询/ a' T; ?, h) F+ Y/ L9 k) d! |
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.* d; g$ P8 E7 m2 \
INTO 子句指定接受新记录的表# L* D$ ?; d4 V0 }. J
valueS 关键字指定新记录所包含的数据值.
8 |! B% ?8 a4 _/ Q5 d/ ^) D& ~3 QInsert 子句的语法:
/ @4 S/ h4 X7 WINSETR INTO 目的表或查询(字段1,字段2,…). D; J0 o6 _) E: t6 K4 c5 H6 W
valueS(数值1,数值2,…)9 x6 }+ H+ T- _" k5 n
例:增加一个客户
8 ]. y0 P. ]+ N2 q- N  tInsert INTO Employees(FirstName,LastName,title)
) |" y# I/ g2 x) i; OvalueS(‘Harry’,’Washington’,’Trainee’)
+ A6 `' o$ B' N& Q& C4 生成表查询
1 V2 q6 D& h6 ]: H2 Y可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.( A, w; W/ f, z5 ^* n4 Y, z  N1 S$ M# b
Select INTO子句用来创建生成表查询语法:
/ L9 [7 g+ q- U8 G+ pSelect 字段1,字段2,…4 O. c( v0 C7 `! {. c
INTO 新表[IN 外部数据库]; Q+ i/ G9 ]$ c, L8 {. \# X; E* z
FROM 来源数据库
' B- a( A- k) H/ \0 s5 nWhere 准则8 X3 ~7 j( R; T9 \9 j: Q
例:为定单制作一个存档备份# w) v. U8 l2 Y. c
Select *
5 }; Q1 F1 B( r+ aINTO ordersArchive
6 `( \4 A6 |! C4 t2 TFROM orders
* N$ j' g" _" t5 H8 u7 ?八. 联合查询
9 I" t2 q" Y$ u& S5 a. mUNION运算可以把多个查询的结果合并到一个结果集里显示.9 f5 P1 S; v6 ~- y3 u
UNION运算的一般语法:
3 U. Z4 W: P+ p0 H$ Q[表]查询1 UNION [ALL]查询2 UNION …8 S; Q+ k- v1 J; t1 Z( F% W6 K
例:返回巴西所有供给商和客户的名字和城市
# J( i) ?) P8 K% VSelect CompanyName,City( Y2 ^: x% K/ T
FROM Suppliers5 e- Z: Y% R! q  `: D& h. R# J
Where Country = ‘Brazil’
7 `  E4 D; K2 `+ S: G, M1 Q! R, dUNION
' }+ M- \/ y5 c. _5 c, W* ZSelect CompanyName,City7 h  i5 R8 C2 `3 a
FROM Customers2 D2 E+ L+ x- u2 Q- |. N0 h% q
Where Country = ‘Brazil’" B/ ^0 k8 }- H* e: k
注:, K0 @8 b5 m. [. E5 `) a
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
/ t# T9 w7 q* s6 @, b! g/ gUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.* q. u4 d. k: u
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
3 R$ n' U3 o) D九. 交叉查询
" L1 L* d% H6 f+ M交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
! C6 A1 I9 ^" m( `; dMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
2 ~3 y0 L: g- G/ e$ @TRANSFORM aggfunction
) t1 ^$ j$ |  E! J% c) SSelect 语句
% p& Q/ b0 P9 l8 jGROUP BY 子句! `& I  |& Y, ^0 x/ k% n" t$ O/ r
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]* @5 O& ?4 X9 |( y
Aggfounction指SQL聚积函数,
( b& K/ }- r# m! Y: n/ F! ~Select语句选择作为标题的的字段," t. ]! H9 M5 ~% s5 J# G
GROUP BY 分组
# Q- }; `% `5 u! x; v. L说明:$ s+ \  Q/ b: ]
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.1 K) h2 S& t* B: \6 a4 M4 f) P
value代表创建列标题的固定值.
# r1 C' v/ N8 d" Z$ ]; T4 z例:显示在1996年里每一季度每一位员工所接的定单的数目:
! T+ |  ]. k9 _, |* m1 qTRANSFORM Count(OrderID): u9 e" Q+ X, F
Select FirstName&’’&LastName AS FullName" O4 R4 Q/ n5 {$ A% u' O
FROM Employees INNER JOIN orders
5 ~" Y! n7 v  {7 Q4 U1 e8 p- FON Employees.EmployeeID = orders.EmployeeID
3 ?/ s  w, l5 l5 YWhere DatePart(“yyyy”,OrderDate)= ‘1996’: X; e, d6 y: _+ R$ d& c
GROUP BY FirstName&’’&LastName
) E3 k4 |6 Y" L/ k9 |orDER BY FirstName&’’&LastName4 h, V7 \' c; U
POVOT DatePart(“q”,OrderDate)&’季度’  W/ `  u+ X5 |- U
十 .子查询
) e4 N" ]' q" v9 |: }' o# H( \子查询可以理解为 套查询.子查询是一个Select语句.
% }2 l$ G" _3 t- w+ U; C. z1 表达式的值与子查询返回的单一值做比较
! k& O  V! n2 ]. A. a/ `" t& u语法:! M0 T3 q2 O. y$ |/ m
表达式 comparision [ANY|ALL|SOME](子查询)/ {- b! q, t6 h9 W
说明:. Y" s" t3 m) m8 b3 h' Y
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.  S) v" p4 Q$ y, o3 T! o2 `
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
( L# ?" h1 K' B7 m6 r" @Select * FROM Products4 R% K9 A  m3 ~. G! H( v" E
Where UnitPrice>ANY- y- W9 w8 A0 f/ _5 E( q
(Select UnitPrice FROM[Order Details] Where Discount>0.25)1 I8 ^7 v* s" x7 z
2 检查表达式的值是否匹配子查询返回的一组值的某个值
; q0 ]$ h! Z: [! I" ]语法:
# K2 t, V& n/ t[NOT]IN(子查询)- h( T5 q6 \! @) Y; _; b; x
例:返回库存价值大于等于1000的产品.+ h5 T. C' H; W6 U2 ?* M
Select ProductName FROM Products
5 y# W3 [: [" U  H8 jWhere ProductID IN
0 u- r& t/ X% K- X4 _(Select PrdoctID FROM [Order DEtails]( w# I  v! B% F  ]
Where UnitPrice*Quantity>= 1000)$ ]6 S! P2 a3 ?+ D- H* L3 N
3检测子查询是否返回任何记录' U9 V# B) h& q* `7 D4 M. z, l
语法:. L! A9 }& p; B' P/ c" y7 p4 U
[NOT]EXISTS (子查询)! U/ q4 `+ H0 V: S
例:用EXISTS检索英国的客户
* T8 |6 ~+ z" w& ]5 [2 s4 ]! VSelect ComPanyName,ContactName
" M; U* X! l( H( {# TFROM orders
7 f: U: n7 b" V1 M8 ?' B1 p2 wWhere EXISTS
0 n. _7 Q4 [) D(Select *! g) m8 k! a, c6 s; b
FROM Customers
  a* \" f% N: |- o0 _Where Country = ‘UK’ AND, a& ?3 P; E3 y4 n5 S* U1 f2 h
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


Archiver|航空论坛 ( 渝ICP备10008336号 )

GMT+8, 2024-5-20 21:38 , Processed in 0.031200 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部