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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
0 Y9 ~1 W' I/ W1 U' Z& }# w! d* ?
select distinct 字段 from 表名
. a4 ~7 l+ a+ [/ ^) U( Y& W9 `- vdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。: L" O5 j! w0 j- q8 o+ H7 s( _
一.Select语句的完整语法为:
: F# p- w% R; m  h2 s' K& ]8 ?Select[ALL|DISTINCT|DISTINCTROW|TOP]
8 I" u! m0 b# O: ?{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
2 l+ ~- w& v1 b  W" LFROM tablee xpression[,…][IN externaldatabase]2 z* C3 `; h6 R! t  k" w: I/ g
[Where…]$ H% A* i7 m8 w
[GROUP BY…]+ U" Y: h5 O) f/ o# g
[HAVING…]
: M4 Z3 J# J% K2 B* h6 D' k[ORDER BY…]
0 X9 _& v' x, V) A2 r[WITH OWNERACCESS OPTION]: ]2 P! U- z* Z1 [2 W8 D7 ^
说明:$ x( D' h1 t1 S4 u2 W3 Z7 z7 o
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
/ k: w& z; a+ G' G1 FROM子句$ |! Q* \. p( f- C
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。. Q) t& B) F, q$ S5 H( }$ G
例:下列SQL语句返回所有有定单的客户:4 v4 y4 L. M, c6 y0 |5 j
Select orderID,Customer.customerID
. O, P. y$ r( v: x  DFROM orders Customers
( J1 u6 `3 R' g/ p- O# p' `Where orders.CustomerID=Customers.CustomeersID
& F3 ]4 b+ Y; u3 N) H+ g2 ALL、DISTINCT、DISTINCTROW、TOP谓词
2 d0 G: a: E% L3 Y1 l8 O" j(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。  O. [5 [! ^5 G) T1 r
例:Select ALL FirstName,LastName
0 q+ T. F& P/ S# K1 C0 g7 }FROM Employees
: o9 U/ ?+ o  E" t( ^7 L& |(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
; _# r! b# ~+ |: p(3) DISTINCTROW 如果有重复的记录,只返回一个
0 k' U& H8 T, i* G. M7 n, [(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
' V3 z/ ^9 s2 r* ~1 s: e# H8 a例:返回5%定货额最大的定单
4 d8 w& W- ^5 y- O3 |# qSelect TOP 5 PERCENT*
$ g* J7 u' k8 ]$ K  L2 R# NFROM [ order Details]! E8 ^- u* I* z- I8 b+ L7 k
orDER BY UnitPrice*Quantity*(1-Discount) DESC+ _- y2 O9 C5 `7 |' J
3 用 AS 子句为字段取别名
& V0 X' _9 b$ I9 Q( ~' W# ~& V* E) e如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
. I+ T% D  J3 ]: D/ F& |例:返回FirstName字段取别名为NickName. g8 B1 ^% Y. R/ v1 v
Select FirstName AS NickName ,LastName ,City
3 H0 j7 l1 n$ P& [FROM Employees- N9 q# `8 i! w
例:返回新的一列显示库存价值2 u8 D1 ?+ X( N
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
* K  V9 b7 `# S6 X/ cFROM Products5 r# N' ]9 b7 u- R: }
二 .Where 子句指定查询条件
6 Y6 X3 j$ }6 p! y% Z1 比较运算符
' i, Z! i8 ]3 _7 k- H3 J比较运算符 含义
; Y2 }) O7 a4 f) t- X: ?: d4 g4 J= 等于* V# p) r) A  {& O, n( V5 `
> 大于  S% \4 F8 a; `; O  z& y/ b6 M
< 小于$ H1 P9 ~  M" f  U
>= 大于等于
' E0 U9 B7 z, `9 m, b<= 小于等于
) W' L; n3 y# x8 h+ q<> 不等于. X# u' {7 Q" Y2 C: X
!> 不大于. t) P, K* N2 q* q! t- _/ e" l
!< 不小于& }0 v, a( ?& l" o3 Q& y/ O( F
例:返回96年1月的定单
* D9 T9 x' G* t6 R$ }, lSelect orderID, CustomerID, orderDate1 d4 C/ u* X* L$ S
FROM orders, b% A. v: {% A. \8 ?8 _/ T
Where orderDate>#1/1/96# AND orderDate<#1/30/96#0 U, ~6 Q8 |, D& U9 O3 D
注意:
' |' u$ ~. D% z, G% dMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
1 z7 D. l6 a6 s  ^9 }. T! P例:" X% m' _3 [" D  S
Where orderDate>#96-1-1#
" k: V/ j- i7 a6 E- ]* S' N3 B. I也可以表示为:3 A9 h4 \1 P% b' `) ~- q* X
Where orderDate>Datevalue(‘1/1/96’)
- t7 _8 l% \: [# T" A& k# Z) @使用 NOT 表达式求反。
" ]3 Z& m  @3 {( W% R# G例:查看96年1月1日以后的定单
' _4 B8 Z8 p3 Y: s) vWhere Not orderDate<=#1/1/96#
* j0 I; M; y1 u$ |2 范围(BETWEEN 和 NOT BETWEEN)  f. R2 ?/ o' h1 u5 x& @. @
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
4 B/ C& R1 t8 |$ q) J例:返回96年1月到96年2月的定单。
$ C& i' [: Z- V8 p/ JWhere orderDate Between #1/1/96# And #2/1/96#
, U2 h( U  l+ A8 v3 列表(IN ,NOT IN)
: d, z# p3 d' P/ dIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。1 ^# h3 u% Q! t) ^- _3 K6 M0 I
例:要找出住在 London、Paris或Berlin的所有客户
; J8 B- H' z" m1 f( dSelect CustomerID, CompanyName, ContactName, City$ p# D+ Y2 e# g
FROM Customers
7 E: p3 t9 K( s  iWhere City In(‘London’,’ Paris’,’ Berlin’)3 ~) x: [1 T% A+ G0 g* ~; |7 F
4 模式匹配(LIKE)
- W3 T* @$ K2 J: eLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
. [" I, U0 D1 N" g4 SLIKE运算符里使用的通配符
! t. _  f' ]3 b$ R# L: t. m通配符 含义2 U8 W/ S  l* C7 @6 {
? 任何一个单一的字符
0 T: `, ~- r1 k* F/ J3 K* 任意长度的字符1 m. |3 z7 o6 g( r7 j  K- i
# 0~9之间的单一数字
/ g4 Z9 w' z, ?! a$ f[字符列表] 在字符列表里的任一值
8 V# ]! J1 [" V9 o+ h7 h" _7 D[!字符列表] 不在字符列表里的任一值+ }& y& n  i  x/ P2 z* g' y
- 指定字符范围,两边的值分别为其上下限9 d6 ~4 t. K/ f( u$ J, K1 l
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户5 x; |' V  b  X. U
Select CustomerID ,CompanyName,City,Phone* R& g/ d% a- u, b4 i( Q6 x& W
FROM Customers
% L3 g' K5 ~% D: {Where Phone Like ‘(171)555-####’
# d6 ~' {+ G! c" G' q+ H5 x  ?LIKE运算符的一些样式及含义5 S0 G! V# i1 u! H/ E; F
样式 含义 不符合# A5 x$ p# U1 j0 l# V
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
2 f6 g9 T5 {' L+ ~& R3 M6 G# LIKE’5’ 5*5 555* }3 k& C' ]4 Q+ H* G* e
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer55 @! D6 q& v1 M0 n# g
LIKE’5##5’ 5235,5005 5kd5,5346
( Y% N& c9 Y2 [- I9 t8 z6 aLIKE’
: [5 @+ |  p1 \* Q1 v[a-z]’ a-z间的任意一个字符 5,%
6 G* `1 v% K8 v0 V; ~5 w$ ^LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
$ U& O4 M) R- L& G1 P: t) g2 TLIKE’[[]’ 1,*
2 \2 f( D  E% V三 .用ORDER BY子句排序结果
5 e! x* U9 g" p) F5 c% z% corDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。! H1 i, r! ~/ X/ ~
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
$ Z" G6 z- `# f6 w( U例:* G- t/ z/ ]  K  W# j% \
Select ProductName,UnitPrice, UnitInStock
3 N* w$ p( ^3 {( i# v2 m# Q. XFROM Products" E: r# j+ h7 y* m/ c9 B1 N
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
; V* n7 ]6 [3 borDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。' ^  i0 k$ G( o, F' N/ T
例:下面的语句产生与上列相同的效果。" s2 g: ^: ]% w) g# C! ]
Select ProductName,UnitPrice, UnitInStock  e' Q! E+ ^. D% d+ f0 o
FROM Products# `/ n+ C8 e; R2 [" A, H
orDER BY 1 DESC , 2 DESC,3
$ i4 w1 k. w4 B2 ~7 K四 .运用连接关系实现多表查询
' E  i: F* n' }例:找出同一个城市中供应商和客户的名字
+ r+ j$ X4 i8 [  T: iSelect Customers.CompanyName, Suppliers.ComPany.Name
& r, s" M) I' K% j' k  d/ o7 RFROM Customers, Suppliers
% f$ N" z9 }; jWhere Customers.City=Suppliers.City
6 P/ b/ v% Q0 @3 z+ U0 B例:找出产品库存量大于同一种产品的定单的数量的产品和定单' O) V) ~$ X  S# n
Select ProductName,OrderID, UnitInStock, Quantity9 `% t8 X) q! {% Z% G8 X
FROM Products, [Order Deails]
9 v% n, Y; ?5 U$ OWhere Product.productID=[Order Details].ProductID
* R! p6 z; R8 ~# oAND UnitsInStock>Quantity
1 k% s% o4 y; {8 G+ x  k另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
: p" x- v2 m# d语法:
* v: [: Q5 p( N: c' [FROM table1 INNER JOIN table2
! c* e5 z! @7 c  kON table1.field1 comparision table2.field2
% ^) X) M9 [$ y' }; V' E9 w9 G其中comparision 就是前面Where子句用到的比较运算符。3 [% D7 N" |& T- ]; p
Select FirstName,lastName,OrderID,CustomerID,OrderDate' A5 |( t7 [, Q  `' x. `  z
FROM Employees( }" c* F1 l. m. @; Z* g
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID/ o; ^$ F6 x5 L  ]4 b
注意:$ B# ?7 w( z8 ^; q$ V
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
+ S* G' t5 U" S6 j. y在一个JOIN语句中连接多个ON子句6 @! F7 A% V6 b$ e0 j* F0 k3 V
语法:. v$ {; _' m" b. V/ N( ~1 ]! G4 H
Select fields
, i  Q! q6 g+ s' _) rFROM table1 INNER JOIN table2
/ K) {/ R! ]4 Y, ZON table1.field1 compopr table2.field1 AND
* o& }- @* [  @: jON table1.field2 compopr table2.field2 or. a6 a9 U3 c* v3 L
ON table1.field3 compopr table2.field30 T! `. b+ G( J& c) T$ f! g9 n8 g1 u' X
也可以
- K  ?. E2 u& H3 `Select fields
. x& j+ s2 w  B, o# Q& hFROM table1 INNER JOIN
% }+ o# {3 P* Z! ?4 G+ p& c(table2 INNER JOIN [( ]table3
( Y6 D2 [. F7 g. j" T6 j[INNER JOER] [( ]tablex[INNER JOIN]
- c$ ]6 k9 B" c; f- V. dON table1.field1 compopr table2.field1
$ N$ C' y3 U- uON table1.field2 compopr table2.field2+ O. g, f: n! z4 b3 x# M- I9 G( _
ON table1.field3 compopr table2.field3' m/ ~3 _' ~0 Y5 V( v# N# C# ^
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
2 l& C: e/ J1 b% J2 H. M/ @6 qFROM table [LEFT|RIGHT]JOIN table2
  _# m3 e/ I2 T6 s5 }ON table1.field1comparision table.field2
6 Q& e6 o" F( g: ~用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据' Q7 w9 Q5 J+ S' w
例:不管有没有定货量,返回所有商品
: q5 f" }3 E# l0 ~' uSelect ProductName ,OrderID9 q# z7 a/ j+ Q/ J& O. _) C# w
FROM Products
* M+ k9 g* d& y' x5 q2 v! M* ILEFT JOIN orders ON Products.PrductsID=Orders.ProductID
* C. o/ {2 P( L. D( A右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。% O$ ^# g: ?5 J0 `
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。8 |8 d! k$ g2 D
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
3 p1 Z! f2 k3 [1 u9 ]4 MSelect *% J1 B# p( l& a
FROM talbe1
9 ?. ~: p7 o" ]6 ]* ?5 p( ^LEFT JOIN table2 ON table1.a=table2.c
0 L( F* w, W; E* s: E1 连接查询中使用Iif函数实现以0值显示空值9 x# s6 q! ^; L* @" U1 i
Iif表达式: Iif(IsNull(Amount,0,Amout)
- @; x& L5 I/ P0 @例:无论定货大于或小于¥50,都要返回一个标志。
, R7 {/ k7 M& w: \4 UIif([Amount]>50,?Big order?,?Small order?)! d- l! U$ u9 k+ J/ M8 c3 P1 B
五. 分组和总结查询结果
9 M- N# x/ L2 e. w0 {在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。' ^: }9 f; \' V/ j$ n- H
GROUP BY 子句的语法* D  E# w6 m. e' V7 ^. E
Select fidldlist
, s* Y- m: Y7 M; Y8 v% B/ }! xFROM table+ Y, i& m2 z8 G' P. q" Q3 W
Where criteria
3 D6 X9 ?0 S( H1 Y( _( }- P[GROUP BY groupfieldlist [HAVING groupcriteria]]: e3 @( U' B0 t* W# f
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。7 S& M/ G( i- I- y) z4 O
GROUP BY字段中的Null值以备分组但是不能被省略。3 K& l' ^( T/ ]. P
在任何SQL合计函数中不计算Null值。1 s) p' H  s+ ], H
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
: T/ ?5 q- t4 n) [0 h9 K例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。2 x: s( V3 v" c4 W0 R
Select Title ,Count(Title) as Total
# H  {7 c) j4 Z) p' u5 w$ bFROM Employees
6 s4 M# j' U. ^# }2 j% t6 O5 uWhere Region = ‘WA’( e" M) ]) l4 A, R2 ?# m! _" H! t
GROUP BY Title
8 S* a  [! s3 d! J. W' WHAVING Count(Title)>1
6 i. @3 a) Z# [4 f% K. D8 v7 DJET SQL 中的聚积函数! B0 w0 V% u$ P0 R; v
聚集函数 意义
9 |9 v1 j& j) F& WSUM ( ) 求和2 o% U+ Y4 W/ I/ g' |
AVG ( ) 平均值3 k* [8 S; }6 @. s
COUNT ( ) 表达式中记录的数目9 ?8 e+ a3 `, U8 q- D1 R2 G4 ]
COUNT (* ) 计算记录的数目$ s" E+ k5 k/ D+ m
MAX 最大值
% R6 n* B# L8 k4 qMIN 最小值+ X/ P. E' g  {+ p! V* c( U) d; i4 n
VAR 方差! m$ a, ~3 s0 ?7 Z# i. i
STDEV 标准误差
. M* ]8 y! _* L* E, v3 GFIRST 第一个值
) ?' j3 I* w9 K3 a4 ~4 y5 r# A$ n, BLAST 最后一个值) \( v% l( I1 X8 C2 k( s- }$ b
六. 用Parameters声明创建参数查询; R- I. M; _9 o) D" w
Parameters声明的语法:4 B. }+ w0 y) R
PARAMETERS name datatype[,name datatype[, …]]
+ d6 ~% v3 i/ k; x5 g其中name 是参数的标志符,可以通过标志符引用参数.
( P# Y8 d7 q/ g* V- CDatatype说明参数的数据类型.7 B4 K2 O, R6 G& y8 t' k
使用时要把PARAMETERS 声明置于任何其他语句之前./ e1 c; L( Q( R& `
例:
- U- p2 W2 G5 bPARAMETERS[Low price] Currency,[Beginning date]datatime
' c$ ~8 L. M& N  `4 ~- ESelect orderID ,OrderAmount
* Z0 V! E9 {; f+ K* ^" x, CFROM orders# x: ]7 j( D, m2 B1 \7 `) h) @
Where orderAMount>[low price]
5 H6 r% r6 p6 K4 M- M% a% TAND orderDate>=[Beginning date]
6 s4 ?: D' [$ N" U+ P七. 功能查询" _$ y7 I/ u6 X3 a
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
+ K, w$ P) v* O+ P) \( s2 p1 更新查询6 Z7 B$ C5 k$ g
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.( A0 R4 y! c' d- f: B% V  _
更新查询语法:
: J4 `( {5 p7 R, ?9 I- eUpdate 表名% P- ?4 _8 D" `. s
SET 新值1 {" j+ }6 z# p6 }# Y6 Q$ s* H
Where 准则
( Y, |* _; _8 q" `3 h! y2 A8 }例:英国客户的定货量增加5%,货运量增加3%
+ }0 i& G" r7 e8 A0 {- Y0 i# ~Update OEDERS& e2 D: E4 F* Q, s* b* t
SET orderAmount = orderAmount *1.1
, y( k8 s& e& {6 I, O0 qFreight = Freight*1.031 }, e* \5 O8 g# h3 V$ Q( r5 i. _/ j
Where ShipCountry = ‘UK’
+ I. H9 d- s( Z3 D& {: d# k. |2 删除查询4 l9 D3 K! T- ?/ i5 T  E( j
Delete子句可以使用户删除大量的过时的或冗于的数据.
  n7 e* T: E) c' w注:删除查询的对象是整个记录.
' G* x6 i, [. k* GDelete子句的语法:
) K# T8 D  j6 o/ ]; f2 _Delete [表名.*]7 x  j( ]* G. f  O% m
FROM 来源表7 F! M* C9 L( E
Where 准则! m" y/ Y; w" s) k+ I
例: 要删除所有94年前的定单8 ]2 E/ p' R. I- y; a+ f
Delete *
/ I: Y) v( r# ?1 \$ l- z3 o$ uFROM orders
* N& N0 K' s, Z; E$ n- iWhere orderData<#94-1-1#
% N8 O  I4 j; K2 U# c* \3 追加查询. d7 g+ {7 J8 R  Z
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.) x+ @& }. O& a. g: d
INTO 子句指定接受新记录的表
0 {- h% N+ b0 m7 C% t4 pvalueS 关键字指定新记录所包含的数据值.
+ k. o& t8 b9 X0 F0 j, @Insert 子句的语法:+ [) w. Z2 T/ ~# g7 ~9 h
INSETR INTO 目的表或查询(字段1,字段2,…)' d4 K( N* r1 C4 b6 H. E: M  c* c
valueS(数值1,数值2,…)0 M& s6 X& C) g1 L, g/ C- P
例:增加一个客户9 T) A# I2 r: }& K8 F7 h
Insert INTO Employees(FirstName,LastName,title)
5 K5 w; r$ w- k6 w0 A; bvalueS(‘Harry’,’Washington’,’Trainee’)1 C- o7 X8 W4 \
4 生成表查询+ y: a+ G6 ~$ z- `0 F
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
3 D+ s% v' @5 ?4 F! ~7 y6 P  xSelect INTO子句用来创建生成表查询语法:
1 @# u5 l9 w: S1 V+ ISelect 字段1,字段2,…8 Y( z/ N7 x$ v+ l
INTO 新表[IN 外部数据库]6 i9 U; F: J  L6 H* R0 y/ G  o- }
FROM 来源数据库
3 r/ N% _+ E0 r0 H8 s: \1 \Where 准则# ?: t9 ~. u& A
例:为定单制作一个存档备份8 s. J* G. I$ l# X& l7 M/ u  P/ E" |/ J
Select *1 {9 [0 H* x) l% a: e
INTO ordersArchive6 b# K% {" f5 A3 z0 z6 M- U
FROM orders$ q! V" ]! P  F; [1 n
八. 联合查询1 r8 m' n' c% G
UNION运算可以把多个查询的结果合并到一个结果集里显示.
9 r! ~7 y8 b8 k1 P# f# C" U, OUNION运算的一般语法:( o6 x; Y: E0 H0 p
[表]查询1 UNION [ALL]查询2 UNION …
' A9 u6 U$ Q" u9 J+ \, p& X8 O/ h$ J/ p例:返回巴西所有供给商和客户的名字和城市
6 y1 Q& L9 ^. J- M5 C8 hSelect CompanyName,City
5 w7 u9 K) H2 s5 H" UFROM Suppliers
, H! A+ ~- B; B* FWhere Country = ‘Brazil’
1 j' B, U. i+ O5 Z8 YUNION  L* Y2 l8 c  `% ~
Select CompanyName,City
0 Q+ S; J$ B6 @# c8 cFROM Customers
! i* e) Q9 c& c7 A* u# B5 RWhere Country = ‘Brazil’% N+ \, S) d* Q0 @1 I
注:& P- y, L8 j2 D+ ?0 Q( \+ J+ V
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
0 H+ x9 x8 I6 T: z6 nUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.  a6 [$ z, {! `6 a+ ]
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.2 v9 U6 @3 ]7 h; @" v# B  ^
九. 交叉查询
2 B4 Z0 f3 j+ N+ l4 S: o- N4 Q交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.4 Q- x. c- H  W  S; |
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:' A6 h0 S0 q5 B& D
TRANSFORM aggfunction2 ?: a% I0 H+ o- z$ M% I
Select 语句
* T4 L7 l$ s9 Q& JGROUP BY 子句
; W* T3 C0 Q- m# v8 N7 G  PPIVOT pivotfield[IN(value1 [,value2[,…]]) ], m0 V/ Q. ~9 ?) R4 _! f, w9 G
Aggfounction指SQL聚积函数,# q- H! ?+ ^  H$ z+ a! u
Select语句选择作为标题的的字段,1 P3 Q# h* s5 J2 n
GROUP BY 分组
/ }( {& N, m" s- s1 Y9 Q: c说明:
; ^4 I2 f3 e7 |+ }Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.. \6 J, ^4 t! {1 x4 u# o. B
value代表创建列标题的固定值.
- D5 w7 Y; G: P8 y4 q4 _# {例:显示在1996年里每一季度每一位员工所接的定单的数目:# n( W) L- T' K( r
TRANSFORM Count(OrderID)/ S& s5 v3 ^" i) F/ d( F
Select FirstName&’’&LastName AS FullName- Y- y1 K( L- X- m. ~  B% a
FROM Employees INNER JOIN orders
2 R9 @7 X9 u- W0 w0 sON Employees.EmployeeID = orders.EmployeeID1 Z$ @' K$ O& V5 g4 C# _2 [8 J" \) H
Where DatePart(“yyyy”,OrderDate)= ‘1996’* y0 d+ S# z4 d6 t5 n
GROUP BY FirstName&’’&LastName
- z- |1 ?# W8 b3 SorDER BY FirstName&’’&LastName
) \4 ^# |/ B& D! y1 v2 O6 DPOVOT DatePart(“q”,OrderDate)&’季度’8 M, Y6 O0 i* `/ x) n) Z
十 .子查询$ |+ T6 @! y3 i/ O" f; ^
子查询可以理解为 套查询.子查询是一个Select语句.
! N. d9 ^6 g6 X+ b7 o1 表达式的值与子查询返回的单一值做比较
5 D8 C/ o0 I( b. E语法:9 ?- Y6 I# S# N" ~2 t
表达式 comparision [ANY|ALL|SOME](子查询)
! C0 ?6 u! }3 k$ Q4 R% s说明:
$ v6 Q' p# c+ H* ~6 tANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
/ Q7 h3 P4 n+ w! }6 z  S例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品3 Y* a- Q# M# q7 Q
Select * FROM Products
, T1 U; s% S3 U7 MWhere UnitPrice>ANY
' B7 h' {; t5 Q4 D* m% w(Select UnitPrice FROM[Order Details] Where Discount>0.25)& S' s8 @2 K) v0 ~
2 检查表达式的值是否匹配子查询返回的一组值的某个值, S+ b, L* F9 H1 B" W* j
语法:4 ?) E2 B0 T) r' p6 _$ v
[NOT]IN(子查询)7 t' [" R( S  ~* g
例:返回库存价值大于等于1000的产品.+ A' D* u! A. P6 r% \6 d
Select ProductName FROM Products) [) b( h  a# B4 r
Where ProductID IN- @: G2 ]- y4 y( w5 B+ H  I
(Select PrdoctID FROM [Order DEtails]/ V  I+ W( B% E
Where UnitPrice*Quantity>= 1000)
1 B; {4 `+ h3 m& a. |  \0 D: |3检测子查询是否返回任何记录2 p5 k# c2 X* q/ z# p8 `. P0 k
语法:
% w% q+ Y; _: Y; G% i[NOT]EXISTS (子查询)
% ^3 e2 z+ w: k- P4 M, ]例:用EXISTS检索英国的客户
; d* q% C, Q) U5 R% zSelect ComPanyName,ContactName
  x# B( A8 g- U% _/ D$ QFROM orders
& [1 S; t8 U5 T- u1 O% P/ ]8 XWhere EXISTS. D8 k2 l! o- l- N8 `' r1 m
(Select *% d; d$ ?0 {  N3 G+ L
FROM Customers
  {, K7 ?3 x4 }: h& i6 f2 P# NWhere Country = ‘UK’ AND
% K9 s3 a# m, p. T( v6 OCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-1-11 14:08 , Processed in 0.027002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部