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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
" q/ r& a5 U  j0 \+ k$ V+ Z: E. {0 B) O/ ~
select distinct 字段 from 表名" z6 W: p" e4 f- H) v5 h! T
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
4 W/ ?0 f9 Z. @+ Q1 H一.Select语句的完整语法为:3 y2 m9 k: d, o
Select[ALL|DISTINCT|DISTINCTROW|TOP]
) Z  U5 Z& T8 H( I' ]0 {{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}( O8 N, e1 I$ q
FROM tablee xpression[,…][IN externaldatabase]( w5 x% V9 t5 L( n
[Where…]
$ t* y* V+ s4 ^( n# l[GROUP BY…]2 x% H3 K; k0 G
[HAVING…]% U/ R( U' e1 b* ]
[ORDER BY…]3 I* _9 O6 g, K0 t% D* w! A* K
[WITH OWNERACCESS OPTION]: M) y9 K2 c& N8 |/ [4 X6 Q6 t
说明:
6 }$ O2 U9 \% E% D; w, c用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
$ K9 z$ E  x- W6 L) o4 b6 S1 FROM子句
) \. j1 B+ v  r' Y( J, ]; \: i' TFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。5 p: P/ _( P# v2 k; W- N, m# d
例:下列SQL语句返回所有有定单的客户:* O' [* @% n5 W
Select orderID,Customer.customerID
9 ~2 E9 j: Q7 U  T% mFROM orders Customers
) d9 \! F  Q" U( h1 v/ Q& _Where orders.CustomerID=Customers.CustomeersID- D  d( L! i8 |5 Y3 K/ \
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
; m+ c( {0 d3 s% D4 R2 C) F(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
: Y+ u, S* \6 ]: h3 \( G( N: g( ~例:Select ALL FirstName,LastName
( F/ X9 I! [5 R, v! yFROM Employees
! p+ [& M3 K0 I1 O* O6 w' X(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。1 c/ c& M( W- S2 f1 @
(3) DISTINCTROW 如果有重复的记录,只返回一个
, Z5 @7 h7 p; S7 B) W# k  P(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
0 d, B$ ?' G. a& }例:返回5%定货额最大的定单
( `7 k% c! T' USelect TOP 5 PERCENT*" e$ L6 h# a" ~# Y) K
FROM [ order Details]
2 b) l- z( }8 \+ X: m6 P4 @orDER BY UnitPrice*Quantity*(1-Discount) DESC) F4 R0 m5 c' [
3 用 AS 子句为字段取别名
% C8 A3 C8 q% [3 E1 c$ R& {4 T, I如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。- ]* ~# {: w9 F- _' L
例:返回FirstName字段取别名为NickName
- t) H+ l; ?) ZSelect FirstName AS NickName ,LastName ,City' o+ L$ J' c7 j* `4 v
FROM Employees+ ]8 H3 f( f: \3 U, ?
例:返回新的一列显示库存价值1 k7 G9 h: k5 h9 L" k. t& Y
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
5 e7 k. E" b1 M5 d: [  AFROM Products- x* Z  V) q1 u+ M8 b% y1 u& G. o
二 .Where 子句指定查询条件
1 A" t; ^( q: T$ i0 \2 L1 比较运算符
& m% }: |8 m8 z9 H/ z- y  p& [比较运算符 含义' b4 d( O9 Z) U) U/ t$ h* s
= 等于
2 w  q) R% B' c7 h/ b> 大于7 e* |% O5 _, ?" k) H; S. \1 L7 F
< 小于3 m( i5 S) P, S5 O8 N
>= 大于等于
0 s4 b& T4 }& K<= 小于等于6 O8 `7 r( M0 A& R. r
<> 不等于. W  x* O& e4 E
!> 不大于
# d  K' k: {" K* N+ _!< 不小于- {* u8 O/ i1 Z: t) p- j9 u
例:返回96年1月的定单, l0 q: w4 z% G+ J5 G
Select orderID, CustomerID, orderDate
7 i/ m$ ?5 e) O6 GFROM orders
' I3 H; k+ o$ H" w. i- ]Where orderDate>#1/1/96# AND orderDate<#1/30/96#
7 \4 L  b) q: x5 L注意:
9 d" j4 L) M. \! OMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
9 C2 H3 z( \; W1 X3 j例:7 r  r0 a- M3 H
Where orderDate>#96-1-1#* D: [; ?( L# L# Z% p
也可以表示为:
. z$ W* G4 u& lWhere orderDate>Datevalue(‘1/1/96’)* \8 I1 A6 e/ M# O2 [/ o
使用 NOT 表达式求反。% t& H/ @, p& {! Z9 u
例:查看96年1月1日以后的定单& I. L0 D0 B' l' {& D* [1 r
Where Not orderDate<=#1/1/96#3 u# _) Y# `4 ^( A+ {
2 范围(BETWEEN 和 NOT BETWEEN)5 p: K- L% H. s6 U& Z$ c, r1 M
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
  ?- |& ?, H0 t5 B1 G# I' N. S3 e例:返回96年1月到96年2月的定单。
7 P3 m% y. `' @5 `6 i% K7 KWhere orderDate Between #1/1/96# And #2/1/96#
0 A5 p1 o) z: {+ ~- @3 列表(IN ,NOT IN)7 N( t0 q1 V+ J; N8 g- M  ~: p
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
8 O" V3 q- K- r7 p例:要找出住在 London、Paris或Berlin的所有客户
$ D; O0 r) z9 S6 BSelect CustomerID, CompanyName, ContactName, City! E, R5 O, g0 O8 d) h1 O
FROM Customers# @: @) ~1 |4 G
Where City In(‘London’,’ Paris’,’ Berlin’)
; v2 b% l, k2 d4 模式匹配(LIKE)' f2 v" G3 C) @3 c8 \  ?- G
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
) H- j) V9 G! ZLIKE运算符里使用的通配符
8 m! S) N( ]3 [+ z/ r( r通配符 含义$ W" _% s. C' @9 o
? 任何一个单一的字符
+ P7 {( @& f( Z1 d3 K* u* 任意长度的字符& R; ]0 O& T' x1 w' P% Y+ o: x( V8 Q. X
# 0~9之间的单一数字
4 l; \1 @4 O7 x2 s& y[字符列表] 在字符列表里的任一值
5 C* l! L* C1 o' f' T* l2 X* y- O[!字符列表] 不在字符列表里的任一值- W. a) a, R3 k4 ]  _9 v3 p
- 指定字符范围,两边的值分别为其上下限
- L1 ~/ o9 |5 j# E6 \% y' ?* f例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
: k& w* c- f* g8 SSelect CustomerID ,CompanyName,City,Phone
8 z- j* ?4 J' n5 X4 `FROM Customers
$ R3 U2 G6 P$ h; GWhere Phone Like ‘(171)555-####’' S$ ?: X6 {. z5 L( y: d) C
LIKE运算符的一些样式及含义0 Q# Q  }( Y- U# C( O. A3 h
样式 含义 不符合0 ^# c4 M" o0 }- X1 d. r
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255) J( a; ^7 n1 C- o+ q/ o
# LIKE’5’ 5*5 555
- q& l' o, b2 |$ w. r" H* ]LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5/ e: B2 x/ Y0 c; x2 y' {7 C
LIKE’5##5’ 5235,5005 5kd5,5346* x- s" ]& ~8 E* |8 J
LIKE’+ b# g. I# D/ T+ P0 |; l$ \/ b
[a-z]’ a-z间的任意一个字符 5,%, a  D, i+ ^  W4 b: s  O
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1. `( h0 Y: @. {8 O; x8 b# o. K
LIKE’[[]’ 1,*5 Q" y' {3 D; d, ]) [4 w
三 .用ORDER BY子句排序结果
6 ~1 Z, Z# X  e$ |" T  y/ G! h$ oorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。" o" w3 ~# D0 X" ^7 y
orDER子句中定义了多个字段,则按照字段的先后顺序排序。7 i% W9 R( m' l" R0 M' A8 F$ f
例:
- @7 M/ B6 b% P) ZSelect ProductName,UnitPrice, UnitInStock
; ~2 w2 M- ^# J  L8 S- [FROM Products& D1 _" W8 `9 H! C: K6 J( t8 L
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
: a) j5 e' S) z/ F! a5 torDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
0 K+ y( ?( n9 K$ z8 C2 F: e4 P& P例:下面的语句产生与上列相同的效果。) n1 i3 ]. `8 v, F9 D; S
Select ProductName,UnitPrice, UnitInStock! O7 P" J# o( }6 l" |
FROM Products2 w3 P! v* `" ~- B/ n
orDER BY 1 DESC , 2 DESC,3
( h# ]7 X6 q5 ^& L& u四 .运用连接关系实现多表查询
- D) u: H2 A" ?, t例:找出同一个城市中供应商和客户的名字
3 Y, u" r  N( M" E2 ^Select Customers.CompanyName, Suppliers.ComPany.Name
0 d% ]1 t/ B8 i& ~FROM Customers, Suppliers6 ~* C4 A. D' m5 v; `0 `
Where Customers.City=Suppliers.City& E3 Y' R  @  k+ N2 R& H
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
* D( Y8 s8 f% ^2 b/ z* u) WSelect ProductName,OrderID, UnitInStock, Quantity
. F) m8 h" ?+ W( w$ o+ C: YFROM Products, [Order Deails]
& E) Z/ P! x  g- Z% F. VWhere Product.productID=[Order Details].ProductID3 d' x  K3 G" S
AND UnitsInStock>Quantity
# p% Y* W7 K8 c" C另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN# m2 f6 M4 U/ q9 E) ]
语法:
: O) C$ s5 K( e0 j# Y# ZFROM table1 INNER JOIN table2( f+ {# d8 E; d! C
ON table1.field1 comparision table2.field2
5 Y9 V! j5 T$ O8 U( D其中comparision 就是前面Where子句用到的比较运算符。/ p1 q) H7 b# F  r: u# Z# R
Select FirstName,lastName,OrderID,CustomerID,OrderDate
/ J0 L) w& E, [2 g+ c! qFROM Employees
$ v8 r% x# n$ E  U/ W9 ]6 P- yINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID7 {8 @/ t3 n& W
注意:  r; N( t3 o2 M. \+ d. m' p7 h
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
# s* z$ R; Q. N3 F% K在一个JOIN语句中连接多个ON子句
8 e! t4 P( o4 j, N. f" v语法:. o, ~* ]% Q5 ~4 O  y! Q  R5 m
Select fields; o, F" u1 K* U! H4 Z+ _( l$ W
FROM table1 INNER JOIN table2
8 o! @, q9 c% _+ H0 r( S1 @ON table1.field1 compopr table2.field1 AND4 s7 n9 s0 D+ B: W. V' ?; ]
ON table1.field2 compopr table2.field2 or; U$ O4 {3 u! L; u& p( D# t% n& j
ON table1.field3 compopr table2.field3
1 N/ U9 P7 h0 z3 e# e( c也可以
* G  t. n6 b- _9 N9 W% {Select fields( ^! \! y5 `, u" Z  F& E
FROM table1 INNER JOIN
1 g" l: M; h  O% X5 ^. A(table2 INNER JOIN [( ]table3
7 O" x, G. a' p* k$ U% y[INNER JOER] [( ]tablex[INNER JOIN]
. p! ~/ G& C+ y* WON table1.field1 compopr table2.field16 a5 [$ [( z- L
ON table1.field2 compopr table2.field2+ v! M6 p& A; |8 O) ], Z
ON table1.field3 compopr table2.field3. L3 {8 x# H0 F* v0 ?  s: `8 _
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。# ]$ A5 l) l0 A/ o; r8 v
FROM table [LEFT|RIGHT]JOIN table20 W7 f) K1 c8 S
ON table1.field1comparision table.field2% F( G0 w6 N3 Z8 G7 Z+ f
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
( ~- g0 g3 Y8 Y, b3 `例:不管有没有定货量,返回所有商品( N6 n" C* f" I" c9 H$ `
Select ProductName ,OrderID' G  ?; z* l. Q! j; M  W
FROM Products
# C: s- V0 c/ q; v' ]# aLEFT JOIN orders ON Products.PrductsID=Orders.ProductID: S# |6 M% [" a1 Y  C( x
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
  Z/ u2 {; w  S& I6 y例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
: J$ ?2 k% Y$ V( D空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。0 ]5 R9 O& |# ^, ?+ x9 A
Select *- g* v5 g. I, O! i) k5 k2 H# c
FROM talbe19 s% Y8 l( m6 x7 y. p7 N7 F8 K
LEFT JOIN table2 ON table1.a=table2.c1 O7 j8 ~) G& w
1 连接查询中使用Iif函数实现以0值显示空值
& j& i1 t# J+ d( Y6 GIif表达式: Iif(IsNull(Amount,0,Amout)
9 a  @4 g8 v& D7 A9 \7 x& s" q例:无论定货大于或小于¥50,都要返回一个标志。
9 S4 V1 W3 \+ ]+ yIif([Amount]>50,?Big order?,?Small order?)
+ Q0 k" K# x, T! ?/ p五. 分组和总结查询结果! w3 H- x6 h# ]7 u3 `8 h
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。/ `1 i  J( U# g9 P) @5 v
GROUP BY 子句的语法
4 U8 h( f7 R% J- ~Select fidldlist
! z4 K" O9 ~/ XFROM table  W$ Z  Y1 |2 j- O+ k
Where criteria
  t$ O1 R; t. s( Y9 O* R4 w[GROUP BY groupfieldlist [HAVING groupcriteria]]7 B" B  v9 L9 O5 A! S3 m4 i! r5 y: O6 b
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。0 Z  P: y& s6 b# D! X& {
GROUP BY字段中的Null值以备分组但是不能被省略。
7 d  H0 J- X1 m  g% h- U2 a  ~在任何SQL合计函数中不计算Null值。
/ k; `& j& Z+ }* U1 A  }* FGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。/ U% m0 Q) f1 {$ g
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
, S2 _7 X3 I# L+ `: S' b9 [Select Title ,Count(Title) as Total
7 b6 \& U- i8 r4 ?1 J3 \FROM Employees+ R7 `% h3 n& W3 O, f
Where Region = ‘WA’
  ?6 G- U: S. B* IGROUP BY Title
9 q' R$ N  M5 B/ {4 g8 rHAVING Count(Title)>1' c' v& r9 a5 S
JET SQL 中的聚积函数1 Y0 B3 S! n1 M5 S
聚集函数 意义4 O' H$ R2 S1 S- F% c( A
SUM ( ) 求和
3 x5 g' w! ^8 V( i3 @6 X( t. UAVG ( ) 平均值
: _4 s/ D: ~/ U: I1 ~7 e7 @COUNT ( ) 表达式中记录的数目
0 F1 v+ Y% H- o- o5 K8 O! g' TCOUNT (* ) 计算记录的数目
2 o$ V) V8 h: w" C8 FMAX 最大值- s: _3 q! t  \: u7 i, I
MIN 最小值: {! i9 |; t* F
VAR 方差
3 a" `% F2 i# ~( I9 C( {STDEV 标准误差
4 y/ l8 I- H! p5 A0 e% r8 xFIRST 第一个值& V) ~: `# {0 ?7 w
LAST 最后一个值# \$ w4 C0 A' l3 E* i
六. 用Parameters声明创建参数查询+ s, n/ ~* M- L8 ]& q& L
Parameters声明的语法:
+ @0 D/ ]1 H% X! ]  C, lPARAMETERS name datatype[,name datatype[, …]]/ z  E6 l% t" K9 ^/ c
其中name 是参数的标志符,可以通过标志符引用参数.) [0 f6 F9 l) l3 p8 b) W  q( O  f' }
Datatype说明参数的数据类型.
8 [/ b9 n) @- g. y2 W0 C! e4 b使用时要把PARAMETERS 声明置于任何其他语句之前.4 u0 S! ^- V* _& ~) h5 _9 q, @
例:
2 z% G6 m  l- g3 L7 WPARAMETERS[Low price] Currency,[Beginning date]datatime
" \3 K3 e! n) hSelect orderID ,OrderAmount
( W' i( A( h1 K* s& IFROM orders
+ W8 W! I2 l' X- VWhere orderAMount>[low price]
6 r; G  L7 u! K, O6 G2 J( U; rAND orderDate>=[Beginning date]- N+ `0 |3 w5 `+ c; n/ H
七. 功能查询7 s# Y0 h1 `& Z8 A
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.. S+ l# u% E; t
1 更新查询- k5 u! E( \; V: s" s' @+ B
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.8 p; k5 I/ E9 L7 Q7 M& F+ _
更新查询语法:* I( J+ L5 Z$ T7 i% o% P
Update 表名: N3 l: C5 k' \3 y+ {+ }
SET 新值
' T% b8 D8 `# I9 Y% `& [2 |Where 准则
, r4 |5 I: o2 x, z3 y例:英国客户的定货量增加5%,货运量增加3%
7 |& Y: D" C3 t) T8 l. @5 _Update OEDERS3 p; N8 w8 y$ w9 H- C3 S
SET orderAmount = orderAmount *1.11 s  Q" u1 n1 S1 g
Freight = Freight*1.03$ B" a) n/ C% _) k- i  }
Where ShipCountry = ‘UK’
8 q, k; Y$ r1 N1 F7 \2 删除查询; E( ?( H4 B" ~" _
Delete子句可以使用户删除大量的过时的或冗于的数据.! H$ r/ B6 ~9 ~! W9 X- ]# Z1 l5 N
注:删除查询的对象是整个记录." n8 K: `9 z: G/ l# t/ r3 \
Delete子句的语法:
& M. F+ Z6 M* S1 W& G" w, ]0 h  `/ NDelete [表名.*]
7 ]: c, W- H* ~; ]+ t; jFROM 来源表# y' |) T2 I- c, B. M
Where 准则
* B2 u9 }; G' a2 B, m% k9 e例: 要删除所有94年前的定单9 [% |6 n' u/ W$ n
Delete *0 i# O3 M' H* B/ D3 _  S" G
FROM orders. j+ P* v. ]3 Z+ p4 u2 Y2 F
Where orderData<#94-1-1#
1 ]' ?8 y: c- R9 L0 R7 w: ?8 n) Y- |, m3 追加查询
& G0 L- K0 a8 u% f1 N: A$ V0 M4 GInsert子句可以将一个或一组记录追加到一个或多个表的尾部." `5 n; J) Q0 m( m/ `8 \
INTO 子句指定接受新记录的表7 S8 _& m+ r- h6 A8 A
valueS 关键字指定新记录所包含的数据值.
9 v) Q5 d! d0 o5 q' c- Q) S3 bInsert 子句的语法:
* G( _: x$ W/ g- W) ?INSETR INTO 目的表或查询(字段1,字段2,…)0 D' f. H$ h7 n7 I
valueS(数值1,数值2,…)* ?5 E" o4 N' t2 |0 N1 v- N2 O
例:增加一个客户
' N! n/ N- N1 E5 _5 C/ T* A6 g: nInsert INTO Employees(FirstName,LastName,title)
2 \% l* X3 o. O& B7 I* C  c$ `valueS(‘Harry’,’Washington’,’Trainee’); L0 C7 ]7 S. \! Z( v
4 生成表查询
0 b4 M4 u& ?, ?& v可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
) g9 @) c; b$ BSelect INTO子句用来创建生成表查询语法:
  {( G! ^* u  K( ~# ySelect 字段1,字段2,…  f, R- T1 B' i' Q, Z% n
INTO 新表[IN 外部数据库]; e9 z( m" t3 ~) A8 l' }
FROM 来源数据库. o+ c, k/ V5 Y! m0 z5 J4 {
Where 准则
% y9 M" q' i9 E& m  F3 p例:为定单制作一个存档备份0 B, i, _2 V+ Y6 K
Select *
! ]  |* m* x. U; `0 m( wINTO ordersArchive
0 A5 y4 R0 l6 ~* C& d% x: nFROM orders: y& ^2 u/ U& O, z% b/ T: {
八. 联合查询( r2 \/ u% B8 p/ j' P
UNION运算可以把多个查询的结果合并到一个结果集里显示.. }# ^* [% ?$ j. ^" O! K3 s
UNION运算的一般语法:0 Y( V8 H/ B# B/ S
[表]查询1 UNION [ALL]查询2 UNION …- `! x# q* a* G7 ]+ h; C  j2 P
例:返回巴西所有供给商和客户的名字和城市
/ ^, I% c, s! {' `; t9 u4 KSelect CompanyName,City$ v/ o, T. X3 w
FROM Suppliers" @: z$ N. ?0 @- N# U: h
Where Country = ‘Brazil’
. k# W8 v; X1 s! \  }1 fUNION
- K1 b$ W* J2 j! A' ySelect CompanyName,City
* V( U  Y0 b  X6 TFROM Customers
  ~( Q- ^9 k3 z, [9 q0 B$ ?Where Country = ‘Brazil’7 R6 J' V) p5 ?4 Z9 e3 O
注:
9 f7 @/ [7 f. W' g/ L4 j# `缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项, M- s' D1 W4 ]8 W# {: `, x+ O
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.* a& _  N7 a6 Z6 w
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
6 o1 H4 x3 D7 G# t九. 交叉查询
- |, R% m( g6 I. p; F5 Q; q交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.' J+ a- z( Q6 J4 |& d% |
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:. N* N& d0 I# X& i" `* m" b
TRANSFORM aggfunction5 m! F1 o* U  o  Q
Select 语句
. y+ f" w& T" p+ _& ~$ O+ k+ u0 vGROUP BY 子句4 G! d+ i) r6 |* M0 p  R" c1 G
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
4 x/ ^, B9 Y  GAggfounction指SQL聚积函数,1 d3 N. n+ H5 R& h* @
Select语句选择作为标题的的字段,
$ g& ?# k. S& s+ G% sGROUP BY 分组! [) O% Q5 ~) K1 M& T
说明:* V$ p4 e0 C( v0 c2 M
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
' t. u" z! l  W. t/ a( @$ l/ {# avalue代表创建列标题的固定值.% D" V  c, k8 x& t3 c
例:显示在1996年里每一季度每一位员工所接的定单的数目:
4 o/ n. E% h8 p) |TRANSFORM Count(OrderID)" `! R" V5 x3 D2 }0 ?) ]
Select FirstName&’’&LastName AS FullName5 X: W- L: W+ H# ^
FROM Employees INNER JOIN orders
5 b5 z6 o1 V' L! Y2 n/ jON Employees.EmployeeID = orders.EmployeeID4 d1 t6 x" F; h, b# F/ c. e
Where DatePart(“yyyy”,OrderDate)= ‘1996’# W# }- _5 Z- k; |$ |
GROUP BY FirstName&’’&LastName
, V0 m2 H5 T) M* t  [) J; iorDER BY FirstName&’’&LastName
5 N, z( j3 e5 pPOVOT DatePart(“q”,OrderDate)&’季度’
/ f" Q0 P- Y. g! ^十 .子查询
/ i' h2 G9 c  d/ R  I子查询可以理解为 套查询.子查询是一个Select语句.
; f6 G# E+ S9 p) C2 y1 表达式的值与子查询返回的单一值做比较
3 Z6 ~1 [3 h( m) t语法:
% a8 A" W9 r3 N& J/ n  q表达式 comparision [ANY|ALL|SOME](子查询)
6 r! v$ ~( `4 d; z* s说明:, m- P. S, i5 ^) y' R( i2 F
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
5 F  y5 @0 @, I! }  B7 m$ _7 m例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品% ?3 [/ i, T1 O2 ~
Select * FROM Products+ ~/ ?; n5 d" O( n
Where UnitPrice>ANY
# U4 U' N8 d; P1 k. h. G; I(Select UnitPrice FROM[Order Details] Where Discount>0.25)+ i9 r6 Q+ n9 ]1 r
2 检查表达式的值是否匹配子查询返回的一组值的某个值
6 t  Z; W8 i% |/ i% y  e. j6 Q" Y语法:
( `6 P0 u) V) B+ F) \6 J; P[NOT]IN(子查询)
- d; F: P' C$ d/ L- t0 v例:返回库存价值大于等于1000的产品.
$ `# T& v5 k6 B) Y4 bSelect ProductName FROM Products6 b* @' s$ ], H) q3 h& C
Where ProductID IN
( \4 N3 T: B3 k2 \( b(Select PrdoctID FROM [Order DEtails]
( m. u6 r, d& n7 e/ o0 e9 ~Where UnitPrice*Quantity>= 1000)" |5 }0 r% N& D
3检测子查询是否返回任何记录
: A  g* F2 p! ]0 n1 D语法:7 Q8 }# f0 k+ G. L! i
[NOT]EXISTS (子查询)
, o8 z: x2 s  {4 W; R$ x  y9 K例:用EXISTS检索英国的客户9 C: R# V  {+ F6 j
Select ComPanyName,ContactName
" A+ H* m* E3 u' CFROM orders
: s3 {$ g& Y7 G6 n  hWhere EXISTS
$ t; a: D! ]; d6 Q4 A; _(Select *
2 c" E7 S! p' Q! |8 M& M7 j* UFROM Customers7 E2 H& i! y& C) C0 @; l; H- T: P
Where Country = ‘UK’ AND/ g2 E/ H5 j: _! S8 Y) r( ^
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2024-5-20 22:34 , Processed in 0.031200 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部