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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |正序浏览
Access如何筛选重复数据以及Select语句的完整语法
% N5 E1 l1 j2 O/ n! ~1 N
7 B! f1 y* W- ^select distinct 字段 from 表名
; \5 G: c" Y7 _9 ~, N1 odistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
4 ^* g; Y4 l9 v! K3 B一.Select语句的完整语法为:+ y6 O4 t: r3 S4 d' u9 K0 l0 W
Select[ALL|DISTINCT|DISTINCTROW|TOP]
/ n; q& D0 g9 C{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}6 _) G. s7 x* O2 z: d& P
FROM tablee xpression[,…][IN externaldatabase]
: F' s' |1 u+ u3 v/ o8 R[Where…]
* M% E' r- m6 v* F2 Z1 N[GROUP BY…]* v8 X( p( {* u
[HAVING…]
; Q8 f  q7 |& C! |0 |2 V% U2 K[ORDER BY…]
& j7 p# q& X% O2 f1 _[WITH OWNERACCESS OPTION]
% v0 l1 e4 P4 t说明:
& H6 G3 {( Q  |+ E; s, F用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。# _. u: P& {) Y3 e. n: G
1 FROM子句
1 ^- M, t( ]2 Y, y$ CFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。+ ~% i9 _* M; m1 _
例:下列SQL语句返回所有有定单的客户:
+ p7 _- W' R( U0 w& gSelect orderID,Customer.customerID) y; Y8 H' F) T. h0 U$ t
FROM orders Customers; L' w7 Y7 o( m6 ]0 D0 l. y: C
Where orders.CustomerID=Customers.CustomeersID* S  J1 q" R7 ^0 W- s
2 ALL、DISTINCT、DISTINCTROW、TOP谓词( o. R# T: G2 Z& A) t- d! P
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
1 P" V5 `  g, z; H- K例:Select ALL FirstName,LastName
% J2 I4 W- c/ \$ Q5 L1 F8 NFROM Employees
, }( g3 N7 Z6 g$ u. Z- C# ^(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
4 d4 L( U! j+ {- T8 S# y- ^(3) DISTINCTROW 如果有重复的记录,只返回一个, W! f2 r/ D4 q- ~) }: e7 F2 Y
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
5 B' R3 b5 `% z% D3 G! g5 d例:返回5%定货额最大的定单) W3 R. ^' j& Z
Select TOP 5 PERCENT*+ h0 y/ N6 j, K! V7 M
FROM [ order Details]) x0 t& V7 v: c3 n6 ~6 }
orDER BY UnitPrice*Quantity*(1-Discount) DESC7 e$ k2 N, Q6 ]8 s* w
3 用 AS 子句为字段取别名
4 {: [/ k3 R& m- f4 @4 e+ C如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。( ^% C; ?/ p+ O' M; S$ F
例:返回FirstName字段取别名为NickName, O- a1 Q. `# q& C9 S# M
Select FirstName AS NickName ,LastName ,City
& e' m0 l3 O5 n9 M& w0 h, PFROM Employees
2 z1 r9 x, x. C! U8 n例:返回新的一列显示库存价值
0 n) g8 ]4 F" G0 O6 OSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock, u8 P' W& k. u: \, r
FROM Products
( g6 v+ Z8 M% u3 S) z4 X二 .Where 子句指定查询条件  k' S6 S5 _5 Q) s5 b6 I' s
1 比较运算符
5 B- y, R& l6 q9 K比较运算符 含义
( R  b8 o8 `3 G6 ]2 C= 等于
: t- D" ^. \% E+ J> 大于9 V2 F' P2 k9 w) [
< 小于, u: j" r* w$ F/ p7 \$ c. @
>= 大于等于
  k) E. V5 O1 b/ R7 H<= 小于等于
% H4 K" x& e/ e- \/ C, e<> 不等于" g/ M7 N+ a- ~9 E4 |9 j0 B
!> 不大于+ s& D' V1 ?. ^/ G+ Y( Q
!< 不小于
0 [/ d& g1 T" |( |/ S: B6 D0 b: o9 \例:返回96年1月的定单1 L5 n' n* W. _% k3 u' S' ]
Select orderID, CustomerID, orderDate
& t! l# s, U3 `6 ?6 i$ aFROM orders
; `# `! C7 e1 H8 a* c/ I6 R' HWhere orderDate>#1/1/96# AND orderDate<#1/30/96#  x& \& X9 U3 e4 O1 R9 g& ^
注意:7 Z1 x7 @% H1 h# w
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
8 ~: l* d# e; o( M例:5 q- g  q+ P8 v+ Q! U
Where orderDate>#96-1-1#
$ `1 k6 V* Q+ g5 a% m+ S3 h6 o也可以表示为:1 b) c9 q9 J6 D* s
Where orderDate>Datevalue(‘1/1/96’)
) q3 W5 O/ d# `' g2 ^6 x使用 NOT 表达式求反。6 @2 k  q7 d0 p" W5 Z
例:查看96年1月1日以后的定单- ]1 c2 x( W5 K9 G, B
Where Not orderDate<=#1/1/96#
* {% W% U( W7 b$ i7 J! s; S5 s% M- K2 范围(BETWEEN 和 NOT BETWEEN)5 P! K- j7 B( j! \, g
BETWEEN …AND…运算符指定了要搜索的一个闭区间。5 u1 q2 T! t0 x. o" |# B
例:返回96年1月到96年2月的定单。
  |! l' A0 K9 ]+ x+ k2 MWhere orderDate Between #1/1/96# And #2/1/96#0 u/ @; y& b0 h. W3 A; A7 y  y0 \
3 列表(IN ,NOT IN): Y/ k- _: a1 [1 c1 r; C" N! k
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
: Q( x1 R+ e2 z: o% ]  A例:要找出住在 London、Paris或Berlin的所有客户
, A- J: c5 I9 X$ u9 ]1 E- @Select CustomerID, CompanyName, ContactName, City
3 C9 P$ M: G+ v  o* o! E& w  ]7 iFROM Customers
; Q* z' o/ E1 n( s+ k) E5 D0 \/ qWhere City In(‘London’,’ Paris’,’ Berlin’)' j1 z: K4 q; q; u3 ^, K7 ]
4 模式匹配(LIKE)
+ C0 Y% t- c! I2 JLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
* h/ t1 T$ J: O7 cLIKE运算符里使用的通配符6 u0 @1 @$ h+ }- k( J) ^7 Y" m
通配符 含义& J/ w/ c$ a6 U4 W- N# k
? 任何一个单一的字符! J' X% Y6 y4 O+ Y& D0 M( L
* 任意长度的字符" ^% q: X4 `) s! [! M
# 0~9之间的单一数字& s% {4 C; v. O. }' O) A
[字符列表] 在字符列表里的任一值
$ k$ f3 N- s8 }[!字符列表] 不在字符列表里的任一值0 e, l  m1 G( ?. g: s
- 指定字符范围,两边的值分别为其上下限
/ S) O# ]- a' w  ~2 a例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户1 ?5 g/ F; z3 i5 P
Select CustomerID ,CompanyName,City,Phone
/ r& h! Y6 U3 tFROM Customers
; q/ Q$ o+ g3 _1 V) `$ SWhere Phone Like ‘(171)555-####’$ C: N0 m. x' t. m
LIKE运算符的一些样式及含义
/ U+ Y/ w! [' b- D, w  g. [. \1 e1 ~样式 含义 不符合* Q7 h0 V. y* \5 _- ~# V) T9 w8 x
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
9 N& E$ l# h$ \# LIKE’5’ 5*5 555+ i: K$ v7 s5 N7 |$ w9 R
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
, q4 b$ G. I) W: zLIKE’5##5’ 5235,5005 5kd5,53465 `& J' G* r5 p
LIKE’) s2 n" m+ @+ A& d! y
[a-z]’ a-z间的任意一个字符 5,%8 u* Y, T$ y  Q
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
, J, ?* R7 B) X. @. y& y% t4 M5 HLIKE’[[]’ 1,*9 C; V! h5 H# q/ D! d
三 .用ORDER BY子句排序结果/ A6 o- O- \7 w7 Y7 C
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。! n5 r; o) |! Z4 l1 v: {9 Z
orDER子句中定义了多个字段,则按照字段的先后顺序排序。, Y. a, s& [' X1 E4 r+ N" z
例:$ o# X& W; S- E2 g
Select ProductName,UnitPrice, UnitInStock. p4 l0 B0 y" M& d6 F5 a
FROM Products3 i' l" e0 Z4 F: h9 J2 {) S& e! J
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
; ?! H  y2 R7 norDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
$ A5 D" R3 d3 Q7 I/ P. \, q例:下面的语句产生与上列相同的效果。2 h$ ?" v& G7 q! V, h2 j
Select ProductName,UnitPrice, UnitInStock# G7 B) z7 p0 r$ W
FROM Products+ Y% a3 p/ T6 O9 d1 T
orDER BY 1 DESC , 2 DESC,3) |! M7 ?) H1 h( w3 N! O+ t" u3 O
四 .运用连接关系实现多表查询/ X; J) v& {) ?  l6 E
例:找出同一个城市中供应商和客户的名字
) k; ^- I6 k3 ^; Z: eSelect Customers.CompanyName, Suppliers.ComPany.Name
$ H) y% w" G9 B( H- uFROM Customers, Suppliers, @; t- T$ W) k
Where Customers.City=Suppliers.City
) F+ p3 Y1 M. `, W; b3 v例:找出产品库存量大于同一种产品的定单的数量的产品和定单9 p# R- C; C+ S% Q3 ]
Select ProductName,OrderID, UnitInStock, Quantity
6 L3 m2 `3 ]1 L1 J3 ^7 e9 OFROM Products, [Order Deails]4 ^- h9 n  z* }. w, k. `  v
Where Product.productID=[Order Details].ProductID  e  y5 K8 V5 Z/ y' D( W
AND UnitsInStock>Quantity
5 f2 ~( O3 B6 h' R( |% f. J+ i: E另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN9 e* u0 v; ^/ j
语法:
0 z1 A1 a6 x) A! v; `: gFROM table1 INNER JOIN table2
* F+ [+ _/ i8 @5 gON table1.field1 comparision table2.field21 }$ G9 N0 c. @1 _. X! A
其中comparision 就是前面Where子句用到的比较运算符。
2 k: z, b' Z5 [$ ^' Z6 c6 ~Select FirstName,lastName,OrderID,CustomerID,OrderDate
- H  \3 C# d. I9 [FROM Employees
3 o8 F7 f5 e* {8 r& hINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
( ~( T% }+ X6 h$ T6 B. h( t. u注意:- i; @  P2 O2 r  y* J
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
  ?! Y5 E( V" J! k在一个JOIN语句中连接多个ON子句
; W1 B. N( o& S! \4 g( d语法:' o4 ?' O$ `- \2 N1 x
Select fields
3 ?- O9 |2 A9 _2 \" w# ~FROM table1 INNER JOIN table2
: y1 a& j7 [& o5 y! ~& G% w" G/ J  BON table1.field1 compopr table2.field1 AND/ w4 [$ n/ W; n/ J) e7 Y
ON table1.field2 compopr table2.field2 or) P) ~5 w" h+ e# Z: d
ON table1.field3 compopr table2.field30 t8 }8 I8 o4 _$ S7 {3 U
也可以" {  O5 n+ H5 ]1 n
Select fields
: Q3 }  w, |' W: KFROM table1 INNER JOIN* `) k2 }( i" y* J- a
(table2 INNER JOIN [( ]table33 `! F6 ~  N( [
[INNER JOER] [( ]tablex[INNER JOIN]
0 _7 ]9 g$ d2 |; v' Y& P/ W) VON table1.field1 compopr table2.field1% m3 a1 f7 l7 s; I( Y
ON table1.field2 compopr table2.field2
2 _6 Z! @5 a, _: T! D. GON table1.field3 compopr table2.field30 [! h+ {, t9 B( @; E
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
- M- n' H9 K( R: I3 P& @! uFROM table [LEFT|RIGHT]JOIN table23 F/ V$ H" h: _8 o! T+ @+ {  S
ON table1.field1comparision table.field2
+ {$ \  p9 m/ d, Y% ]用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据- \5 m# w( h- y; W3 P; C0 x
例:不管有没有定货量,返回所有商品! i+ Z* F! Y0 A9 [
Select ProductName ,OrderID8 e9 V/ s- ~) d9 x; N; }
FROM Products
! u3 A. v& m+ x4 U) RLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
0 \( X1 t- U' Q右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
9 J1 x3 G+ R! y4 p例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
+ T5 [1 _$ S7 |9 o( \# s空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。; p6 W6 \! e% W. y. r1 ?/ i1 H
Select *
$ o8 N# J4 n. S) F8 HFROM talbe1
/ a6 `5 H9 V3 X, c- w* h. pLEFT JOIN table2 ON table1.a=table2.c
; M1 q" T2 O/ U( f% B8 Q1 连接查询中使用Iif函数实现以0值显示空值+ B# L% f& [, X2 ]0 I
Iif表达式: Iif(IsNull(Amount,0,Amout)
) r7 Z1 r, r: q# o- n- J例:无论定货大于或小于¥50,都要返回一个标志。4 {: P" @* o% u6 P; e8 G7 ]
Iif([Amount]>50,?Big order?,?Small order?)
' A% y+ }: g0 m/ i& P3 l* u% u五. 分组和总结查询结果
# l$ B% j: c" ^7 ]8 T4 S* \' y在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
* i, ~( A$ D1 K% D' o4 }! oGROUP BY 子句的语法
# u% |1 n7 C6 S$ g9 S9 ISelect fidldlist, ]" p& R; `7 m) }; l- F8 v
FROM table
& r+ \3 Q4 A" z* Q' Q( L8 Q% jWhere criteria# S/ C1 E" z/ v0 J
[GROUP BY groupfieldlist [HAVING groupcriteria]]2 {5 x: h) ]2 f+ ~" z7 V
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。0 t7 f% y4 r  B& v8 @
GROUP BY字段中的Null值以备分组但是不能被省略。
4 c3 ~' h7 M( B在任何SQL合计函数中不计算Null值。
2 K) G1 }4 w- J+ q* ]4 OGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。2 M; U' F6 k0 |. l9 y
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
/ I/ U8 t0 U* j6 p+ a/ V& K6 `/ \Select Title ,Count(Title) as Total
  K( T+ F! ]4 p& FFROM Employees
6 c- Y2 R* {/ @' V( hWhere Region = ‘WA’0 f* I; g. q5 a7 e! |% z
GROUP BY Title
* C3 p4 `4 F/ C1 a  n/ y- hHAVING Count(Title)>1
# F# F/ y( Q& V' ?, r: S2 EJET SQL 中的聚积函数5 J; Q: z6 d1 N( r3 N5 F* k0 b
聚集函数 意义0 V0 s) f! X1 F" J! N$ K9 K! n5 }
SUM ( ) 求和  p6 f! {" N0 A9 Z" w" p" o( _
AVG ( ) 平均值) }; Z+ n: x1 G2 a- R' ~& A/ i
COUNT ( ) 表达式中记录的数目3 R& M2 Y6 {. y- R( h
COUNT (* ) 计算记录的数目
& W7 v7 e3 ?2 q; M' j! R* kMAX 最大值
. Z4 l- g9 ]: U+ j" R7 q9 d+ t, [MIN 最小值
) k/ p9 S  ~. T9 {3 \0 UVAR 方差
! c1 `8 H/ U  l4 g  g  FSTDEV 标准误差
: d2 F: \+ d7 [* K0 m% q+ XFIRST 第一个值0 }; K; `4 ?- ~/ g
LAST 最后一个值: W& Z7 m6 }6 o
六. 用Parameters声明创建参数查询
3 b. Y" h. K# y4 |' fParameters声明的语法:
% W5 S0 b1 D( i/ _: APARAMETERS name datatype[,name datatype[, …]]
8 P: l5 r# A+ q其中name 是参数的标志符,可以通过标志符引用参数.
& `  Q7 ^" w+ `' a. K' |Datatype说明参数的数据类型.* {/ T- j% n5 o8 w
使用时要把PARAMETERS 声明置于任何其他语句之前.; b5 Y5 f, i% y7 }+ ^
例:' Q" j' A& N/ c* w; L
PARAMETERS[Low price] Currency,[Beginning date]datatime, @1 f* m$ v8 M% b+ p
Select orderID ,OrderAmount4 B8 }6 J& e/ c' D4 z8 ]$ w
FROM orders
& ?: K  n# Q2 ~Where orderAMount>[low price]4 W- |! o0 g% L# s% Q5 p. G2 U
AND orderDate>=[Beginning date]
1 Y( V$ D$ s+ ^7 s七. 功能查询3 j% |5 A% r7 J7 Z
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.( q4 Z: q( n9 ~+ H
1 更新查询
- b3 Q- F) D5 C$ s: f0 O2 a) w, g  WUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
( M# k. E, I+ @8 p更新查询语法:
  ?4 J! r. Q5 f, A- }6 P6 I1 m5 D" tUpdate 表名6 D* W' @9 s! Z  E
SET 新值
4 O3 x7 ]8 u4 Y5 A+ cWhere 准则
! I( u8 H; J' ]8 A例:英国客户的定货量增加5%,货运量增加3%
; e+ ?1 u/ n) y) L2 {! ?7 y$ HUpdate OEDERS
* b- z, ~( u5 {2 x9 T  jSET orderAmount = orderAmount *1.1; [6 w/ c' ~$ a* P- U$ ]
Freight = Freight*1.03
5 h" Y$ D: R, p; Z( S3 u( KWhere ShipCountry = ‘UK’
# b8 }8 a4 F) {( r3 Z5 w& m% L' z2 删除查询: S+ ^( H( s+ G9 U' M# _# }* X
Delete子句可以使用户删除大量的过时的或冗于的数据.; E  c! O, E! U
注:删除查询的对象是整个记录.2 ]( l$ U4 v7 v
Delete子句的语法:
- s* ~/ o/ @$ YDelete [表名.*]2 z* ^% K9 v& ]9 l. s# D# ^
FROM 来源表0 s, S) |; G. v8 S* [# ~+ G; v
Where 准则) {  Y; b6 I9 ^9 ^9 G
例: 要删除所有94年前的定单
9 X# z0 w  N( K5 ^Delete *! o* B5 r9 |1 a' F7 E  H, d
FROM orders' F1 F+ ^- ?* z: E% y; F! D
Where orderData<#94-1-1#6 E" l4 F" }1 X5 s5 q4 Q4 A+ d
3 追加查询
* t& B) w. a4 `) b$ i* S" [Insert子句可以将一个或一组记录追加到一个或多个表的尾部.1 L8 y. P# c' p& F
INTO 子句指定接受新记录的表
1 `4 ~! v# V" s9 n/ ZvalueS 关键字指定新记录所包含的数据值.
$ o9 t$ v0 \! c* U3 pInsert 子句的语法:
( Y) v* D; L: X/ u! }INSETR INTO 目的表或查询(字段1,字段2,…)% S4 R9 f3 t7 J7 o5 _: o
valueS(数值1,数值2,…); W4 g7 W) B- k6 B3 W
例:增加一个客户
6 x* G; t  u( G0 LInsert INTO Employees(FirstName,LastName,title)
. C, D$ y% M0 cvalueS(‘Harry’,’Washington’,’Trainee’)$ P6 z/ [6 D' j& O) h
4 生成表查询7 E& @! ^8 m" ?/ S- b
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
' ]2 o6 Q, f# u+ z+ TSelect INTO子句用来创建生成表查询语法:1 ]9 o4 g& w5 n2 C
Select 字段1,字段2,…
$ P7 I2 @1 i$ ^INTO 新表[IN 外部数据库]
* d' J/ E: B$ f3 _FROM 来源数据库5 w7 l) ]( R+ S& ]0 r! q( U# S; u
Where 准则; K) R8 P0 {! Q5 t! [& a
例:为定单制作一个存档备份
  ~1 v: h1 u2 ~  I; ], }( S9 lSelect *
) i) B+ y( i1 n) C, h$ ~INTO ordersArchive
# R8 [3 R0 p! Y4 M3 s  ~FROM orders: z$ R0 d8 `/ I  @
八. 联合查询9 K6 f" w$ h+ e* r6 R
UNION运算可以把多个查询的结果合并到一个结果集里显示.
* p9 E' l# l8 @  m; ]6 G8 G0 RUNION运算的一般语法:  J; ~! [, o) L, e. G
[表]查询1 UNION [ALL]查询2 UNION …
( U+ f5 I+ r8 }  H例:返回巴西所有供给商和客户的名字和城市* c" m" l) B# p( D% [
Select CompanyName,City) X" w% n, {3 e( R" @  e- B
FROM Suppliers
4 ~! A: G8 i, AWhere Country = ‘Brazil’
9 [3 m& ^' e/ O; X/ Y3 yUNION3 \# t3 _- q# p9 W
Select CompanyName,City
& a. h( P/ T+ Q+ a/ R9 [5 |FROM Customers
7 `; I# ~  M( ]' g. pWhere Country = ‘Brazil’
& z$ ~# r4 o7 F注:4 w! I( n8 i5 @# j( r7 A7 M
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
# A' g9 r# B, h3 h" l6 `# v: SUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.! ^, F7 ]- w  j4 N; `5 B! w
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
+ @; y3 `6 A) e, A九. 交叉查询
) x' \, k& U- j& v( [9 H- L交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
" X, I! _5 y2 y5 T; S- ]9 O! `! TMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:  b* b4 B0 i% a5 \3 h; [
TRANSFORM aggfunction
" ^% m# g4 \6 D% t  _Select 语句, G0 m3 r& W5 q# O* j0 a' e5 D
GROUP BY 子句
) {- d( D' G2 b6 g; P0 t, \" |PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
( a  q- G- d+ F, DAggfounction指SQL聚积函数,+ y( L. S* R( m9 E/ p8 S
Select语句选择作为标题的的字段,
, D5 Y5 s- Q4 f& j# A- u# ?GROUP BY 分组
" C8 r: f1 j# ^% t9 }7 M说明:3 a9 r9 M% T# W% ]1 {6 K1 T
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.- A" [+ |" P9 I9 i0 D
value代表创建列标题的固定值.
' Z' }1 a3 Q! S2 ]- e9 R例:显示在1996年里每一季度每一位员工所接的定单的数目:
+ u4 Y! [& w2 ?5 ?: |# i- iTRANSFORM Count(OrderID)  M" X. e9 ~% _
Select FirstName&’’&LastName AS FullName3 X" J1 F' q% Y! T; k& p
FROM Employees INNER JOIN orders
0 D; N! B9 y5 k. SON Employees.EmployeeID = orders.EmployeeID
; ~, @! Z( g5 {9 P2 x& PWhere DatePart(“yyyy”,OrderDate)= ‘1996’, X5 q# r2 K2 n/ s# Q" I
GROUP BY FirstName&’’&LastName
  t5 ?8 G7 C0 {6 NorDER BY FirstName&’’&LastName7 w& J. E. w2 ?- I: M5 e2 O+ v0 ?- }
POVOT DatePart(“q”,OrderDate)&’季度’
) S" C9 _9 s' V* A% w( F十 .子查询4 E  `9 Z1 ~" ~! ~
子查询可以理解为 套查询.子查询是一个Select语句.  e6 K  F. W& \# ]8 l* V
1 表达式的值与子查询返回的单一值做比较* p+ _) @+ C' b. L" l5 I  S
语法:# C6 L. D3 A) J0 D0 h8 o1 H
表达式 comparision [ANY|ALL|SOME](子查询)
3 S! f: v# _1 x$ \/ o! J5 @# P说明:) z) p& q% J6 Z! v% u! h) F
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.& Q4 Q/ h9 K( b7 m  G6 P- j$ p5 F6 H
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品, @9 [1 {2 r( d- a5 l" ^/ A
Select * FROM Products5 n/ g1 I/ u) `5 T1 h1 F. s9 T$ G
Where UnitPrice>ANY
1 f4 u4 }. G% A" ?, e0 e) y+ E9 z(Select UnitPrice FROM[Order Details] Where Discount>0.25)
( |% e- j! }1 P* s2 检查表达式的值是否匹配子查询返回的一组值的某个值
- ?9 z* \1 x" T3 H4 ]语法:
1 }0 z; e+ A8 d& J( d% w[NOT]IN(子查询)
/ `9 B+ e0 M7 |: y+ r例:返回库存价值大于等于1000的产品.
. f: h+ o4 f4 }/ kSelect ProductName FROM Products
$ B9 N5 P" l% W& O. ?Where ProductID IN
+ r1 o- o: a+ ^4 j: y, F" x(Select PrdoctID FROM [Order DEtails]
* f$ I& [2 c2 [/ {4 BWhere UnitPrice*Quantity>= 1000)
: Z$ p5 W. z$ q8 k: ^8 D9 @3检测子查询是否返回任何记录7 }# d9 T# I( g; S* |. n
语法:
/ t  F- |3 b* Q+ i; R1 G3 |[NOT]EXISTS (子查询)8 x( K0 G+ g( }4 ]2 H+ q/ N
例:用EXISTS检索英国的客户
" E4 B# q) m3 _Select ComPanyName,ContactName2 ~) B" e9 q9 o/ N
FROM orders9 }, |& i: D' y: [% t! P& b$ o# v
Where EXISTS; W* g2 h- ~0 ~' B) r) Z, _
(Select *+ i- i( P: y& \
FROM Customers
. S9 I9 ^& F8 h! N" T" |Where Country = ‘UK’ AND
7 Y! H1 D% ~# z. x3 h0 f# |/ }, k" uCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-1-28 12:25 , Processed in 0.029002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部