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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
# _2 f! h5 l" b, Z4 x8 O  n$ w2 l' ^  B9 X' W0 @6 N/ D6 T
select distinct 字段 from 表名
/ }" Z# c( c" p& l% B& Y3 O& Gdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。+ e6 G) {! T1 G+ r  O6 y/ Y
一.Select语句的完整语法为:
! x2 ?7 }6 J8 c9 g! RSelect[ALL|DISTINCT|DISTINCTROW|TOP]. {" M6 i- A  `+ E
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}7 x& X8 G4 g( D+ b- l$ n
FROM tablee xpression[,…][IN externaldatabase]
, Q+ q) B$ y4 F* F' l$ h5 Z& p[Where…]5 ^3 Z% W( M) v$ i  Z+ l: X
[GROUP BY…]  ?" _* P9 z# c8 b- F
[HAVING…]2 X. @, m/ ]7 c! D! P" i: E* G& ]
[ORDER BY…]) H# A. A6 @- b* k
[WITH OWNERACCESS OPTION]
7 g' u6 g. Z+ Z( ~说明:  _9 F. s- x/ }. K6 ^1 J6 E/ U
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
* {; W# n, ]7 u& v7 _1 FROM子句' D4 V; E$ S/ o' |" g0 _
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。6 y# ^* ^" w: y( _
例:下列SQL语句返回所有有定单的客户:, S5 G% s1 P% d% M. ]. p- ?
Select orderID,Customer.customerID0 S3 p4 i7 g. ~! Q, Y* K
FROM orders Customers
. n& _, p( ]2 HWhere orders.CustomerID=Customers.CustomeersID3 e- X- ?1 ^: C6 _: _& F
2 ALL、DISTINCT、DISTINCTROW、TOP谓词8 n1 O; c7 V3 o7 j7 y, \+ A3 H  \9 q
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。' E2 j2 f1 _% U3 C- p
例:Select ALL FirstName,LastName/ P4 k; l# T' i( O( q6 i7 {$ m
FROM Employees
5 O. ]$ q+ c/ P$ V(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。' N1 d' I% r5 N# o/ Z5 V
(3) DISTINCTROW 如果有重复的记录,只返回一个' s# I; c1 f: V& [
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比); [- y7 r/ x( C2 q+ ^1 ?
例:返回5%定货额最大的定单
$ I- `9 o6 f1 A4 X! I# O* [2 N: rSelect TOP 5 PERCENT*' f: n6 J5 J# T5 v
FROM [ order Details]
/ A1 j0 M+ q9 N9 B* |8 L( t; zorDER BY UnitPrice*Quantity*(1-Discount) DESC
* E2 F% [1 f, ?* T3 用 AS 子句为字段取别名
) L  V" h# e& Z1 l如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
8 g. a1 g' \$ `( }例:返回FirstName字段取别名为NickName! k$ q' i) Z& \
Select FirstName AS NickName ,LastName ,City
5 ^. x+ |2 Q$ j% t! z7 _FROM Employees
- V) O! Z. J2 n5 }% M例:返回新的一列显示库存价值9 J' ^! ?2 o" ?
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock" S- i/ X5 D6 [  o. |
FROM Products" m/ T0 S; H6 g
二 .Where 子句指定查询条件0 E8 K- v/ I7 l* O& i+ O* B
1 比较运算符, z% d3 S& U  S+ K! ?
比较运算符 含义
4 e; S: ]. K4 a) D1 W= 等于
2 L' P; v" J/ m0 T& H- n( Q7 S> 大于
4 T6 e- l# w' C< 小于
7 y3 Z4 k$ ^6 a+ L>= 大于等于
& R0 ^% u5 X+ _# O<= 小于等于
( m& K: K. Z7 H<> 不等于8 _/ A  P# C; `  Q# c& e
!> 不大于+ X& G) @0 Q" v9 {+ _
!< 不小于
) j( W# ?9 ?3 i1 {1 M9 t! N例:返回96年1月的定单
2 L" n# e7 Q: x8 V, I- vSelect orderID, CustomerID, orderDate- `/ D5 w/ c4 A) J
FROM orders
- f$ G0 \9 P9 {" RWhere orderDate>#1/1/96# AND orderDate<#1/30/96#  G4 G2 E, c$ M3 f3 }3 ^
注意:0 s5 W6 k1 z3 X( P
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
$ ^* u. ^; |& M# n+ i% _7 X) [例:
7 O. s6 Z; C6 Y! _1 G3 l$ nWhere orderDate>#96-1-1#; i9 P) [4 p* o+ f4 W
也可以表示为:% |" G5 W* t' @3 Z' Q0 j- k" y
Where orderDate>Datevalue(‘1/1/96’)
; B7 |9 ?6 B. q! ^使用 NOT 表达式求反。, S8 u' }9 V2 y
例:查看96年1月1日以后的定单
+ L# W4 E8 `6 o9 DWhere Not orderDate<=#1/1/96#) \) w# M. b4 n! @: A) P
2 范围(BETWEEN 和 NOT BETWEEN)
4 `% R( A' ~0 g  g% m! eBETWEEN …AND…运算符指定了要搜索的一个闭区间。: D4 O2 U( p1 x) n% ^. ~' X2 F2 c
例:返回96年1月到96年2月的定单。' P7 Y( d0 x0 q- ~0 L7 z
Where orderDate Between #1/1/96# And #2/1/96#
5 M- _) V9 Y" x3 列表(IN ,NOT IN)
* Z) D' o+ _5 DIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。1 f( U1 T; ^" E/ o
例:要找出住在 London、Paris或Berlin的所有客户: |8 R3 @0 h" q4 Q+ |7 i
Select CustomerID, CompanyName, ContactName, City
9 a, K3 D/ K; K. J; b- _FROM Customers; x( {& x" P! M: y
Where City In(‘London’,’ Paris’,’ Berlin’)
7 i5 r! }, b6 D% j4 F/ m4 模式匹配(LIKE)3 J4 h/ F9 L% l5 x! t6 J* z' ?, q
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。  B2 t8 s1 O# W6 Y/ q
LIKE运算符里使用的通配符
" l8 D  u$ l. x, d3 G: B; F通配符 含义
: |# n) M$ a& t) D? 任何一个单一的字符: l6 `% W* ^, W- v
* 任意长度的字符
( Y, j+ T# v" ]. \7 U' k, N9 F# 0~9之间的单一数字( }0 h/ W) p& R+ [" J& o3 u
[字符列表] 在字符列表里的任一值: J( K) Q/ d/ n# o& w) p
[!字符列表] 不在字符列表里的任一值
" `% _* V' H, f8 \- 指定字符范围,两边的值分别为其上下限
+ @$ ?+ r; I. T, h例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
' J1 @9 ~7 S4 [3 l. _$ v. q! k0 Y0 fSelect CustomerID ,CompanyName,City,Phone) v+ o0 I6 X7 Y8 D
FROM Customers- s8 [9 W( y0 x5 E! H! H: u- v( [
Where Phone Like ‘(171)555-####’; f8 f4 ~1 R; q: b
LIKE运算符的一些样式及含义
3 r& G( S1 v0 ~, A6 Y样式 含义 不符合9 `4 q" X. F4 ~
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
3 `; z6 Q  L* b% A  _/ ?# LIKE’5’ 5*5 555' e7 D# {+ z* |: j
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5& Q6 G& [9 Q  m
LIKE’5##5’ 5235,5005 5kd5,5346, V# S6 q) N7 q! Y$ \& A
LIKE’. }* V0 C* ~/ g0 l- U8 P
[a-z]’ a-z间的任意一个字符 5,%
1 t0 H4 w8 ]3 q1 a; ALIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
* ~$ n, X% M. m" ^6 Q  |LIKE’[[]’ 1,*
8 j1 a5 d, u. w) _4 B! ]" l1 u3 P三 .用ORDER BY子句排序结果
8 g! [" w5 e: x" W! e) H: ?, ^" w* HorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。# T$ `  P, _9 ~+ A# x, o- B
orDER子句中定义了多个字段,则按照字段的先后顺序排序。9 B+ D8 T, L/ I) }/ b9 v7 n+ f
例:: n' G8 I  y; G5 K' j
Select ProductName,UnitPrice, UnitInStock
" K$ e, C/ e* ~% Q8 s! aFROM Products
4 U6 F0 n: }( q' `" a9 s! |, N2 rorDER BY UnitInStock DESC , UnitPrice DESC, ProductName0 V8 \2 m7 Z: K3 R8 Y+ H
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。7 h' m( W* a& l7 O
例:下面的语句产生与上列相同的效果。
( ~8 m& L# }7 e- ?1 ~+ YSelect ProductName,UnitPrice, UnitInStock3 X# [: ^# c# O* {& J
FROM Products) ~: P" d4 o3 i$ x* I
orDER BY 1 DESC , 2 DESC,3
) m% ?' I/ h: ?3 E9 t  F' Y四 .运用连接关系实现多表查询+ y( D7 K: c. K9 T
例:找出同一个城市中供应商和客户的名字2 v& T4 i; M, h3 E4 G* x6 K
Select Customers.CompanyName, Suppliers.ComPany.Name; {8 i, h8 |* |
FROM Customers, Suppliers
, T5 r) N/ i3 x7 Z, Z7 ~Where Customers.City=Suppliers.City
2 U) v2 x: ^* O1 l9 ]+ z例:找出产品库存量大于同一种产品的定单的数量的产品和定单
& F' L6 j1 g/ x; ]$ tSelect ProductName,OrderID, UnitInStock, Quantity; r. U( j# h5 O, o# P
FROM Products, [Order Deails]
, i% @, Y* p0 Z: jWhere Product.productID=[Order Details].ProductID" e# y2 Z8 A) ~# s' \* j. V) X
AND UnitsInStock>Quantity
% ^" @! }# v* C9 v1 N$ V另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN# U+ a, w, G5 \4 L! u2 x0 [5 A
语法:  A+ a3 `3 ?! }  l
FROM table1 INNER JOIN table2
: Q- b5 {( Q' q+ e2 \3 z& JON table1.field1 comparision table2.field23 z7 {( k! y  \! s/ c. J( X1 \& q
其中comparision 就是前面Where子句用到的比较运算符。
+ h1 ^# o5 r5 a7 p7 I8 a, \Select FirstName,lastName,OrderID,CustomerID,OrderDate8 P# B8 c' i' m9 t
FROM Employees
/ A  {! S8 j4 ~$ ~, {INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID8 _; q/ F  n$ [: ~6 }1 X: h# M
注意:9 Z' b& R" ?8 A" G
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
6 k3 H, @0 h/ m: f8 A! K在一个JOIN语句中连接多个ON子句; @% E- O3 Z0 C2 N" Y6 I* S) Z
语法:- e, W9 Q1 ^( b7 O# G, S
Select fields% p. B1 R) T6 p, |1 g
FROM table1 INNER JOIN table2
, D) `6 B7 z9 O! gON table1.field1 compopr table2.field1 AND
* b8 z7 j4 G* @! K5 r9 NON table1.field2 compopr table2.field2 or
/ ~* Z# a/ x: R) U' s6 NON table1.field3 compopr table2.field3( Z- E# y- P! P7 @, h, S& O& R
也可以- f" \) c4 {5 U$ f5 N4 d2 w8 N
Select fields( N. S9 M. [4 m$ s( V* ~  }
FROM table1 INNER JOIN' m# P/ [( }6 C5 a! U3 {! V' E; F
(table2 INNER JOIN [( ]table3* `! K% S  t( P
[INNER JOER] [( ]tablex[INNER JOIN]; e5 ^; [9 @% B& h& V6 z
ON table1.field1 compopr table2.field1* b# T* j/ w: }; W7 t8 l% o# c$ ~1 n& _
ON table1.field2 compopr table2.field2& k9 I# @$ y( g8 k3 S$ ^2 R
ON table1.field3 compopr table2.field3
3 b& r# D; f: W/ o4 @外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。! u" K+ k- f( ?1 E3 a
FROM table [LEFT|RIGHT]JOIN table2
! H6 g: M5 \: O: V! f) WON table1.field1comparision table.field2
$ s. C: b8 h* N) H用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据8 `3 ~* Z/ O2 F: k$ r
例:不管有没有定货量,返回所有商品
0 l$ U9 z: Q9 A0 o7 J; K& V  }, _Select ProductName ,OrderID5 X. ^' E6 n% W5 X3 X
FROM Products
, |: n5 G  b$ nLEFT JOIN orders ON Products.PrductsID=Orders.ProductID7 [+ p0 m7 @' z0 _" ~
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。) r/ y# W3 l6 [. x4 F
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
  m% Q& P, C; @7 c; D空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
) m6 }4 h3 z# T! E7 YSelect *
6 R: m2 O; u4 ?: x8 [* PFROM talbe14 i- v- n$ Y% I* O
LEFT JOIN table2 ON table1.a=table2.c
0 V6 P+ {. f& [- C- t1 连接查询中使用Iif函数实现以0值显示空值
- B  M- ?- G4 {! GIif表达式: Iif(IsNull(Amount,0,Amout)
. v) @) M7 i: T例:无论定货大于或小于¥50,都要返回一个标志。
% W* T2 P+ G6 k1 V' P; mIif([Amount]>50,?Big order?,?Small order?)
. f' w9 ?. B. T  N& T五. 分组和总结查询结果
1 [8 G, d: O1 [2 F, C在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
& \2 p# f, E2 C8 B( s# YGROUP BY 子句的语法2 j$ F! C. ~1 }: b/ r& O
Select fidldlist) h' a: ]' ~" A7 w) o3 b& \
FROM table. X3 Z. |( q9 O$ y9 B
Where criteria$ W5 R: e- f8 o/ b# V7 l/ a
[GROUP BY groupfieldlist [HAVING groupcriteria]]8 C9 ~4 C% X6 P/ k2 F9 q" H" o
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
+ n; S  z$ T/ o. b: A4 l6 v4 F0 fGROUP BY字段中的Null值以备分组但是不能被省略。( `# o' x2 }& z, r% a( c
在任何SQL合计函数中不计算Null值。- s7 B4 a$ \2 r, a
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
* W% ]! {1 e9 P" f3 C0 c例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
4 y% r) s) V# I! bSelect Title ,Count(Title) as Total+ g( f( l6 `0 W& i) M: y  ?- V1 ?
FROM Employees
4 M0 [  w& y" y5 T( iWhere Region = ‘WA’" v! [# v9 j* e& f' z9 ~; p
GROUP BY Title/ O: B4 _; t  ?. p2 M3 I
HAVING Count(Title)>18 O7 f. [! A0 V9 a
JET SQL 中的聚积函数
9 Y; k5 M  G; N) P# d# n聚集函数 意义( ~, g0 _; e) u: i
SUM ( ) 求和
, n1 }  P- j) f& }  Z4 ^AVG ( ) 平均值, X2 u/ N$ _! h; D% ?% k: h
COUNT ( ) 表达式中记录的数目
8 K  M8 _& i8 @2 `5 [3 |2 SCOUNT (* ) 计算记录的数目9 I8 D' V8 t& t" [) d; c4 p
MAX 最大值* N# I+ H% n4 }# q" m; m
MIN 最小值
: d+ i5 E( Y, y1 X0 t* NVAR 方差1 l; i' v& q( S, k5 `& c
STDEV 标准误差. w0 Y1 N0 O2 t
FIRST 第一个值
. }/ J1 g/ W% z$ v# ~0 xLAST 最后一个值
9 y7 i; ?3 P* {六. 用Parameters声明创建参数查询, T) ]7 |9 t! z& o
Parameters声明的语法:3 N" Q! o4 S; Q- n
PARAMETERS name datatype[,name datatype[, …]]: o- m3 l# m1 ~# @0 Q8 d
其中name 是参数的标志符,可以通过标志符引用参数.* `* n% e3 D0 Z2 r# @/ z) l
Datatype说明参数的数据类型.. E) W! n" r) W( N4 s! J/ `
使用时要把PARAMETERS 声明置于任何其他语句之前.
3 B* u- t7 ^' T- H: N& s+ o+ r例:
2 c  r8 s' y) c7 J6 ~" @PARAMETERS[Low price] Currency,[Beginning date]datatime( z  z4 b6 J% x* R! I0 S
Select orderID ,OrderAmount- L, W( y' m+ m% H+ F
FROM orders9 I8 s, e  G" b. g5 D
Where orderAMount>[low price]7 j- Z7 ?$ [4 S7 N! Q! W8 a
AND orderDate>=[Beginning date]/ i3 G/ q; i( W+ e$ x& d4 j5 J. D
七. 功能查询7 V  F( _  [3 \" m2 J0 @
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
5 f2 L6 O; ~! p1 更新查询
/ q+ j6 A3 c  z+ iUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
! r4 j: r7 H: W( Y8 K  Z9 M$ N  z更新查询语法:
+ f$ s7 z- {) U/ oUpdate 表名
8 ]8 C  W0 d* f5 {& ~, SSET 新值% i. y3 B2 t9 `5 L3 _
Where 准则
* k9 n# x. p% i) k+ l( J例:英国客户的定货量增加5%,货运量增加3%. R, a, A6 K# }( r+ M
Update OEDERS
* h) G( D: Q0 _SET orderAmount = orderAmount *1.1$ q/ i7 N# e2 i/ M) Q1 [* _
Freight = Freight*1.03
9 U  J; P1 k7 k$ W, E; F$ mWhere ShipCountry = ‘UK’2 F& O8 z5 h: l
2 删除查询
0 k0 O( _5 r% b$ R1 SDelete子句可以使用户删除大量的过时的或冗于的数据.
8 {1 O( X; `2 k- V注:删除查询的对象是整个记录.* O7 h+ s: h* `$ ~% c
Delete子句的语法:
  O2 x7 X5 K$ o. t) g) ~% WDelete [表名.*]; c" I6 c4 }7 W' g5 L& B% H+ q
FROM 来源表8 }. }$ F, E1 p4 g
Where 准则
1 O6 R4 R+ i" x7 |例: 要删除所有94年前的定单
0 L* ~/ u, j$ QDelete *1 o% v7 V1 @+ {3 k- ?
FROM orders1 R0 ?  v4 S) h* J1 D) r9 ^% |1 p
Where orderData<#94-1-1#
7 ~1 W( f2 }- e  ~3 追加查询
, g& e9 N5 ^, qInsert子句可以将一个或一组记录追加到一个或多个表的尾部.+ k8 U; X8 ]& L9 N4 I- w% U% h2 ?
INTO 子句指定接受新记录的表
& `4 W$ J) I% m* s4 r/ `3 gvalueS 关键字指定新记录所包含的数据值.
0 L' e: H7 ~( Q9 e8 U/ B. z/ pInsert 子句的语法:
3 V' e  K% J; X( ]' T" sINSETR INTO 目的表或查询(字段1,字段2,…)
/ d8 A' k/ R8 O/ F% X3 g; WvalueS(数值1,数值2,…)
/ j6 c8 k" k( L5 W+ }) F& F6 e例:增加一个客户4 T( s* J/ Q- G( ~5 \+ |+ ^
Insert INTO Employees(FirstName,LastName,title)
6 E- Y: x( v7 B/ W: Y" ]valueS(‘Harry’,’Washington’,’Trainee’)
9 b) g# N: q& b, S8 C1 h* U4 生成表查询
- J, {# K( u1 K+ u: z可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
8 {. s# u" d" D0 b5 L; bSelect INTO子句用来创建生成表查询语法:# Z, w, M: p% ~3 D
Select 字段1,字段2,…# E. j( x$ _0 O7 y% q
INTO 新表[IN 外部数据库]
* W* S1 \( j. ~1 m1 [FROM 来源数据库
/ }: W% {8 c6 ?' q6 S$ g/ uWhere 准则
( i; C9 n5 z& r9 ^7 o+ T3 X例:为定单制作一个存档备份4 c' w9 R9 t1 @( C! e
Select *; @, q4 G' ?2 b: j/ N' l
INTO ordersArchive5 [( {7 E: m- I, p
FROM orders9 h. e8 g; A) i9 p* x0 z. c
八. 联合查询
9 L3 f9 i4 G1 OUNION运算可以把多个查询的结果合并到一个结果集里显示.
/ p: @; O, t0 V/ m6 rUNION运算的一般语法:' ^/ U& B! Q1 O! P
[表]查询1 UNION [ALL]查询2 UNION …
* i$ n% V9 }3 E/ I1 F# S1 Y例:返回巴西所有供给商和客户的名字和城市
; p, h4 \8 ?2 S4 O6 \' _) y8 eSelect CompanyName,City
# V# O. R/ N7 u7 q  u- @8 `FROM Suppliers
+ Q7 J8 M  R/ V3 L+ _& n9 pWhere Country = ‘Brazil’
* ^' {# p: ]2 I9 W- z- m: JUNION
" y0 m- ~* E% g  Y. qSelect CompanyName,City
3 [* n3 Q* Z6 gFROM Customers
2 S/ z! a' [7 P) H8 K1 G' LWhere Country = ‘Brazil’
/ D5 I7 O8 _4 N) t; J2 _注:
4 v# g1 H& p/ m2 v- W5 o; F缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项  d* s1 z* ]) M* q! `" }2 A
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.( j8 j: q# E, [/ u
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
: f/ A- X: p( K  W  j+ T/ S0 ]/ N九. 交叉查询: l4 o  N; F3 ]1 U
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
8 ]6 ^- R# n- eMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:$ k; b+ w  L( o* x7 G8 u0 b9 J3 m
TRANSFORM aggfunction: o1 r1 @9 i' n
Select 语句
" V6 ^9 u) i! K! J% dGROUP BY 子句
! H6 U7 g% V2 z# D. E! w3 ~$ O) rPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
7 h; L. [" U9 J( c5 O6 c4 N7 _2 p9 {Aggfounction指SQL聚积函数,
5 }& Q) p5 v' `" {Select语句选择作为标题的的字段,
* r1 q* L2 W0 h3 x' YGROUP BY 分组
5 l! z5 W3 A5 i% O0 `说明:6 x7 F! }& K" W, Y0 J
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.* u# B" d! a' b: o, _* W
value代表创建列标题的固定值.
& `7 j+ Z7 D2 S, ^  |  D. w2 `例:显示在1996年里每一季度每一位员工所接的定单的数目:
8 b2 ~$ ]5 [+ T. i$ O8 KTRANSFORM Count(OrderID)
/ E9 h- S  N7 F& a- ~. Y6 r" zSelect FirstName&’’&LastName AS FullName3 F0 I5 K+ F3 A$ n
FROM Employees INNER JOIN orders
/ \1 Y& P! j7 X* k/ z* Q. K) AON Employees.EmployeeID = orders.EmployeeID
( w* \# u4 e; `, ~8 P6 kWhere DatePart(“yyyy”,OrderDate)= ‘1996’7 b# _$ r, I: X- j) @
GROUP BY FirstName&’’&LastName9 k, B& `$ _) L2 g: s6 v! s: q  I4 [
orDER BY FirstName&’’&LastName& H3 T  p% V# U6 m# }5 R$ J
POVOT DatePart(“q”,OrderDate)&’季度’: O8 I; s- S( s  y8 o( P
十 .子查询- {0 y% X: f; p, G' ]
子查询可以理解为 套查询.子查询是一个Select语句.8 f5 X5 H1 S& m/ ^* k8 a
1 表达式的值与子查询返回的单一值做比较
" D- [0 I7 T; p9 y语法:% O) K: m$ V" w# }
表达式 comparision [ANY|ALL|SOME](子查询)
7 |/ p: L$ m$ I/ ]( ]. j说明:* {8 ~: q% m( {- m+ T; \8 U
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
" C  D% a5 x6 z4 c1 \0 S; P  z8 D例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品) ~# Y, h0 ]& m* G  f
Select * FROM Products( f" X1 b8 g2 P5 v% X4 y8 \5 V; q
Where UnitPrice>ANY& i1 y3 N; B1 g6 W
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
) t# r4 w/ d2 t2 检查表达式的值是否匹配子查询返回的一组值的某个值+ q( X$ u/ R% k( i8 m
语法:: |/ N) u5 |9 [$ y- t
[NOT]IN(子查询)( Y- ^9 J3 Z8 r7 _' N
例:返回库存价值大于等于1000的产品.
6 L5 E+ q- B) \$ ]5 F& n2 `* VSelect ProductName FROM Products
, K* K0 A1 ~8 B6 N, p1 wWhere ProductID IN/ m( w, t4 Z% _1 _" R; p+ S+ S1 T
(Select PrdoctID FROM [Order DEtails]& Q' j8 T. V- u: ]8 W6 b" Y/ p
Where UnitPrice*Quantity>= 1000); ]% T, s4 N( c, W
3检测子查询是否返回任何记录
0 c2 ~6 A5 E+ e( C! a+ K# X6 W5 y语法:
6 c: H, L, n  F8 P" u[NOT]EXISTS (子查询)# q* C+ O9 ^' J1 F
例:用EXISTS检索英国的客户
' t7 Q4 ?' r  p$ u/ N! Q: tSelect ComPanyName,ContactName( i7 [) z3 S3 Y$ {
FROM orders
+ A! a3 J4 T3 J, d0 NWhere EXISTS* x- B, N0 x$ U, v. O
(Select *
9 V) [; X' H$ {* ^1 r# RFROM Customers. P  H" F! _; k0 F
Where Country = ‘UK’ AND
% C5 u, ~/ P" o8 M4 ]3 ECustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-2-3 19:37 , Processed in 0.025001 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部