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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
7 U" k  t; W+ F# U" W& X5 }) {' O# A- ^( U  _, |. s7 Q% O3 K% k
select distinct 字段 from 表名
; R& F, Z! ~9 J; G% p) w6 F- {8 Gdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。9 X+ U, P9 Q0 L. s9 M6 f6 {4 G1 ^
一.Select语句的完整语法为:
9 m2 V- G5 E7 tSelect[ALL|DISTINCT|DISTINCTROW|TOP]& Z' L/ a6 k. H/ t
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}$ I5 D: K. o, O) n5 W+ w/ }: V
FROM tablee xpression[,…][IN externaldatabase]0 q9 N5 |/ ?* I$ S7 G- Y+ a, f
[Where…]- Z  H% [' Z3 a* l- {8 Z' }
[GROUP BY…]
! U$ {9 E( _! b) D# H' u- O[HAVING…]0 M: q4 e! Y" O5 R( p. V- _3 _
[ORDER BY…]; U5 Q  H9 \6 H4 r
[WITH OWNERACCESS OPTION]( ^& y. r$ H5 X7 o) [
说明:
/ F' @5 a: k7 x用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。) c8 G! Y6 t* U) }$ p) b- x
1 FROM子句
- P3 [6 Y# Y( u: P  i6 a6 DFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
) V  @5 Z$ B* e% W  U4 g( j+ }例:下列SQL语句返回所有有定单的客户:
$ E( H; ^" c! W. u0 z: z  |0 s% f) |2 zSelect orderID,Customer.customerID
( y6 n( [: _) p( jFROM orders Customers
8 U  N& p9 J. e8 T7 _! WWhere orders.CustomerID=Customers.CustomeersID6 r% o6 m& G  S2 ~6 j# v5 j
2 ALL、DISTINCT、DISTINCTROW、TOP谓词' o5 T/ B' c' }
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。/ z  h( b' Y4 P9 Z5 n
例:Select ALL FirstName,LastName
) U+ ~( W4 k" i. k- Z% [9 tFROM Employees3 _% |; w2 M9 T* ^5 m
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。. U" H1 {- X; n' J+ v4 Z4 w0 t
(3) DISTINCTROW 如果有重复的记录,只返回一个, m( I0 \/ o7 d* o! E
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
3 ~+ g4 Q: M& z4 C% j5 p" ^; L例:返回5%定货额最大的定单* y. h5 {# n# x0 t2 J
Select TOP 5 PERCENT*
3 R# D- W' a; Q9 dFROM [ order Details]
: n$ _& b2 _, ^8 B3 S5 ]. }7 \$ OorDER BY UnitPrice*Quantity*(1-Discount) DESC0 x1 `8 K, Q4 g# m0 E1 L
3 用 AS 子句为字段取别名
8 a+ f0 Q, h; q7 [1 h" ~  U如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。; K/ k+ |3 _  j6 c
例:返回FirstName字段取别名为NickName
2 P& @5 v$ r+ Y2 S  z! PSelect FirstName AS NickName ,LastName ,City* y# p; r; E% \6 Q# P) I2 c! w
FROM Employees) |& F# C1 m5 ^% H0 m
例:返回新的一列显示库存价值
7 Z/ f  K4 y* e5 M1 D6 }) lSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock) q/ x7 J# Q; D$ l4 d
FROM Products3 p: K6 {7 a5 ~0 ]
二 .Where 子句指定查询条件
! l9 x- }( [9 |" e1 比较运算符
& ]7 {+ v) v; v+ w4 z5 P+ o, r比较运算符 含义
; j/ @( {7 c4 Q, T: o= 等于
  [! B' t1 Z7 f" q6 {# Q> 大于2 `9 K' w( u) O" z" @
< 小于, ~' q0 T3 t# u$ N0 Z' Q% P
>= 大于等于
0 ?7 u" P0 v1 j( [; Z6 ?<= 小于等于- b8 P: s" n$ P( `, x
<> 不等于
: i5 {4 x% X: `!> 不大于4 }7 y2 ~* d; [& k* Z  a1 j
!< 不小于
; J# J5 M+ I6 r! ]+ O例:返回96年1月的定单% m( n- \8 |% k5 n$ }
Select orderID, CustomerID, orderDate% y" C5 }" [" U' G
FROM orders/ f; U1 j2 n( z6 ?8 Y. m
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
9 y* Y0 r& O: D8 w. ]9 @注意:
& r6 I$ R8 o* iMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
# [1 G& z" s  G, F7 f例:
5 ~7 k5 x2 x% p" Y* K8 ZWhere orderDate>#96-1-1#5 o9 `$ r. Q, r4 h
也可以表示为:. x) ^/ e* p/ c" j( x' e: c3 z& t
Where orderDate>Datevalue(‘1/1/96’)
; b" x  C/ ?. A% q1 t+ R# A使用 NOT 表达式求反。
( D) T! K: |( H! I- l5 u: W例:查看96年1月1日以后的定单
; o' T8 n8 M6 p/ }( @Where Not orderDate<=#1/1/96#, X8 Y. b2 S5 I
2 范围(BETWEEN 和 NOT BETWEEN)2 g% h6 H7 {9 ?8 M- ]8 c# e* v
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
& W, N" g8 v1 }( ]" Y8 v例:返回96年1月到96年2月的定单。
/ B( {8 L& B0 {+ r) [% x" I' zWhere orderDate Between #1/1/96# And #2/1/96#
8 B" Y7 y" I3 O% b5 F# t) W0 h3 r3 {3 列表(IN ,NOT IN)2 G: D2 c' ]  v8 k
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。! i) J" T$ j% i5 E8 Q+ |/ e
例:要找出住在 London、Paris或Berlin的所有客户) h1 V! c- u  \+ u7 X( V
Select CustomerID, CompanyName, ContactName, City/ k" R2 S7 w! j, r. U  \3 u2 f9 d
FROM Customers
5 ]4 T9 a( F7 n* K; x" ^Where City In(‘London’,’ Paris’,’ Berlin’)5 n2 `) Y  w' }
4 模式匹配(LIKE)
5 }% i# x5 c- V2 q2 PLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。! O- L& ~, |9 Y' x* D& N
LIKE运算符里使用的通配符
! D# a: U# g4 F" w: Y( t0 `: h* x通配符 含义. I$ c7 {' T; n6 M2 J
? 任何一个单一的字符2 \( {4 h! d2 ?4 N
* 任意长度的字符* l' v9 l- B8 b0 g
# 0~9之间的单一数字; J& Q% _: T& y/ Q* X
[字符列表] 在字符列表里的任一值
8 r. x0 H! f% ]; ?[!字符列表] 不在字符列表里的任一值% J+ h# }: ^6 T0 t" u+ D: y: }
- 指定字符范围,两边的值分别为其上下限: P9 l7 `6 J; P# n7 V  U
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
6 K( c5 r% L% `7 d+ d4 V$ v1 DSelect CustomerID ,CompanyName,City,Phone
# _8 F( @% }( V4 ~. iFROM Customers
$ |( z4 y) v2 I! Z" P# qWhere Phone Like ‘(171)555-####’- q' ~3 P; M' g+ {. s( Z
LIKE运算符的一些样式及含义
/ L( W( M8 o- b+ h7 \" ^/ d样式 含义 不符合/ J+ h+ Z+ o8 ~* R' \
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
6 X- T: r! K  J; c# LIKE’5’ 5*5 555
0 p3 {9 n( L! V7 Y( f2 A. M' ULIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
8 K$ W2 a, ~) i# T3 ^LIKE’5##5’ 5235,5005 5kd5,5346
2 Q! i0 `7 d7 x& s8 wLIKE’6 h% F8 p. F7 G! Z  y) ?. r, z
[a-z]’ a-z间的任意一个字符 5,%, ?4 k' K( o: t! U4 C, j3 q
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1$ f; t! }) i7 ~6 [. u; y# U
LIKE’[[]’ 1,*; _$ J( v  X2 u/ O  U! Y5 l+ ]
三 .用ORDER BY子句排序结果
" o% |( z7 d1 J; h, v5 C# p. Y6 KorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
- C" m% g% ?- o) MorDER子句中定义了多个字段,则按照字段的先后顺序排序。
' M0 C3 ^% c! \. l例:
4 r' N5 y5 n6 }* J& Q5 Q. R5 H* HSelect ProductName,UnitPrice, UnitInStock+ l, P1 ]" E( J! u- q' z
FROM Products
" x* d9 w# O3 g/ u9 ForDER BY UnitInStock DESC , UnitPrice DESC, ProductName8 ~) h& S( O( g
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
; }% Z1 h- W: z! @- \3 N6 u# O! U例:下面的语句产生与上列相同的效果。
" h& w8 P3 r  y6 B% K7 w8 uSelect ProductName,UnitPrice, UnitInStock# U% Q1 A) S, L; r6 }) ]
FROM Products
% _% {+ L! A+ P/ a! b; B9 W+ B. uorDER BY 1 DESC , 2 DESC,31 m3 J" F) ^. {& p. v5 A
四 .运用连接关系实现多表查询
+ v$ D) H1 K4 ~# N+ f" O例:找出同一个城市中供应商和客户的名字
  z$ `+ C& [* F( _Select Customers.CompanyName, Suppliers.ComPany.Name2 U, _( u+ c! |- Y- a
FROM Customers, Suppliers  u$ }" O  a( @1 Q
Where Customers.City=Suppliers.City3 b2 N8 a% S  o! {
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
! R9 @, k* Y' L  g; QSelect ProductName,OrderID, UnitInStock, Quantity; V- Y8 I6 Q  c4 d- N
FROM Products, [Order Deails]
9 t: {# c# f7 V" ^9 K) mWhere Product.productID=[Order Details].ProductID% z" G) l" K/ ^( o) Y' F! V
AND UnitsInStock>Quantity
# U; o- {5 F! l; G# i+ U另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN& H# x1 x" _4 V# }: r$ G3 a
语法:
; d* \2 K  F: q6 Q0 hFROM table1 INNER JOIN table2# A. x- q, ], r. T: ]) W' C
ON table1.field1 comparision table2.field2
" s! N0 b  m+ e1 C5 d" Z/ E$ O8 b6 P$ ^其中comparision 就是前面Where子句用到的比较运算符。
6 ~( _$ }0 x5 MSelect FirstName,lastName,OrderID,CustomerID,OrderDate
$ f/ M  |- [! W( R$ }' V# U6 f+ l. i! F8 zFROM Employees
- K5 }# D: P4 n% m4 [# w$ VINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
$ r) G' c) b0 d, s注意:, u( N3 n2 j, `8 P- h
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。2 i$ T- ]' o1 N3 t3 Q* f+ k
在一个JOIN语句中连接多个ON子句4 g( w# ]' r( f: R5 A4 _+ |  p
语法:- d/ p% C% O+ K: r* L4 Q% E& e# i) R
Select fields9 H% s( A* Z+ c, X, i
FROM table1 INNER JOIN table2$ R8 D6 J7 h' P$ H. C
ON table1.field1 compopr table2.field1 AND; k" M* h# y6 Z8 B3 {8 M4 P7 \! T
ON table1.field2 compopr table2.field2 or" j& ]: C+ y7 o6 O
ON table1.field3 compopr table2.field3* ^6 M: `8 e7 f& _2 g. W8 e: d0 f
也可以2 t9 ~$ x' L0 }! H, C
Select fields3 x) \- f3 x# X; {
FROM table1 INNER JOIN
7 ^4 ]( G9 Y0 R3 k8 h+ x(table2 INNER JOIN [( ]table3
6 K, C1 P7 F! C( U3 ][INNER JOER] [( ]tablex[INNER JOIN]
" ?$ R1 d# P, C' e2 z5 E0 ION table1.field1 compopr table2.field1
7 y, I3 N' [6 q+ ?ON table1.field2 compopr table2.field2$ Q& ]8 r% g9 i9 _
ON table1.field3 compopr table2.field3/ g! A% n3 p/ T% l8 M+ a2 _
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
* Z+ J9 t: J+ F, Y$ VFROM table [LEFT|RIGHT]JOIN table2, j: i5 c8 n4 i) M$ n, V" J/ Y
ON table1.field1comparision table.field2
5 Z! r+ `5 r3 Q1 Y) A* X用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据3 n" y$ A2 v8 Y% P! c
例:不管有没有定货量,返回所有商品
9 X( T- ]" T; p; KSelect ProductName ,OrderID
$ ]. U+ I, c' u/ PFROM Products
$ n* V# `! N& c2 gLEFT JOIN orders ON Products.PrductsID=Orders.ProductID, @" t8 ]9 j9 C& p
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。1 x! X- B+ C' w* y
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
  V% T/ _7 e" e' `$ }) b空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。6 @" j! X. I5 ]" [3 D: ~8 J3 R
Select *
1 h# m8 ]) t. h9 v2 |5 ~FROM talbe1' K& z% I/ K# e5 q/ B+ U- g+ d
LEFT JOIN table2 ON table1.a=table2.c% O6 ^7 ^; i% D2 S+ s; h* q6 ~$ k
1 连接查询中使用Iif函数实现以0值显示空值
9 \2 \3 R/ b! f0 e' g) b# pIif表达式: Iif(IsNull(Amount,0,Amout)# @+ Q- K- J: c& k9 E" {% R" I5 r
例:无论定货大于或小于¥50,都要返回一个标志。9 V2 Q4 E$ `  T/ X& m6 g
Iif([Amount]>50,?Big order?,?Small order?)3 K- }! I7 F& f
五. 分组和总结查询结果8 R% f: {' }7 ^+ Q
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
* m7 O  _" C/ c5 d2 A+ P, XGROUP BY 子句的语法
- Z2 j; j: p7 rSelect fidldlist
" Y. \8 ~, ~0 U. d$ j  q! M. z! oFROM table
( ?2 D2 E3 V, @8 e4 O" K4 j7 m% xWhere criteria# L7 h+ {% _! n9 F
[GROUP BY groupfieldlist [HAVING groupcriteria]]
! O/ B! ]- c5 D注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
; G" n9 r% p$ }% `* C* x6 J1 RGROUP BY字段中的Null值以备分组但是不能被省略。$ h3 z! q& r3 z) g
在任何SQL合计函数中不计算Null值。# A' a* m- c3 o
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。* x' d. ]8 G, a' j* ?7 J
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
7 O0 P2 L2 G- ISelect Title ,Count(Title) as Total
. @  w6 {/ h/ ]/ uFROM Employees
  l  l' t1 r, }3 T; J) h; @: e0 ^Where Region = ‘WA’
% F  |$ |! \! E* c8 B/ MGROUP BY Title
) Z. c& }8 I; j6 _1 K3 j! qHAVING Count(Title)>1% j1 s( m2 f* Z! l( m
JET SQL 中的聚积函数
; x2 R, O, ?" t8 y) ^9 K/ [* q聚集函数 意义5 [8 F# [# [; {% M2 x8 I
SUM ( ) 求和" s. i' I5 J3 ~2 A6 |; t
AVG ( ) 平均值
7 M% R* J. k' zCOUNT ( ) 表达式中记录的数目
9 A/ C+ ?$ P% [# r) e9 B# ?COUNT (* ) 计算记录的数目% E" ?2 Q6 N- |6 W6 F5 D( r
MAX 最大值& o# Q: `& Q+ W8 d+ _
MIN 最小值
! N& t' A$ Y$ _% R8 U- y2 f" RVAR 方差1 ^; `# S( ?/ a' x3 v8 [
STDEV 标准误差
% P+ K6 `" Y' y( K* s/ hFIRST 第一个值! J; L! n+ w  B2 a# ?& P0 Q
LAST 最后一个值$ o) B1 T( c: a% T5 Y, a3 Z- F
六. 用Parameters声明创建参数查询
4 Z( ^; f6 w. CParameters声明的语法:
/ d4 k- L: i; {/ g! d5 G$ B0 zPARAMETERS name datatype[,name datatype[, …]]7 M: r9 e6 S% x! D
其中name 是参数的标志符,可以通过标志符引用参数.
* `2 z$ a/ Z6 ]- [- [Datatype说明参数的数据类型.! |! c4 p9 A1 \. p0 f) ^* o
使用时要把PARAMETERS 声明置于任何其他语句之前.
6 L/ \% s6 _0 c& \! `例:( n9 v: `7 X9 i% q3 l& n
PARAMETERS[Low price] Currency,[Beginning date]datatime5 v6 ~. z! t' [2 v# K. X- A8 T
Select orderID ,OrderAmount; d% a1 p# e/ S! w2 j
FROM orders
  e6 Q0 A1 b0 b; VWhere orderAMount>[low price]
! ?( A+ r, {& T" P$ h1 {9 H6 ZAND orderDate>=[Beginning date]  z9 n9 J+ S8 ^; |  A- [
七. 功能查询. e7 X) i. J4 m, f+ L+ j
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.# t$ y  ^: Q8 [5 t( S6 n% d- X' m
1 更新查询4 M4 \% d9 \+ u4 m8 r4 P4 B
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.# [$ \) z7 P* S7 P$ D
更新查询语法:
8 H$ U* f) k) Z6 f& Y. i! yUpdate 表名
9 n, U8 Z; \" {5 {* vSET 新值0 P& F% d- _! o6 ~$ P3 p
Where 准则" j  c; ?$ i- U/ \9 m
例:英国客户的定货量增加5%,货运量增加3%! \  v$ ]5 N9 ?& u( y2 r8 o$ v$ G
Update OEDERS
0 P( @( E+ ~/ s4 T) I4 b1 BSET orderAmount = orderAmount *1.1
& z+ n7 @8 i+ |8 f; @Freight = Freight*1.03
7 A$ x9 ~8 s( a3 B2 s, qWhere ShipCountry = ‘UK’) x' O5 m, ?; P+ {0 X
2 删除查询3 v) Q. H4 s8 J7 Z
Delete子句可以使用户删除大量的过时的或冗于的数据.
4 k4 D# W+ k6 D9 p. ^$ H3 U6 o注:删除查询的对象是整个记录.2 z. k0 K7 j( ~2 q1 k3 S
Delete子句的语法:' T) W+ P. p) c3 F9 G. |
Delete [表名.*]
2 P5 n5 N. L6 V: |. wFROM 来源表! j$ ]9 J  S0 m& m. U9 a
Where 准则
6 ~- {, Z# r/ ]' D例: 要删除所有94年前的定单! g- g* ]) k& q, [0 k* r! e
Delete *
' a0 K8 T+ |$ H7 K0 KFROM orders$ ^1 I. \; a0 N; i) w; X
Where orderData<#94-1-1#" o% F" j$ f- p. ?
3 追加查询, v! d% ^& Y: l4 B$ S: G# b$ k2 M
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
8 G6 [, [3 |- X. E* pINTO 子句指定接受新记录的表) U  ^0 c3 d0 ?, r$ t# g
valueS 关键字指定新记录所包含的数据值.. m/ z  g4 p% a5 @' [
Insert 子句的语法:- B! D/ p: @; Y( ]& T2 Z4 Y
INSETR INTO 目的表或查询(字段1,字段2,…)
7 ^( H3 F2 U( T& ?( ^valueS(数值1,数值2,…)4 ~  [- J% S/ w
例:增加一个客户) h4 P, D1 Z& A( a) X4 O
Insert INTO Employees(FirstName,LastName,title)1 C7 K; {. f( u# _
valueS(‘Harry’,’Washington’,’Trainee’)4 E3 h; T* y! B" V5 x3 t
4 生成表查询
& _" [* g& D& H9 |0 v可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.2 p- }0 a6 T, Y% r6 T
Select INTO子句用来创建生成表查询语法:5 r" N1 r' E& B+ Z6 t( c
Select 字段1,字段2,…3 T! B# q( b7 N- s0 I- _0 r3 M3 I# Y8 ?
INTO 新表[IN 外部数据库]) V# [  Q% a* V3 z! h( E
FROM 来源数据库& C& ^; }! K, s& o1 z  Q* V5 b$ \
Where 准则$ `! o8 ?4 c' K
例:为定单制作一个存档备份
, m8 P- P9 _  OSelect *1 `0 Z& O  b# S& U; a' s8 j( |7 L
INTO ordersArchive
2 @/ P+ G2 |2 p# y- fFROM orders
* o0 s8 c& X2 ?+ @8 Y: Q9 B9 Z八. 联合查询  g5 `% d( N, q3 T3 o
UNION运算可以把多个查询的结果合并到一个结果集里显示.% i7 {& t, ]+ X
UNION运算的一般语法:
- K6 y" S5 ?. A, H" o# a[表]查询1 UNION [ALL]查询2 UNION …
9 M) ?- i$ u( u# K( {( p例:返回巴西所有供给商和客户的名字和城市
2 K+ R" ?( m8 T' c: BSelect CompanyName,City
: S" @/ G0 A" I+ F9 b* tFROM Suppliers
+ h% P  C/ S+ m. sWhere Country = ‘Brazil’
" t: }2 e( p. H6 L! h, \UNION: `& |2 R  P1 P; r
Select CompanyName,City
# e( y; `! H) s/ tFROM Customers! Y9 p1 f& W! F( J* [9 C) x% \
Where Country = ‘Brazil’
) S) P0 o- B6 B+ M注:
/ p+ R8 ~! ]3 Y( r* ~4 v0 M缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
, m' [( l& f' j/ W& ?UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.. o5 B) S. b% F+ ~) M
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
+ H# j, W8 q5 H1 F6 S九. 交叉查询6 L* v0 R) l* q. N/ a  f3 n
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.- k/ k8 v/ s. E) u7 F. ^4 [
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
7 f# m1 v6 b9 @5 eTRANSFORM aggfunction$ {0 e; ~. b4 @5 p/ ?4 o# d
Select 语句* b5 e' |3 N- u( P8 d: K( S9 U
GROUP BY 子句& u  u$ U! Q: a' ~: u4 k* G
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
9 |( Z; @* s2 _Aggfounction指SQL聚积函数,* W% H5 F/ v% @- f6 Z" J+ t
Select语句选择作为标题的的字段,7 }6 q# L' v2 C! k" @3 b
GROUP BY 分组
+ `+ J: o8 I2 e+ h+ t& C& f7 v, {说明:
( `) a5 D( T9 ^, [5 S6 a( O. |Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
, i: g% H' ?$ ]2 D1 C% xvalue代表创建列标题的固定值.
) K( N2 Q8 ~( o6 V% j6 V例:显示在1996年里每一季度每一位员工所接的定单的数目:
9 r4 O5 e: c; ]3 R/ w  D0 cTRANSFORM Count(OrderID)* ^  M# Z0 c0 w
Select FirstName&’’&LastName AS FullName
% d! z/ q/ k# a. z; lFROM Employees INNER JOIN orders
* F7 E6 z7 K9 AON Employees.EmployeeID = orders.EmployeeID
2 V4 H# j3 G3 RWhere DatePart(“yyyy”,OrderDate)= ‘1996’. g8 P! Y$ b& P* P5 X
GROUP BY FirstName&’’&LastName% O; h& _8 S7 A, @* M# h- U
orDER BY FirstName&’’&LastName( J: S$ [; @: D( R3 g$ c
POVOT DatePart(“q”,OrderDate)&’季度’% U+ b6 n; G' v% v1 X, _
十 .子查询8 F, D0 i6 M; ~& q( p" g
子查询可以理解为 套查询.子查询是一个Select语句.
! f0 g$ }' e% l4 U5 p  J1 表达式的值与子查询返回的单一值做比较- U: D+ J4 Y, f# n) ~1 Z, S( L! E2 d
语法:
1 T* f3 [( r2 Y% N" Y2 e9 U0 {表达式 comparision [ANY|ALL|SOME](子查询)+ w  B* A: z  V
说明:" S% j9 o( a9 c. T, R1 h- ^
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
/ D( d% E- A, f+ F例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品" F! `! ~  z0 _, r
Select * FROM Products
8 f/ x: e+ a6 k+ [Where UnitPrice>ANY6 @9 w! @8 |2 j
(Select UnitPrice FROM[Order Details] Where Discount>0.25). p& m( r7 n% U9 p: N6 }
2 检查表达式的值是否匹配子查询返回的一组值的某个值2 Y" h2 e, }* \6 N+ @2 m
语法:* t" j8 \$ T" X0 F2 Z
[NOT]IN(子查询)0 t5 N/ u; A0 ?6 y' x% l; y
例:返回库存价值大于等于1000的产品.8 m: c2 ]8 s7 ^/ B
Select ProductName FROM Products' s8 t/ L* W2 ]/ i- h3 b! p% T8 y
Where ProductID IN/ t8 r" @, c8 \5 g; W
(Select PrdoctID FROM [Order DEtails]
5 v5 v& F2 a2 v: K4 OWhere UnitPrice*Quantity>= 1000)& Y$ i$ p3 _! d+ i4 z  h
3检测子查询是否返回任何记录
7 \) V& S5 ~$ n) V语法:
$ e: \0 |8 E4 T: n1 R7 f4 N" L+ C[NOT]EXISTS (子查询)
) W! n! ~$ B8 e8 q1 F- ]例:用EXISTS检索英国的客户
: B9 S% |8 `* v& \" ASelect ComPanyName,ContactName% f% T! [' `! H/ W) @' Y
FROM orders
5 B1 [& L$ r; y( j3 v, R* O# OWhere EXISTS
% T( i( [9 M2 ?; L! z(Select *
* \9 g' L$ K- eFROM Customers" \( J( U, h* Z2 a' o) t4 ^
Where Country = ‘UK’ AND
% Y: {5 v8 @' \0 X; j# p. FCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-11-27 02:29 , Processed in 0.025002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部