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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
3 P* J, V  F* z! l0 l' X- A# P, N% ^! F5 k& l( x- R* t7 ]
select distinct 字段 from 表名
& ^" _$ A& p- {7 t& i. Zdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。  v4 R  W1 J; s. Z) o1 c
一.Select语句的完整语法为:- L0 {& ?1 ]% t" p* j* ]
Select[ALL|DISTINCT|DISTINCTROW|TOP]
+ A0 J% p, u% c; L0 J4 j" S& _{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}0 _( ]+ v# Y' h3 R% p# _
FROM tablee xpression[,…][IN externaldatabase]/ D9 w6 ?5 Y6 T! b
[Where…]) k' Q# O8 u* G3 i4 r! i) U, H
[GROUP BY…]/ o& {& G* A( E8 i1 m/ S* Z* Y
[HAVING…]
+ J- q! @4 o1 d& Y[ORDER BY…]  E7 _" E" f7 _- C% g2 P! ^. E
[WITH OWNERACCESS OPTION], J% H0 c7 L/ J+ d
说明:
& p/ X: Z" H- s* c$ Q用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。+ r" }* u. w2 G8 l+ G0 Y8 J
1 FROM子句
  K; s- z0 b. _) xFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。% V2 Y- v4 m) Y/ j
例:下列SQL语句返回所有有定单的客户:* G% V% [- q, ?# [2 S; W
Select orderID,Customer.customerID% O% x. f* x5 m% w1 }/ l5 i7 d
FROM orders Customers
# B4 ~3 y2 y4 J  A$ o9 v" \( FWhere orders.CustomerID=Customers.CustomeersID
9 a2 {% h7 L7 o& \, c7 ^) x2 ALL、DISTINCT、DISTINCTROW、TOP谓词
( e+ B0 {4 M8 r' L" r# f2 s( {3 N. o- g1 X# A(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
$ y1 b& H# h, K  |. |. O5 @例:Select ALL FirstName,LastName
7 i; `+ n, A# D& y3 |* P. H5 XFROM Employees. O" {4 @7 |* P  c
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
+ t# G9 l  i+ Z- N(3) DISTINCTROW 如果有重复的记录,只返回一个
# e* t! q) t- c* ](4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
& {5 U4 y/ K  e3 M* r& Z5 k9 ^: h例:返回5%定货额最大的定单
3 d( F# H6 Y6 t" eSelect TOP 5 PERCENT*# S3 Q. j  K- d" P* R) c
FROM [ order Details]/ V/ Z: ~0 d3 t. G4 q1 D' c$ D+ p
orDER BY UnitPrice*Quantity*(1-Discount) DESC$ v% _% {+ m2 L/ m8 f5 O
3 用 AS 子句为字段取别名
. m# d1 |4 ^- P2 J* p6 K: G如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
+ W: C2 x# l( ^+ t" T例:返回FirstName字段取别名为NickName
' D  c2 P# ?+ l* W; O# l$ V! H- {Select FirstName AS NickName ,LastName ,City  E7 h. n" {5 C& \& u
FROM Employees
- k. n8 {: _& D/ i例:返回新的一列显示库存价值
4 R' m' I9 i' n  m3 JSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock5 \* j, p" ]% c$ o' c
FROM Products
* C$ Y7 v6 p% Y! I1 _: P8 c二 .Where 子句指定查询条件% R! Y4 k5 U3 @( g0 q
1 比较运算符6 U$ Q; \- u+ F; `' i
比较运算符 含义
8 H( N; h0 f, W4 X: g" O' q= 等于
; u. n! U$ p' V> 大于
$ E( U( c( a( W6 U: H< 小于  V1 p5 m: _; m8 W) r, q
>= 大于等于
* `5 d$ b4 k* U" a3 V- R1 {: \<= 小于等于
# w" ~  C9 P3 E' w# f' @<> 不等于
) N3 j* g0 |2 R: s# x3 J!> 不大于
' S! w) H: A# _+ Z+ ?7 ?!< 不小于) E3 V7 `1 _9 I1 c& W4 R* V
例:返回96年1月的定单
) r2 R) ^7 J/ B) M2 p- gSelect orderID, CustomerID, orderDate7 q/ i) f6 l) m. w& _
FROM orders
, ?, W* B$ z4 B. G2 @* H# x( o% J) WWhere orderDate>#1/1/96# AND orderDate<#1/30/96#, }& |6 G! g5 Q5 I
注意:
: X- A" M6 t# n) q' wMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
5 A* F3 ]$ R1 }2 C例:
0 K- G; b+ W( Y6 Y+ O3 a' I# g- h2 _! iWhere orderDate>#96-1-1#
6 ^* t; c2 V2 @7 q8 n/ X+ {也可以表示为:
" a9 k+ M+ O  ~Where orderDate>Datevalue(‘1/1/96’)
9 [; }; y$ r6 D! v( J使用 NOT 表达式求反。
& V& E! c+ k; K; d例:查看96年1月1日以后的定单
; O; l8 Y* V6 GWhere Not orderDate<=#1/1/96#' e& y9 W( x6 Q7 {/ U  W! S7 A: Y9 ?
2 范围(BETWEEN 和 NOT BETWEEN); E3 A' Y7 P! Q5 s
BETWEEN …AND…运算符指定了要搜索的一个闭区间。& g7 N4 Z( M' W: e8 B
例:返回96年1月到96年2月的定单。
7 `( e: F9 ^: a5 D. j+ o& sWhere orderDate Between #1/1/96# And #2/1/96## f, S; E$ @4 ?4 Z1 N1 ~
3 列表(IN ,NOT IN)' {( M3 K' H! T$ L3 V
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
) ~' ~: M5 B& b$ N' f$ ~% V例:要找出住在 London、Paris或Berlin的所有客户
' ^) m! T' Y; D; Z1 C9 ]Select CustomerID, CompanyName, ContactName, City' `8 ^% J/ ]: G: u$ g3 P8 H# O2 R( n! g
FROM Customers! \! m. `! s0 K# w. T9 D- @
Where City In(‘London’,’ Paris’,’ Berlin’)6 ^8 R/ Y( \6 K4 V7 S
4 模式匹配(LIKE)8 Z3 K2 O* g" I- X2 F9 Y, R3 ]
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
" P8 ]# ?( `: S/ qLIKE运算符里使用的通配符0 i" X. P; Y! P. X
通配符 含义
8 Y0 u, b5 P: f* E8 Z8 r? 任何一个单一的字符2 B! [7 c" s! x9 |# ]
* 任意长度的字符, i8 o6 {6 C2 \- k/ G
# 0~9之间的单一数字
- f( Q7 f# J' `4 B[字符列表] 在字符列表里的任一值  d+ l; v1 C& _0 t4 y3 {
[!字符列表] 不在字符列表里的任一值2 g* M% M; V  U- E
- 指定字符范围,两边的值分别为其上下限
. Q( m4 _) i( w4 C" k& i0 A例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户) _5 i4 i2 y# j$ |% @# G
Select CustomerID ,CompanyName,City,Phone
8 B. Z0 q  M$ I# s7 FFROM Customers8 f. U4 A, V" K$ c. l1 h% C
Where Phone Like ‘(171)555-####’/ Z, Z2 |# q4 T1 j4 p* D2 X
LIKE运算符的一些样式及含义
! [& N/ q4 x) n' P  s' i! d5 O* [: i4 e样式 含义 不符合
0 Z$ ]' D! P% A! Z6 K5 h0 qLIKE ‘A*’ A后跟任意长度的字符 Bc,c255
& v- ^; e! N+ H% M! G/ s# LIKE’5’ 5*5 5554 R6 c* O  V& m3 h0 v! h6 t) J  i+ ~+ C
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5* {' J3 l# M" R& k0 k# e! O
LIKE’5##5’ 5235,5005 5kd5,5346: x5 V  G$ f4 k4 u: n5 o, S
LIKE’  ~' l" T" K+ M; X
[a-z]’ a-z间的任意一个字符 5,%
; q: e: `4 u6 w* U, o( [- f. ILIKE’[!0-9]’ 非0-9间的任意一个字符 0,1  t; m9 m6 ]# l- z# C3 w
LIKE’[[]’ 1,*& W! p( X1 z) S
三 .用ORDER BY子句排序结果, y* e. P6 g- l1 V. Q) w
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
" ]5 p) b& X6 W9 rorDER子句中定义了多个字段,则按照字段的先后顺序排序。
' \, N# Y( M/ Y8 E; ?1 g: G例:
" Y+ g  E/ o! l5 RSelect ProductName,UnitPrice, UnitInStock
" l) u' x+ k) |FROM Products
# Y3 s7 q* j! norDER BY UnitInStock DESC , UnitPrice DESC, ProductName
! K& s7 w. [9 d- h; r, horDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。+ C2 L/ ?! h9 [' x! u) M
例:下面的语句产生与上列相同的效果。9 `% n2 I( `/ ^1 c
Select ProductName,UnitPrice, UnitInStock
' b! T) t. X+ B! f" u0 IFROM Products
: G/ B/ _$ f9 x% w) ]7 \orDER BY 1 DESC , 2 DESC,3
4 F( t1 }' e1 R' _# t四 .运用连接关系实现多表查询
* C( X0 r! Y) q" @4 @$ H, }% g( @例:找出同一个城市中供应商和客户的名字
) a( N' _. w, Z+ {2 L* JSelect Customers.CompanyName, Suppliers.ComPany.Name
* E' n1 ?- K( HFROM Customers, Suppliers% E; n% X2 ]" p0 S
Where Customers.City=Suppliers.City
6 D4 I; Y2 V/ t. h7 k例:找出产品库存量大于同一种产品的定单的数量的产品和定单
, b0 }! N& Y: X) U) E* SSelect ProductName,OrderID, UnitInStock, Quantity" x$ t' @) r8 ?2 B4 C
FROM Products, [Order Deails]
4 M  Y' y6 f. n7 J& fWhere Product.productID=[Order Details].ProductID  M8 O# [8 q; U. K! q" i0 D* D
AND UnitsInStock>Quantity% S; @  Q: N" j9 {7 r; N4 h- S
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN( a6 U2 l. [- |9 _; `; J& X
语法:$ `0 w9 l4 }5 `7 O5 G
FROM table1 INNER JOIN table23 N( U. w. j- N, V: O7 M
ON table1.field1 comparision table2.field2
* F2 j: v8 h3 v! G# ?" z其中comparision 就是前面Where子句用到的比较运算符。6 r( c- s: W; e, B6 |! D6 Q
Select FirstName,lastName,OrderID,CustomerID,OrderDate
# O& q5 K2 f+ A1 `1 ^& M% \1 GFROM Employees
. Q# h# }$ K0 N( j6 y6 p; b9 ~, dINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
9 o$ M$ [/ _, q; Q2 k  d) k, C$ v注意:
  H$ l1 J8 Q3 v& w8 e8 hINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。& A' ^) c# F3 l, |
在一个JOIN语句中连接多个ON子句9 W, @& X" r# |
语法:4 d9 X9 f4 S9 E5 V/ G8 F+ J& Q. Z0 P
Select fields
$ c2 B6 ~" Z, ~- W7 P$ iFROM table1 INNER JOIN table2
! z# O0 t) d! m6 _/ bON table1.field1 compopr table2.field1 AND
  X. U6 j- e: c* yON table1.field2 compopr table2.field2 or
3 m1 K9 W/ u. J1 D" G) cON table1.field3 compopr table2.field33 a: D: [. B+ C. p1 P4 |# o
也可以
( }  P2 v3 `' OSelect fields
7 r0 q& H3 v- H6 U, A( c5 mFROM table1 INNER JOIN2 @5 E; |1 i* K4 T/ z
(table2 INNER JOIN [( ]table3
: U: I, |: v( L' D[INNER JOER] [( ]tablex[INNER JOIN]
: ^4 \  K* H' ION table1.field1 compopr table2.field1
9 F( x5 ]* w% v% HON table1.field2 compopr table2.field2
, G7 c5 B  ]$ \; [. ION table1.field3 compopr table2.field3
/ \5 \6 ]3 ^, g外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
! K' q) R. Y: {  RFROM table [LEFT|RIGHT]JOIN table2/ H: S, v- K; t- T# N% J' T
ON table1.field1comparision table.field2; u9 y# b: y, c, T0 y! U
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据+ V% ^3 M8 s" X7 o8 q3 F- q4 @
例:不管有没有定货量,返回所有商品
: c4 e% X* B1 E  Y" C, {Select ProductName ,OrderID1 N/ W! X. u& P- z6 \
FROM Products" W& w; c, I) W; I3 `
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
$ _$ e) v! g6 L右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
/ y) R5 N$ \* Y" l0 M0 |& |例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
! A! U5 _" P6 _空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。# n0 \' U) G# z% N8 g) o
Select *
  c( o" U9 r" k. K7 B4 K. aFROM talbe1, a5 e# d( e, ~6 \) y* T
LEFT JOIN table2 ON table1.a=table2.c  S, ]+ R2 u9 p& _
1 连接查询中使用Iif函数实现以0值显示空值
1 w: G& ]4 V% w/ o* ]) I. R: RIif表达式: Iif(IsNull(Amount,0,Amout)$ s* ^5 D, W9 d# X
例:无论定货大于或小于¥50,都要返回一个标志。0 Z( ?' s0 }) u3 J( Y
Iif([Amount]>50,?Big order?,?Small order?)
! |7 c3 W* M$ d, q  W0 ]五. 分组和总结查询结果
$ O! |! M6 `) O% b3 s& M" \# `在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。' M+ M' d2 g! L
GROUP BY 子句的语法
/ l7 \; c2 n& U) `/ fSelect fidldlist
/ d5 e  K' X) n3 ~, E! ]  b! a- RFROM table
( x( t4 ^; _& h3 U2 UWhere criteria
* |7 \' o* C/ U% c: X[GROUP BY groupfieldlist [HAVING groupcriteria]]7 N  _3 o9 z9 V' z! x% H+ G( ^: H8 W, \
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。: _0 K& R+ y1 r6 O
GROUP BY字段中的Null值以备分组但是不能被省略。
/ q5 p0 \5 D5 f# j在任何SQL合计函数中不计算Null值。
4 P+ S. v3 o3 C# j1 @) M/ S, vGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。! r! y' m1 @4 I3 M  X1 P
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
; x$ A0 `+ A& L7 J' I) A/ S9 W8 hSelect Title ,Count(Title) as Total
' o  ^7 z& J1 ~! n) XFROM Employees
- E& C* M( v6 N& c7 `Where Region = ‘WA’
! `9 Z/ U5 I  V& n6 b3 a4 \) zGROUP BY Title
8 I- g' e2 p9 v6 w( i$ E) EHAVING Count(Title)>1
/ c/ J# ~5 z- M$ |2 qJET SQL 中的聚积函数. y: F! ~% y: N* n( m
聚集函数 意义( V" A! q( Q7 l: K
SUM ( ) 求和
! m3 a8 p) t. k9 U8 e5 D/ qAVG ( ) 平均值2 k# r4 L4 x% m5 B* f
COUNT ( ) 表达式中记录的数目
* l  J  ~0 n. _3 S4 JCOUNT (* ) 计算记录的数目
  G9 M. F! h" Z! ?. Y& lMAX 最大值
. T% V* R* d9 H: eMIN 最小值
6 ~9 i  u' S4 a. n. FVAR 方差3 F% B; V  b9 X# k
STDEV 标准误差, L  z0 T$ w0 f3 R8 O
FIRST 第一个值2 \" e# T! }( X2 K1 A9 [
LAST 最后一个值
5 g9 O' t- c. C六. 用Parameters声明创建参数查询7 V/ N$ x, y) f( m6 ^2 \
Parameters声明的语法:0 D+ J/ T. N' Z$ i7 _/ v
PARAMETERS name datatype[,name datatype[, …]]$ x2 h* T6 ~" Y$ a
其中name 是参数的标志符,可以通过标志符引用参数.
0 s/ l$ ]5 x: I0 x. E% ~; UDatatype说明参数的数据类型.
! E, [1 U8 Y  }) P8 B使用时要把PARAMETERS 声明置于任何其他语句之前.
0 g7 s3 `3 \+ j$ W例:
7 u$ K' m9 S! x2 X. u: ^4 nPARAMETERS[Low price] Currency,[Beginning date]datatime# G' N9 z& S) M8 e6 E
Select orderID ,OrderAmount" n/ @: U  X3 n+ m+ W
FROM orders
: }- K* g  v2 BWhere orderAMount>[low price]
, w( _5 ]+ P' w9 tAND orderDate>=[Beginning date]
4 g' a9 B6 C) P6 @4 J5 r七. 功能查询
! V- [' r8 m' v% v所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询., o# \# V3 J0 i( [4 q
1 更新查询
  t& b- L/ S+ q% nUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.6 W+ V. s# K) }8 J+ t3 X7 [
更新查询语法:: I& h. ~  X: x2 F
Update 表名
+ i& Y9 O) H3 L0 }: i% f5 lSET 新值
' ~8 P- Z' |5 I5 H: \& V6 [Where 准则2 b  ]. S/ `: L; {/ h' x( [" @
例:英国客户的定货量增加5%,货运量增加3%: o5 p4 M2 c; M; M" `
Update OEDERS8 g" b$ [. U2 S3 [% Q7 c
SET orderAmount = orderAmount *1.1$ _) T, g) C% @" j7 m# w
Freight = Freight*1.03
' t/ E6 G4 I' O6 p0 T6 m4 jWhere ShipCountry = ‘UK’/ x4 p* U/ e; E! ^5 X8 x
2 删除查询6 c( |* K- t. _) i9 D6 B3 F
Delete子句可以使用户删除大量的过时的或冗于的数据.
) D( }# n2 E6 G! e( X$ m- S注:删除查询的对象是整个记录.$ U' i& y3 G" l( o7 L# h  t" q
Delete子句的语法:
8 @8 Q' |: i) \+ J5 l' T. M4 c! o2 aDelete [表名.*]
7 t5 @; s( F: @: N8 IFROM 来源表
2 k2 {$ R& L8 J4 e0 y& U' d- J  z* IWhere 准则
( O* [  J: L7 t5 c$ R6 y! T例: 要删除所有94年前的定单+ c( [+ K# b$ h4 c7 D0 h
Delete *
- {/ ^3 J) v9 v5 b6 A8 lFROM orders
7 S# x3 m( n9 I3 G1 bWhere orderData<#94-1-1#
+ q% _3 o% U9 [; c! P5 \3 追加查询: x. \5 }2 B2 ~( i
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
# |$ Y4 t+ X+ [INTO 子句指定接受新记录的表
1 O/ }  L2 j2 N$ CvalueS 关键字指定新记录所包含的数据值.
1 ?0 I, Q+ j2 {3 n& rInsert 子句的语法:: L0 C" b3 x+ T6 O
INSETR INTO 目的表或查询(字段1,字段2,…)
$ o5 h0 ~. l0 ?+ QvalueS(数值1,数值2,…)# P; C+ A5 |7 f$ p" x: J1 L
例:增加一个客户, X- e  m1 s6 D2 G! |* C9 b
Insert INTO Employees(FirstName,LastName,title)7 p; ~( k3 N7 B7 p
valueS(‘Harry’,’Washington’,’Trainee’); }8 Z- \) a; o& u  a
4 生成表查询# S% e4 H' F" `! X7 L6 X
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.9 J  R/ D6 ~! L/ s  e: p; O% n
Select INTO子句用来创建生成表查询语法:
6 P2 k' M- D! rSelect 字段1,字段2,…
; l" [6 T2 u5 M. UINTO 新表[IN 外部数据库]
% U1 q! v8 X" Y( L  R8 uFROM 来源数据库
. ^# K1 [# z6 mWhere 准则
3 q% u- K# D; {9 [7 k7 x+ |! k  l例:为定单制作一个存档备份
1 W8 X  r" e* \Select *
6 I! j: X5 m" S% _8 C6 C" wINTO ordersArchive
$ f) I( t' G$ {7 ?* GFROM orders4 K9 m/ G7 ^2 ?
八. 联合查询
9 Q- |) `# ]: ~UNION运算可以把多个查询的结果合并到一个结果集里显示.
0 C$ X2 a1 @2 _7 O! \* _$ _2 G# cUNION运算的一般语法:0 g: d5 n7 U* X0 k
[表]查询1 UNION [ALL]查询2 UNION …9 f3 ?! _6 F6 ~4 l, l7 q
例:返回巴西所有供给商和客户的名字和城市
3 p+ g+ V0 W9 QSelect CompanyName,City( O6 y1 [/ C1 P& o
FROM Suppliers
' w' D0 r( R# Q, Z% }+ QWhere Country = ‘Brazil’
- o% B$ X- }2 y% t( lUNION5 s; u8 c5 R5 L$ f& N) l
Select CompanyName,City/ N$ Z5 ~1 i- v! l+ r0 K% u
FROM Customers
2 ?% ]/ s' [0 t- r+ V- y7 }: j/ EWhere Country = ‘Brazil’
# M( c' V! \' ^注:& c" J' ^! M& v& l7 |
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项" i! g5 H/ R& n, z( P6 l
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.  C; J" `+ \- {+ a; T$ Q
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
9 k) h' a5 Z; Q九. 交叉查询
- R- x, z& z2 @& H交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
1 e5 t. g) U% e1 u% l( U. CMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
8 ?' ]+ Y9 {1 cTRANSFORM aggfunction
. ^2 C# ]; R! X+ ]Select 语句0 P9 O- O1 P: E6 E- M5 O& P  A
GROUP BY 子句4 F5 o% |3 f: p6 s
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
( t  I* }7 O# r0 L2 x( `, uAggfounction指SQL聚积函数,( R! K+ [3 K' k7 e! V5 G
Select语句选择作为标题的的字段,
% h% W% A6 P- RGROUP BY 分组9 W' Y3 v- f5 r1 V' Y
说明:
4 O& D4 [! z6 L5 k# u5 RPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.% D& ?0 s( V4 u: y! A0 m  Y
value代表创建列标题的固定值.& f1 B" b  w8 r0 h$ i( U( R  `
例:显示在1996年里每一季度每一位员工所接的定单的数目:2 U" D7 \0 |0 y- j' d8 x: B* P
TRANSFORM Count(OrderID)" o% x+ p6 W1 a( c. \3 z
Select FirstName&’’&LastName AS FullName0 f, ~' M: Z" v) s$ A" |, q
FROM Employees INNER JOIN orders
) L3 ^+ @+ W/ T; V5 P8 G$ A3 \% K$ EON Employees.EmployeeID = orders.EmployeeID, v9 k* t3 f! i' x5 T  J9 Y9 |
Where DatePart(“yyyy”,OrderDate)= ‘1996’
' |# I/ T2 Q+ _- {GROUP BY FirstName&’’&LastName
! I5 E- t) y: o/ I* eorDER BY FirstName&’’&LastName, C+ V) V+ Q9 s: z
POVOT DatePart(“q”,OrderDate)&’季度’
& j/ j& _* j' t$ W, f# E十 .子查询  C3 p3 J& l6 n' U
子查询可以理解为 套查询.子查询是一个Select语句.: o9 @6 W; ~5 ]% B& r! S
1 表达式的值与子查询返回的单一值做比较2 k) `3 B0 i8 \; _' i
语法:
% l3 q, ~. `2 C. |8 ]表达式 comparision [ANY|ALL|SOME](子查询): H5 a. D% c; Q# J9 I
说明:
: `+ u4 Q* V; X# H2 b) S# V1 v* ~ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
6 ^3 _! U4 @# h( N- r/ z例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品$ N' v, ^9 c( m5 K: w
Select * FROM Products
2 K% S0 |. f% v5 m6 VWhere UnitPrice>ANY
. `& s2 G+ B4 d5 q; B(Select UnitPrice FROM[Order Details] Where Discount>0.25)+ v( Y& I8 F7 r# f
2 检查表达式的值是否匹配子查询返回的一组值的某个值
- U$ J% K' ~2 H; b语法:
& t# i" g" k; z0 b% f) u[NOT]IN(子查询)
$ f' s3 w3 b) C9 v- p0 F例:返回库存价值大于等于1000的产品." t6 Q* R! n7 a/ h
Select ProductName FROM Products* t% `/ K0 P! h; e3 J
Where ProductID IN! O" D- t. [6 [0 ]
(Select PrdoctID FROM [Order DEtails]3 [1 n$ R8 N& H$ p* \9 {
Where UnitPrice*Quantity>= 1000)
, d) P$ \9 D+ r3检测子查询是否返回任何记录
2 l7 Z/ Y5 |$ U$ A& q! [; z语法:
5 I- t+ v% ~2 t& _& n- r/ y[NOT]EXISTS (子查询)
' H1 Z" a2 p  x- }  B8 P例:用EXISTS检索英国的客户" C" h* q' z, N8 h: l: S
Select ComPanyName,ContactName3 p7 l" m. {4 W8 M
FROM orders! q4 F/ Y! b5 `; G# ^- f
Where EXISTS
5 t; B# f9 y/ N, M- s, y(Select *% y, F7 F' ?. K
FROM Customers
- f) f) q" W* p8 S+ D+ sWhere Country = ‘UK’ AND, h% v  X5 C! Y5 Y9 I3 y" j; W9 F
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-12-19 02:24 , Processed in 0.026001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部