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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |正序浏览
Access如何筛选重复数据以及Select语句的完整语法
; x" M, L- M4 @" v
# j. [; f; t7 _% _. B! a3 A* nselect distinct 字段 from 表名
; {! |( _8 G/ I& S3 Y+ {distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。. A+ G' P# \" d- h& k- J
一.Select语句的完整语法为:! |- b7 U) v3 n3 V8 r% a; O
Select[ALL|DISTINCT|DISTINCTROW|TOP]
5 V8 F: P* ?" ^( K, b" f5 R8 y{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}% [$ Z" g) ^) q6 n- P& C/ u# J
FROM tablee xpression[,…][IN externaldatabase]# b8 y* Z; ^# n: {, R. h; J" M
[Where…]% t; z; `! o  F5 e& N
[GROUP BY…]! {! Q# C; u! Q+ ~9 f$ |  L
[HAVING…]4 v5 \/ l' I- x" o, S3 [! z9 s2 p# y+ }
[ORDER BY…]% V' X7 V1 ~* t, D( M
[WITH OWNERACCESS OPTION]( ]3 S. {5 K7 p9 F
说明:3 O( `5 {, J/ d/ L2 w
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。+ `/ ~! U* W, E: U; P  i
1 FROM子句6 E; y# Q- z! S& T2 {9 W3 w
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
# \! h/ X9 g" ?2 y6 y例:下列SQL语句返回所有有定单的客户:( u& U  U0 h4 U) j
Select orderID,Customer.customerID( D0 i# ?5 i* s5 u  c1 n
FROM orders Customers$ L' i% a( F9 o) S3 ^) `" L6 o
Where orders.CustomerID=Customers.CustomeersID
. j4 N# r+ T+ e2 ALL、DISTINCT、DISTINCTROW、TOP谓词/ A, O( Q5 W# z' j
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
$ D$ F' ^" {2 o  x& q例:Select ALL FirstName,LastName- s# t+ v; ?1 m! y4 h
FROM Employees0 c2 F1 s- F6 P% }3 l
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
- G- P' f6 W/ f8 D  f9 U( Y(3) DISTINCTROW 如果有重复的记录,只返回一个
6 o2 {, l6 G# b(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
* b+ c# f: ?  b! e9 F( v4 X例:返回5%定货额最大的定单
2 [% [* V4 g$ L! @! g5 a2 DSelect TOP 5 PERCENT*% @& Q# P2 g+ X" `9 [
FROM [ order Details]3 B4 I3 r8 `- B7 x3 W- i
orDER BY UnitPrice*Quantity*(1-Discount) DESC1 z4 H. |8 D- }3 p0 {
3 用 AS 子句为字段取别名0 R+ Q2 J: F- U  f/ n8 q) M4 Y
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
1 ]0 V* I8 }. g# N. {例:返回FirstName字段取别名为NickName. E+ \8 m8 o' N. }$ D
Select FirstName AS NickName ,LastName ,City
: Q$ \# m) {' s1 n  }. }" b  }3 CFROM Employees
1 M% C0 r" v& q. G& S. n+ ?例:返回新的一列显示库存价值
+ U: {' a. y, Q& HSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
6 \+ P, u0 V1 A) n  V6 o8 a2 qFROM Products
) R: f4 w1 G- p9 d3 {& A二 .Where 子句指定查询条件  ?. ^4 @2 N* f( Q* B; p: E6 u6 i
1 比较运算符
: b* p# g2 |! Q4 u3 H比较运算符 含义- F1 h9 F4 U7 I  g$ u: w0 I
= 等于
9 q" b$ f, n% f4 V1 F* G> 大于9 ]& i2 s2 K. W% u0 _
< 小于' G* `7 Z+ c. |) X% H' w, G9 H
>= 大于等于6 s: w5 P: n9 X* g5 P" C( r3 z; o0 r
<= 小于等于- L0 p* n. Q+ y+ n7 X
<> 不等于
9 a* i! P  H- Y) t, Y!> 不大于
% \$ k# B; u7 Q0 D" S) p!< 不小于/ ?" B! e4 N# g. F; ]' S
例:返回96年1月的定单0 V$ ~( u' L3 n3 e8 j
Select orderID, CustomerID, orderDate
' ^% ]! L9 ?# O6 e+ V3 U& Z( FFROM orders
) j; u) B; Q* @4 {' }Where orderDate>#1/1/96# AND orderDate<#1/30/96#
# s* {. t: w; }注意:
+ e, Y# m) k& @  `- Q8 {) t3 HMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
! ]5 P( ?+ _4 M) }; M- `" g例:9 w- q( S3 A+ h# h0 ]: t1 L
Where orderDate>#96-1-1#0 D; ~( q, C* r9 C9 U0 `3 f& p1 k
也可以表示为:
2 c( i: ]( e. Y6 k$ P5 K7 YWhere orderDate>Datevalue(‘1/1/96’)) C, K( X4 _4 o0 y# }: d! _* T
使用 NOT 表达式求反。  G- h, Z, S3 G, R0 L; n
例:查看96年1月1日以后的定单
& {( b$ b. L5 E- pWhere Not orderDate<=#1/1/96#( t, Z0 j3 z/ C  g
2 范围(BETWEEN 和 NOT BETWEEN)2 t0 m4 S6 b/ w6 F/ t" ?+ l
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
% r1 `8 }5 P$ J( d' ~) y例:返回96年1月到96年2月的定单。
& L- P9 U: c4 W" ]# {Where orderDate Between #1/1/96# And #2/1/96#) B3 ?9 o. Y0 P0 D$ v( D) x
3 列表(IN ,NOT IN)
! F& d& ?! u- i! c6 SIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。; T+ i9 P5 {( D: s" }3 i: e
例:要找出住在 London、Paris或Berlin的所有客户' T( J- f* V' t
Select CustomerID, CompanyName, ContactName, City  r: U' ]+ Q/ Y5 Z0 z3 W
FROM Customers
! G3 ]- `) y: d- nWhere City In(‘London’,’ Paris’,’ Berlin’)) |1 W8 C" ^9 v7 J1 `( X
4 模式匹配(LIKE)
% O% a: B' A! ?LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。: G, r$ S& d4 }7 u. t) E
LIKE运算符里使用的通配符
0 m( N: i) [8 M通配符 含义) n% \2 X1 W$ I6 g9 j) X# ~  x
? 任何一个单一的字符
& J3 r' z3 ?- F4 ?" c2 j* 任意长度的字符3 h6 s- _6 _( d
# 0~9之间的单一数字2 z- u5 P( G5 X8 y  T  J3 v* Z5 P
[字符列表] 在字符列表里的任一值
& C8 |8 u* U& p6 t% k# n7 m[!字符列表] 不在字符列表里的任一值0 F. r' {0 _/ ]; j" n. q
- 指定字符范围,两边的值分别为其上下限8 J1 H  P8 g5 Q8 g+ q5 y
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
) J& Y+ O4 i, B+ X, @Select CustomerID ,CompanyName,City,Phone
  C8 Z/ I! |) W9 e+ g3 L' Z  pFROM Customers+ N( U$ Q; V) b( F
Where Phone Like ‘(171)555-####’0 x" {8 H. G0 n. J' J5 J/ z
LIKE运算符的一些样式及含义+ l2 s$ W$ U7 F: L
样式 含义 不符合
) g7 O# B; ?  R, q( bLIKE ‘A*’ A后跟任意长度的字符 Bc,c255
, {8 @$ L) e& w" }# Z/ M# LIKE’5’ 5*5 555
: z9 f( T: t1 x$ ~) gLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
$ `, J$ i  P: ]LIKE’5##5’ 5235,5005 5kd5,5346
; m( ?! A3 |+ PLIKE’
- Z3 \( i3 K7 ]' U) D* N+ {+ e[a-z]’ a-z间的任意一个字符 5,%
# q& K1 P9 K8 p$ B3 @LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1% h' g4 v# e! T
LIKE’[[]’ 1,*
0 A( g" t2 g6 Z" h4 r0 n! \三 .用ORDER BY子句排序结果8 h3 _7 P; A# d2 b6 @2 F* J
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。: d: V4 ?* x0 ]4 @. a
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
) T7 A6 d: ?; j# R例:
8 Q, j7 c, Z# R3 MSelect ProductName,UnitPrice, UnitInStock
/ F9 V2 m  B: Z' bFROM Products2 d# [* O# J8 D# W9 p& O# k
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName; f! V# F5 H; `( ~& Q
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
" q" v. V  G) Z# V9 {例:下面的语句产生与上列相同的效果。0 v0 H5 p0 A" W6 K
Select ProductName,UnitPrice, UnitInStock4 m4 v9 @8 [6 `8 e- d
FROM Products
1 ~6 u" S( `6 \9 S' aorDER BY 1 DESC , 2 DESC,3
( ^. {/ _4 ]" x4 u+ G四 .运用连接关系实现多表查询
0 l# Y8 m7 Q* h. D7 c. n例:找出同一个城市中供应商和客户的名字; S( g7 Q3 {2 j$ P- B8 L- X
Select Customers.CompanyName, Suppliers.ComPany.Name' i# ?8 z: \9 f* `& v+ T
FROM Customers, Suppliers
; v- n' T& q6 H% n& [( I6 jWhere Customers.City=Suppliers.City
- n4 I4 |7 ?! G/ \例:找出产品库存量大于同一种产品的定单的数量的产品和定单2 z4 a, ?+ M6 v
Select ProductName,OrderID, UnitInStock, Quantity7 A: o# a6 Y4 C" S' N
FROM Products, [Order Deails]9 F3 O. R( a$ `0 S3 V! x7 p
Where Product.productID=[Order Details].ProductID
$ q8 [9 _. G8 c0 c" M* W) BAND UnitsInStock>Quantity& L& A$ K2 T- C- ]4 H
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN! c* a$ K3 K6 ~/ W
语法:
( p" O: h. j9 [7 D" @8 pFROM table1 INNER JOIN table2- E  y8 E" s- K0 l% [
ON table1.field1 comparision table2.field2
- }  |3 \5 _, o9 y6 F其中comparision 就是前面Where子句用到的比较运算符。9 y: Y( W) A; K- K( {* o  U# Q
Select FirstName,lastName,OrderID,CustomerID,OrderDate, M! Q$ i* q8 x/ I3 ?) I
FROM Employees7 q, O, {9 z  T: a9 u4 E
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID% I$ W5 e6 V0 a$ t2 L6 p- C3 `& k
注意:& P$ q  M/ f6 X1 i
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。* ]- T- }5 Z# N; V
在一个JOIN语句中连接多个ON子句
  k6 o$ g8 F' v8 Z& r语法:. M, n& k9 @9 }) e# H
Select fields
! p+ A/ B7 }1 q. w* XFROM table1 INNER JOIN table2
5 A; W' I  q+ E/ h( uON table1.field1 compopr table2.field1 AND+ H$ [' t1 j6 q. F- r8 O7 T6 n
ON table1.field2 compopr table2.field2 or: r( a! P: o: V4 l
ON table1.field3 compopr table2.field3
& i8 y5 o4 F! Y& c$ v5 L* F也可以
: m: Y; L7 e; b3 z7 C$ a8 }Select fields
1 E8 ]2 H) i% t$ t1 a! \! }0 E! uFROM table1 INNER JOIN7 k) ~- \0 k; E; c' i
(table2 INNER JOIN [( ]table3
" j& s2 n9 n" ]: X: b% Z[INNER JOER] [( ]tablex[INNER JOIN], f1 G+ [, n/ m
ON table1.field1 compopr table2.field1
0 S9 `3 |: E, y5 O. N+ a2 EON table1.field2 compopr table2.field2
5 ?. H! C  P8 D" W  qON table1.field3 compopr table2.field3
5 ~: r& ]. J# N% b9 y外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。/ E2 t5 s* m6 U
FROM table [LEFT|RIGHT]JOIN table2: H+ l9 |% V9 n) ?; P6 w
ON table1.field1comparision table.field2
2 j( s7 y2 }) U% e8 Y用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
* i, S. x0 S8 Z' k例:不管有没有定货量,返回所有商品9 X3 Z! e4 h( l& \( `8 Y5 ?
Select ProductName ,OrderID: Z+ k) Q6 t4 |( M1 l
FROM Products
' W+ q  l& d3 jLEFT JOIN orders ON Products.PrductsID=Orders.ProductID9 V  ^7 F: Z2 e4 T3 `
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
' i4 R# [; k8 P6 _: N1 n例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。$ o* s( n% S/ X6 m$ H
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
. P6 q. E/ F7 p- H4 pSelect *5 H, Q/ ~2 v5 s$ p. ~
FROM talbe1' W, {; F: ]8 F& a
LEFT JOIN table2 ON table1.a=table2.c
* G" T/ K$ Y* f3 F$ X) N1 连接查询中使用Iif函数实现以0值显示空值" }5 A# s: e7 {& |$ z8 i# v
Iif表达式: Iif(IsNull(Amount,0,Amout)
: }. @" |( i5 S) F6 D  p0 ~例:无论定货大于或小于¥50,都要返回一个标志。
# P% K) m& N- g6 j" i( mIif([Amount]>50,?Big order?,?Small order?), p8 `7 h+ @) O6 s) V8 F- g) A' G
五. 分组和总结查询结果
$ U) a, A1 b& |4 Y# G8 V在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
3 b# i% v( r- J( |3 ]( rGROUP BY 子句的语法
4 {9 M+ O- P8 D/ NSelect fidldlist3 _) a$ X* E; H8 H
FROM table
( [$ W; n% z( ~# H8 K: T1 Z1 JWhere criteria$ B4 m" L& ]7 s2 f" O! f
[GROUP BY groupfieldlist [HAVING groupcriteria]]. \8 `; y1 k  t8 r, b7 P7 p: A
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。8 C4 Q. o- A! }$ E7 v/ P2 M
GROUP BY字段中的Null值以备分组但是不能被省略。9 e) q! Q2 x, |( a
在任何SQL合计函数中不计算Null值。
  u( X+ O" d2 }& `0 wGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。% {- Y& _" H( \
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。* l0 l; e, i6 o5 i# z! p" a
Select Title ,Count(Title) as Total, ?, m5 Z( B8 l5 \9 Q) K/ \& ?$ m
FROM Employees! P& H0 Y! x' ~4 {
Where Region = ‘WA’
6 ?  B$ w# K! Z! L/ fGROUP BY Title9 M5 W. a2 V4 S, M- ~+ K& I6 `% {
HAVING Count(Title)>1; \6 G9 n4 b! J0 Q8 u5 x1 W
JET SQL 中的聚积函数
) b' u. e  i  C- A聚集函数 意义# i% y8 G, d3 i6 T/ y. |
SUM ( ) 求和
% k$ E" S9 p8 SAVG ( ) 平均值4 O& W+ m. t( h& u! Y( @
COUNT ( ) 表达式中记录的数目
' o/ j: ]4 A/ B5 H. D6 cCOUNT (* ) 计算记录的数目
0 r- T7 d0 L1 s7 |0 v+ p! oMAX 最大值1 V" I  d& b  O. b4 z
MIN 最小值
4 W' J2 l$ T; K8 C8 {/ gVAR 方差+ n$ h$ [, f4 x# ^! M/ r& D! c
STDEV 标准误差( A. _, E1 k$ p. m+ c
FIRST 第一个值
( U' y2 ^# r! x6 Y" _& Y, L6 tLAST 最后一个值$ L( \4 A5 o6 A7 V% v% C
六. 用Parameters声明创建参数查询
6 i9 }5 c! w4 _- w0 {, k' n# zParameters声明的语法:/ Q, ?+ |/ V* M# |/ v3 n
PARAMETERS name datatype[,name datatype[, …]]: e# U* _0 W  {2 e" h+ V4 d1 P
其中name 是参数的标志符,可以通过标志符引用参数.
- @2 u, M7 [. J8 z0 L0 A: L" B, }* DDatatype说明参数的数据类型.+ K# |, v8 G% m- Y0 Z
使用时要把PARAMETERS 声明置于任何其他语句之前.
  l; Y" z/ B0 b( k8 X例:
% E4 ^0 z" X& j% q" S9 r. ~$ [, aPARAMETERS[Low price] Currency,[Beginning date]datatime+ f- @4 c0 ?3 N# N, j7 n. X% n
Select orderID ,OrderAmount. t0 w: J! |( x& h
FROM orders, \8 h$ e8 f6 E
Where orderAMount>[low price]$ J' i- `" b) I" s
AND orderDate>=[Beginning date]! @/ `1 |; `) q* N0 ^  Z
七. 功能查询
5 p  N& I; z  n8 D所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
( M( t* k/ a( m2 U1 更新查询- q. S1 v# L, q7 v1 B! c$ c. C
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.1 P1 `" I: _4 T/ t' @
更新查询语法:
3 X( Q: Y. x. G! fUpdate 表名  Y( F) H6 Z  M, V
SET 新值% O" l- q# P" I) g' I  V
Where 准则
; |& Y) E/ a3 ~6 v) x例:英国客户的定货量增加5%,货运量增加3%
8 j  }6 n& |  j+ [Update OEDERS  \. m# v: u( s/ z5 W0 r& }
SET orderAmount = orderAmount *1.15 o; E' s, L4 c  Y  Q7 U
Freight = Freight*1.034 Y% i) \1 _' T7 C
Where ShipCountry = ‘UK’
# _6 T& z6 w( u2 删除查询
9 g3 p9 H, z8 |3 l( EDelete子句可以使用户删除大量的过时的或冗于的数据.  o1 b4 j/ p  P6 Y% f" X7 Z5 s
注:删除查询的对象是整个记录.
0 E' j' Z2 c6 D0 QDelete子句的语法:
: i5 E  z% T% t, h6 V& zDelete [表名.*]
& K# P# U! Z+ r6 fFROM 来源表
0 |4 m8 v. @$ D6 R- E: i! l' W$ iWhere 准则, ^& B# ?1 G! k$ Z
例: 要删除所有94年前的定单
# M: k7 z/ w; w  _! }2 tDelete *
8 r( N, s- I6 C  y6 J: C5 zFROM orders( ]; L) p. F. H9 o3 ~* ^7 I; U
Where orderData<#94-1-1#
4 p5 [8 B; z5 Q; a1 T$ A3 追加查询1 S) J9 m, H8 z, N5 b$ m- Z" ?. d: k2 g
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.6 ^, k" u7 P; g
INTO 子句指定接受新记录的表$ T, T( ^! N: d& y7 l6 d6 V  i
valueS 关键字指定新记录所包含的数据值.
7 K  R* r0 B( k! l- gInsert 子句的语法:
) z4 N. E: @' jINSETR INTO 目的表或查询(字段1,字段2,…)' B3 P) c6 L% T$ P! Q( O& z
valueS(数值1,数值2,…)6 b& M7 [2 i4 N+ B/ D
例:增加一个客户
/ s( D* Y0 O0 J& F$ Y/ ~; o' ^* x) M4 yInsert INTO Employees(FirstName,LastName,title)
. g/ }+ L% j/ \! [; svalueS(‘Harry’,’Washington’,’Trainee’)
2 R. y0 p( r) B. E9 T  `8 N! X8 z# x4 生成表查询( m6 ]9 s) X5 K8 Z# @
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
' m" g# Z9 a9 Q0 H! P. ]; h5 BSelect INTO子句用来创建生成表查询语法:
# a+ U7 Y) z% fSelect 字段1,字段2,…
' R! O: F% F& U7 ~INTO 新表[IN 外部数据库]
" }* O. |5 W" ?FROM 来源数据库% i# \/ \9 A, m# x5 K* q. w7 u" L/ {
Where 准则
0 V  L- ~" n; K0 P! a例:为定单制作一个存档备份+ M" X: I8 l$ |$ a: ?8 |: {
Select *
, w/ S, t1 T! p8 ]- y  l, r$ MINTO ordersArchive! C0 b, r+ ?: C' I. I9 G; o
FROM orders1 n" M, X5 x# _# K% S. y+ r
八. 联合查询2 G2 a- ^8 h: c6 r7 w
UNION运算可以把多个查询的结果合并到一个结果集里显示.; Y  Z0 T2 E7 H7 x% a& _( i, V
UNION运算的一般语法:
/ C0 P) u! ^/ F' ?. d1 m! @* X. x[表]查询1 UNION [ALL]查询2 UNION …
3 M9 W+ t$ N( B+ \& P& @例:返回巴西所有供给商和客户的名字和城市
2 c+ @" t6 R0 v( hSelect CompanyName,City2 t8 i1 y$ s1 M3 L, A( D
FROM Suppliers
8 x. i7 c. `/ g# t  \( k6 C1 h& TWhere Country = ‘Brazil’# m9 T, B/ _7 P5 X5 _" O. C
UNION# T+ z3 G* A! B# J7 o
Select CompanyName,City/ x0 a- ~/ h- ]' h) ^
FROM Customers4 H# }  X" K+ M0 @
Where Country = ‘Brazil’
4 Q; r, _0 r9 j! p$ V3 {) \注:, g6 [  w5 }" R' p3 W1 Y# O
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
# q% u, A: y9 W; S7 Z+ WUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.+ ~1 {0 D1 o) z# _  {3 m) b
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.8 A' S# l+ [+ R8 _2 V. i+ A6 U
九. 交叉查询; k# }& x9 N6 W9 i( B# `  I
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.4 n8 t, [$ }: D
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:( n* m8 v# u! T' H
TRANSFORM aggfunction0 J% L! t4 h2 W
Select 语句
  D/ \$ {2 m# V3 N8 V$ `GROUP BY 子句
' [, Q# b% H# f, e) l" wPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
4 @1 t; i( Z" e* ~& z$ }Aggfounction指SQL聚积函数,
' A% O/ Z1 U, d- I; cSelect语句选择作为标题的的字段,
9 X) _$ ]- f2 uGROUP BY 分组5 T+ P( M& g  H7 q% j
说明:
( w" ]' Y1 s0 e# n$ R+ XPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.# K& ^% s; e6 K4 C( o  R! F
value代表创建列标题的固定值.
: v- u" N- J+ i2 d/ [9 {例:显示在1996年里每一季度每一位员工所接的定单的数目:
3 W5 e4 `; Q1 Q, _TRANSFORM Count(OrderID)" r4 P! Z& s7 P, ~$ k7 z! ^
Select FirstName&’’&LastName AS FullName$ {) y; L& C2 |& S) q2 a" m- ^- G; v
FROM Employees INNER JOIN orders! J  I, T. ~$ c3 t6 u
ON Employees.EmployeeID = orders.EmployeeID
, Y& }3 X, _5 ^+ t& a7 U; ]0 LWhere DatePart(“yyyy”,OrderDate)= ‘1996’
7 ?4 y8 P7 M5 U, oGROUP BY FirstName&’’&LastName
4 i- m/ {. m" P! IorDER BY FirstName&’’&LastName
& N3 d7 V3 y  q5 c" T$ e' l: |POVOT DatePart(“q”,OrderDate)&’季度’
, E6 D" E# l# d% C4 j! {. d十 .子查询
8 c" B$ k2 [+ G: m$ v" p  C+ J* j子查询可以理解为 套查询.子查询是一个Select语句.4 P6 m/ ?0 R! t* A) @9 M8 K0 @  t
1 表达式的值与子查询返回的单一值做比较
4 a: t, B) K1 |2 o: j语法:  b! Q! c/ |6 q# w
表达式 comparision [ANY|ALL|SOME](子查询)
0 X) c9 B5 w1 z8 M) f; D  o说明:
1 z) x8 j; c7 YANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.& i' L; t# d2 L- y
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
! \  ^1 N! j( E1 Z! i% I* tSelect * FROM Products5 i7 ~7 L) I+ t, D9 e+ n; c) _
Where UnitPrice>ANY4 r& F- L' m7 M6 D9 q8 L" ^6 n
(Select UnitPrice FROM[Order Details] Where Discount>0.25)2 B7 M9 n0 P. H4 F6 m0 y
2 检查表达式的值是否匹配子查询返回的一组值的某个值
* x  w4 F, V. j4 C: @+ N4 j2 P语法:' Q) h) s8 t6 ~, m; o
[NOT]IN(子查询)
6 o! ^4 T, V  A! h& R例:返回库存价值大于等于1000的产品.
5 D' p/ l9 l# ~0 k; w, K2 B9 uSelect ProductName FROM Products2 j0 N! J6 b+ A! h/ X, T
Where ProductID IN" C2 q* S3 v* [: o) _9 l: _4 y
(Select PrdoctID FROM [Order DEtails]
% r  q2 m# t0 ]8 q# Z' EWhere UnitPrice*Quantity>= 1000)  d. g/ ?& N* P+ Q- R9 c( X
3检测子查询是否返回任何记录2 a- g* c/ Z: R, x9 D" |  X) G( V
语法:
1 ]# ?1 L: c6 D0 w$ O* q[NOT]EXISTS (子查询)
" J% a# C2 `/ [9 n3 _5 o3 i9 K例:用EXISTS检索英国的客户
( t- f7 p5 m, g* \/ }! `Select ComPanyName,ContactName
# C  v) X' I8 r5 ^7 O3 R# L. BFROM orders
6 e2 _, i  d/ e- ?; k9 CWhere EXISTS
% ~: M9 ^. i) f# X$ z% g(Select *5 Q  ?( B& r3 e! c  u, n
FROM Customers. Y8 x, P9 |* g( t
Where Country = ‘UK’ AND- n# ]& \1 c* z1 u- v2 r* `9 e" N7 {
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-10-29 17:08 , Processed in 0.027001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部