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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法2 @1 J. r3 ?2 i' B& H: {5 u
+ X: D: U+ \/ E. x+ x
select distinct 字段 from 表名
' t9 n9 Z0 O  M, L. G7 J3 w. Fdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
9 H! {1 P& M2 ~2 r0 `& c3 i一.Select语句的完整语法为:/ x$ d& P3 @2 N! r* f5 P
Select[ALL|DISTINCT|DISTINCTROW|TOP]! k  z$ @1 ?* R1 p
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
- N- ~- z/ ^5 J! F+ m2 f' M, hFROM tablee xpression[,…][IN externaldatabase]
5 l4 F  u0 S. |6 ?3 \* N) P% N  _3 C( \[Where…]8 J7 L7 Q! |+ w4 M: B% J2 `
[GROUP BY…]
/ W, H& X* c$ H9 |7 G/ ^$ N[HAVING…]
6 n, D' E' U) N- ^, W5 J[ORDER BY…]
  e: g) }9 s  x6 u[WITH OWNERACCESS OPTION]7 O9 a! w, L; P; r, v! |$ I
说明:
% {  t+ V5 O, Q" t- i用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
+ L4 b6 C  n5 h: R, o1 FROM子句+ o4 Z% m" V( `  R% ?2 x
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
+ Z  |, _4 L6 q5 M  f- S3 O2 X例:下列SQL语句返回所有有定单的客户:
5 }" j- T( q" k$ S& fSelect orderID,Customer.customerID
  A! i' q4 n" E. [) Q: \FROM orders Customers
1 X+ p- }0 `* g* l# t3 cWhere orders.CustomerID=Customers.CustomeersID
8 f1 ]& y( d) Y! z' u  o# E- R2 ALL、DISTINCT、DISTINCTROW、TOP谓词, ?8 C2 i% W7 H; P2 a
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。. R. M% r+ D/ ?6 @! E' v/ d, a  x
例:Select ALL FirstName,LastName% m; V9 s" ~& D9 V; y( `* q
FROM Employees/ _2 ~$ X$ l! ]/ c  {7 R3 K
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
3 j: f# x8 O" X4 ]$ Q(3) DISTINCTROW 如果有重复的记录,只返回一个5 w7 ~+ x8 G0 L5 K" Y/ B
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)5 m2 Z- i- u2 |' k$ q' ?3 |
例:返回5%定货额最大的定单" p. O) L/ c+ M& x" J! U9 P
Select TOP 5 PERCENT*
" J: x" o4 C  X# eFROM [ order Details]
6 ?9 d* T0 E& c  q8 w, n, \orDER BY UnitPrice*Quantity*(1-Discount) DESC
# S& n9 t% l1 h' c" R3 用 AS 子句为字段取别名, a7 @8 Y) o) Q6 Q5 u  ?- s- ~
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
3 `! J. c- Z2 O; w; L5 Y例:返回FirstName字段取别名为NickName+ b& t- `: i& C* E
Select FirstName AS NickName ,LastName ,City: w: W7 {/ P" _% r
FROM Employees& [; F. P+ G- Y# q3 ~
例:返回新的一列显示库存价值
. a- i- v6 R% P" LSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock7 W+ Y" H0 w; u6 I( B
FROM Products1 E( a2 d' C2 h: g1 d" B
二 .Where 子句指定查询条件
! e9 C/ U3 b, f8 b; H1 比较运算符2 o! q4 T- @$ {4 w- x4 C
比较运算符 含义1 U, H! z. Y* ~: R& E
= 等于4 o# M8 A5 M& ?: U) N4 q6 R
> 大于
  ]" R; s3 ^. c- x" {. j- I. Q7 @< 小于
: X. A0 j9 \( P0 o>= 大于等于
/ U9 u* U3 o9 P2 u<= 小于等于9 d" N+ x1 n& b; |/ P. ~6 b
<> 不等于
: z$ q) X9 m9 b9 B- ]!> 不大于
+ _) `1 }3 B# C7 Z" T9 v3 `* I0 V!< 不小于; o: s# |+ z- d, X
例:返回96年1月的定单
3 w! E+ B4 j; ^3 ISelect orderID, CustomerID, orderDate( h& D% u$ I& _: U
FROM orders
7 z! L# d) j; l. K! fWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
% U4 }, M& Y7 {3 ^注意:% @# u. l2 O7 w& c# v' r( A
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。( `: p/ t5 ^$ C, W
例:
, d) Q7 x. v7 j# Y9 ?0 EWhere orderDate>#96-1-1#0 f+ T  I/ M. i. {+ k/ h. ^
也可以表示为:
2 m5 \0 o% H. @2 i6 Q- F5 cWhere orderDate>Datevalue(‘1/1/96’)
( f; B, N1 t- |& }使用 NOT 表达式求反。. @! o# V/ ]  F4 w! I7 n' ?
例:查看96年1月1日以后的定单
% N% O) `1 W) V! ]3 J; X- V8 uWhere Not orderDate<=#1/1/96#
' q3 X5 ]- ?3 v+ X- d2 范围(BETWEEN 和 NOT BETWEEN)0 s7 d! }# U; y6 J+ x! R& s
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
) O+ ]. Y) |  J. \7 K3 `- s* q% B例:返回96年1月到96年2月的定单。. w& K6 B& M3 A* U1 }. p- ?
Where orderDate Between #1/1/96# And #2/1/96#+ ?( \+ k# J, V. q
3 列表(IN ,NOT IN)
5 |) l) H! r1 j- @/ W0 N/ e% U9 w" w& HIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。- J' x* ]: ]+ \4 |5 ?9 T4 N0 u7 S
例:要找出住在 London、Paris或Berlin的所有客户
, i1 e+ S9 G- }7 X5 eSelect CustomerID, CompanyName, ContactName, City
3 N& h. l6 J" [2 H* p3 HFROM Customers
* T2 |1 g& E# d( ~3 C- L- `Where City In(‘London’,’ Paris’,’ Berlin’)
' {& \  Q4 m* O8 a" E4 模式匹配(LIKE)
( K1 R9 ?: t  S+ s5 q  u$ ?0 l2 ZLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。( G4 q3 y  |6 d; ]; y
LIKE运算符里使用的通配符
) ~1 t4 ?5 Z! w8 b& Z( ~通配符 含义9 g6 f  r+ I. M# ~4 i- H3 Y6 f
? 任何一个单一的字符4 v: k9 v) @) j
* 任意长度的字符* I+ f$ `1 x  R- ^( j
# 0~9之间的单一数字
9 {9 t. @, M2 K  F[字符列表] 在字符列表里的任一值' g$ c5 t5 [4 J- y( r9 _
[!字符列表] 不在字符列表里的任一值
" [3 {/ B% s$ ?6 F; |' g4 e- 指定字符范围,两边的值分别为其上下限" I* b. y/ A; O* c0 t1 e9 X
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
% i. F1 W7 z. N7 K4 E! {Select CustomerID ,CompanyName,City,Phone* X# R- ]. v8 x2 y/ B' Z
FROM Customers$ O" o/ b4 R! ?( q
Where Phone Like ‘(171)555-####’
% i0 @# `+ {0 Y4 h/ k% t( uLIKE运算符的一些样式及含义! _5 g7 q: c& I3 a4 Z
样式 含义 不符合7 b  b9 C: M7 J. e/ q9 R. C
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
8 Q) W. N3 a  k  W# LIKE’5’ 5*5 555; P' y' d' U9 @. t3 S
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
( A  B! J6 g- j3 G' VLIKE’5##5’ 5235,5005 5kd5,5346' H5 D) V7 j" _5 G8 z5 Z
LIKE’0 U- v% e7 ]) G
[a-z]’ a-z间的任意一个字符 5,%
/ r- Y0 }: l/ ^( i9 CLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1$ v7 u9 M( f$ j/ l6 ~0 v: I
LIKE’[[]’ 1,*1 r8 a7 J& S# z: ?/ e+ Z+ _# ]
三 .用ORDER BY子句排序结果$ k- b. c+ Z7 l) I/ g, Z
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。# n! h* g/ L' e7 f
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
8 |( g+ a9 v4 W例:" ]8 u7 [, h7 U
Select ProductName,UnitPrice, UnitInStock
) B: S1 u5 j, S- fFROM Products
$ [- ]7 ^7 V7 ?$ }. J8 worDER BY UnitInStock DESC , UnitPrice DESC, ProductName
( O  x. e, p: E9 b! O% J. @orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。5 _. D: `2 i- Y! {+ c; p( W) v9 Z
例:下面的语句产生与上列相同的效果。
% [8 J+ j& \, DSelect ProductName,UnitPrice, UnitInStock
$ J0 u/ `5 N' {FROM Products
1 F6 q' T3 e8 V& |orDER BY 1 DESC , 2 DESC,3
! l. G7 _+ Q4 |/ m& Z1 ?; G" p四 .运用连接关系实现多表查询
9 z& W0 z" y$ D% K例:找出同一个城市中供应商和客户的名字; U1 c* h& l- ~( h
Select Customers.CompanyName, Suppliers.ComPany.Name
" w( P7 C  l1 r0 k" |; j. NFROM Customers, Suppliers$ v5 s$ g3 n# `1 {
Where Customers.City=Suppliers.City% D$ e9 `( I0 b
例:找出产品库存量大于同一种产品的定单的数量的产品和定单% e% s0 r& \, E5 z& H" i% ^
Select ProductName,OrderID, UnitInStock, Quantity* U$ G8 ~+ V& n: i
FROM Products, [Order Deails]
. a* ^+ l( J7 M8 \1 D5 @Where Product.productID=[Order Details].ProductID, N, x7 b$ f! V  a/ R. G8 ~  M% v
AND UnitsInStock>Quantity" u% [. Z1 ^$ A0 J
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN# b8 y. k4 g& B/ [& ]& C
语法:3 F/ ?' n% `( b$ x  x$ S9 A
FROM table1 INNER JOIN table2' T( B: K% S: t
ON table1.field1 comparision table2.field2
: Y9 ?5 l  A  f+ m2 u其中comparision 就是前面Where子句用到的比较运算符。
3 |$ a! l' c% w  k8 TSelect FirstName,lastName,OrderID,CustomerID,OrderDate
5 o. I) L$ C- [. X4 ^3 T" {FROM Employees  A2 X! Z0 L; v2 ?1 `5 V' _
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
/ q6 @0 t; ^/ \7 x. u9 ?; O注意:: I% @- ~- F  T' c& `
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
4 |" F0 x1 k* S! G0 h9 x. v在一个JOIN语句中连接多个ON子句! L. n2 Y7 B! e% G* c
语法:
& v& r  F+ O% V/ r! `Select fields: D3 i8 o+ e! y$ D+ X9 o
FROM table1 INNER JOIN table21 W5 {  o7 ^/ q3 A/ D
ON table1.field1 compopr table2.field1 AND4 E) o8 W4 C7 Z  X* Z  c
ON table1.field2 compopr table2.field2 or
/ Q! e4 e# ~5 cON table1.field3 compopr table2.field3' H# r! s" v5 R1 L# s# n
也可以
, r) {. _/ i3 ySelect fields; G: D8 Y4 J* H3 p8 e2 t
FROM table1 INNER JOIN1 H( l$ c% d! M) [4 d
(table2 INNER JOIN [( ]table3
, x' D; `- h! y) r" A[INNER JOER] [( ]tablex[INNER JOIN]2 V/ I- I. r& B2 c& k# I( s$ A
ON table1.field1 compopr table2.field1& e2 J, |3 U8 o9 Q& e& i6 h: L
ON table1.field2 compopr table2.field2
# O6 E7 ^! k9 L2 r8 CON table1.field3 compopr table2.field3  O' Z. ?4 `+ k& R! l
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
* ?2 T! f$ w0 [' c- {FROM table [LEFT|RIGHT]JOIN table2
) R7 g! Q2 ]) B2 z; Y; ?ON table1.field1comparision table.field2
. L/ s% s( J. q: R2 }用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据. V" Y; T, d/ U- d
例:不管有没有定货量,返回所有商品4 N# W2 [9 R6 R7 u  z& d
Select ProductName ,OrderID
0 R4 }, l& J" {& c# L/ nFROM Products0 j* s6 u$ [6 p# K: ]3 O
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID" Q$ f) U4 b; ]) n7 `9 t! k
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
/ B8 T" C0 J' r. l( |' u- K例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。& [6 R3 G$ W- e
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
! l0 ~7 ]' z; @1 Q5 x" ~) }Select *6 `. l! b- J& R; S" v5 [' K
FROM talbe1
" e4 A. x, z7 J$ ]( ELEFT JOIN table2 ON table1.a=table2.c: A, t4 \: G, R  A
1 连接查询中使用Iif函数实现以0值显示空值) ]  k2 F" F1 g  f
Iif表达式: Iif(IsNull(Amount,0,Amout); }4 t8 \+ d5 }
例:无论定货大于或小于¥50,都要返回一个标志。% z) W  {0 u, J& q1 @+ Q. s; ~7 n
Iif([Amount]>50,?Big order?,?Small order?)/ `' H$ q4 }  X: M! \
五. 分组和总结查询结果
$ i& `# Z' i! |* p1 |在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。/ a$ m0 A! f2 w( \+ m
GROUP BY 子句的语法
2 }0 e* ~2 S/ X" C& X% U& ZSelect fidldlist* \9 P! Q4 E+ L
FROM table' b/ x. T" p( I4 Q$ x
Where criteria1 H$ F: i& i7 i/ f
[GROUP BY groupfieldlist [HAVING groupcriteria]]
- Z3 `$ ^1 @- d' s; s! t, z注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。2 o' Y9 k% m+ `0 o) t4 e
GROUP BY字段中的Null值以备分组但是不能被省略。
" G6 R9 S1 \* X( U+ B: o# B在任何SQL合计函数中不计算Null值。
/ v# Q# l1 V+ @- O4 _2 o. _GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。) |- s, v' F+ s  B6 R" @$ [4 z
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。8 j" G/ R+ R* ?! Q% O# M
Select Title ,Count(Title) as Total- q: `6 k2 Y! |2 @: v
FROM Employees; d' X) W2 y3 w# ~, F
Where Region = ‘WA’
) L9 M6 q- L- g/ H5 D& z4 YGROUP BY Title; V/ Z9 H* z+ w% r" c0 w% n
HAVING Count(Title)>1
) `7 `7 ?9 J3 K& Q0 ^JET SQL 中的聚积函数/ U- L4 y- @, M$ _: E
聚集函数 意义
* ]3 ]2 u3 q; a. t+ I( ?9 V0 Z7 u7 FSUM ( ) 求和
. _0 M. n9 r; `1 _" o; J6 c1 ~AVG ( ) 平均值0 ^1 a2 t3 M  y/ B
COUNT ( ) 表达式中记录的数目; `2 w! t) y' b; ^/ r2 f. {
COUNT (* ) 计算记录的数目
! m* j: M% k  i; W, P, C# ]$ oMAX 最大值* [. E. p( j5 U7 V; ?' z
MIN 最小值& G; n, ?3 g* w
VAR 方差
" F: s1 V4 A) O( P/ `STDEV 标准误差
8 ?' _+ D. _/ J8 S" n# oFIRST 第一个值8 l2 {* L% Q) V9 q) f) [. Z% t
LAST 最后一个值+ z) d- J7 v7 Z
六. 用Parameters声明创建参数查询
6 k; l# R/ Q  m4 o9 |7 M9 g& X7 |  xParameters声明的语法:2 ?  f1 a0 j$ R, X& U; H  }: f
PARAMETERS name datatype[,name datatype[, …]]
7 ^7 s( c: P8 i: w其中name 是参数的标志符,可以通过标志符引用参数./ @. X8 T6 m8 R
Datatype说明参数的数据类型.
+ O% s1 f( U! ~3 E使用时要把PARAMETERS 声明置于任何其他语句之前.! ]. J0 z  O4 j0 T/ S* ~
例:
4 d+ O" F/ {( a, o! {* d- `' h0 hPARAMETERS[Low price] Currency,[Beginning date]datatime
! V- O4 t' Y; q4 eSelect orderID ,OrderAmount, o* C6 V3 z/ n& j4 Y+ {/ q+ H: c
FROM orders7 F* ~% O' b  I1 a* F7 X9 E9 Z
Where orderAMount>[low price]
3 x+ l" p7 b; H0 i! S$ q) CAND orderDate>=[Beginning date]
: Z0 [$ S2 Z2 N5 {% j$ j七. 功能查询/ r# @* w7 f, I& C' H, [7 S$ O
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
5 i- V2 {9 w# V% p) ~1 更新查询" K/ Z. B0 n1 y2 Z) O  |' G, K9 W' D
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
) {) @& Q& M1 T- p: X+ R更新查询语法:9 ?- s4 }2 z* Q4 F5 [
Update 表名; d' E0 m* @- x9 t- _& m5 s( l
SET 新值" C2 N, b) N; M$ F
Where 准则9 ?8 }# ?, w& E+ c( h: [  G5 \* _
例:英国客户的定货量增加5%,货运量增加3%
% d7 U( Y4 R1 t5 ~Update OEDERS# r+ {$ t! F6 y1 r/ q# K$ p8 i# V
SET orderAmount = orderAmount *1.1# V) z( h. U! j/ D4 r' t
Freight = Freight*1.03! I  r$ J% B# ^% P
Where ShipCountry = ‘UK’! ~8 {4 E! P& Q4 L6 _5 O
2 删除查询5 s6 q1 W! b8 V/ @2 Y
Delete子句可以使用户删除大量的过时的或冗于的数据./ i; R- t$ e% H) k3 C- X: w' F
注:删除查询的对象是整个记录.: A2 w. v& T/ |; B
Delete子句的语法:
& X# K! j' c* ?+ |8 x" {! v# jDelete [表名.*]
3 B/ Z8 S: ^5 @( @, YFROM 来源表
1 q$ m$ e! \5 b% dWhere 准则0 P; Q$ x9 |  c6 X- B, P; f" i
例: 要删除所有94年前的定单
9 p0 C4 ~4 {( pDelete *$ I: ~5 O$ R2 }1 A6 x+ S5 ^8 _
FROM orders
' S$ {: I7 D6 G6 [' EWhere orderData<#94-1-1#$ I6 h' d: C7 l  [! T% N3 T
3 追加查询1 y. l! N% N1 m1 m% R
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
2 j% T( F4 `9 u) G: I1 SINTO 子句指定接受新记录的表+ p- q% Q9 ^1 M5 G
valueS 关键字指定新记录所包含的数据值.
. p% _' U; \/ g$ J3 mInsert 子句的语法:7 y# _" `# \6 @/ Y) x$ p0 r
INSETR INTO 目的表或查询(字段1,字段2,…)
* L, Q( c7 S8 e1 v, ^' vvalueS(数值1,数值2,…)3 v% X! ~4 I  {
例:增加一个客户
6 t- d3 G* [- B) T3 lInsert INTO Employees(FirstName,LastName,title)! D# M) o- f: x4 g/ N4 ~7 C( m# K+ l8 ?; o
valueS(‘Harry’,’Washington’,’Trainee’)
6 W  s6 {, ~7 \/ C7 y  C4 生成表查询
' d5 G& C/ b; ?5 h9 D+ d可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.* v8 X& u8 O: O/ ?* r9 P+ l
Select INTO子句用来创建生成表查询语法:, H9 J/ Y! P) Y+ x& E; l+ [! w5 p  @5 o& W
Select 字段1,字段2,…
& K6 a# z3 z: B2 n; z/ c' m- JINTO 新表[IN 外部数据库]( m+ O$ ?6 S2 N# z
FROM 来源数据库, {  T0 c9 H% w0 p: V9 `+ }% X
Where 准则
& [4 h3 x9 _2 j& ~# m: m" i例:为定单制作一个存档备份* Q) O  Q* r/ c' E, B1 d/ d
Select *
1 R3 P$ L3 I1 b$ }- e/ u) ]/ k, x/ `INTO ordersArchive3 s8 V3 j/ u: M
FROM orders
9 l; s* V' e9 w- @. a% O( @八. 联合查询& D! y( D/ A3 u: ]8 k: n% {
UNION运算可以把多个查询的结果合并到一个结果集里显示.( w' f/ m5 z1 X! A) t' j& j, Q
UNION运算的一般语法:- \6 `5 V& s* c% `- x) c0 a1 }. @* F
[表]查询1 UNION [ALL]查询2 UNION …% k4 L9 r3 B: u& V) J
例:返回巴西所有供给商和客户的名字和城市
3 Z+ v1 Z: e$ ~Select CompanyName,City
9 X8 Y  Z) K' a2 YFROM Suppliers
5 W- d- H( A+ PWhere Country = ‘Brazil’
  l+ h4 ~% b' cUNION
7 }7 G& @) g9 L# eSelect CompanyName,City, L' ~  t( ^; W9 d( ]
FROM Customers/ S: C9 z. q: l* w9 Y  |( }; k
Where Country = ‘Brazil’9 G" e" }5 M2 X# X) v' w/ l
注:  U" g/ D/ a7 [' p9 S
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项2 r$ R! b5 ]) A, Q: _, A3 h! q
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.$ e6 g  f, I6 f% S
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.5 z& U# _0 _" Z
九. 交叉查询+ l3 A+ ^* ~6 ~8 F" y5 m
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
" l- @" M& X5 ~Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
( Z3 A" f6 s3 w* N6 [TRANSFORM aggfunction+ G0 q6 a& Z) B. h# S5 _7 y
Select 语句
# n# o1 m8 b5 k( o. gGROUP BY 子句
. R+ \0 n: I' x% J8 _4 G$ ZPIVOT pivotfield[IN(value1 [,value2[,…]]) ]6 j6 Q! h9 i5 p. ^+ T
Aggfounction指SQL聚积函数,6 g+ r& I" r1 ?$ T
Select语句选择作为标题的的字段,# n7 t9 L  d+ L2 g0 a- z
GROUP BY 分组% ?6 Y/ K% |4 T4 T/ }, J
说明:
. [$ y" W" ]% f) X( O8 @Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.1 b9 L6 a3 \- v7 c" m5 q! J9 _* f
value代表创建列标题的固定值.' ^) }1 x. G' q. }) c4 ?6 q
例:显示在1996年里每一季度每一位员工所接的定单的数目:' |' [( v' B5 w' g
TRANSFORM Count(OrderID)9 F* R  E* B1 D
Select FirstName&’’&LastName AS FullName
% b6 m0 `" F/ H4 P1 l1 f2 o, `8 f+ pFROM Employees INNER JOIN orders
' }3 Y. V: m8 g  n& t4 yON Employees.EmployeeID = orders.EmployeeID
; @, D, [, }* EWhere DatePart(“yyyy”,OrderDate)= ‘1996’
: K3 r1 A7 u+ B+ \GROUP BY FirstName&’’&LastName
' \0 ^6 [/ {8 H) f& M" UorDER BY FirstName&’’&LastName; G/ y9 P3 Z7 d9 G; C* W# V& J2 h. Z
POVOT DatePart(“q”,OrderDate)&’季度’
6 M0 B9 B4 y$ j) H6 O. F十 .子查询
& o) Y' q( K+ o( c子查询可以理解为 套查询.子查询是一个Select语句.. ?; }; h5 T  A6 @8 h
1 表达式的值与子查询返回的单一值做比较3 v% F$ k! p) j4 c
语法:" h# Z8 j! X" i/ u0 E$ i, I
表达式 comparision [ANY|ALL|SOME](子查询)8 _' g5 W0 O( }! W1 H
说明:; J& R  U' r! q* j% _
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.4 k5 N5 h5 V# }& V9 c* L/ |
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
4 X2 `# z4 e7 w* u# zSelect * FROM Products+ u" O+ N( l, {9 P5 }
Where UnitPrice>ANY8 u4 H) q1 V8 t! M
(Select UnitPrice FROM[Order Details] Where Discount>0.25)4 ^8 p* d& Y% u- m8 }
2 检查表达式的值是否匹配子查询返回的一组值的某个值' M( S; [% \* T8 ]
语法:3 R: S1 [2 P/ C) g- M8 F, V
[NOT]IN(子查询)5 V) i5 O: ~, b+ `$ R( H+ D/ G
例:返回库存价值大于等于1000的产品.5 D$ o( e- `1 Q4 J9 c, R
Select ProductName FROM Products
' ?# O' [( y" r( Z0 yWhere ProductID IN
0 j7 G. {# P1 m(Select PrdoctID FROM [Order DEtails]9 |* {4 Y6 O0 X, r* o: K
Where UnitPrice*Quantity>= 1000)% [  j+ o( u& j8 D
3检测子查询是否返回任何记录
& }( L1 V- V; q! ?4 G: K语法:% ?) l; u2 I/ L. }; r
[NOT]EXISTS (子查询); L, k5 R3 b2 c* r9 l
例:用EXISTS检索英国的客户
! \3 Z. ~& u) n$ aSelect ComPanyName,ContactName
) c# E/ T+ C% m1 g% zFROM orders- W4 p; j% N' r/ O  C- e
Where EXISTS
, t* S; u4 w5 R6 I- A1 Z; \: B(Select *5 @" i5 Z6 V  x1 j" A5 c
FROM Customers
+ [% w9 H: X1 f) f' A6 O  [6 BWhere Country = ‘UK’ AND* z9 Q' O% |" h0 x$ C
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-2-3 17:54 , Processed in 0.026001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部