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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
% s8 x( `6 d  s- R8 |' ^: f% ~0 P2 u9 r# Z
select distinct 字段 from 表名
5 a& y* g) n2 c) fdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
0 [% e3 Y: D4 V! `& A2 A5 X1 P. c0 j一.Select语句的完整语法为:/ ?1 i7 B) x  J4 S- F: V9 T
Select[ALL|DISTINCT|DISTINCTROW|TOP]7 d" L& z3 d$ O1 F" g0 `
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}) m8 A$ h" G0 i0 P- V
FROM tablee xpression[,…][IN externaldatabase]
. w" a/ Q0 a, d* i! ?1 x4 {[Where…]1 L8 s7 m; j% [% |
[GROUP BY…]
& L) M4 J! Z9 b! q5 M+ H% V[HAVING…]
. F* ^. A6 G& Y! H2 }[ORDER BY…]
* H0 O8 }. m. s) l, Z, s7 q* \0 k[WITH OWNERACCESS OPTION]
6 p: c, l: s5 R7 z3 {) D说明:
$ @, S$ V  a/ [& g/ M+ S: v; e用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
# q1 i( _- ~& P( P! E9 a1 FROM子句
$ W$ Y8 s: m( `" i) OFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。2 O, s: p" I( Z( K( N
例:下列SQL语句返回所有有定单的客户:
  J+ |6 B5 w) \3 HSelect orderID,Customer.customerID2 M$ D( p% L: V1 v9 V
FROM orders Customers
' g4 U, G' p* k0 E- F  s( nWhere orders.CustomerID=Customers.CustomeersID1 w! @- l( V9 s. @8 C3 ~& O
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
4 U  r  ~* t  z& R6 _(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。4 e4 C8 ?  j. }/ j
例:Select ALL FirstName,LastName
5 w! ?1 E" Y; F% NFROM Employees
* y2 F7 j7 R4 R" V* Q" j(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
8 ~$ p: `% A0 o. a* _(3) DISTINCTROW 如果有重复的记录,只返回一个
3 v' @( J: o3 d; I( N5 H# k(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
+ M& F6 \+ ?5 F( g2 C例:返回5%定货额最大的定单
/ ~' V/ m8 V3 v7 v: Q" TSelect TOP 5 PERCENT*
8 k) V3 h1 \2 a  e# {( wFROM [ order Details]+ y; `) e2 X* p+ P& c( _6 f' {
orDER BY UnitPrice*Quantity*(1-Discount) DESC
( H5 l1 c% q6 p  O) m) d$ V3 用 AS 子句为字段取别名
: l4 D6 m8 ^9 r& x6 Q; z如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。0 m/ h. |3 C5 o
例:返回FirstName字段取别名为NickName' I6 Z* J) B8 ^1 h' O! e
Select FirstName AS NickName ,LastName ,City" u3 r* j7 E& P4 t) I! q( a
FROM Employees$ N9 B( c) M& C- |) P, D
例:返回新的一列显示库存价值
, J5 ]0 a( W) t& c( KSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
% @/ I8 _2 u7 v4 D) AFROM Products
5 H1 [; q$ b) L( e& X7 P二 .Where 子句指定查询条件
* E9 h" C! \. t8 x4 K7 t1 比较运算符
; r2 a3 [3 [( r3 W. t4 \比较运算符 含义
+ _% }; h$ r6 g$ C; G2 v" X$ T0 z/ L= 等于
& H2 j: z7 n' r% h+ E( G7 v> 大于
" @, U, ^  l' K8 o- m; b  k! p9 M< 小于% e7 I' _2 J4 W% {5 k
>= 大于等于
0 m  {  T6 v9 V8 K7 |<= 小于等于; p% `" M9 ?( k/ M6 h  z
<> 不等于. K2 ]1 J$ \6 @' `0 K
!> 不大于
. H- X3 r5 }+ T: w7 u!< 不小于) V+ X8 G- e$ n/ G
例:返回96年1月的定单7 U' k+ \5 j# S! I
Select orderID, CustomerID, orderDate* x' s3 q% q$ q! b
FROM orders
/ ?) U1 r7 y! u  {  p. ?' {' I( E9 cWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
+ y5 O# X2 M" a& G注意:
8 A# D7 Z" c' U- |1 C% zMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。' z. s- n  y/ }0 W! ^2 ~
例:0 Q8 z! a, V- f2 k2 C
Where orderDate>#96-1-1#: q1 F# @: |" ~% X2 L8 p
也可以表示为:+ E) T3 m# z; x6 P. i$ p  v( ^
Where orderDate>Datevalue(‘1/1/96’)$ @; }$ r0 O. {
使用 NOT 表达式求反。
0 f0 u( T0 y; c" h7 Y& e/ M例:查看96年1月1日以后的定单% ~' y3 C- C9 j) v: O. k1 ~+ g
Where Not orderDate<=#1/1/96#; U6 n& N/ L/ ~0 D5 q7 _$ q; K
2 范围(BETWEEN 和 NOT BETWEEN)
* @. K' L% S' G/ ?$ WBETWEEN …AND…运算符指定了要搜索的一个闭区间。
+ S. L8 E. ^1 Y* M8 E) o& X1 Q例:返回96年1月到96年2月的定单。5 I! P  ?8 ~; p+ a" s8 X8 }! \3 a
Where orderDate Between #1/1/96# And #2/1/96#: z9 E7 x; S( K$ n' h# |+ c3 }* G
3 列表(IN ,NOT IN)& T4 e5 u" t" u$ m$ k4 \, q( O5 _
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。8 k( U" N+ f6 t
例:要找出住在 London、Paris或Berlin的所有客户
) q% Z$ o2 A( w# a( ~, D7 t0 k5 r: I: KSelect CustomerID, CompanyName, ContactName, City: T8 }, I- n- ~& {- ~+ O0 m
FROM Customers
5 f7 L1 o+ I4 _# R* {$ x$ d( gWhere City In(‘London’,’ Paris’,’ Berlin’)' m3 ]- G4 l- ^' ]
4 模式匹配(LIKE)$ P6 H! k& {$ R) J1 U3 H3 z
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。) Z! W) G8 @: B; H4 |
LIKE运算符里使用的通配符, B% P, m0 c1 a5 i1 L! [
通配符 含义* |6 _. ]2 L) |+ D
? 任何一个单一的字符' E+ @. X$ L2 K: d" V
* 任意长度的字符4 d  ?' G$ V( |$ \( l; h
# 0~9之间的单一数字4 a, ]5 j9 Q% ^3 g% z: V
[字符列表] 在字符列表里的任一值
0 {6 t, _/ ~4 @[!字符列表] 不在字符列表里的任一值
. l' \+ n- w7 J8 h. u- 指定字符范围,两边的值分别为其上下限: b6 D3 g3 U: z5 m
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
$ ]3 d. \( T1 n& g1 l  CSelect CustomerID ,CompanyName,City,Phone
7 g: h/ ^) \3 V' NFROM Customers
3 O/ o1 M! g: }, R) X3 l* d' NWhere Phone Like ‘(171)555-####’. n& p9 u- P8 o/ t8 h" c
LIKE运算符的一些样式及含义
! k& W3 d* g6 B样式 含义 不符合
) Q4 [# v) q$ c5 E' |LIKE ‘A*’ A后跟任意长度的字符 Bc,c255: b4 C% y9 t7 v) h4 I
# LIKE’5’ 5*5 555; ^6 M& r% _8 b' C1 P. C
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
; l& E2 v3 ~! _. j& ~& z, QLIKE’5##5’ 5235,5005 5kd5,5346
0 I' w, J: x! k; l6 g, MLIKE’$ c( ^2 O# L1 t8 h% _' X
[a-z]’ a-z间的任意一个字符 5,%
. c* |* \5 o0 O! fLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1) t9 M3 h* p: Q; ?* A
LIKE’[[]’ 1,*
5 h2 I% M, z2 [& J; j三 .用ORDER BY子句排序结果
! `# i+ l# w% {2 h' `1 d7 XorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
2 Y3 c! [$ F3 a/ N0 c& borDER子句中定义了多个字段,则按照字段的先后顺序排序。
( x7 z& e' h, {, u例:+ S( Y3 F& r7 L9 F* F' V! }
Select ProductName,UnitPrice, UnitInStock0 G7 j1 p; ~3 Z( A& i: j, |. w
FROM Products+ z; A" Q0 h$ ]5 m2 C( m
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName! r* a$ u& b" t. D
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
4 U9 l; i! c1 l1 j例:下面的语句产生与上列相同的效果。  T' ^# |- P3 e$ @
Select ProductName,UnitPrice, UnitInStock
/ {! ?$ S' ?: \9 a1 r0 y2 dFROM Products
& H; Z7 e+ Y. t6 s* |$ _orDER BY 1 DESC , 2 DESC,3
6 E0 N$ l/ B+ `( _  [0 b+ e四 .运用连接关系实现多表查询
. i# t2 S0 |1 \4 e  D例:找出同一个城市中供应商和客户的名字
5 n7 \) T7 \$ T( PSelect Customers.CompanyName, Suppliers.ComPany.Name' [: w! p1 e/ X" Y9 ~) ^0 b! W  m
FROM Customers, Suppliers
* z7 k+ {3 x  D+ Z! DWhere Customers.City=Suppliers.City3 Y* H# X5 c2 e  N6 p
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
; g: Z3 ^, p' J& ?; p1 u3 W! T+ t2 x- }Select ProductName,OrderID, UnitInStock, Quantity+ E0 l  J3 b' d
FROM Products, [Order Deails]
& e0 H# y% t8 S3 RWhere Product.productID=[Order Details].ProductID5 E% R9 U4 L: N1 u, K
AND UnitsInStock>Quantity
2 b- O  U, q! Q/ n3 T; C另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
9 U7 s* L9 u# c& [+ V  @) i  {语法:
) ~5 |4 X& I/ s) Z4 HFROM table1 INNER JOIN table2& ~2 y. I; K8 r9 _
ON table1.field1 comparision table2.field2* R; J) [$ n1 F$ u# l7 L8 U
其中comparision 就是前面Where子句用到的比较运算符。
( \7 v3 e7 }6 F+ u4 PSelect FirstName,lastName,OrderID,CustomerID,OrderDate: a$ L; P$ f& f  G/ W! K6 U& A7 y4 s4 M9 n
FROM Employees: d6 R; B4 {  Z1 V
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
" S3 v/ |+ A4 q注意:, R. B+ `% a# r: e1 N* m7 Z: c
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
/ [" q8 B( d* z在一个JOIN语句中连接多个ON子句
: q  t' z( t& i/ V语法:" y  Y4 a6 F/ S/ U, B9 a. ?1 j
Select fields9 N% U) [8 h) {; m! [& N
FROM table1 INNER JOIN table2* e* S8 X8 n4 z/ H2 g$ X* ~8 n* U1 h
ON table1.field1 compopr table2.field1 AND
0 T5 ~& p" l( }/ AON table1.field2 compopr table2.field2 or
2 T$ i$ _& M: V: N. }3 j: ?ON table1.field3 compopr table2.field3* D# ?# L1 }% ]3 B5 Y$ C( X
也可以! u% Z" j4 l& d$ I1 @
Select fields
% [7 O  I3 B# a& V: T: q' O% [4 Z, GFROM table1 INNER JOIN
6 |1 a$ E2 Z+ J(table2 INNER JOIN [( ]table3
$ K+ Z1 z5 o- Q4 J' S8 F/ @[INNER JOER] [( ]tablex[INNER JOIN]
" z4 v+ V' S. y! ?! o# {ON table1.field1 compopr table2.field14 q) k, K  n) A  y  G3 |
ON table1.field2 compopr table2.field2* c5 a  I8 K: m& T" y: i
ON table1.field3 compopr table2.field3+ w, s/ q, }) P' L0 R
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
" }; l$ O' ^4 _! VFROM table [LEFT|RIGHT]JOIN table2  |7 m" }. p/ _& C! x
ON table1.field1comparision table.field27 i- M+ W, i* \/ e
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
& R& ^. X5 \/ n4 s例:不管有没有定货量,返回所有商品1 a& S6 ]* w% U  q" O7 L
Select ProductName ,OrderID  C$ U7 K6 b- C; Z' h2 W
FROM Products
: J7 ]$ q2 m( Y) ?: aLEFT JOIN orders ON Products.PrductsID=Orders.ProductID4 l) l# {6 ~8 W
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。/ Y, q, [+ y0 N, m  l+ x# \' S4 l
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
8 C3 I2 k$ P5 A: E空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
: j& m. W* {* M  \  ^" PSelect *; w4 }( O# a$ t+ ^
FROM talbe13 b; ~* V4 [4 b8 j) `! C
LEFT JOIN table2 ON table1.a=table2.c
3 w8 z" [8 P( m% U7 v. L' N1 _5 k- c1 连接查询中使用Iif函数实现以0值显示空值+ V/ F4 q1 l2 k
Iif表达式: Iif(IsNull(Amount,0,Amout)
0 H5 z4 [. R. N5 `/ V: y/ T/ e例:无论定货大于或小于¥50,都要返回一个标志。6 [- S) K% B! }% _" {
Iif([Amount]>50,?Big order?,?Small order?)% G3 y, t( ^4 ^+ L
五. 分组和总结查询结果
/ o/ ]- q4 r8 ]2 R# T: F! u在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。( D, K- f5 z, x$ H! Q
GROUP BY 子句的语法, c- f2 t7 K- L
Select fidldlist
: _& [2 ^6 }6 p  P4 V/ [FROM table# R" Y! j1 u7 h6 S0 Y
Where criteria# I- `3 x/ z/ a
[GROUP BY groupfieldlist [HAVING groupcriteria]]9 i1 E4 n4 W* H/ U6 D- s
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
6 D& \9 [; W1 J" c% |6 V4 @( fGROUP BY字段中的Null值以备分组但是不能被省略。
2 V' r, Z, q6 O% {- W( U( F在任何SQL合计函数中不计算Null值。
" C; w" _  ?, v7 V  W8 VGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。1 |% q# h3 T6 D# m
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。. D& f( }8 T. ]6 V' W
Select Title ,Count(Title) as Total) s; n  S' B. a
FROM Employees
: O; O6 U( G# h, F& sWhere Region = ‘WA’. X/ U5 c7 t1 u) [9 A5 g: R* |% m$ }
GROUP BY Title
3 S& j' a4 j  {! Z2 {4 ?HAVING Count(Title)>1" ?9 t2 Z  b; M" ?7 `7 N2 Z
JET SQL 中的聚积函数
* C& q) M1 t. D8 v6 {聚集函数 意义
3 W* b; P. f: _$ J6 N" iSUM ( ) 求和$ u0 u) n# q$ n* Z6 `
AVG ( ) 平均值& x: l# L# k/ T
COUNT ( ) 表达式中记录的数目/ K# N  ~4 i. j
COUNT (* ) 计算记录的数目% ~% Y- a& k/ ]8 R" Z  i
MAX 最大值! h( z: C$ Q. W2 ?' f
MIN 最小值
' [1 q) x% w1 B; k3 \# F$ VVAR 方差
. J7 u, U/ W# TSTDEV 标准误差
4 O3 l0 P- m3 kFIRST 第一个值% ~: r9 W9 F+ s+ X: D
LAST 最后一个值+ A7 D, J0 z  t
六. 用Parameters声明创建参数查询/ p) Q" B: n/ Q& F& u, i4 g7 \+ n
Parameters声明的语法:5 _) H$ D% m1 ^
PARAMETERS name datatype[,name datatype[, …]]/ y- G7 H* U8 Z7 ]" x+ J- u  O  K
其中name 是参数的标志符,可以通过标志符引用参数.
( y) R) [; ], m: ?( }  PDatatype说明参数的数据类型.
! a! B! M+ w9 \% e" t/ C使用时要把PARAMETERS 声明置于任何其他语句之前.9 H9 y/ `0 d1 s0 B& n
例:* B: E) s  Q9 b4 d5 v
PARAMETERS[Low price] Currency,[Beginning date]datatime
* P( y% K/ n9 P4 v# I+ H* W9 nSelect orderID ,OrderAmount3 x9 H( o; v& t
FROM orders
5 g7 J0 o; ]( p( ZWhere orderAMount>[low price]7 t0 ]. A+ A, F7 r, ?
AND orderDate>=[Beginning date]
( V9 V- G/ u, f3 y  a七. 功能查询
$ |& Z# i3 s" T) {所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.. [" q9 M6 u& I9 e
1 更新查询
' K# @: C  Y! b% c2 _0 l- T3 oUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.( j2 W7 ~1 c5 A0 J2 e$ c+ Z, y8 V3 Z3 J
更新查询语法:
* h0 I; c; J) Y- |9 PUpdate 表名  B$ c( Q8 B1 {8 H4 ]) M
SET 新值
! e5 ?5 U1 @) L* n8 ]/ k1 ZWhere 准则/ v: }+ w: O& }& ^/ Q2 }5 K
例:英国客户的定货量增加5%,货运量增加3%
0 |# f: j. j6 ?; r. |. ?Update OEDERS1 ]9 i0 ?& _, C' ~' y
SET orderAmount = orderAmount *1.1
4 M. C7 q8 x. M- @+ G) F! oFreight = Freight*1.035 E( ~8 C1 |* {; v+ a# n2 H+ X
Where ShipCountry = ‘UK’  V% n+ n' C% M1 c
2 删除查询6 h" T) e6 n) E1 p% A' w
Delete子句可以使用户删除大量的过时的或冗于的数据.3 v" W: d  e# X
注:删除查询的对象是整个记录.
' g. U. F) D+ _: z8 W6 XDelete子句的语法:
; a3 A3 |. Y& k' uDelete [表名.*]+ A1 q8 G/ o1 L  ~/ I7 _2 @3 _" f: o
FROM 来源表# J6 g7 \. |7 _# g4 o* D+ @5 T, j
Where 准则
0 q( m, h) \' [( f$ c' j  M例: 要删除所有94年前的定单
) o0 G7 c2 Z* p- e" B' q/ ~Delete *
9 Z1 H# n. `" M& d1 h4 S7 l- BFROM orders; j; Q( B. Y5 t4 p9 Y! n
Where orderData<#94-1-1#
0 b% l4 z$ ]1 r, g3 追加查询
- d2 ?. k, o" v: Z$ u" x' _Insert子句可以将一个或一组记录追加到一个或多个表的尾部.6 A; P! s7 b1 X( @+ S
INTO 子句指定接受新记录的表, T  ]) O4 ]- Y& r/ m7 |7 U4 l
valueS 关键字指定新记录所包含的数据值.9 G9 b4 o: z: H- N& `4 f0 m' d
Insert 子句的语法:
! U% ^: A( G6 i! ?* w2 UINSETR INTO 目的表或查询(字段1,字段2,…); u4 [+ }  D9 _
valueS(数值1,数值2,…)
: Q6 i% m* p) D) K例:增加一个客户
8 _" r  R! @+ E9 e: }2 nInsert INTO Employees(FirstName,LastName,title)
6 F9 }0 z+ k) W% FvalueS(‘Harry’,’Washington’,’Trainee’)
7 \* j' r% c& A. k4 生成表查询# _) E6 A, @! d! d% C
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.2 S9 J3 M" L  d9 ^6 p9 j, R
Select INTO子句用来创建生成表查询语法:0 W$ `3 h3 U' `; b  m
Select 字段1,字段2,…
/ C. ~8 T& i/ y& j7 {! k! zINTO 新表[IN 外部数据库]' p6 m3 v' R* a0 r6 R% R. f7 P
FROM 来源数据库7 r% `' F7 g6 i" K  v) n9 K1 v, l" A- v
Where 准则
% a8 B. I) C  V, W6 W  x例:为定单制作一个存档备份
1 U% @) r6 C2 ^( }( y4 w3 L+ GSelect *
$ n7 d6 v6 A9 A3 B9 u! `9 r) b3 hINTO ordersArchive
8 E/ [1 n( g: z  OFROM orders
% {/ X+ Z' U/ U0 n+ g2 N八. 联合查询1 t& \9 r6 ]& N* E1 R6 g/ R
UNION运算可以把多个查询的结果合并到一个结果集里显示.
; E# k" R: V/ m' @: O. XUNION运算的一般语法:$ F5 Q! B# u% Y- B
[表]查询1 UNION [ALL]查询2 UNION …' p  V4 ]) D5 ]6 A9 ~2 \! z7 n- ^5 ?
例:返回巴西所有供给商和客户的名字和城市, A( F3 p+ t/ v4 E0 I2 H
Select CompanyName,City& f" D+ k# f" f
FROM Suppliers
  V' B) ]" r( TWhere Country = ‘Brazil’- i8 R* A) Z* M6 t
UNION
5 v( j( F8 w0 N; C2 a: ASelect CompanyName,City
+ J% Z( @$ a1 Z& J& PFROM Customers0 a+ P# P/ S  v7 Y6 I. H+ H
Where Country = ‘Brazil’
- m9 H: }. k% u注:
6 z* ^: F1 m. K" p/ A& z8 J缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
& M$ B: L; W9 U. p( O& C- n" BUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.  I* h" X9 W/ f8 X# O
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
+ p2 ^$ G( m8 {4 P九. 交叉查询
2 G& |- d+ I2 C0 H0 i/ o5 S9 s交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部., Z" k  ]6 J8 H# n1 k& z
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
6 ~9 F! l, s" u0 T: yTRANSFORM aggfunction6 J$ V0 S. `$ g5 n( Z' o
Select 语句  g6 f5 q9 ?9 A4 D0 p. _
GROUP BY 子句* w0 ^3 A0 _% e: D& D* ]1 a8 q
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
. G0 m+ Q$ F; M5 f- O. u! J/ VAggfounction指SQL聚积函数,  n. ?6 L! g$ H) s# {# `
Select语句选择作为标题的的字段,4 h$ Y& b9 c+ B4 B  a  M; R  b4 C( E
GROUP BY 分组
; S- {9 ~  G$ n3 }说明:
; k, L# J+ S% {( C/ B1 a  qPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
) W- m- h' @, c7 V4 k# @* v4 g8 @value代表创建列标题的固定值.
- S$ B% T2 d/ R, c; ^3 j7 p9 N例:显示在1996年里每一季度每一位员工所接的定单的数目:
! t3 H" p# T2 C" _: l4 yTRANSFORM Count(OrderID)2 j5 K4 v' ~1 W7 @% w
Select FirstName&’’&LastName AS FullName) t$ ^) l4 T2 x3 q7 C8 b& F
FROM Employees INNER JOIN orders: ?- h  R- [! D3 ^: i
ON Employees.EmployeeID = orders.EmployeeID
4 u8 ?2 }6 f1 {. a9 V+ W! `Where DatePart(“yyyy”,OrderDate)= ‘1996’
8 O3 n1 \0 e( r7 ^GROUP BY FirstName&’’&LastName3 q2 U% B, {7 N# Q" T# r
orDER BY FirstName&’’&LastName$ i. N" u; \7 J8 k% _
POVOT DatePart(“q”,OrderDate)&’季度’
6 V& d+ z  d4 K十 .子查询% G5 O6 A! u5 S# u- Y$ P
子查询可以理解为 套查询.子查询是一个Select语句./ b+ P- F: Q% J; T
1 表达式的值与子查询返回的单一值做比较
/ A  t) j4 j( q语法:8 n6 U3 O! A8 @0 K: ~! ?; r6 \
表达式 comparision [ANY|ALL|SOME](子查询)% B* e$ d/ `- \" K0 |
说明:
8 O* C; ]( g- x8 m( pANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
$ ?- O* }$ _: k# n$ a* k例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品( p% m1 t3 `6 s
Select * FROM Products5 T/ J4 {1 O$ J; r* h7 A4 _8 p
Where UnitPrice>ANY% K! G; U& c  B2 D/ A8 h
(Select UnitPrice FROM[Order Details] Where Discount>0.25)6 G+ n% T8 {  J% `# l- O( M4 Q
2 检查表达式的值是否匹配子查询返回的一组值的某个值
# z; M6 W; P! b" X* h- E语法:  q1 w1 \8 J1 b+ Y
[NOT]IN(子查询)2 n6 r* x( _2 H  i" O2 Q
例:返回库存价值大于等于1000的产品.
) g0 Z. L! t3 e: b  J  ^! mSelect ProductName FROM Products
: H, X# W: ?' i( n' dWhere ProductID IN/ u/ u' L  y; i7 ]: [
(Select PrdoctID FROM [Order DEtails]) D) t( N6 l: x0 `, g- \
Where UnitPrice*Quantity>= 1000)
5 b; s" \: z% C7 h5 F( R3 b7 d/ i; s3检测子查询是否返回任何记录1 c$ @# C- M% \9 `
语法:
/ g2 L" v) M& t( T: n9 |8 N[NOT]EXISTS (子查询)$ C* ]1 X- r# A5 c
例:用EXISTS检索英国的客户
8 l  z  n, U& A$ i, K  J* \5 TSelect ComPanyName,ContactName2 O0 P+ f4 y2 C1 i
FROM orders  A4 @5 |5 v3 _% E8 Q0 {
Where EXISTS+ R: O7 S" T* c! u
(Select *
4 M8 y; W6 ?" jFROM Customers$ ~$ D: v( Y! I5 k4 T' u5 _+ n+ k/ z
Where Country = ‘UK’ AND4 [; @) W& [5 O% n0 |
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-6-19 10:53 , Processed in 0.027002 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部