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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
9 \5 b; K( I" r! r) t+ Z3 m9 Y. @( E- E
select distinct 字段 from 表名
# C* v6 c3 }- S& m! @& f! ?' adistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
( w  W- V+ T+ B( Y1 k) J* }一.Select语句的完整语法为:) R8 v: e: e" A4 \2 Z
Select[ALL|DISTINCT|DISTINCTROW|TOP]
( c( w4 o$ }% c9 R{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
# A0 Z$ q$ z% b6 |0 |" `FROM tablee xpression[,…][IN externaldatabase]
' Q  Z, I0 A5 R% T! y& N" Q( Q[Where…]. t+ t8 Q* p5 e! b7 d7 w
[GROUP BY…]9 J  W- R  u/ w  f6 P8 l1 k# O5 c  z
[HAVING…]7 I' N; W$ k( {( H! Y" Z6 z+ P$ R1 h
[ORDER BY…]
) w- ^! r1 z' ^+ u1 G/ N# G( H[WITH OWNERACCESS OPTION]
4 |  }7 {  i4 e* _; K, x) r说明:
0 T1 S' X& g* V- W' }1 A用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
5 U, [; U. t) m* Z3 ]; I1 FROM子句
5 v0 t; R7 {- x' k# t% J1 CFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。: |* E) f' t- |; d7 Y' J
例:下列SQL语句返回所有有定单的客户:
, W% \8 t3 q3 j9 s  }3 O; R+ p' {Select orderID,Customer.customerID  n, \- y8 r1 L3 C, ^( Y
FROM orders Customers8 q! x! B6 i3 b& K; L! d) ?$ T
Where orders.CustomerID=Customers.CustomeersID& O. e: k7 }3 T, n5 o
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
2 h" A$ I# n5 I; r, E' F# }& U# F(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
0 l$ W- W$ h2 U. O, ]7 s例:Select ALL FirstName,LastName
9 w, g- X; I$ B6 yFROM Employees4 z8 G' ?# e2 z3 p
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。6 A% B+ x; e2 }' o# Q
(3) DISTINCTROW 如果有重复的记录,只返回一个: m( `$ R0 i  V, W: G! F7 W
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比): W  P  _- ~4 |. V* U- I
例:返回5%定货额最大的定单
! O0 _& h, l, J1 J! BSelect TOP 5 PERCENT*
5 H0 Y2 ?5 C7 ?+ @FROM [ order Details]! q) q2 p+ y/ C# U, S
orDER BY UnitPrice*Quantity*(1-Discount) DESC
% r7 f4 Y, z- w, ~; e# q% U/ [3 用 AS 子句为字段取别名. C3 ?2 e3 |! J2 X" G( S" a
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。7 {/ j8 m) X& @/ I
例:返回FirstName字段取别名为NickName5 c  k; `; t8 a  v: {9 t3 ?5 h" N
Select FirstName AS NickName ,LastName ,City
3 r+ |1 U0 y# L( VFROM Employees
& O! }- {) Z8 u% ^6 J例:返回新的一列显示库存价值) Z* M7 ?5 d) c. L/ X1 e$ v
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock7 I7 \. ?: J8 ~/ n4 A2 ~
FROM Products# Y( d8 }- C, A
二 .Where 子句指定查询条件
# G1 p, A: o& V# M( b9 i1 比较运算符
6 \" O) j" g( h; m: v比较运算符 含义
3 s, ~2 H8 z5 s6 Y, D# o= 等于. M4 ?9 @* T- K4 V; T2 V* X+ h( {
> 大于
& n; o' n$ X+ S4 N& J< 小于2 n- Y3 a$ i) W- {, v9 {9 e! f
>= 大于等于
3 u7 N: d; w1 q( K) e  \+ w<= 小于等于; _  U. O7 L% b( D* g. p1 q: U
<> 不等于
5 V/ f& g8 l& m3 W* n4 S!> 不大于: g) x( I' A8 I6 E5 ?5 V
!< 不小于
! p/ X, [4 t9 b* n+ g例:返回96年1月的定单
, c* T. a/ v" ^3 D% _5 t; nSelect orderID, CustomerID, orderDate9 p7 {: G3 I1 u; Y  s+ K. x
FROM orders5 X6 `9 Z2 x  h  e7 a" p6 i
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
4 M2 r# G2 \  @/ x. P9 E注意:1 ]+ @' a9 y1 E9 Z' j6 p& U
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
& `$ j1 q# ^- S( m8 u$ H例:$ M; d/ ?+ w! i- A4 N
Where orderDate>#96-1-1#5 ~0 r+ r4 x3 j: j% [: k9 F
也可以表示为:1 h2 X" t- U3 Z% U
Where orderDate>Datevalue(‘1/1/96’)
0 D$ G3 W- J/ Y& w4 y( a. [使用 NOT 表达式求反。
- k7 }" O. r& [: Z, p. g0 p0 a& ]2 m例:查看96年1月1日以后的定单1 Y2 @2 U' R+ l- y! z
Where Not orderDate<=#1/1/96#
% H5 @4 d+ w2 U; \9 N1 C, i2 范围(BETWEEN 和 NOT BETWEEN)3 E4 s" @1 f  m- [5 r& X
BETWEEN …AND…运算符指定了要搜索的一个闭区间。( L8 ]) @' s+ X, I. q
例:返回96年1月到96年2月的定单。
+ I4 Z- I* m* ?  }, }& Y: P( fWhere orderDate Between #1/1/96# And #2/1/96#" i! u7 G" j* f" o! R6 S& d
3 列表(IN ,NOT IN)
" a2 w3 }/ B/ {3 D% OIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
2 `8 Y6 H( O( C/ z. o/ q& N% w3 @* j- n. u例:要找出住在 London、Paris或Berlin的所有客户2 F8 y) b/ O* J, Z; c6 H1 ^" V
Select CustomerID, CompanyName, ContactName, City- x8 Y; @2 w8 `( u: l
FROM Customers
9 \7 U" e# Y' |. d, NWhere City In(‘London’,’ Paris’,’ Berlin’)) L6 T' K* M5 x; S3 y- ^+ K
4 模式匹配(LIKE)
9 c7 G) a% h$ k2 }. yLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
$ p$ e- V0 z4 ?) {, b" {. p4 RLIKE运算符里使用的通配符
& ]: S! A3 g: u1 }' x通配符 含义
* q- {5 z% I* G0 {8 w& x7 E? 任何一个单一的字符' J1 n$ s7 ?2 `2 L: u
* 任意长度的字符
5 q& T) I# r  b% z# 0~9之间的单一数字3 w! m/ H3 @" R1 b+ x
[字符列表] 在字符列表里的任一值9 k- `$ r2 ^* j2 e( ^# }- E
[!字符列表] 不在字符列表里的任一值
# o& r  _; S. E, @. [- T% f- 指定字符范围,两边的值分别为其上下限
- {3 i: x3 [( N5 R例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
4 k$ g5 V; v# I; g6 n6 VSelect CustomerID ,CompanyName,City,Phone
. P* c% Y/ |5 E( d# Y  PFROM Customers" U3 a" r' {8 Y8 r
Where Phone Like ‘(171)555-####’: m1 r* e6 s1 n7 ~9 a6 u- D
LIKE运算符的一些样式及含义
8 u' |8 A! [& K! S8 o) k样式 含义 不符合. H8 N7 V# T9 D
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
+ n3 p- r3 l! {4 T  o# LIKE’5’ 5*5 555
! R$ T0 l$ h5 H1 @& v$ oLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
3 P4 H6 J  F2 f$ d" z; JLIKE’5##5’ 5235,5005 5kd5,5346
$ c! e- `" P" n- T! A6 b5 k& s* yLIKE’2 \' G! k0 e( ^4 C4 [
[a-z]’ a-z间的任意一个字符 5,%1 e$ r) y1 B+ ~. v( q2 g3 W
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
# R( l, }: u/ [2 k3 o+ ALIKE’[[]’ 1,*
$ t, b+ R  M- q. H三 .用ORDER BY子句排序结果
: g$ U! b" {4 l- `. b0 qorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。$ J7 N: L/ m$ w, X) [( z2 _
orDER子句中定义了多个字段,则按照字段的先后顺序排序。& c: W' \5 d8 Y7 K
例:! ]! T; x" A( l- w* I5 i  [# e; ^
Select ProductName,UnitPrice, UnitInStock
6 m/ ]# ^; h+ q: HFROM Products
6 X7 \; f7 s6 U) o0 N, @! o1 qorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
. w# C* ~( N; r9 k- _4 eorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。! T# q" b$ I* Q  S: a) S
例:下面的语句产生与上列相同的效果。
. |1 h/ |% A, ^5 ^2 v; [Select ProductName,UnitPrice, UnitInStock% U* m* O" \4 d( o) N0 f
FROM Products
; q3 `* a& g2 p! n$ q3 N3 ?; BorDER BY 1 DESC , 2 DESC,3! R2 x- A. u- E- K+ F
四 .运用连接关系实现多表查询) W% S% O- l6 _6 E
例:找出同一个城市中供应商和客户的名字
, ~/ _; E) m! U# b  r( sSelect Customers.CompanyName, Suppliers.ComPany.Name7 R+ ~) \' _( \) k+ s2 z8 F
FROM Customers, Suppliers) K+ |' C, P" t0 B: w8 k
Where Customers.City=Suppliers.City+ Q' p$ l5 x' I
例:找出产品库存量大于同一种产品的定单的数量的产品和定单3 R% f% C6 ]8 D) R5 k5 Y  a3 A
Select ProductName,OrderID, UnitInStock, Quantity+ x* I* t) ~4 J9 U+ F& |
FROM Products, [Order Deails]" D2 a3 \6 d! W& U1 \
Where Product.productID=[Order Details].ProductID
- n: Y4 H+ E# P! J7 l& A+ G) AAND UnitsInStock>Quantity
- c/ L# \  e0 _. D另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN* y$ h! X, L/ }2 h5 w6 J# X& k2 E
语法:
* ^4 o, t- c# J# m! V* OFROM table1 INNER JOIN table2
- @# L* \8 f* ~, [ON table1.field1 comparision table2.field2
" p) a# A! u, Z! d6 h# j  Y其中comparision 就是前面Where子句用到的比较运算符。  u9 O* v- P4 l9 }9 e5 D
Select FirstName,lastName,OrderID,CustomerID,OrderDate
) Q4 w2 I5 x' |3 Q! H. AFROM Employees
: h1 o  S) m$ I# {4 Y, f+ t$ AINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID8 b1 `+ H) D, C5 `/ q
注意:
9 J; I' G( W& n0 J& o. |% R* w& xINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
4 P: @5 N9 o6 p: s在一个JOIN语句中连接多个ON子句
! J  Q# Q# o: k: K$ w语法:
' y# ?: o. \% rSelect fields
) e3 j4 n& f' K! x4 e. \- v; B  PFROM table1 INNER JOIN table2
5 y) m4 S: c* [( L4 O, yON table1.field1 compopr table2.field1 AND% t1 }0 `: \% X3 C4 h
ON table1.field2 compopr table2.field2 or8 j4 k" [: M! a
ON table1.field3 compopr table2.field3
% n& {0 P$ L8 D8 f8 J0 q. ^也可以
, Y9 y: k1 b! SSelect fields, e6 J/ R! c1 T  U* h1 e
FROM table1 INNER JOIN
# A, [8 |) `: k. G9 M& L8 i: _(table2 INNER JOIN [( ]table3
+ F5 J5 k$ w: r0 w& v1 s3 u[INNER JOER] [( ]tablex[INNER JOIN]
6 f9 d! v, a8 rON table1.field1 compopr table2.field1
- Z8 F# {& }5 T( C! |ON table1.field2 compopr table2.field2* j, q4 `  h$ V
ON table1.field3 compopr table2.field3
5 q  K0 a& M# k7 Z& l! m& P5 v. M+ o9 f外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。0 n1 d: e# z, z0 _+ D
FROM table [LEFT|RIGHT]JOIN table2
  X5 b; R  m( z# [$ @% LON table1.field1comparision table.field2" J  w- {1 V7 P! p8 N
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据7 b5 ^( ?8 S9 U  P1 T+ }4 i
例:不管有没有定货量,返回所有商品2 n! K! c8 \) J- g1 H* ~
Select ProductName ,OrderID. V7 `  K" T; p( U( f+ M. T
FROM Products
1 v4 ^. [0 z0 ALEFT JOIN orders ON Products.PrductsID=Orders.ProductID# v: D/ w( k2 e- X% V
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。3 J% l7 o( E$ p+ n. p* h
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。6 f6 R0 V( T/ S3 e6 r2 S1 V0 }  v
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
+ v- N. A9 |( u6 X4 u# R* F! lSelect *8 z4 E; {( G- W/ s8 G& h
FROM talbe1: Y( ?, F8 r* B( e# u
LEFT JOIN table2 ON table1.a=table2.c
' M8 K4 \5 O; l( G- l3 e" @7 p1 连接查询中使用Iif函数实现以0值显示空值( u- R% a9 k9 B. t: M% M8 p
Iif表达式: Iif(IsNull(Amount,0,Amout). ]3 |6 Q7 x2 `5 l) H+ c6 G
例:无论定货大于或小于¥50,都要返回一个标志。# b4 R% f7 P8 \. w
Iif([Amount]>50,?Big order?,?Small order?)
7 y. [* E/ {% ]; j! O) Q3 ?五. 分组和总结查询结果
: D, ~" g! j9 B/ s5 J$ X在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。' D1 B! e1 L7 N) s9 A
GROUP BY 子句的语法
; o+ L. _0 A1 u* K+ x  g# _/ |Select fidldlist
/ M6 D; `3 t2 b+ _9 w# G: g) p) JFROM table
& E/ i6 o/ o& j) L6 T6 Z2 r9 uWhere criteria
% p" L: Q; e* O; l1 G7 W[GROUP BY groupfieldlist [HAVING groupcriteria]]
2 h, x# C% T2 R3 Z注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
0 q" U% m8 }+ |) m6 M2 LGROUP BY字段中的Null值以备分组但是不能被省略。# h* m* h0 R3 |) g4 A3 E1 ]
在任何SQL合计函数中不计算Null值。
' {! z" O2 p% F% y6 I: X7 P  v  TGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。/ H! j' @; l6 Z& }' ^, H
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。, E' n( Y0 z3 l4 ^6 t
Select Title ,Count(Title) as Total/ u. y* {2 J, m9 ]& X. D
FROM Employees* {5 S! I; L4 T9 h, l
Where Region = ‘WA’: U, t+ S  Z0 u$ I0 {3 \  y
GROUP BY Title
; p3 K9 h  x% Y! N) ^HAVING Count(Title)>1( ^" V$ @$ a9 k
JET SQL 中的聚积函数# x5 j  W- \; F, i. W* i
聚集函数 意义% t6 s, K$ A8 _* p( H* h6 `
SUM ( ) 求和, J) [2 H  F" s4 R7 j
AVG ( ) 平均值
2 J: J6 r9 z8 b" wCOUNT ( ) 表达式中记录的数目
1 `) N  R7 Q: RCOUNT (* ) 计算记录的数目2 A$ i3 u9 H/ c5 k' c
MAX 最大值
7 E2 X' R$ H4 e6 B! ]2 rMIN 最小值
7 u6 a5 ~& ?  a' X8 s8 {" T. pVAR 方差. C% _& k- y' C7 F& s, S+ w& [9 X$ E% l
STDEV 标准误差* a, j7 e) d4 J0 X% ?* @5 I
FIRST 第一个值
+ @4 k* G+ V9 oLAST 最后一个值
. b) j. ]6 z. j& b六. 用Parameters声明创建参数查询
1 R) R8 |* Y. L7 i6 O' ^; b% SParameters声明的语法:
3 @  m: K# D. t* w  U. B$ OPARAMETERS name datatype[,name datatype[, …]]
7 q: @1 F9 Q5 C$ T. u$ ?其中name 是参数的标志符,可以通过标志符引用参数.
7 D6 h( [7 n$ k# Q7 q6 o& m7 N4 ?- {Datatype说明参数的数据类型.7 x! h! _0 r+ L; t2 _% V! g
使用时要把PARAMETERS 声明置于任何其他语句之前.4 a! H" p7 U( g; ]* z2 }! k+ S
例:5 v8 y. ?0 r; f6 `6 }4 k  ^+ @
PARAMETERS[Low price] Currency,[Beginning date]datatime
! A5 l/ Y# Y) A; f* b% p8 m! q4 ISelect orderID ,OrderAmount: U1 z- Y7 f8 I' }) L. o/ K
FROM orders
7 e8 G! e7 u8 o* L0 V' g# JWhere orderAMount>[low price]
/ [) t( i' L) m- _AND orderDate>=[Beginning date]
& t- p1 \4 [# i: `5 V$ n七. 功能查询
8 k) X$ r. h! i所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
# [. N/ e8 w1 f# I1 更新查询/ n9 `7 x/ u! ]
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.$ W- `6 b9 M7 n5 S" N
更新查询语法:' M8 _9 R9 g% l2 \% n3 T9 M( ^
Update 表名9 D8 |/ w3 T: f: E+ n, z
SET 新值
: C( l0 v8 f( e0 TWhere 准则
% S; C% K+ Q+ d# u- ?0 \例:英国客户的定货量增加5%,货运量增加3%
+ \7 O. \" S0 [6 t; `Update OEDERS4 i+ w( k2 h; ?* b
SET orderAmount = orderAmount *1.19 _7 _% Y5 z$ h& U
Freight = Freight*1.039 _7 L0 ?8 n) B( J
Where ShipCountry = ‘UK’+ y; j6 x) L) m0 w1 `, ^) I1 e" [
2 删除查询
& V6 k: J, s' @9 HDelete子句可以使用户删除大量的过时的或冗于的数据.! u6 G- D! P7 [' \: `+ ?
注:删除查询的对象是整个记录.
/ C7 s0 O. A# _# F/ R5 wDelete子句的语法:
8 t& G) u$ ?  o" O# e) xDelete [表名.*]
: r0 w* k. \6 q2 R( L; J) dFROM 来源表
1 Z/ F! V& F* YWhere 准则
! [- O% ~$ C' a- S3 X! q4 x3 L例: 要删除所有94年前的定单8 d' H2 n; g5 }1 R# M
Delete *) R2 X8 \  y9 \' M% w
FROM orders
  V; t6 S( f( ~) nWhere orderData<#94-1-1#
, F8 i' D( H1 Q& R8 q0 D' ]3 追加查询
% R0 Z9 x& F! {6 rInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
# E% Z9 d, L6 t( b3 ]INTO 子句指定接受新记录的表4 `/ a% P! u0 K$ z; C" ?4 v
valueS 关键字指定新记录所包含的数据值.5 Z7 _$ ~' b4 B" [, L
Insert 子句的语法:
7 T0 I$ t. e0 o3 T; QINSETR INTO 目的表或查询(字段1,字段2,…)
; W7 Q2 N6 a; j9 ~' D$ \  g- O2 [valueS(数值1,数值2,…)9 k  k, n/ p) |7 M
例:增加一个客户" U  y* r* `6 r# P
Insert INTO Employees(FirstName,LastName,title)
+ y" U; s' `4 T1 z& k7 |valueS(‘Harry’,’Washington’,’Trainee’): n; C3 i* C  y5 R
4 生成表查询7 G+ ], }) J8 k, E9 D+ h- b" [
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
2 N  l) M5 r- ]/ ?Select INTO子句用来创建生成表查询语法:( e9 G8 Y$ U# a
Select 字段1,字段2,…( ~9 Z$ S$ T0 {' l, T' b
INTO 新表[IN 外部数据库]1 v2 D4 r' k1 y( d
FROM 来源数据库; e* Z3 O2 ^8 i- C1 _
Where 准则" z& K6 V1 j, ^
例:为定单制作一个存档备份
* E$ p7 L% o- ^- g4 mSelect *1 Q* C( s2 d9 y9 f: y
INTO ordersArchive
7 f1 S% o! n! I, q' gFROM orders
: s& A$ L  I' x2 M1 Y* H* n八. 联合查询
$ x4 z, S2 ?' O' Y2 h8 pUNION运算可以把多个查询的结果合并到一个结果集里显示.
3 g; v* e# r: L8 u+ U8 @UNION运算的一般语法:2 u: J8 t6 f2 c& j5 M4 t! c0 G
[表]查询1 UNION [ALL]查询2 UNION …- V: |2 z, j; a: h* N8 u/ x
例:返回巴西所有供给商和客户的名字和城市! [0 m$ }; E- U# e: A0 S
Select CompanyName,City7 G# ]6 K; `! z7 o
FROM Suppliers4 d4 X6 B. U( Q( q# k: [$ s7 q6 B
Where Country = ‘Brazil’
9 m( V/ X9 b1 E5 W1 @UNION9 J2 e8 ?0 I8 x. W
Select CompanyName,City
, T- }! r( S3 C& FFROM Customers
  n5 D( |9 i* o* T/ r5 NWhere Country = ‘Brazil’
& N9 T" k  e) x) g9 y( z注:6 Z0 O3 x, K: j
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项% S9 `( @9 |0 `* |0 A$ O
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
% b8 @7 m# P# ~' a每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
6 g1 e6 b2 ]. v6 g8 s九. 交叉查询
: P# f6 l5 [  a- L* }交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
6 N8 l# E* ~$ Z- m6 r; ?5 ZMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
5 Q# D2 c" ~6 ~  b2 C( PTRANSFORM aggfunction
9 b, Z; @8 g. U/ e  X1 kSelect 语句/ Y& c9 k! c- j2 ]+ E: A) j2 E; o
GROUP BY 子句
" V" S7 [6 @0 C0 f+ w& zPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
0 p& u+ \- N$ H, V  ]0 u' ]* u" TAggfounction指SQL聚积函数,
1 Z0 G8 Q! Z( `6 d. a5 ?4 R* @7 iSelect语句选择作为标题的的字段,
$ c1 `6 O! V% S  U" A4 X+ A8 `* Q( ?GROUP BY 分组
6 J4 i2 [. M) t8 S- S说明:
2 _, ^" C& R+ e0 o+ S3 Y$ bPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
. L& C) U( r, C7 [6 D) D5 Nvalue代表创建列标题的固定值.
( X5 U8 @+ \: u. j# T例:显示在1996年里每一季度每一位员工所接的定单的数目:
9 P) b( D7 J5 v9 n7 \TRANSFORM Count(OrderID)5 T7 P+ q+ x  S# f3 z
Select FirstName&’’&LastName AS FullName
+ s  w7 S( T# lFROM Employees INNER JOIN orders0 W& @- k9 p/ u
ON Employees.EmployeeID = orders.EmployeeID8 S' s9 d( w7 B5 n! M, S
Where DatePart(“yyyy”,OrderDate)= ‘1996’
& I1 u% I1 f' A/ n  GGROUP BY FirstName&’’&LastName
+ V2 F/ v+ }( X- H  ^7 K; C# QorDER BY FirstName&’’&LastName8 I4 O! h: l6 j! a; J* o/ m% Z) I
POVOT DatePart(“q”,OrderDate)&’季度’
1 r* }) N# I8 u4 Q" U十 .子查询9 |7 l; g5 c6 B& _; Q; W
子查询可以理解为 套查询.子查询是一个Select语句.
: {- `$ O! m( h- |# g1 表达式的值与子查询返回的单一值做比较$ f& d/ J! v" c, \) x1 k+ }
语法:! H6 ^# \9 E0 q" {' Z' S
表达式 comparision [ANY|ALL|SOME](子查询)% l) j3 D/ }6 l) f1 v
说明:) C' t* {5 v' {4 h3 q$ @2 h
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.8 M( I! m+ f; F$ D+ T, i
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
+ L8 ^1 Z  `5 a1 |# RSelect * FROM Products; a3 Z5 J: V$ V( _, K
Where UnitPrice>ANY+ F" {; k1 @% O: H) C
(Select UnitPrice FROM[Order Details] Where Discount>0.25)( q9 [! Y7 v8 p2 |5 y
2 检查表达式的值是否匹配子查询返回的一组值的某个值
- M6 {& j. E3 ]& P4 [语法:( {# {$ U& o$ t/ w+ R  K! j
[NOT]IN(子查询)
1 D" {1 b) ?7 B! x例:返回库存价值大于等于1000的产品.
3 N2 F4 G+ `; p9 S# R; PSelect ProductName FROM Products8 W* n5 o# d. B* O+ v
Where ProductID IN9 B3 w' M4 Y9 B! Q$ v( v
(Select PrdoctID FROM [Order DEtails]
4 N' {; D/ n- O, H( q" q7 i* \Where UnitPrice*Quantity>= 1000)' u1 F$ f! ]  k" O" j7 C
3检测子查询是否返回任何记录0 @* K$ h/ X0 d: H! r
语法:
# F& l# X! L6 v/ c3 e[NOT]EXISTS (子查询)3 V. [+ d6 V3 U, z. l, h
例:用EXISTS检索英国的客户" b% d' K. G2 m' I# t! R
Select ComPanyName,ContactName3 E3 K) l, ^. ]2 t' C
FROM orders
9 l  s  D7 @+ L& j6 \# c6 ~Where EXISTS3 o, {  F$ |- U
(Select *
9 B( t  e/ _% S$ b/ ?FROM Customers
# b, ^/ e* ^. w& W( f5 r. _/ Y4 AWhere Country = ‘UK’ AND# x9 k# b; `; H2 u- a3 t
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-1-14 00:39 , Processed in 0.026001 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部