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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
) h5 O& x+ }% \# `7 X, m1 ?' O$ j
( f* _/ B3 i7 v+ Nselect distinct 字段 from 表名
0 w8 Y: y/ A  {3 b7 ~, l4 l6 `/ }$ xdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
/ O5 s( D! a. W一.Select语句的完整语法为:
; z$ F9 j1 S, h; I' D; c0 e( Y$ l+ {; sSelect[ALL|DISTINCT|DISTINCTROW|TOP]; x- M8 {' S1 }1 ?
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
* K2 C" g+ h- Z( X* V' xFROM tablee xpression[,…][IN externaldatabase]
6 d/ t2 t4 J( o2 g) f[Where…]
" v" l% u5 m" }0 h! B, f2 d[GROUP BY…]3 p- K' z" a* O* t4 i7 u- ?0 E
[HAVING…]4 D8 C+ l) \" V, }% @" d
[ORDER BY…]! j! x. j1 x2 G1 c7 k" N& T& ]! T
[WITH OWNERACCESS OPTION]
- G1 f! m% q& t& Y% e! b说明:
* Q# A! a2 d! y/ K# q用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。8 {1 @& E& k' i3 e; v
1 FROM子句, ]0 v1 \9 q1 P
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
& t" j. c% F3 [$ p6 |例:下列SQL语句返回所有有定单的客户:) h+ e/ d( N! H. {1 j
Select orderID,Customer.customerID( h) ^% T1 e) y' S
FROM orders Customers$ l6 w- P* j9 _6 T# m' T- A3 I
Where orders.CustomerID=Customers.CustomeersID7 l4 Q! m+ ^: g- q7 v
2 ALL、DISTINCT、DISTINCTROW、TOP谓词% |7 D  o! K  u0 j0 ?- p' Q8 [
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
1 y/ o9 u) A2 ~& H例:Select ALL FirstName,LastName# D  I( S9 J% F6 m/ h! ~
FROM Employees
- w4 v: g# I; v+ I/ F, p/ ~(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。; V" T. a6 w* \
(3) DISTINCTROW 如果有重复的记录,只返回一个
2 v* [7 A9 c" X8 E5 r(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
6 q1 D4 |. ^' _5 @. }例:返回5%定货额最大的定单
$ X7 ?8 j3 X& E# \" E6 u& HSelect TOP 5 PERCENT*
% H+ ^( e# \. g& ]8 v7 aFROM [ order Details]# w1 r" O7 L+ b: ?
orDER BY UnitPrice*Quantity*(1-Discount) DESC* m0 Y, x9 \# ~5 o6 \. b$ P
3 用 AS 子句为字段取别名
5 t' A; d) ]+ ]- P如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。1 ^" S  |( i+ d: _( h8 v
例:返回FirstName字段取别名为NickName
0 I( Q- ~4 _& z, qSelect FirstName AS NickName ,LastName ,City
; S$ A8 ^/ S7 |! K& eFROM Employees3 e7 |' ^! V$ O
例:返回新的一列显示库存价值
6 A( _" o2 ~! `3 F$ USelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock7 {! ?! f# S. ?- n$ G2 ?
FROM Products) \# b: Q: _7 v4 ]- a6 H
二 .Where 子句指定查询条件
2 T8 h; |. [9 _1 P) F. ?/ K; D1 比较运算符
% z8 \* V- U$ A比较运算符 含义. v$ h+ F) _0 L- L' u, i
= 等于2 m' T+ F5 L( K2 |5 B$ q4 m8 m
> 大于
: q  C4 b3 @" ?- M: b( D< 小于& Z0 k' t  T4 n% D% ~
>= 大于等于. R3 |! s6 Z' F: R' u3 p8 r
<= 小于等于: f+ o5 p. n4 H! X0 o3 e  k2 X6 b
<> 不等于0 v* A9 p) h) _8 d" @7 m9 i! t0 u
!> 不大于2 o8 L6 ]2 w/ C; p# j0 _
!< 不小于
! o8 l9 \8 O% W' A, G例:返回96年1月的定单; y) ?1 J1 D& p4 w0 N9 j/ _9 w7 n& J( H) a
Select orderID, CustomerID, orderDate
# E0 B) U# X$ c* U  [FROM orders6 Y) j4 w& _4 Y- {) _, W
Where orderDate>#1/1/96# AND orderDate<#1/30/96#, t0 j, x! w, ^! b, j+ U
注意:3 ]& x2 i5 d1 C9 m& o$ E' ?
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。4 L* v! _' S/ [7 O' r
例:
6 x4 X, P2 {0 G* P8 Z3 NWhere orderDate>#96-1-1#3 `9 s; V  \, N
也可以表示为:
1 T( v7 }8 i6 }! q/ q3 Z5 }& T: EWhere orderDate>Datevalue(‘1/1/96’)& t" p1 ~1 ]! C. F# ]* t- I( U
使用 NOT 表达式求反。3 t: `+ y0 H& ^( I6 u/ N
例:查看96年1月1日以后的定单! V6 |2 C( ]* r* n9 o
Where Not orderDate<=#1/1/96#
5 F4 O1 o) m+ Z2 范围(BETWEEN 和 NOT BETWEEN)
$ O9 r& l$ w2 v; d% N/ ?5 v4 O0 P6 yBETWEEN …AND…运算符指定了要搜索的一个闭区间。
* t+ v3 L) K  s2 o  _; k  a例:返回96年1月到96年2月的定单。" e9 r" t' ?. x* P' T4 C
Where orderDate Between #1/1/96# And #2/1/96#
0 V4 I1 \) `5 `3 列表(IN ,NOT IN)% r0 y$ m" Z) n# f& y
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
6 X& I4 c: t! Y2 R例:要找出住在 London、Paris或Berlin的所有客户
# L# w; z% b& k- `" C; ySelect CustomerID, CompanyName, ContactName, City0 ~' L) H' ^( x# I1 P+ b
FROM Customers# ~& m* ?2 {% `, T4 p1 r
Where City In(‘London’,’ Paris’,’ Berlin’)
" R+ t' g" }. A4 模式匹配(LIKE)
# o2 F: i! d; m& X, iLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
3 v( R% s" ^  HLIKE运算符里使用的通配符- A6 ?% ^+ W! \! a/ p( N9 |8 G  s
通配符 含义
, y0 @+ T) J0 ~5 V4 Y? 任何一个单一的字符2 t) R' Q" O; Y/ I& |) t4 n% q
* 任意长度的字符
2 s. ]" }2 Y& S, Q# 0~9之间的单一数字
3 h* j7 n: s  t  z( k[字符列表] 在字符列表里的任一值: K* {5 @' H9 i6 H
[!字符列表] 不在字符列表里的任一值& g) k+ k, u- N
- 指定字符范围,两边的值分别为其上下限) G: Y( r9 y" v4 |
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
# i  e& \) r+ i# Q) b4 {+ lSelect CustomerID ,CompanyName,City,Phone2 Z+ v( {6 ]1 T" S- K; E
FROM Customers( q& d  r# x* k  K- K0 k+ m0 x( i, n
Where Phone Like ‘(171)555-####’3 l( ?& B" j+ j6 M$ `* ]' {
LIKE运算符的一些样式及含义
6 {5 t# W" p  ~2 N样式 含义 不符合
1 t5 x4 b! m) e* ^* o6 N  Q+ ULIKE ‘A*’ A后跟任意长度的字符 Bc,c255' p+ Y3 N8 L' d$ ^/ ]1 R
# LIKE’5’ 5*5 555
4 _, t2 n# r& S- C1 T. HLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
# A3 t, q- Q' @& C! w. F8 sLIKE’5##5’ 5235,5005 5kd5,5346" V! u  t* d, }% ?9 o
LIKE’( n( V- K# |7 j
[a-z]’ a-z间的任意一个字符 5,%; x- X8 R4 d+ j
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
# }" Y9 n- A' ~7 [3 c  H6 BLIKE’[[]’ 1,*
) f1 @# K& ~+ E% @三 .用ORDER BY子句排序结果
/ I6 O! B3 y' g4 b  N1 yorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
9 `& J  S( [& P' T% k- _1 SorDER子句中定义了多个字段,则按照字段的先后顺序排序。
" F4 e% ^. ^9 O  l* F% ?例:
; N* V% I# u. j6 S8 l1 ESelect ProductName,UnitPrice, UnitInStock
. r4 g2 |8 h. UFROM Products
9 o( B2 l$ o8 w4 [1 sorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
* _, C. q9 Y  ]' qorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。* F$ |4 G, X5 l& Q
例:下面的语句产生与上列相同的效果。8 j6 G% c2 F! `; R, i$ u& i' m
Select ProductName,UnitPrice, UnitInStock9 b# D' M  R* ~$ Y. z! B" \  ~
FROM Products2 g5 k4 G7 \. U) F8 P1 G2 {' X* E& f
orDER BY 1 DESC , 2 DESC,3
$ v0 T7 y0 R) @! Z1 K! n5 A3 \) {四 .运用连接关系实现多表查询
8 \$ H( r! M3 Y& R1 Y! ]( f例:找出同一个城市中供应商和客户的名字
, g: |. q/ b5 P  P% vSelect Customers.CompanyName, Suppliers.ComPany.Name  e2 k8 j" e/ s4 g0 o& q. I* K1 g
FROM Customers, Suppliers
4 p0 z& ]: V  Q& e9 RWhere Customers.City=Suppliers.City+ T& n! B# h( I( z+ J
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
% R1 w. _# c8 ~9 c* DSelect ProductName,OrderID, UnitInStock, Quantity7 A) j% @! ]# Q3 l
FROM Products, [Order Deails]- O; z, Q2 X% b
Where Product.productID=[Order Details].ProductID
1 T2 X. s7 S  }AND UnitsInStock>Quantity1 `' A) X. a- ~3 D$ H# Q
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
' y: ]* N, i9 ?- c6 {语法:
1 [' }% L- r+ {2 QFROM table1 INNER JOIN table2% j: }, O9 P- ?0 ?0 |& l) Q
ON table1.field1 comparision table2.field2
  u, ]3 X( p9 A- |; V其中comparision 就是前面Where子句用到的比较运算符。; c$ i' w) V% B: P
Select FirstName,lastName,OrderID,CustomerID,OrderDate
$ f/ f4 b+ y9 }; \' n, HFROM Employees) f, s9 C+ d/ l, j5 C7 Z
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
0 |/ C6 H! k5 _' }注意:( B' E6 r* D. @5 F) V" J+ B
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
9 F/ d, D: A3 v" ^在一个JOIN语句中连接多个ON子句1 Z& V, Z2 T/ c8 n( c3 _
语法:
" G2 o& u; c2 @) g0 h" HSelect fields
6 p, w# ]% \" f; a; d; t/ T/ kFROM table1 INNER JOIN table2  L% j9 n& g  o/ a! r
ON table1.field1 compopr table2.field1 AND, R3 Q# e" V" d$ K5 O! f6 g( P
ON table1.field2 compopr table2.field2 or
- E. x. \$ l) w5 T: R4 u% uON table1.field3 compopr table2.field35 B3 g% j, E% G7 K" V5 E$ ]
也可以
$ F, d! |3 y' w8 _6 p' k+ g+ CSelect fields+ l# }# j! I; W& z4 q/ T. M5 q
FROM table1 INNER JOIN& j7 {" t- y( M7 y
(table2 INNER JOIN [( ]table33 S5 f0 z# J& T: ^2 S
[INNER JOER] [( ]tablex[INNER JOIN]
: k7 b( B7 V- y* I9 A2 Z' a: xON table1.field1 compopr table2.field1
& v7 l& w2 K" t0 qON table1.field2 compopr table2.field2
/ ]% Z2 m8 o' Y0 YON table1.field3 compopr table2.field3
1 m& X; R0 H3 \, C3 }: ?外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
( L3 m5 h1 s4 _0 r5 T. J  E6 CFROM table [LEFT|RIGHT]JOIN table20 |7 `8 W0 R2 @- j# a# C* g
ON table1.field1comparision table.field2, [* b! p, R  H, V* O3 {8 ]! U% R
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
$ {) J- M  Y) w5 {" f  _. O例:不管有没有定货量,返回所有商品% c. e9 }% U* U" j
Select ProductName ,OrderID. P4 F: g6 T, \" B, k
FROM Products
  [# z/ v2 N# I' s, }4 ZLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
( R, T! _* M+ s: H6 a右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
0 W: u* W  _7 l" P8 i' O例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。  X. v) m- A0 Y. J, O4 B  L
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
  Z& r/ @: z4 c* J4 F2 L- u# ^Select *; r# g* B; c7 V  T% H4 x/ y% X
FROM talbe1
8 B9 ?6 o7 v/ o6 W& aLEFT JOIN table2 ON table1.a=table2.c* Z" P) D: g9 l( p
1 连接查询中使用Iif函数实现以0值显示空值
) J# r" b9 d: V, M/ g# m8 B) XIif表达式: Iif(IsNull(Amount,0,Amout)
8 }% m; R9 H: Z8 z9 y例:无论定货大于或小于¥50,都要返回一个标志。8 k' N) J6 n! u; S3 ]+ `4 `
Iif([Amount]>50,?Big order?,?Small order?)2 F9 y  h8 }6 R0 j0 c7 w% ]1 s8 A$ C
五. 分组和总结查询结果( H! c) u* G$ V- `- Y  c+ S+ z
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。* H0 g5 u( I8 T  V$ P6 ]
GROUP BY 子句的语法
7 }9 `6 n: i. V9 W2 e9 dSelect fidldlist
. C! ~+ B, W9 @FROM table
; {! n2 _% d: J" \1 WWhere criteria$ p/ u8 Q4 P- \5 U; _
[GROUP BY groupfieldlist [HAVING groupcriteria]]
6 D0 w' l+ Y2 ^+ y6 U: _: ?- c% M# W注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。) N2 `. N; j3 S( |- V
GROUP BY字段中的Null值以备分组但是不能被省略。9 A+ ?+ M3 `/ M1 q1 L: j& t& ]: h
在任何SQL合计函数中不计算Null值。
3 P0 \/ o/ W2 x; j; R0 dGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
1 B/ _4 `( a6 Y7 q例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
! L/ {1 u$ [: f1 Y9 O5 ^Select Title ,Count(Title) as Total
$ ~2 L5 s4 E# J/ [! `FROM Employees( L) I0 _+ h3 ~! K% e
Where Region = ‘WA’
/ `- v; V8 V/ e. F" N- Q& [GROUP BY Title/ U) o; J# [6 L7 ~$ N5 C% I
HAVING Count(Title)>1/ D4 f5 _$ ^0 V
JET SQL 中的聚积函数
3 ?/ f# s; s: ^" m2 k) f聚集函数 意义1 T. _) G. X, n( @2 l9 L
SUM ( ) 求和
$ k9 _, j% k" n" Y' ZAVG ( ) 平均值
/ k( D3 W6 D9 \# u3 ^COUNT ( ) 表达式中记录的数目
) C+ C- b- K7 D! \( M9 KCOUNT (* ) 计算记录的数目
% l3 x" Y4 t9 M- QMAX 最大值8 n, C* u% V, l1 B5 _& M9 a( u
MIN 最小值& {% b" W7 P# X* ^+ d& a& Y1 ^
VAR 方差
& T6 ^: k! o8 h% T% z* r3 T9 ZSTDEV 标准误差7 M( k7 M1 \2 I8 k
FIRST 第一个值2 X' q9 N9 x8 y- {* z
LAST 最后一个值
) r' m0 v& ^3 n# R, R4 O6 \8 }; u( C8 E六. 用Parameters声明创建参数查询( J1 H9 H- o8 L4 \+ X2 y
Parameters声明的语法:
  j, r# Y+ c6 {6 ZPARAMETERS name datatype[,name datatype[, …]]
+ P0 @, ^, f. P; c6 u; H) Q其中name 是参数的标志符,可以通过标志符引用参数." Z4 |1 A  e% m3 Q9 ]: ^
Datatype说明参数的数据类型.; i* J- ~9 K, V2 v. r- Z. u: P9 \
使用时要把PARAMETERS 声明置于任何其他语句之前.* ]8 ~% Z4 i. N' I( ]; [
例:" V4 c. p' Z6 N7 h" X0 G
PARAMETERS[Low price] Currency,[Beginning date]datatime
0 R; V6 u' T8 f" {1 L9 zSelect orderID ,OrderAmount
/ O- }" L% L  J  h% [- ^; \6 ?FROM orders: @( q% ^+ p5 j) l
Where orderAMount>[low price]# g% Z! V$ T" `& s
AND orderDate>=[Beginning date]
8 A- F6 B, D7 y7 y, V* u9 u七. 功能查询
/ C. b+ v1 W2 b6 D* @! [& Z所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
  l8 N3 W: X8 H1 更新查询; q: E4 O+ C$ I- c
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
3 M( k$ Y  A) Z- ]8 [  ~9 d* C% H更新查询语法:: A; C( D/ _9 L, g7 I  O% B
Update 表名
. q: ]. C9 a, o' XSET 新值+ G+ e# k/ M1 j: s( Q
Where 准则
! Y, F( g, @$ {' @9 o例:英国客户的定货量增加5%,货运量增加3%6 Q7 }5 f( Z5 Y1 j; @
Update OEDERS1 U1 v( P- y  Y) `5 S( G+ t& V
SET orderAmount = orderAmount *1.1
8 R4 _( G  v' ?3 R2 c) I# iFreight = Freight*1.03
2 g  u6 J) H9 WWhere ShipCountry = ‘UK’
3 M2 C2 v4 r$ H5 C, [2 删除查询
" X  p$ k8 c5 _' lDelete子句可以使用户删除大量的过时的或冗于的数据.
7 {+ _; a( M- I7 j" g注:删除查询的对象是整个记录.8 y5 d7 }& U: {
Delete子句的语法:
3 U3 B3 I7 E3 ^/ k" N+ HDelete [表名.*]2 {+ Z# _1 J0 d* `: E1 e
FROM 来源表8 u8 w& Z, V6 E/ A
Where 准则: F& u0 I! c8 u* e8 E
例: 要删除所有94年前的定单$ S! d$ c2 M$ N
Delete *
( V9 Z" t% }* O* Z( o! XFROM orders3 v( X/ l& G9 @0 S4 b: n" {
Where orderData<#94-1-1#
! {8 P' j+ r* _7 I2 l/ {3 追加查询* B; |( F# m& @, e: W
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.$ p: ]. `( p, ~, \) G
INTO 子句指定接受新记录的表
* H$ |# y6 b/ @6 Z% {# svalueS 关键字指定新记录所包含的数据值.
& m4 O$ B/ B! }+ w  [Insert 子句的语法:
8 j; z: P8 N# jINSETR INTO 目的表或查询(字段1,字段2,…)
- y. R' j  q# f3 Q: n( M0 AvalueS(数值1,数值2,…)+ ^1 O  w% |% p, i. T3 b
例:增加一个客户
/ @2 y3 D4 A: J. uInsert INTO Employees(FirstName,LastName,title)
: I; q; [; ?3 L3 b# V2 LvalueS(‘Harry’,’Washington’,’Trainee’)
7 B& A, |. H; e6 ]; K2 p5 R2 j( o4 生成表查询7 c- [2 g# O' H9 J; i/ j6 ?2 r
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.# K* r$ P! k3 O! y
Select INTO子句用来创建生成表查询语法:
( t- O) y+ w" P9 S7 I* f  |Select 字段1,字段2,…
4 c& u* _" Z+ ^1 DINTO 新表[IN 外部数据库]
6 r) h% [9 b7 `FROM 来源数据库
3 h3 L4 C3 L8 N: \5 V9 ?1 qWhere 准则0 i8 ?7 n# K1 K! u  D5 v
例:为定单制作一个存档备份- ?, Q+ l* K' y* d+ F, `* Y
Select *
( l" H8 X# B: k' I0 o8 K" fINTO ordersArchive
+ x/ R* ?. T) B! R$ e/ x; |FROM orders
1 D* L3 ]+ z/ S! E八. 联合查询
( F7 S+ r" Y5 w2 {$ P& jUNION运算可以把多个查询的结果合并到一个结果集里显示.
# q5 u' B- [7 w2 oUNION运算的一般语法:8 @) v7 m6 |( L( L. ~4 |
[表]查询1 UNION [ALL]查询2 UNION …  i3 }" T: W& o
例:返回巴西所有供给商和客户的名字和城市
& N1 f" i( I. J3 v; h: G9 eSelect CompanyName,City& \$ [# ?! y  y; G* Q0 t8 G; m
FROM Suppliers
( H+ T4 ~) w1 q0 EWhere Country = ‘Brazil’& Q) D; [* T0 J8 X* p5 j/ p6 D
UNION
; d1 W; a3 }$ |* GSelect CompanyName,City
# i- b& }9 l" H4 I" U' g6 C* nFROM Customers
* w8 e: ^+ O( c) T; ]Where Country = ‘Brazil’8 e3 ~) r1 I0 r
注:* n; j- b) L; u/ `( x
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项* x8 T0 L; I8 o  F7 @
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.+ x. i% f/ C" X, C& c
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句./ b1 s+ U6 Z9 v1 t2 ]8 [
九. 交叉查询3 h4 i+ l* f* V3 V5 O
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
/ I0 _$ n4 P8 i$ H' z) a/ \% Z$ bMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:5 a1 B3 a! g) G2 @7 G! X2 c& G
TRANSFORM aggfunction% ^4 f) L7 k5 _& D( C
Select 语句
; M  Y0 `2 m1 t' H( i0 bGROUP BY 子句7 ?! N8 F  n  r8 ~  D# H9 K$ Z/ w
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
+ I/ M' ~+ j/ ]' GAggfounction指SQL聚积函数,
; S! [6 O# E( FSelect语句选择作为标题的的字段,# ?- |5 x; }! \8 z8 q% W
GROUP BY 分组
: Z! b  x+ `; h+ H说明:
7 d0 u( q; G( l) UPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.! d2 m# Y. U3 A& O
value代表创建列标题的固定值.
8 @) ]" X6 F- u3 |* I4 v  @例:显示在1996年里每一季度每一位员工所接的定单的数目:" |" {; ?. _" {( u5 D4 i9 e
TRANSFORM Count(OrderID)7 z1 D! X  `3 [5 ~
Select FirstName&’’&LastName AS FullName
! `: g# _7 L7 b6 Y/ rFROM Employees INNER JOIN orders: _; s& P- _& ?
ON Employees.EmployeeID = orders.EmployeeID
0 L6 f1 z* |6 ?; wWhere DatePart(“yyyy”,OrderDate)= ‘1996’9 R& a/ `/ C5 Q6 v3 u
GROUP BY FirstName&’’&LastName' H2 j. O* o! y' c8 m- l
orDER BY FirstName&’’&LastName8 C& z5 W; B4 ]4 A( b# U
POVOT DatePart(“q”,OrderDate)&’季度’- E! g" S# k1 W: X
十 .子查询4 {* B6 k/ D$ V9 B, ~/ s& q9 B
子查询可以理解为 套查询.子查询是一个Select语句.
- {8 N( X9 M2 N7 B, a5 V1 表达式的值与子查询返回的单一值做比较! D" I6 ~9 E: x2 M* Z  X1 K, @( J
语法:) F# t3 ~$ w9 F+ ~6 h
表达式 comparision [ANY|ALL|SOME](子查询)
* j' e! O2 a3 p6 k! F说明:; D9 i4 w) V  j# e/ F, W
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.9 c" v$ a* o3 ?& g  z) D
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
4 j4 r0 r( z  f8 w. bSelect * FROM Products
/ z- |, x, I+ x4 U! T9 LWhere UnitPrice>ANY
' S) F+ J! N' }* t(Select UnitPrice FROM[Order Details] Where Discount>0.25)
( R" R" L9 j! `3 U+ q' K2 检查表达式的值是否匹配子查询返回的一组值的某个值' s$ N3 J# ]; g4 M
语法:2 s; c. u# H- o9 V; D
[NOT]IN(子查询)9 Q2 a1 ~  ~% i: {6 }7 X
例:返回库存价值大于等于1000的产品.8 t3 Q. Y. n0 e& r# l( v7 Q
Select ProductName FROM Products
2 L. Z/ q) _3 W# `# p" ]Where ProductID IN$ o( `8 Z. N/ q$ L4 J( U# I9 y: E4 c
(Select PrdoctID FROM [Order DEtails]1 T) p4 s% C$ s& p. z. l) l+ F' Y! q
Where UnitPrice*Quantity>= 1000)) ?1 G! _, S& B8 C3 M" _, n) Z
3检测子查询是否返回任何记录
/ ^+ g3 [4 C4 m, Z& n) y0 n5 w语法:
" G; t6 F* D) w% W, L  O[NOT]EXISTS (子查询)' O8 r  Y, m& Y* f7 f4 ~$ F
例:用EXISTS检索英国的客户# K5 G8 @. V" ]/ k7 L$ Y
Select ComPanyName,ContactName
  K% L# P( j% V0 `$ x$ A0 v0 eFROM orders
8 [- c6 {) I/ R* JWhere EXISTS
, J' C2 v. i- p9 l(Select *
9 \' c7 h1 z, U- L% vFROM Customers
3 N/ {( w/ C0 C1 c7 N) oWhere Country = ‘UK’ AND
8 e* f, L& c2 A& ]$ [1 uCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-7-15 14:06 , Processed in 0.026001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部