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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
8 F2 E6 }: w  |8 V6 b8 K2 k/ U6 H
: I/ G! r0 r$ Q' v5 D5 p2 v8 X3 U/ r7 rselect distinct 字段 from 表名
& q- s) j8 X9 j0 a6 j" y8 B2 bdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。' N* C* T3 G) F3 M, [* B
一.Select语句的完整语法为:
4 m7 T4 [2 q, X/ _+ H( g3 ^, d& D. WSelect[ALL|DISTINCT|DISTINCTROW|TOP]* U9 ^! j' i7 q) q
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}2 v$ c/ \6 u" _& [1 |
FROM tablee xpression[,…][IN externaldatabase]# S( c8 N0 w& U4 X
[Where…]8 D1 U( c% O% F$ f. }
[GROUP BY…]
. D0 P3 @! @6 Y/ j' {, H4 b9 t[HAVING…], J$ [/ s. d3 R
[ORDER BY…]2 B) q% [; v# F* y  k* r
[WITH OWNERACCESS OPTION]
2 B6 n) V  T7 n+ ]0 ^说明:3 `) n8 p8 q7 I: m; G
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
8 ^0 N3 F& h; @  U- A: g# i  ]& H3 H1 FROM子句
3 |7 y9 t6 y4 g2 `FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
* h5 w" w" }" T4 b, a4 I+ I例:下列SQL语句返回所有有定单的客户:
6 q/ N( F5 V# _4 ^8 p" d$ w+ m5 ]4 d% KSelect orderID,Customer.customerID$ W: S9 }# s2 B1 g8 R. z5 G' b
FROM orders Customers
# w7 {/ r( z9 M+ b) q! f, iWhere orders.CustomerID=Customers.CustomeersID1 C6 U/ q/ Z9 \! q( u- p
2 ALL、DISTINCT、DISTINCTROW、TOP谓词+ Z# g" Y8 e$ M* ~/ ?
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。0 B% o  T* J5 @! E
例:Select ALL FirstName,LastName) f7 z, \7 d+ f7 b
FROM Employees
& f: ^8 Z* B3 H; q0 l5 [6 V(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
) M1 x: b& O- Y9 b" |8 h& R8 W(3) DISTINCTROW 如果有重复的记录,只返回一个
8 U" `: B" _9 Y7 j; b9 H: |(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
% [" T/ r2 t. i8 R2 y+ c: s- U例:返回5%定货额最大的定单" P8 i/ ?" U* j3 N2 ^
Select TOP 5 PERCENT*4 G3 _5 M& m0 n1 l
FROM [ order Details]
# K% Y3 |. D. i; TorDER BY UnitPrice*Quantity*(1-Discount) DESC0 l) _4 s& b6 u# ]* m1 W7 l
3 用 AS 子句为字段取别名( c! S! c* B! q' ~# F0 @
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
6 u' U% S; K/ b: \" v! p例:返回FirstName字段取别名为NickName4 M9 \' Z" I/ `6 c
Select FirstName AS NickName ,LastName ,City/ G9 t( D; @) M5 |0 \
FROM Employees4 F- Z- N- h' e6 S- U5 @/ N
例:返回新的一列显示库存价值2 @' a1 b: I, p) {& d5 K* Z
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock& U5 P3 U; F0 y$ z/ y: ~7 x0 P
FROM Products2 T; n5 x' U9 F; ?9 I0 q% e
二 .Where 子句指定查询条件
0 u4 y  x  Y/ ~7 A! O1 比较运算符0 |* `: ^4 ]: m$ d  ?- v7 W
比较运算符 含义+ i% {% K5 _7 |  x5 o! W
= 等于
: r$ f1 o# ~& s/ C$ j" {6 M> 大于! n+ S! d; y/ M" t4 y
< 小于2 v! E. r# R2 I6 E+ R
>= 大于等于
+ h/ h2 }( L/ o+ E* S9 a<= 小于等于* C2 x! ~7 ]8 W: z, f. u
<> 不等于* h/ G6 N; P/ X- M: t2 W6 ?; ^
!> 不大于
  ~/ h" ]2 x1 }9 @) i3 w- a!< 不小于3 [' c6 K% U+ p/ i3 _% {7 ]
例:返回96年1月的定单
* [* k* f! N: j1 H/ ISelect orderID, CustomerID, orderDate8 e4 M. r3 V' k3 m  N1 C8 M4 K6 j* m
FROM orders
% ~4 S$ j8 \! w# w" }Where orderDate>#1/1/96# AND orderDate<#1/30/96## }+ T5 {5 `0 ^4 D4 M
注意:
3 B9 Z# \% G3 v4 K. i& L$ jMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。1 L" x& E9 P2 i' ^- l
例:
# p; {4 {' O; ~Where orderDate>#96-1-1#* I4 A3 Y. b  ^# D! G# c0 r
也可以表示为:
& Z' R, x9 e( U; [Where orderDate>Datevalue(‘1/1/96’)! y5 `4 E& O6 F! Y  m) e
使用 NOT 表达式求反。
* t8 D1 z4 b- M0 ?3 p% z例:查看96年1月1日以后的定单
* W9 `/ ]# \2 K; Z* UWhere Not orderDate<=#1/1/96#
5 _# s: c- ~9 u( |. E6 e5 `3 I4 J2 范围(BETWEEN 和 NOT BETWEEN)9 \! S' m5 M8 X) s$ M8 Z. C
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
9 A3 \' ~' r8 H" J) r5 z2 @例:返回96年1月到96年2月的定单。
: W3 k( b9 p. a2 i. ~. Z2 {% wWhere orderDate Between #1/1/96# And #2/1/96#
5 u  p$ b4 |4 P! E3 列表(IN ,NOT IN)2 E1 e* D  ?0 p2 F( m' Y
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。9 c" A: Q: P/ y/ V, H, Q; _
例:要找出住在 London、Paris或Berlin的所有客户
0 J: u7 M' P2 p2 Z2 {Select CustomerID, CompanyName, ContactName, City
& \, J& V' ]" }8 T1 E/ ?FROM Customers
7 ^6 G  [$ k/ BWhere City In(‘London’,’ Paris’,’ Berlin’)
$ y5 S. H$ l" i& l$ h4 模式匹配(LIKE)
2 P& W( P6 Y3 N2 C9 hLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。! _( ]* k0 \0 p9 o& x
LIKE运算符里使用的通配符
2 Y: n& v( Y/ a. U! W* X- c& G通配符 含义$ P- W% T) e% z; P, E
? 任何一个单一的字符" g& V* P, a" M, B& n! \
* 任意长度的字符, @7 }$ C- m# M7 K0 ~
# 0~9之间的单一数字( }# {! f, n. i. G3 a
[字符列表] 在字符列表里的任一值, I% t! z1 ]5 U/ L) P; ^% {' i- Z; h
[!字符列表] 不在字符列表里的任一值; H: x! L, {5 ]% X) o
- 指定字符范围,两边的值分别为其上下限, Q5 H8 g1 a* a, V5 a( x
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户3 m6 j9 @) d* I5 j9 J
Select CustomerID ,CompanyName,City,Phone
  W4 k& y* I* Z4 w6 g, \% N/ IFROM Customers
  Q0 C3 Z7 t2 j% hWhere Phone Like ‘(171)555-####’
. U: S% f+ s  P, d0 U  T& eLIKE运算符的一些样式及含义
# Z8 V4 a/ x4 a* h' n: j2 C3 q4 Z3 b样式 含义 不符合+ M! N$ O+ z) A, k0 V/ i- W
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255; [' z  b9 B8 w3 }. I- [
# LIKE’5’ 5*5 5558 ?" L2 k0 M0 X5 \7 U. v
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5  x3 ~1 ~+ O7 @- k& j8 q
LIKE’5##5’ 5235,5005 5kd5,53463 N- n/ K* r6 O
LIKE’3 V  k: `$ l( C( e
[a-z]’ a-z间的任意一个字符 5,%& ^4 p5 U1 m1 k; f" q3 P
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
$ D3 p+ t/ L( _, P) \/ \" E: q6 eLIKE’[[]’ 1,*6 ^+ o/ k8 l9 J# ~3 I
三 .用ORDER BY子句排序结果4 k. Z2 r6 q- D
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
  {+ y7 u. Y( }4 [6 |( \1 Z( ?, korDER子句中定义了多个字段,则按照字段的先后顺序排序。0 J, H( {) _0 O4 K
例:
  P5 O5 i  h$ _2 G) DSelect ProductName,UnitPrice, UnitInStock3 D3 ?: R/ r7 d8 |: [/ A- p" a2 @
FROM Products
7 P3 m" p& ^9 d' q5 rorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
; i0 u' ~( D( J: i: _: DorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。6 G  I! S) W9 @6 J) m2 F1 P
例:下面的语句产生与上列相同的效果。
! S- t7 l" M0 A0 \1 L# ^' @0 |Select ProductName,UnitPrice, UnitInStock
) z+ r+ d; I) |+ `FROM Products. P& P# g& j# ?( K4 ~7 m- Y5 b
orDER BY 1 DESC , 2 DESC,3
$ Y, \* @% O( d3 w3 j! [四 .运用连接关系实现多表查询
, Z5 E1 O/ N0 C( A, B6 c+ H例:找出同一个城市中供应商和客户的名字* ^) C& H- o; _9 u% ?6 r5 [
Select Customers.CompanyName, Suppliers.ComPany.Name  i9 O8 x9 x+ ?# H( }
FROM Customers, Suppliers+ H! e- ?4 q$ _  ~  f
Where Customers.City=Suppliers.City/ D/ U+ s+ C! ^5 O% X& |
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
! A/ d+ x; I7 [* {  u4 gSelect ProductName,OrderID, UnitInStock, Quantity: X3 V# {" V& o' M
FROM Products, [Order Deails]
. |% Z3 X% e- X1 I7 uWhere Product.productID=[Order Details].ProductID. G- k3 V! f4 l* ]  P
AND UnitsInStock>Quantity
: f9 u+ R  a, L. ]) t2 e另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
. u- t! d3 y6 ?0 f% q0 z语法:
& R2 s; n6 R8 ]* J$ M8 a' Y" UFROM table1 INNER JOIN table2
& i, M( X% [7 ]; Z7 zON table1.field1 comparision table2.field2
$ h+ w0 \% |# A3 Q, I其中comparision 就是前面Where子句用到的比较运算符。
' w) m7 Z; M# }: V/ T' a% sSelect FirstName,lastName,OrderID,CustomerID,OrderDate* u  a: z2 W! n  U! P* F
FROM Employees; @# h! w$ |. e0 b# `* B9 k
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID* p+ Y2 E/ X. A# P
注意:
# _  J  d2 @3 E: q/ ~/ x7 }INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
8 ^; z3 M% T9 z4 ?. m" @/ T! h4 t在一个JOIN语句中连接多个ON子句
4 q( Y& a: U$ Y  J( Q3 d6 ^0 L语法:
% z* p) V4 m, m# i0 E/ D6 nSelect fields* ]4 f+ ~+ r; k! t
FROM table1 INNER JOIN table2: m- R7 z( H" j/ \. l5 ~% y, C
ON table1.field1 compopr table2.field1 AND) ^6 V1 O8 n5 S+ l  P4 T
ON table1.field2 compopr table2.field2 or) [6 J$ ^, x& h; O3 Z3 b" I" t
ON table1.field3 compopr table2.field3) S3 T7 X4 d; i  g7 |
也可以6 z$ [; H" S: }( k& s( l1 ?3 p
Select fields% Y1 x8 Y! G; w
FROM table1 INNER JOIN
9 z, R  R" A2 ^: Q& }$ b% r4 A3 k, w(table2 INNER JOIN [( ]table3) w( \8 @2 G2 L' ]
[INNER JOER] [( ]tablex[INNER JOIN]1 ]5 p; f! _, O
ON table1.field1 compopr table2.field1/ Q6 V; @& D% H! Z; p' b- O9 q
ON table1.field2 compopr table2.field2
& J( k) I' H. d( Z! G9 }ON table1.field3 compopr table2.field3# L7 K! a0 n( p0 O
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。! f# {  r2 r, a; F) l7 k
FROM table [LEFT|RIGHT]JOIN table2
# G- o( D5 w* d! yON table1.field1comparision table.field2
" N  K! H# i( z' A/ E用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
2 W6 M/ d  z; l+ D4 U例:不管有没有定货量,返回所有商品1 I% D+ E6 t2 V1 c
Select ProductName ,OrderID  {& O8 o. w5 W! t5 \
FROM Products
  k1 N9 J# ?7 w& mLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
& |4 G) J! z. B! h1 C右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
: I4 R# w9 n* _- N7 Z例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。, I% Y9 U; p# C& E
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
$ q4 ]8 k6 y- k$ d5 F' ySelect *
+ a% r* G" h3 n; o/ M+ yFROM talbe17 V$ v3 y& X; E0 X- U! h- q
LEFT JOIN table2 ON table1.a=table2.c# Q4 N" I. T# j* Q
1 连接查询中使用Iif函数实现以0值显示空值
& [3 p2 s  S' ]Iif表达式: Iif(IsNull(Amount,0,Amout)
9 R9 `- ?, a4 a. |7 Q例:无论定货大于或小于¥50,都要返回一个标志。6 u$ o3 \( M. B/ t2 e' v( i9 E+ w5 y& B2 ^
Iif([Amount]>50,?Big order?,?Small order?). I. H; P+ i* _3 F, P; x' m
五. 分组和总结查询结果, c" k) G- P8 X( G" X; X
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。0 X9 W. @2 b* K) }; U4 y
GROUP BY 子句的语法
- n4 b6 }9 F6 C$ {$ p# A$ OSelect fidldlist
+ T" Q+ r- b2 x/ x  w& \' bFROM table' M( ^+ E. Y9 b2 h. \8 @
Where criteria
1 |) M% @0 i( `  F8 s[GROUP BY groupfieldlist [HAVING groupcriteria]]
& W6 u& d/ G" p, v. _注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
8 E  @" M0 r! e9 T& @GROUP BY字段中的Null值以备分组但是不能被省略。  [2 I& J* B( P+ R4 h; p
在任何SQL合计函数中不计算Null值。) u( a3 T% n3 e6 u: J" l
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
4 B: a" k$ e+ J: u& \  H例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
6 |, @" c8 G5 v- ZSelect Title ,Count(Title) as Total- k( ^9 W# z% S4 D4 w- @0 r7 Y
FROM Employees
. [- h, o  h4 A8 kWhere Region = ‘WA’4 x9 m- O1 _" d. T2 c* ~/ A
GROUP BY Title. @0 Y; T# O- _9 h% g) o
HAVING Count(Title)>1, X4 l9 B9 ?) a4 S' {, C
JET SQL 中的聚积函数( I. i( ^) n- y; v
聚集函数 意义9 e8 w; @( P4 x( _) B5 _; @8 w
SUM ( ) 求和
$ \6 X9 J2 \) R( Y1 d$ VAVG ( ) 平均值
+ U7 c$ y# o+ ZCOUNT ( ) 表达式中记录的数目8 q# L  ^* R8 v' e: d
COUNT (* ) 计算记录的数目4 ]& F( J+ c+ \  Z/ l- j
MAX 最大值4 l) X+ ?+ N8 W% x. B7 b# S
MIN 最小值
6 y8 t- z5 W! o5 t1 k/ \5 O5 GVAR 方差
$ [  F6 y) d! I. m* \# qSTDEV 标准误差- |! M" G7 |- o3 T
FIRST 第一个值
% I% g$ g/ y2 `& f9 N* \' NLAST 最后一个值/ E' f4 Y& _" q
六. 用Parameters声明创建参数查询9 d, v! B5 u) ~" L
Parameters声明的语法:
( p7 ?: z$ C; h# [% N0 qPARAMETERS name datatype[,name datatype[, …]]: y" t& J8 Q5 a  z: Z% o
其中name 是参数的标志符,可以通过标志符引用参数.$ \, K5 a  h8 ?6 t4 `
Datatype说明参数的数据类型.
4 V# n( M3 N2 w3 b3 p使用时要把PARAMETERS 声明置于任何其他语句之前., w, |( Q& r$ ]& a: g3 q& A
例:: j. `% `+ H% M2 A, _% h; l
PARAMETERS[Low price] Currency,[Beginning date]datatime( i4 E$ b3 h( l3 p% \& O
Select orderID ,OrderAmount8 U6 Q) N3 }8 s' Z: r
FROM orders# ~! [8 E( B7 _0 g/ Z. ?, D
Where orderAMount>[low price]
$ W& V3 m+ b$ e; ~+ O6 XAND orderDate>=[Beginning date], o7 C0 [: c: i) P
七. 功能查询
2 c7 M5 y; J) }9 g5 U  ~3 M所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.4 c! O% m" B, e7 t
1 更新查询
, v0 R& _  h8 U1 h6 PUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.7 n6 q; y7 _' R, v/ @. r
更新查询语法:/ J2 c! Q: u9 V1 O2 x- L7 ^. Y! j
Update 表名  q9 K) i0 @( ~9 ^
SET 新值8 u# W+ {' ?& n% }9 X4 O
Where 准则2 g% a2 s) |' m% P( ?' Q, ]
例:英国客户的定货量增加5%,货运量增加3%
9 l5 {4 G/ I+ }Update OEDERS) P8 h; F! o3 y0 J0 b/ Q$ T0 G
SET orderAmount = orderAmount *1.10 `9 n& z% C3 a
Freight = Freight*1.03
' S& ]( X# c$ q5 ^/ \, e$ aWhere ShipCountry = ‘UK’% H0 n2 Z) N0 w: j/ p
2 删除查询
4 n/ n2 F8 K3 T8 k! J4 W$ QDelete子句可以使用户删除大量的过时的或冗于的数据.$ z/ t5 ]# b, B3 u
注:删除查询的对象是整个记录.; `! f, y: `7 D/ T  ^+ O: i0 {
Delete子句的语法:, ~) j2 h( V8 R/ t3 i
Delete [表名.*]
( _: v( \  o1 P# j! ^5 `FROM 来源表
! c8 w0 _$ b; R- X: R# o) sWhere 准则. ?6 J( \% ~+ k, T2 ^  `& p
例: 要删除所有94年前的定单
. ^' `& v; x. I4 s8 C, zDelete *
- \* w6 a0 C, E8 B$ S& LFROM orders& e  c; Q. M8 k: a
Where orderData<#94-1-1#3 Y0 |: Z9 w2 O1 R
3 追加查询6 Q. U9 Q  K) S$ J8 b4 y  \3 Y  H
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.# k6 m* v; p  l) A
INTO 子句指定接受新记录的表& f* c6 V/ C) z$ Z' ]" K& p
valueS 关键字指定新记录所包含的数据值.
$ I6 R% y( L% [7 p/ O& f  ^Insert 子句的语法:+ W5 S4 y8 [1 k1 N! g2 X
INSETR INTO 目的表或查询(字段1,字段2,…)+ T' @1 {) K+ p! c
valueS(数值1,数值2,…)
- x2 w; ~! C  d5 Z例:增加一个客户
' m( T# s$ S$ ]% ZInsert INTO Employees(FirstName,LastName,title)
  H' \5 ~9 G5 |) z( BvalueS(‘Harry’,’Washington’,’Trainee’)+ M9 {. i& X+ F, x4 v# _" b
4 生成表查询: C! O9 _% {. t9 f, x3 }. M
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.+ d7 K1 j! w- v3 k0 `" _* J
Select INTO子句用来创建生成表查询语法:
" j% |0 [$ K& A3 e( Y7 GSelect 字段1,字段2,…
: s& x. V! P) _9 w; N2 pINTO 新表[IN 外部数据库]
' I2 c' Y* u( {FROM 来源数据库0 p' r5 ^$ T* \
Where 准则
8 t+ v' \1 m- g  ?% C( k) G# b. B例:为定单制作一个存档备份( g5 X- L( ?: R/ }7 J8 |% I! x
Select *
" T; x( N0 N: G5 s. Z# R4 d! q9 }  }INTO ordersArchive/ \( ~! g! V8 v
FROM orders
9 ]7 U; l/ y5 O& y八. 联合查询. h; F. N, i0 M( V
UNION运算可以把多个查询的结果合并到一个结果集里显示.
0 ]( ~3 R3 c0 L4 ?UNION运算的一般语法:3 v# T+ W6 M9 {; {0 G6 O+ E
[表]查询1 UNION [ALL]查询2 UNION …7 u1 }1 Y$ E2 W: V2 r
例:返回巴西所有供给商和客户的名字和城市1 D$ K3 l2 ?& Q& x
Select CompanyName,City$ @( R. C4 Z& ~& v
FROM Suppliers
' [# t" n, q0 p; s- ~Where Country = ‘Brazil’
/ x& [* f( m5 l* t. R* ?" D, B. jUNION
3 i% L9 T) e- H- ]* D0 LSelect CompanyName,City9 p: ]$ n: Z# z: V
FROM Customers. O5 k; F  s! \% g0 T
Where Country = ‘Brazil’  f5 [* x8 n" ~( V' }: T& r
注:
% }( _- M  ^5 Y8 ]缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项3 Y$ z" ?, i* k6 L' m$ X# a
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.& ^  U# \/ B- {; _9 I& h; c! j
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.* K: ~/ w0 h, L& d
九. 交叉查询' E( V1 s# V/ D% D4 J/ Q/ h, h
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.6 n3 @, n# @4 w/ U7 N
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:2 Q- j: t4 i$ h8 t! E
TRANSFORM aggfunction
7 U/ O( P8 m4 o9 ^& r6 D0 |Select 语句
4 G3 r1 B  z  R" h4 iGROUP BY 子句
0 e2 r. _4 n% zPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
/ c8 N: j8 s4 ^# w% cAggfounction指SQL聚积函数,
, L6 X2 e+ s2 N9 A3 ^9 NSelect语句选择作为标题的的字段,  U0 J# Q0 T7 i, L2 z8 d0 f, a
GROUP BY 分组" p* P& B9 z5 N: o2 y5 A
说明:
6 g9 |; q) G0 s, VPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.& i; n1 e9 T* p- H  h0 Z2 w
value代表创建列标题的固定值.
) l1 v* b8 A8 J% N例:显示在1996年里每一季度每一位员工所接的定单的数目:, [% z6 b  _0 K. ?' `  |
TRANSFORM Count(OrderID)
. O& `! }4 c# }& ASelect FirstName&’’&LastName AS FullName4 E3 y) k* F. V. H
FROM Employees INNER JOIN orders; u! s. B' @7 n+ M  A
ON Employees.EmployeeID = orders.EmployeeID
* F' A1 j6 N) w3 C$ @& pWhere DatePart(“yyyy”,OrderDate)= ‘1996’" [& p5 h, K1 `
GROUP BY FirstName&’’&LastName7 H: b5 y& I* C
orDER BY FirstName&’’&LastName
; ^3 f. l7 y9 d% F9 j% K+ ?! r3 _  wPOVOT DatePart(“q”,OrderDate)&’季度’
8 o7 a- G6 f1 r+ s  N9 p9 g6 d( r十 .子查询
$ B, }6 `, ^9 l" `( U子查询可以理解为 套查询.子查询是一个Select语句.
0 |; Q1 x# [) M1 表达式的值与子查询返回的单一值做比较) r% O( c6 }  Y) K3 t4 n; v
语法:
; ^% b3 F( P' a6 V7 m1 e表达式 comparision [ANY|ALL|SOME](子查询)$ m9 L! m- K: L, c& r
说明:
% C* @% H* Z2 h9 G, V: ?8 oANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
3 [2 T$ b4 @- `& x3 K, Z1 f) M例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
1 i7 B/ ^7 u4 r& i4 h- n5 b9 xSelect * FROM Products1 V5 J1 X# ^7 X
Where UnitPrice>ANY, q9 B/ j& p! O) w7 R
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
4 f+ ~" R2 ?: N: g' E2 检查表达式的值是否匹配子查询返回的一组值的某个值" F8 G) z+ T- ~
语法:
9 G( H, f* F+ \* {; J2 E[NOT]IN(子查询)* s2 ]5 X" s- c
例:返回库存价值大于等于1000的产品.
5 w% T5 \( N. cSelect ProductName FROM Products" c, G7 p+ M# c
Where ProductID IN$ M6 y9 r+ @5 ^# p5 A
(Select PrdoctID FROM [Order DEtails]2 N+ S0 H/ K) D& W3 G5 G
Where UnitPrice*Quantity>= 1000)
* [, B5 [# E- |: Q7 S3检测子查询是否返回任何记录$ U6 @; M  F/ v
语法:1 W8 S, Z+ O4 z' p# D. k
[NOT]EXISTS (子查询)9 {( J; p, R6 Z( @5 L! C$ ^
例:用EXISTS检索英国的客户
$ S+ n( f3 J! Y7 z: _Select ComPanyName,ContactName
2 M% T4 h9 f( l( UFROM orders
, u0 D/ Q/ z4 Y. u, \Where EXISTS
$ v; U: }) ?% W8 T(Select *% f# V3 o. N* b
FROM Customers
3 Y8 F1 a3 c7 BWhere Country = ‘UK’ AND/ x. z2 h9 q4 Z
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-5-15 04:09 , Processed in 0.031200 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部