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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法! E$ @0 Y+ Q/ F$ `0 z

6 i- O1 Q  ^' ^/ _! u& |, F* G) fselect distinct 字段 from 表名& n# M2 ^+ x0 B( R2 [
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。1 H# J  C  ^! a  O8 I; U9 @' |
一.Select语句的完整语法为:
: g' r* z6 w: ~1 K/ sSelect[ALL|DISTINCT|DISTINCTROW|TOP]
9 Q: ?% p5 X4 T3 n{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}- ^; W& x8 ?2 P+ @9 w6 L5 ?( X2 ^0 {
FROM tablee xpression[,…][IN externaldatabase]! d5 n1 o. x2 K4 m) B0 R8 _' ^
[Where…]9 J0 Q( o- n- a; |+ k
[GROUP BY…]
0 m2 A( E/ X) N* @. ~4 L0 b# p[HAVING…]
3 n9 B/ z  W% Y  S& t7 h: X" N3 i, F, O[ORDER BY…]- O  A& W  N4 g$ G0 z
[WITH OWNERACCESS OPTION]
; k- p0 g1 s8 t说明:+ V+ |; s) ?& c9 ?+ Y( K: S
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
0 w  T' m# v- o  F1 FROM子句* X- E9 T+ }" X( \3 _: ~
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。% u1 d3 l% v; Z7 w& ~/ H
例:下列SQL语句返回所有有定单的客户:
2 k  F1 S9 l9 d3 g6 A% PSelect orderID,Customer.customerID
4 _  U7 j  M" y1 _! oFROM orders Customers
9 p1 ^- x* C4 eWhere orders.CustomerID=Customers.CustomeersID& [  U! }  G0 O' P# u
2 ALL、DISTINCT、DISTINCTROW、TOP谓词3 a- L1 |; q2 V/ ^0 Q2 _# u- ?
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
8 z; r( @3 Y! p; c' L例:Select ALL FirstName,LastName0 O0 ]* g5 k3 d# l; T
FROM Employees
0 W# N) v) V& n6 t' e& J* U) Y; F(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
- J7 Q9 b" B0 i/ @6 _& |  w(3) DISTINCTROW 如果有重复的记录,只返回一个
0 x7 n& u4 d" Q* G7 q- ?4 p3 E(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比); P# e% x7 `4 X( F
例:返回5%定货额最大的定单
* @4 c3 d, _0 ySelect TOP 5 PERCENT*  Q( y$ Q# @1 T* b
FROM [ order Details]% Z6 Q/ `, p3 D: @$ A2 a
orDER BY UnitPrice*Quantity*(1-Discount) DESC
. ^) y" v6 [2 I+ d, u3 用 AS 子句为字段取别名
/ h1 C5 V) |! p. z: t1 c1 e如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
! E( f( `1 y0 s# W$ k0 S: s例:返回FirstName字段取别名为NickName
+ G2 _8 [4 a% Z  l8 S5 y) N$ h; KSelect FirstName AS NickName ,LastName ,City8 o  ?: m3 p" S) L# o
FROM Employees
- K4 D2 a- |% ~& k; A例:返回新的一列显示库存价值
! s. l! e! u( `% q& a' x! RSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock; H$ b  J0 P6 Z
FROM Products
2 s" V8 K$ x; V! Y, e1 S二 .Where 子句指定查询条件
+ H# z7 m9 t* L1 比较运算符" C5 [" h( V$ [; H* V
比较运算符 含义+ b+ d. V# s0 P  y" d
= 等于9 ]) P) R& d# z3 c8 `
> 大于/ F) p" \$ K# X% o/ Y. o
< 小于- o, E% w- {0 v) P" r
>= 大于等于
4 d% n6 h5 t0 O. m2 L4 I) @9 \<= 小于等于
2 `7 Z" H8 G& P# X6 ?! `<> 不等于0 J- T( c! `% E
!> 不大于- }3 U9 R  f0 H  K9 B$ S/ w- G
!< 不小于# `8 s7 x! U# o
例:返回96年1月的定单
; M6 t, _8 i  H3 ?. c8 A* U5 |Select orderID, CustomerID, orderDate1 k3 ?/ ^, p2 u0 X6 \+ N
FROM orders3 H7 C- Q# N: t) c! I' w& |# F' `
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
/ F; ?9 o; E* A. k9 [% t& X0 D. e  K2 V注意:
3 X9 f  I0 P& g: |- j% a! qMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
( l+ q- e. O+ l* U例:
! S2 h- M6 f9 X6 |+ h4 GWhere orderDate>#96-1-1#1 i: h9 i5 v- K" v" @
也可以表示为:" {& H1 I/ U: ?& i5 R' [
Where orderDate>Datevalue(‘1/1/96’)
2 {$ `$ ^- e- W0 T使用 NOT 表达式求反。
( G  r* Q2 h) K6 j例:查看96年1月1日以后的定单- D0 h8 N; }2 D1 e! J" Y
Where Not orderDate<=#1/1/96#2 y* u( m7 _' b) h
2 范围(BETWEEN 和 NOT BETWEEN)
2 v6 c: o! f3 A9 N# x/ h1 u3 WBETWEEN …AND…运算符指定了要搜索的一个闭区间。
7 _4 ~7 n) D. |( C# R/ [; a例:返回96年1月到96年2月的定单。
+ n' \0 A1 q2 WWhere orderDate Between #1/1/96# And #2/1/96#
. K1 N' y  ], V1 A$ q3 列表(IN ,NOT IN)
6 T, ~4 ^; f& K" Z) MIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。. j0 t' ?4 u4 x$ u
例:要找出住在 London、Paris或Berlin的所有客户7 g5 b5 V( j: [. \
Select CustomerID, CompanyName, ContactName, City) Z$ y$ s. ]1 l
FROM Customers
" M3 P6 m. M) y- M$ Q7 YWhere City In(‘London’,’ Paris’,’ Berlin’)
2 b2 l! r- {, l9 ]3 o4 模式匹配(LIKE)9 O8 _7 w) N8 d- Z/ a, d# a
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。' i; T  {  n0 g- y
LIKE运算符里使用的通配符& G: S) {7 }' k, J
通配符 含义
0 Z* D  o; \/ T$ I! x7 N: V? 任何一个单一的字符6 G% d1 G* u, F  R
* 任意长度的字符
: E1 i3 d6 m* m4 ?# 0~9之间的单一数字
% c( o! q- z8 [- F- X. T[字符列表] 在字符列表里的任一值5 O) x) U. a% m3 [& G, h
[!字符列表] 不在字符列表里的任一值
$ @9 V2 H' n) p* \& _% f2 _2 G- 指定字符范围,两边的值分别为其上下限
! P/ e& J7 J9 A% `5 o5 D# j# V例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
& c9 w4 {9 j* M$ \: E8 [Select CustomerID ,CompanyName,City,Phone$ {4 _- b% M( T; G; x: f
FROM Customers1 z3 N9 U' e% p# U
Where Phone Like ‘(171)555-####’  m7 n, T( p, |( T
LIKE运算符的一些样式及含义
2 t2 J3 f4 V: [样式 含义 不符合5 A8 m: A: l  A( \/ v$ v+ P2 V
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
4 ~) Z; ^; j: s/ m# LIKE’5’ 5*5 555. |9 |6 ?) T1 G" |& Z' ?% Y
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
4 c# z) d" U+ ]3 o0 hLIKE’5##5’ 5235,5005 5kd5,53463 M2 M$ f. A9 m2 S
LIKE’! h' j+ h. `/ W. C# ~
[a-z]’ a-z间的任意一个字符 5,%
3 `$ o6 y; ]; i) z" S+ _LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
- S: T$ C: Q9 x" d1 `LIKE’[[]’ 1,*- b. t8 N9 f$ R, Z( w* f& J% a
三 .用ORDER BY子句排序结果/ D7 t( ?2 K" ~+ r1 q9 `
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
. Z5 M: `1 c- P4 v. x, korDER子句中定义了多个字段,则按照字段的先后顺序排序。
. a" t9 ]9 O6 S例:
0 i! P/ g  I' |1 ?3 [$ J" R) cSelect ProductName,UnitPrice, UnitInStock
8 M' X7 _2 u. U, eFROM Products/ Z4 o- P0 q8 s) s! l4 T
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName# L+ M+ j, q9 z! J
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。5 h  ?( q: h9 }' T( C( l
例:下面的语句产生与上列相同的效果。
" {) @2 S+ X* ~: v3 {& V/ R% O0 HSelect ProductName,UnitPrice, UnitInStock
& j4 [! Y  F$ N3 n6 `FROM Products
! J3 L, h: B, u% ?6 z/ q1 HorDER BY 1 DESC , 2 DESC,3. D, \6 w% ?1 [  R
四 .运用连接关系实现多表查询
4 e/ f- o( I" _% s' k例:找出同一个城市中供应商和客户的名字
7 k% W- l, d8 p. p( L& T  U- |" nSelect Customers.CompanyName, Suppliers.ComPany.Name# V. {" q* X2 D3 ]6 a: G) _$ w
FROM Customers, Suppliers
8 Q6 {2 A; Z* j' U; H) ^Where Customers.City=Suppliers.City4 a4 q& \3 k4 S
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
" _' W5 K, {/ D% E4 W; O  RSelect ProductName,OrderID, UnitInStock, Quantity) U2 d" D+ B+ R/ Q" \. d1 b  ]
FROM Products, [Order Deails]! c3 l* L# C6 _* e
Where Product.productID=[Order Details].ProductID
+ k5 J2 [7 S. t; Q* Y3 [1 |7 QAND UnitsInStock>Quantity9 P- ^5 T% A3 N2 ^
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
8 o3 v# ]8 Q$ [/ [, ]3 T语法:& r6 p* M9 s1 @3 L
FROM table1 INNER JOIN table2
8 {# Y% G1 d8 n% k# M* ]5 qON table1.field1 comparision table2.field2% v! y; f& m4 J# l  X+ m7 `- U& i4 u# I
其中comparision 就是前面Where子句用到的比较运算符。, u7 E, b' ]5 p4 E' }, k. I' @
Select FirstName,lastName,OrderID,CustomerID,OrderDate1 t, X2 w) Y* G) S5 y
FROM Employees/ ?) g( c0 |! L5 P% i( k
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID- u7 [/ Y. h& a/ l8 D: e# v4 W% }
注意:7 O: _! ]* L. E; }
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
* q* ^7 k8 U# Q; C6 R* B& R在一个JOIN语句中连接多个ON子句
8 @/ X8 k9 g$ p: l& X+ h% e( D+ D' P语法:, ^$ L' \# M7 D
Select fields1 q  P! N9 X0 |3 a# V
FROM table1 INNER JOIN table2
4 I# Q; p! Y: w; x$ v* w- GON table1.field1 compopr table2.field1 AND: q1 x& N! ^2 v9 {; N& k
ON table1.field2 compopr table2.field2 or+ j4 q3 c7 p% V# o7 F, r4 X  A
ON table1.field3 compopr table2.field3
7 r4 G* ?+ ~* f也可以' Q9 x$ D5 f) A2 c# v3 e* Z+ p' T' {
Select fields
% t& Y. _  b$ c/ pFROM table1 INNER JOIN  d: d+ q: i3 f4 P$ b0 U
(table2 INNER JOIN [( ]table3. _7 u. G: g: b  Q
[INNER JOER] [( ]tablex[INNER JOIN]& }' G8 P2 V) \7 I; F
ON table1.field1 compopr table2.field1
  p5 L6 Q4 B  Y  {8 dON table1.field2 compopr table2.field2
+ L  b% e0 {/ \/ L! jON table1.field3 compopr table2.field3
- W) u# a5 @! V外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。7 U" l, C7 O0 n, j. l  b/ x
FROM table [LEFT|RIGHT]JOIN table2( ?6 `2 M7 d% |5 t& ?
ON table1.field1comparision table.field2; G' h2 }( ?# \% U
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据; A/ m' u6 K& k+ U3 |0 i2 c
例:不管有没有定货量,返回所有商品
& q; v9 L8 Q; g. j7 _Select ProductName ,OrderID
4 w4 A7 I# h! K) s- x4 _9 ?" wFROM Products8 g+ b" I3 {9 K7 W* }
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID0 m( d0 ~# A7 Q) a
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。5 Z/ m) n/ f6 D
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。7 r4 g! m, |  {! p; e, d, d' C3 y
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
: Y: k9 P6 w. SSelect *
, M4 _8 Z" o* a" EFROM talbe1: ]! ~$ J  v' _
LEFT JOIN table2 ON table1.a=table2.c7 k2 q0 h8 I$ s3 b" n/ R
1 连接查询中使用Iif函数实现以0值显示空值: S# E( v1 c, q! B: l1 R6 a
Iif表达式: Iif(IsNull(Amount,0,Amout)$ X, [% ]4 T" K# L4 ]
例:无论定货大于或小于¥50,都要返回一个标志。7 x. w* e( G& ]/ f4 G
Iif([Amount]>50,?Big order?,?Small order?). Z/ t" S8 c6 d. S
五. 分组和总结查询结果
: W3 i+ L6 l' [. g在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。# K) C8 K* P) F$ \. f
GROUP BY 子句的语法
9 h1 |- E, F; l0 Q' y- u/ tSelect fidldlist( v3 e, i2 ], ?3 M9 D( q+ y
FROM table5 p  v+ [8 L& m5 T5 c- X
Where criteria' C9 b! Y3 y( A4 w7 ?
[GROUP BY groupfieldlist [HAVING groupcriteria]]6 H% U* N5 k& o* C* r  o
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。3 R& M, C$ n0 q0 Y1 U( t% r
GROUP BY字段中的Null值以备分组但是不能被省略。. {) G3 S; n( K! B2 p
在任何SQL合计函数中不计算Null值。* w& ~9 D- S( x/ [1 v* ?% Y, x: C' e
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。  E" P7 z6 C  t% w! g
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
0 B, H& T7 A% e: n: [Select Title ,Count(Title) as Total- `! d+ M! e1 a6 e% r, G
FROM Employees
$ d0 K0 V- R: f% f* B0 j: dWhere Region = ‘WA’
8 @& V" U1 X0 C. ~+ V! W! p: MGROUP BY Title9 V; f4 @: Y6 ^; x3 B* G  q, L
HAVING Count(Title)>1
% c, D- Z. D6 y. c9 N8 RJET SQL 中的聚积函数) G% x7 M" P, L6 ~" {) l* j
聚集函数 意义
$ V. w2 ]& l, V5 m. wSUM ( ) 求和
$ E; d( t0 Q- D, ?6 g4 [) f. \" GAVG ( ) 平均值' \; r/ f% d6 m6 w7 k7 V+ z
COUNT ( ) 表达式中记录的数目1 ~5 e* }) O+ b# u& @
COUNT (* ) 计算记录的数目
9 U) W  H$ v4 A1 |0 e4 EMAX 最大值
, `3 z  n9 M# u8 nMIN 最小值8 W1 O+ w9 Q1 H
VAR 方差9 N8 ]4 ?. ~: U3 x6 g8 M3 @4 s+ l
STDEV 标准误差! y- l+ y0 C. E8 @  f
FIRST 第一个值
+ E+ G% Z: U4 H% @LAST 最后一个值
* q3 E5 ~5 t& B5 u六. 用Parameters声明创建参数查询! j7 s; S* P: \: y5 g
Parameters声明的语法:: g% O$ ^7 h0 M, Z7 Z6 J0 t! |/ w
PARAMETERS name datatype[,name datatype[, …]]" @( s4 p/ D! b+ L
其中name 是参数的标志符,可以通过标志符引用参数.
2 z. p! b& J+ |Datatype说明参数的数据类型.
- P. I4 Q- A+ n9 @* l: E使用时要把PARAMETERS 声明置于任何其他语句之前.
6 A  A$ o2 ~1 }& ~9 h# ^! a例:, M1 y& k9 J) z" ^7 z; P
PARAMETERS[Low price] Currency,[Beginning date]datatime! W4 B: O4 ?: Z( v
Select orderID ,OrderAmount
5 h9 ~# i& J/ f! M1 U+ bFROM orders5 X2 k; Z4 `5 w( ?- F
Where orderAMount>[low price]/ j7 a: ]$ j' v6 V. t: J# [
AND orderDate>=[Beginning date]
1 Z$ o  _/ h7 W七. 功能查询5 \. d7 k2 e  Z: U5 u
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
, [$ m2 T! W2 p) y1 更新查询+ U# i0 O% R, [# a
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.5 [+ f" h+ ^7 z* J/ f
更新查询语法:7 E' L9 I, l+ G
Update 表名. R: l5 m8 H1 Z$ N2 j
SET 新值: k* ?% m" }4 p" J
Where 准则
3 c" ~/ h. o  p) h/ f" B" K例:英国客户的定货量增加5%,货运量增加3%
+ f, ^; i/ X& @) aUpdate OEDERS6 F4 z. y1 L4 j! ^' F! Z
SET orderAmount = orderAmount *1.1) y0 U  z2 i) G3 T- O- u% K
Freight = Freight*1.039 `* }- B# i* X! l8 I# {) H
Where ShipCountry = ‘UK’, _. X% u0 e3 i. I/ r  m
2 删除查询
6 O! v2 t& ?( R% [; q# BDelete子句可以使用户删除大量的过时的或冗于的数据.$ E  {5 x9 ?+ @! O9 W1 }
注:删除查询的对象是整个记录.7 ?4 j  Y/ ?2 F8 Y# I  P, W9 G' G3 c7 ?* K
Delete子句的语法:
. C4 Y! q4 c; ]: e; e. q% f6 D4 KDelete [表名.*]) H' P  v  }6 r* x! w4 s9 D$ o
FROM 来源表; V# Y0 o. p7 S* b' ~. c
Where 准则
2 B5 T5 k& v1 k0 q5 _8 e) r例: 要删除所有94年前的定单
# N% x3 W; R" B3 T* pDelete *
, P* M; T$ T+ M3 ?FROM orders( ]. c& K" T! H1 B0 a
Where orderData<#94-1-1#* S# E3 N! i) O7 ?
3 追加查询
) _0 b4 u( }0 i$ [/ m$ ^( D* mInsert子句可以将一个或一组记录追加到一个或多个表的尾部.! m7 N8 ]5 h  e: g7 S% I
INTO 子句指定接受新记录的表
8 t6 k0 @$ @: m& k* b* YvalueS 关键字指定新记录所包含的数据值.3 o/ F, {6 ?3 n/ I+ ~1 i/ `
Insert 子句的语法:
& b8 A, |4 y5 Y% P* v6 mINSETR INTO 目的表或查询(字段1,字段2,…)
- E" s5 E$ h- q, r! B# ?8 Y" J. cvalueS(数值1,数值2,…)+ S4 g( A( d! l" F3 p; f; z) _
例:增加一个客户: R3 K/ Z4 ]( A" j- }' m3 I- S1 _
Insert INTO Employees(FirstName,LastName,title)
& D3 |2 i$ k; u1 e/ G7 fvalueS(‘Harry’,’Washington’,’Trainee’)# t, ?; v  N3 Z
4 生成表查询
9 g: N- [6 K) I, d2 O可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
# p+ J7 y: B1 h) d7 xSelect INTO子句用来创建生成表查询语法:3 }: x* b7 B' ^! r2 h% H0 C! {3 Z
Select 字段1,字段2,…' A. k& y) f& i* z& y3 y7 L/ A
INTO 新表[IN 外部数据库]
" N' @5 Q4 ?: d$ |- {8 n+ A! aFROM 来源数据库: H5 m, J$ O5 m3 Q  K0 J: X2 D* z
Where 准则+ x8 q# B7 d: P7 n
例:为定单制作一个存档备份
% P- ~  d% I0 OSelect *
% d5 C: R$ X, P7 ?INTO ordersArchive- N( T1 g0 I. f  s. U/ ]/ r
FROM orders$ Q7 Z' {0 O, G1 w8 N" m8 u
八. 联合查询
5 K9 [3 w+ P8 F4 S$ p0 b! R" b) ?UNION运算可以把多个查询的结果合并到一个结果集里显示.  O& Q7 q! _2 \' \6 f
UNION运算的一般语法:5 Y5 P) f/ Y1 ~) D  \
[表]查询1 UNION [ALL]查询2 UNION …, i* L5 I3 R& T% I7 t: m$ j$ S
例:返回巴西所有供给商和客户的名字和城市
' B. d' O- ^; y6 N. DSelect CompanyName,City
# n& I: S/ P) D% p2 c. f; eFROM Suppliers3 r8 d  M$ X' g" S2 |( I/ B
Where Country = ‘Brazil’
: q- L0 X/ F% `" L* _  FUNION0 \' _& @: o( y% r
Select CompanyName,City
& r) @$ X* J: X0 {: o. IFROM Customers
3 N; }0 x1 |2 @6 ?Where Country = ‘Brazil’: J9 b/ L( q) G* a- E
注:9 _. ~3 V+ L" c& L) s% ?
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
7 K1 Y" i( G& L* \' P; ?6 @# ^UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
: M( v0 q! N4 g每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
. ]: [0 l3 m; w' I九. 交叉查询
& i: }, k3 I' e5 \* E' p/ i交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
1 s- \" x- D% a5 p5 jMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:. {, k1 t6 Z+ }' z9 Y2 \4 [% c0 x
TRANSFORM aggfunction$ g2 {+ s6 E  Z" H% N( u
Select 语句1 x/ \; I. {8 `
GROUP BY 子句1 h) Y/ j8 T+ o
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
* P% y2 H( n5 PAggfounction指SQL聚积函数,, X1 A& D  H5 f: N( k/ }( T$ H
Select语句选择作为标题的的字段,0 V6 t% a# X$ ~
GROUP BY 分组3 q1 A9 I9 p$ H. o$ N3 c/ L# \
说明:& @& |6 J* r( v( i' {2 k
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
' t& ^$ m+ x$ T6 F* T  H5 Qvalue代表创建列标题的固定值.- _3 g2 w8 {. J
例:显示在1996年里每一季度每一位员工所接的定单的数目:4 K6 q, u3 @: E% Q% ]
TRANSFORM Count(OrderID)" X9 [) E0 F& |# S/ t) F
Select FirstName&’’&LastName AS FullName
4 |; ~" |- N. V: O2 yFROM Employees INNER JOIN orders. W, \0 ~1 t2 E1 y1 ?
ON Employees.EmployeeID = orders.EmployeeID
7 R4 x6 D3 P, mWhere DatePart(“yyyy”,OrderDate)= ‘1996’
+ j6 p2 ~( _/ R) G: Z7 n. UGROUP BY FirstName&’’&LastName6 h7 @$ E6 w. d$ {7 ]
orDER BY FirstName&’’&LastName3 K$ J+ v- w/ r! g
POVOT DatePart(“q”,OrderDate)&’季度’
8 F, f0 y9 G" T* N, r" m十 .子查询; u, d* E' v0 R7 {7 }  |
子查询可以理解为 套查询.子查询是一个Select语句.8 p. G, j. m  K9 J) o) u" g
1 表达式的值与子查询返回的单一值做比较
" K& n: K! l- q0 |) Q) v语法:
: T3 u) k, P# l' ]( \/ O8 Y: m表达式 comparision [ANY|ALL|SOME](子查询)
/ Q" B0 f7 ~% k6 V' _  N1 l说明:# [# _: c0 _+ p9 h8 ]
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
+ c9 i9 m( u4 v6 m例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
7 a& ^7 s, o/ H- c! \4 Q  `Select * FROM Products
+ I$ g/ T+ i5 ?2 v$ DWhere UnitPrice>ANY6 `; d! i, [# u
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
5 o8 L  O6 R' C+ f7 |9 G2 检查表达式的值是否匹配子查询返回的一组值的某个值
7 r0 L; i2 A% D4 g( q4 x7 J语法:
) `; P* e+ H9 m1 U' R) G[NOT]IN(子查询)  H* j; r3 G! ]
例:返回库存价值大于等于1000的产品.
% E/ M, K# a; vSelect ProductName FROM Products
- K+ L9 U' \! K  QWhere ProductID IN
$ M9 W8 |( H) H( ](Select PrdoctID FROM [Order DEtails]
" ]7 a6 I1 J( `. ?1 jWhere UnitPrice*Quantity>= 1000)- X* ?5 A8 W+ v# U: I& {% b+ Q  U
3检测子查询是否返回任何记录7 q5 Z: _6 T4 \2 `1 c2 f! y! o
语法:& J; u4 I& R" n! k
[NOT]EXISTS (子查询)
6 _, f  Q, |, v9 p6 a例:用EXISTS检索英国的客户1 R( q# [% [" [! @1 x4 z
Select ComPanyName,ContactName2 n& z1 j( e( S4 r8 d* J
FROM orders! \- [; x0 Z6 D2 d
Where EXISTS
$ T$ T. Q3 r; K1 K! {4 B(Select *5 m3 {* a$ y; x0 E
FROM Customers- q( @! C3 y9 Y4 A" _& |3 H! o9 w
Where Country = ‘UK’ AND" J9 z% r/ K; N$ G
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-1-14 21:52 , Processed in 0.026002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部