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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
1 |; ~( J+ ^) t7 J( z9 A
: E* ?! ]) c/ X( Lselect distinct 字段 from 表名
) }3 R9 {/ v9 vdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。; g' M; R$ I$ x( D: ?
一.Select语句的完整语法为:+ O, D0 ]+ x( d0 N: s0 w
Select[ALL|DISTINCT|DISTINCTROW|TOP]
* t/ ]0 R" ?. F1 M4 f/ u) A{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
9 z( V4 F4 K- d9 l# iFROM tablee xpression[,…][IN externaldatabase]
, {" X( k# n/ z7 y[Where…]* ]* ?) d& k0 z
[GROUP BY…]( K1 y! L; p5 s2 e1 x; F
[HAVING…]4 l3 |3 ?1 r+ ~+ W7 u- R  y1 J
[ORDER BY…]4 \& W' ~1 I0 D8 P6 K4 b/ p
[WITH OWNERACCESS OPTION]
3 o. ~& b% s2 l5 C/ {; }6 E说明:* ]$ b$ H: M: M
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
+ G" A6 E/ ?: R. L! L9 E1 FROM子句
" u, t* b/ c# w4 sFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。2 I' k0 l+ ]5 Y: `$ i/ P- I+ O/ z
例:下列SQL语句返回所有有定单的客户:
+ a- |9 _" I9 l8 a- m- LSelect orderID,Customer.customerID4 r* U; i$ r, i* P  _1 J' l
FROM orders Customers
" f6 v6 @! s8 s) @6 EWhere orders.CustomerID=Customers.CustomeersID
# ?4 l+ e8 v, d! R, g; u9 K  v2 ALL、DISTINCT、DISTINCTROW、TOP谓词
/ V" {$ y" K8 M' u9 t- ]5 S(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
) r" I+ T' V7 ~6 X例:Select ALL FirstName,LastName
$ L. Q! p" w( t! O# v$ g3 bFROM Employees
8 _- T) `/ h6 o% M6 g(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。4 \7 v) B, g* h& z7 g7 h; |
(3) DISTINCTROW 如果有重复的记录,只返回一个
$ o- L, S/ ]* y3 T: x) V! n(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
( U( h6 p: ?5 T# \  b( d例:返回5%定货额最大的定单$ k% v0 N  S' Z9 l) A# }% u
Select TOP 5 PERCENT*7 k# X3 @8 Y8 k' t5 d' g# {
FROM [ order Details]
* W8 C4 T4 i1 ^" H) lorDER BY UnitPrice*Quantity*(1-Discount) DESC
9 O0 B% l$ C( X  P/ L/ ?/ _3 用 AS 子句为字段取别名
1 T8 ]6 {3 k4 Y  P  P: G如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
/ r6 @; T: V$ S2 E4 \! o例:返回FirstName字段取别名为NickName
6 z1 f9 u5 _1 rSelect FirstName AS NickName ,LastName ,City1 x! K( T+ h" [4 T  k7 q; ?
FROM Employees
: ~$ b$ _0 W0 n: W例:返回新的一列显示库存价值$ t8 e. e: _# ?9 u9 t1 d3 p  t
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
8 S+ W$ Z* `) }# @  K8 gFROM Products
( B8 y, V; C, z1 S二 .Where 子句指定查询条件  |, i* M; g$ m
1 比较运算符
$ z  x; E) u9 H& U6 I2 y# V# b' }7 `比较运算符 含义( M. [9 v0 Y2 H4 @. r& [
= 等于
4 U- I: e/ C# B& Y* ]/ A> 大于9 U& O' T/ H; B
< 小于2 E, o; p- j" w7 b2 C
>= 大于等于! N5 X- f8 J6 h* P* Y1 s
<= 小于等于
: H9 V' d. ^( E; k# Q<> 不等于9 P; P7 W" i7 S- O& L" e; i
!> 不大于
) i' a* l6 f, ^% [!< 不小于
( l1 R$ Y/ \2 z例:返回96年1月的定单
7 e: P8 w2 y6 d( J% wSelect orderID, CustomerID, orderDate7 k) \9 b! r2 W. j' r; A# J
FROM orders7 Q- W: g$ M  g0 g6 k* _
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
( L5 D, q( z, ]: b* C注意:; P% _7 e1 y! k$ T+ O
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。& O# ~1 J) o8 e# a
例:% o# p% Z" ]# R2 n
Where orderDate>#96-1-1#1 @9 Y, Z+ r% K: a4 A
也可以表示为:, E  |: W/ F$ a7 J1 n. V
Where orderDate>Datevalue(‘1/1/96’)
" p) c" e! h% e0 W9 |" `  b4 ]使用 NOT 表达式求反。1 f9 h5 h% C5 K; ?
例:查看96年1月1日以后的定单
0 C2 h8 y% i7 a4 j6 eWhere Not orderDate<=#1/1/96#1 c( f7 r% u' ?
2 范围(BETWEEN 和 NOT BETWEEN)" s% n5 j2 y# M  D. R) {4 V
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
0 B6 i1 |! }+ F- x9 \% p' f+ w例:返回96年1月到96年2月的定单。
+ V( N" E  u+ a7 kWhere orderDate Between #1/1/96# And #2/1/96#
8 u6 @" ]5 I' W7 q+ h* x2 ]: I3 列表(IN ,NOT IN)
6 {3 W0 U5 R* O) d# ]8 uIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
# ]6 ^7 s5 Q7 j7 v5 d' t9 m例:要找出住在 London、Paris或Berlin的所有客户
3 [+ y  m( H& }& ~5 M. ^, P$ u: Q/ ~Select CustomerID, CompanyName, ContactName, City
0 W6 ]4 ?( j* d- [# n9 RFROM Customers
+ g7 `$ B3 i0 ]' I9 V/ hWhere City In(‘London’,’ Paris’,’ Berlin’)
' j& r: j1 p5 }$ }- F* r4 模式匹配(LIKE)
: m0 H% s" @" k# g! DLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。, ~- c* M5 n3 h0 ^8 j4 g
LIKE运算符里使用的通配符
& k' r) L; M" o. o通配符 含义. i+ U2 Q  s5 z) i1 a- @
? 任何一个单一的字符
6 Z+ t  \( }' q- H$ C( N* 任意长度的字符
3 F2 ]/ \& K( H; ]# 0~9之间的单一数字' ?" C% C* ^1 U$ Z* Q
[字符列表] 在字符列表里的任一值: {3 r$ b. A* X5 Q7 i$ h* u
[!字符列表] 不在字符列表里的任一值
% t) N( Y; k; I# ~6 A" z. N- 指定字符范围,两边的值分别为其上下限  O+ q/ A$ ~6 z/ H8 d4 W
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户: C& u2 e; t6 B: T
Select CustomerID ,CompanyName,City,Phone9 _8 }1 m+ z/ q& s1 N
FROM Customers  {2 ^; r5 x9 B0 `2 r: j
Where Phone Like ‘(171)555-####’6 {0 O& l( l+ ^2 E
LIKE运算符的一些样式及含义: G; }5 d, h9 Z0 i& _8 e1 x  J
样式 含义 不符合
$ {! ?/ ^& h% R- J" M) bLIKE ‘A*’ A后跟任意长度的字符 Bc,c255
. W5 R4 I  S  u8 b: A* O/ V% Y# LIKE’5’ 5*5 555
# z5 a* Y; z5 P# Y" aLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
! o/ G. z+ K, h: A* zLIKE’5##5’ 5235,5005 5kd5,5346
# e" h) x' D$ m4 |' m" Y# L" H; eLIKE’
% o$ s3 m8 v. e) ][a-z]’ a-z间的任意一个字符 5,%3 z6 Y) j" E  q; I% w# x; M( i
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1- {3 D# I, b  z; o5 c% ^+ r* S6 Z
LIKE’[[]’ 1,*# [, y, s  l9 z' `0 ~9 i
三 .用ORDER BY子句排序结果7 Q1 s3 Q0 i& u
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。( Z. R8 n; g8 S  k
orDER子句中定义了多个字段,则按照字段的先后顺序排序。$ G4 x& E0 C9 L
例:  w4 W, k8 L) _# q& u- Z. R5 v4 C  S
Select ProductName,UnitPrice, UnitInStock
8 z' m" e" U7 I" F" @  F$ T7 iFROM Products
( j- K$ H% S2 BorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
$ F; f+ U/ b) rorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。, p# h  w# b1 m# }0 {5 K
例:下面的语句产生与上列相同的效果。
* f9 I$ I- u" N: p, H  ySelect ProductName,UnitPrice, UnitInStock
2 E* f* T2 d$ s5 ^FROM Products+ k! X" y9 X) M( f
orDER BY 1 DESC , 2 DESC,33 v3 w3 y) Q. h$ r. a% W* r
四 .运用连接关系实现多表查询
. W4 z. Q* C8 Z3 d5 o4 _例:找出同一个城市中供应商和客户的名字
" @/ t. S0 n- KSelect Customers.CompanyName, Suppliers.ComPany.Name
6 q- G# b  r7 ^" VFROM Customers, Suppliers/ p% o/ ?8 h* M. _' F
Where Customers.City=Suppliers.City, h. w6 G8 k, F, D/ H0 X
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
, |; q  D1 S$ j- U, m5 y  QSelect ProductName,OrderID, UnitInStock, Quantity
6 S3 A: \1 x+ z5 T8 ^2 G0 z* nFROM Products, [Order Deails]
: q' D& H0 b8 VWhere Product.productID=[Order Details].ProductID  K4 X4 }) H1 P& U4 E6 N
AND UnitsInStock>Quantity' r% O- a  @7 l: l) E9 `
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN; R$ P$ i$ R; U1 q$ [) Z8 t6 |
语法:
7 W$ t# K% m$ k( ]: a6 oFROM table1 INNER JOIN table20 Y: o# c( U/ ^5 n: m+ E: C
ON table1.field1 comparision table2.field22 Y" D& ]5 I% T5 F5 W8 ~: t3 _1 e
其中comparision 就是前面Where子句用到的比较运算符。4 B! Y$ J" k% S4 ?& @
Select FirstName,lastName,OrderID,CustomerID,OrderDate6 ^8 P% W  U" [' ~- Y
FROM Employees0 l9 e8 ^3 I9 [9 }% R& {
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID- E8 y2 i, L) E5 G. d$ \$ D; N
注意:
2 l. }0 c! G6 D! _0 B; yINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。5 |$ C6 g0 S! S$ |" Q- y4 {  i$ y
在一个JOIN语句中连接多个ON子句# e8 C9 T  X% v" K( c9 a" q! ]
语法:) R# q% y* S( i7 H, o* P+ g
Select fields! d% J) Q. G, \% s8 I" {
FROM table1 INNER JOIN table2
& Y6 j) ]7 i$ Q8 g; DON table1.field1 compopr table2.field1 AND
: {5 O) T- _( t4 p* \0 zON table1.field2 compopr table2.field2 or) ~+ q' _3 N9 W0 E& r# u
ON table1.field3 compopr table2.field3
: [4 [* `# f4 j+ L. M9 I也可以
& ?9 e! M+ \7 C1 p) h5 jSelect fields
/ g" x8 n  Q0 L* k  ]% u/ bFROM table1 INNER JOIN
/ c! C5 K0 ~8 P3 q- o' `, B(table2 INNER JOIN [( ]table3$ f2 f8 C0 E( p4 s5 l
[INNER JOER] [( ]tablex[INNER JOIN]8 C8 ^; w7 e6 y4 O2 O1 s
ON table1.field1 compopr table2.field1
  n2 H' X+ s& SON table1.field2 compopr table2.field2
5 F) b5 Z) d" E) K2 I) j" EON table1.field3 compopr table2.field3
" C# N% m7 U: S/ l+ k/ Y外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。2 a) d% D- s' q0 }/ ]# ^
FROM table [LEFT|RIGHT]JOIN table20 E( u2 W% ~) M& ~- ?& L1 h
ON table1.field1comparision table.field29 ?! C7 ]8 j" z9 r0 T% b) e8 F
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
* t6 P! G2 G1 }0 c( I& |例:不管有没有定货量,返回所有商品
2 I) a3 S. r% T# q- |6 QSelect ProductName ,OrderID  m* Z( s9 ]' W; s3 _
FROM Products
* b6 U) W0 c! e* Q/ KLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
8 B+ U' I0 f5 \) E4 k右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。. [% Y2 \  T" F# |+ X# P: B' Y' ^. }$ {
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
9 C9 ^3 S+ S* W9 \6 |# k& v空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。. T- v3 s4 N, ~3 [
Select *
. S( u4 h6 t8 w, k* N% M5 R* `FROM talbe10 a1 _  k1 d0 K7 S" U
LEFT JOIN table2 ON table1.a=table2.c
0 {7 S9 P8 O& E4 J+ Y! A' i4 I5 o1 连接查询中使用Iif函数实现以0值显示空值1 @$ o) z2 d' ]/ C
Iif表达式: Iif(IsNull(Amount,0,Amout)
7 F# g& F. `$ X2 K# G' c  @  g7 a  k例:无论定货大于或小于¥50,都要返回一个标志。
8 _6 W2 W! c) s; |1 RIif([Amount]>50,?Big order?,?Small order?)/ \. F5 G5 F9 L. O5 K* y
五. 分组和总结查询结果
" Z/ u# ~/ N6 s) g- Z5 Q在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
" P: \$ \. ^( j- `! t- C0 Y+ h+ HGROUP BY 子句的语法
2 _$ g7 M) r! w! H6 TSelect fidldlist" \" c! X) }) S) f
FROM table
, [. Q2 |  m: i) P  KWhere criteria
( @6 K3 l+ n( j) G3 T6 G5 L( _[GROUP BY groupfieldlist [HAVING groupcriteria]]
+ S" X: a5 f4 M! O5 ~8 W/ A2 ~注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。3 k& z! L% B! [; u% u6 Z
GROUP BY字段中的Null值以备分组但是不能被省略。
6 n4 A/ R2 `4 t, s3 {在任何SQL合计函数中不计算Null值。, @" S+ l# G1 `& ^7 a  R
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
# p3 B4 o, L; }例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。( ^+ i: Q) I4 K! H
Select Title ,Count(Title) as Total. G' ^' {6 ~6 ]& ^0 G# A
FROM Employees4 r5 t& y4 \! f" {' Z
Where Region = ‘WA’
. A1 P8 h, O( U& mGROUP BY Title
7 q+ y9 d0 I0 P$ ^HAVING Count(Title)>1* s, S. e$ `8 Z6 o( L
JET SQL 中的聚积函数* e5 s! |2 B( [# ]) z6 m- `
聚集函数 意义
& C( K3 B6 T3 @2 w* JSUM ( ) 求和& f! s8 G& R* u1 l
AVG ( ) 平均值
3 v9 V0 r+ M# f: jCOUNT ( ) 表达式中记录的数目
1 b. I, @: K4 k$ m7 TCOUNT (* ) 计算记录的数目& K7 u4 |" B3 B+ T6 x
MAX 最大值
# v1 I0 P3 h5 u9 h) |% iMIN 最小值( G1 _' c* c9 P2 B, Y* k+ K
VAR 方差" B; l6 ?+ F# Z# ]- W. t
STDEV 标准误差
+ H9 W0 l% \3 N# r( {& L; nFIRST 第一个值
# I# s2 Q  G1 Y" g$ L; I3 {LAST 最后一个值
# q0 Y* o4 {6 [, L/ a六. 用Parameters声明创建参数查询7 A: ]: z, [9 h/ d) D) P$ J5 O
Parameters声明的语法:8 R" n6 L- U$ F: M2 K! j7 R
PARAMETERS name datatype[,name datatype[, …]]* G( i* v: m. T  d; O
其中name 是参数的标志符,可以通过标志符引用参数.
* L! l' Z/ [( H( v9 p0 \Datatype说明参数的数据类型.
% q+ q8 L. ]# r+ I# O使用时要把PARAMETERS 声明置于任何其他语句之前.
) M; q3 ~8 u3 w. `: z6 T0 m9 U例:/ ?* y7 C# o8 X+ a+ S, K: _/ w
PARAMETERS[Low price] Currency,[Beginning date]datatime0 Q. N; P* U+ @" ?/ i
Select orderID ,OrderAmount
- R" m: ~3 @6 x& s$ A8 P% }FROM orders
4 c5 ]5 I- h/ u* IWhere orderAMount>[low price]) l# ^3 X2 n9 E5 {
AND orderDate>=[Beginning date]
) y# J  \6 w+ a# `/ K* u  I七. 功能查询" A: [# S% _6 y# v3 \. \
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
0 D. R5 ]' H6 h5 U1 更新查询+ x+ D4 C5 s" q6 t5 w! ~
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.9 r) r/ n" q5 b$ z/ w) s
更新查询语法:
/ t) @8 [5 c) t( m9 q& ?6 Y& CUpdate 表名% z- B- \) `. Z: W$ h
SET 新值3 i: H  z. y& e1 O( w+ _
Where 准则
! j/ w& t# M: |% U例:英国客户的定货量增加5%,货运量增加3%3 v0 _! C9 M* y; G- |8 \
Update OEDERS
5 d- ?6 y: K( E! d' BSET orderAmount = orderAmount *1.1
+ c1 `0 A  I6 {& T  P" z( T# Y  {Freight = Freight*1.03
/ g% r# H4 P2 t/ G0 D) o9 RWhere ShipCountry = ‘UK’1 G3 m! N1 p. t9 X4 o7 I% o4 c( b
2 删除查询8 ^" L) q( f# x# b0 a
Delete子句可以使用户删除大量的过时的或冗于的数据.  c0 L7 u4 C' r7 O: @1 l9 @! K
注:删除查询的对象是整个记录.  o( o, L# V! x. O0 ~# }
Delete子句的语法:
7 [. a7 Z6 [# |  C1 ?1 SDelete [表名.*]
+ _9 D8 s$ H" G- rFROM 来源表" M0 H, J( P4 w2 R, n+ `
Where 准则" H) h+ q4 z- e2 e* j  ]$ w( l) {
例: 要删除所有94年前的定单% b/ m% K2 y2 \8 v( e2 ]% a' q  e
Delete *
  t7 ~: l) U& \* o$ Q- x2 GFROM orders
2 F& K/ U/ T; \Where orderData<#94-1-1#1 E$ r  G, |3 E0 W* f. c
3 追加查询6 |, z3 @3 l: t( S
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
7 e) c# }7 z0 p2 f1 x6 h$ @INTO 子句指定接受新记录的表
- g3 B1 u- E8 ]0 s. f9 @valueS 关键字指定新记录所包含的数据值.
4 G8 M0 L+ a$ Z4 O0 u" T4 s3 g- rInsert 子句的语法:
3 k3 R+ g2 o" F& a) l. r+ UINSETR INTO 目的表或查询(字段1,字段2,…)
; s$ o/ u5 r, p' i8 D5 a2 YvalueS(数值1,数值2,…): d# C( t- Q! m, ~
例:增加一个客户' y/ J- ^+ \! w
Insert INTO Employees(FirstName,LastName,title)# p4 y8 H1 r- y9 U
valueS(‘Harry’,’Washington’,’Trainee’)
2 v7 j2 l! B7 Z4 生成表查询: k1 O& ]3 l$ M. W4 v
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.) W, I' ?4 o' t9 E( [& ^8 T
Select INTO子句用来创建生成表查询语法:+ z' N! @! t, _% S& j
Select 字段1,字段2,…8 i% ^% [$ [1 [" M% a# n
INTO 新表[IN 外部数据库]
( t5 z  v4 `* O/ v# `9 DFROM 来源数据库
' y, ]% m" x- w* gWhere 准则
) d$ B" C  n; P3 R; L例:为定单制作一个存档备份2 ?0 h5 P9 ~2 o0 y9 P- c, @9 d6 I
Select *
9 F2 F: U. o' c4 m6 hINTO ordersArchive+ T& }) Z8 j$ o4 O4 K& r$ [5 X
FROM orders
6 k- Z+ r: I! K; G八. 联合查询! `* T3 e( j. W7 `1 y( `
UNION运算可以把多个查询的结果合并到一个结果集里显示.- G6 c& d0 N; d/ `# j: D
UNION运算的一般语法:
! O! S. z  u5 L2 W" H5 A; V[表]查询1 UNION [ALL]查询2 UNION …
& b1 y3 }& H4 N" q例:返回巴西所有供给商和客户的名字和城市
1 H( Y! y: n; r. @9 ^Select CompanyName,City& N8 o* H* O$ ?
FROM Suppliers
/ b4 v3 C2 T1 p4 h8 X& `Where Country = ‘Brazil’
& n8 ^  u3 R, ?+ l( m) z9 K2 Q4 ~UNION
; _8 D% N& E$ {# {Select CompanyName,City7 j6 S2 k8 g+ f0 }/ V4 o: ]' f3 r/ l
FROM Customers) f; }5 {& y5 g' F3 ?% p* o
Where Country = ‘Brazil’* V2 ^4 j& S3 @
注:
) l; i  ?; x3 F5 @7 \- e: o缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项) {3 Q# g  a; O* U
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
( ^* E( h/ M. v4 I8 Z" h每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
0 c: b, ~/ k& q  {九. 交叉查询
2 a: u. Q/ E/ T6 I: ?+ R交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
6 U* _  I$ N. `! s# D8 g  q  ~Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
5 A! m9 p2 k0 m% QTRANSFORM aggfunction
% N+ _3 R* A3 |7 fSelect 语句
& M( d/ a3 z0 x6 }3 H6 cGROUP BY 子句0 [4 h+ h8 q0 q( g, O1 D' E5 a
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
: R" _+ G  d( Q4 k+ J9 E! ]; OAggfounction指SQL聚积函数,
3 P5 b4 I9 A7 w# \  J' ]9 S. KSelect语句选择作为标题的的字段,! ?! f2 g/ K0 S( W* [: z
GROUP BY 分组! b& Q- A' T3 ~! W) J. s& {
说明:
+ |: M  i2 y: a5 KPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
8 g/ n: t4 M8 t, O2 x6 G2 p; fvalue代表创建列标题的固定值.
) }3 G" M% D8 F! t# E例:显示在1996年里每一季度每一位员工所接的定单的数目:0 ^  Q9 ~7 {  F& _9 H
TRANSFORM Count(OrderID)
/ ]) W+ t- a5 u+ NSelect FirstName&’’&LastName AS FullName; F% W9 k9 l) _) V8 l
FROM Employees INNER JOIN orders
# C, F) l3 a& `6 u& kON Employees.EmployeeID = orders.EmployeeID
; q3 }0 Q' S- _' m% E' C2 e4 ~Where DatePart(“yyyy”,OrderDate)= ‘1996’0 Z& G0 G2 X' {/ a0 P+ p7 O$ f
GROUP BY FirstName&’’&LastName
* \) m6 |- ?  d1 horDER BY FirstName&’’&LastName
5 X5 n5 k% A# F+ ZPOVOT DatePart(“q”,OrderDate)&’季度’6 S8 n+ R9 e( _( w1 e! ]
十 .子查询
7 Y- J0 E1 B) B, W. w' G# W: j, A子查询可以理解为 套查询.子查询是一个Select语句.
, ~, i! J& X4 ?' W; R* J* K0 K! }1 表达式的值与子查询返回的单一值做比较+ [3 v' Q; n* g; ]5 Y, a, N+ U9 U
语法:6 m9 G3 X# y& F2 _
表达式 comparision [ANY|ALL|SOME](子查询)' R& |9 q. c7 ?+ x
说明:
1 B7 ^; a- m! u3 [& X, TANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
2 T" C9 j; t/ L& A例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品( E/ u7 j7 G9 d& K* |8 A, B$ |1 b
Select * FROM Products- Q4 H$ S2 m3 k  p
Where UnitPrice>ANY/ u9 n6 _* w. o% c
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
: U; f) f. K/ M, ]- O2 检查表达式的值是否匹配子查询返回的一组值的某个值) H) I$ C( S) M- N
语法:
7 ?2 K9 V& U, u. m: d[NOT]IN(子查询)4 M8 y+ i& S2 U% O( [* E
例:返回库存价值大于等于1000的产品.% D5 d' ?# a, _! n
Select ProductName FROM Products+ J! q' x! z0 O
Where ProductID IN
. @/ D& V/ p! I( N7 I7 ^8 ^(Select PrdoctID FROM [Order DEtails]
% `/ L8 l. u+ R; X3 ]6 dWhere UnitPrice*Quantity>= 1000)
! o0 ]: v+ c7 ^  L2 o3检测子查询是否返回任何记录1 j; Q! o8 B+ n/ B& r8 D/ S
语法:" T& w: }* c0 |7 m$ y4 g
[NOT]EXISTS (子查询)- u& \3 V7 c" B
例:用EXISTS检索英国的客户
" }; s/ a* m6 x4 ?% `' X& ]Select ComPanyName,ContactName
- j% x% F# a% e" EFROM orders% N# F# I4 _, I
Where EXISTS% `1 {' X# h, B* D
(Select *
2 E% k/ [; r& I+ `7 _- P7 e; X6 kFROM Customers
/ f$ I2 t! C3 p9 bWhere Country = ‘UK’ AND
7 P- y1 L: z6 X) H( vCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2024-11-25 07:34 , Processed in 0.029002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部