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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
! B) h1 _8 P% A* x
9 K6 o$ A, `. E- G" g0 zselect distinct 字段 from 表名) k: L9 ?9 H+ U; e7 H
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。# h& n5 Q' Y! p1 D0 a5 T/ g
一.Select语句的完整语法为:  }  H4 ~) L* L( V/ ^2 J
Select[ALL|DISTINCT|DISTINCTROW|TOP]
% c2 V% [# F2 k' |3 [4 ^9 E3 [. m{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
: O3 ~1 q& \3 A9 r) H) f  d- iFROM tablee xpression[,…][IN externaldatabase]2 p) Y5 o: _) D) w: n- D
[Where…]
' Z# x) s9 i( N- ?[GROUP BY…]
, M4 v( @% m- P) b4 t[HAVING…]  a, x% X, A2 E5 k9 r6 b+ n& |
[ORDER BY…]
: L5 I6 `1 K' L- ?/ [8 H[WITH OWNERACCESS OPTION]
( T7 e, q! B& X说明:2 Q8 W7 H# l3 I7 x# S7 k: s- b" j
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
+ `6 p: O  L! N/ o4 y7 k9 k( k1 j4 t$ g1 FROM子句: T' T" d. n7 u4 {  E( M1 i
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。- G( Z! o0 R! m8 L9 e& T0 K4 B% a
例:下列SQL语句返回所有有定单的客户:
" h* w5 k2 O1 P5 ySelect orderID,Customer.customerID
# ]) N" E5 H, x( q$ M5 R$ _) q5 K# MFROM orders Customers  `. H5 P! ^* J" m2 B" c
Where orders.CustomerID=Customers.CustomeersID+ T6 r0 W3 o* F  W2 x  v  R1 A0 L: L
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
. S6 J4 b5 X2 E, T0 z: g) H(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。! X( ~% i5 p3 u; @* z, |
例:Select ALL FirstName,LastName
& ]2 i1 L) l+ s) F* [FROM Employees
/ B- T8 C. \3 ?8 M( {% h(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。/ Z: @" `" m+ n) S& u1 w
(3) DISTINCTROW 如果有重复的记录,只返回一个
; p' N) s7 L- Y0 P, l. X(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
; B( L* l- z" Q+ k例:返回5%定货额最大的定单$ j6 m8 @) n- P/ }5 K
Select TOP 5 PERCENT*
9 \$ z* E( ^, D' H; l* tFROM [ order Details]$ _- }0 d% k4 w, F+ F) V  r
orDER BY UnitPrice*Quantity*(1-Discount) DESC& q! z: A! m* w9 N' q  r6 g9 T
3 用 AS 子句为字段取别名% ^2 [& C% N2 Z( c  ]+ @' Q  l
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。( o  N7 E: ~0 u: q& d
例:返回FirstName字段取别名为NickName; M- Q: a* [% T; n9 w
Select FirstName AS NickName ,LastName ,City& @: z4 Z+ ]) P5 q
FROM Employees, `4 v% Z& s2 _# O
例:返回新的一列显示库存价值9 `( P% I' g6 v- H; C5 Z; ~
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock  F' T0 ^% S- o' x# W, e
FROM Products. _; S' o( t& F. ^
二 .Where 子句指定查询条件4 b1 |! x1 S; P) P, G
1 比较运算符
: k7 _! R* p$ }比较运算符 含义+ T1 l/ O8 E0 ~1 ]$ {
= 等于/ O% {8 A+ W9 o/ z
> 大于
  F7 B1 ?8 O+ u5 u< 小于' i. b% u6 f& Q/ T: ^" Q& k
>= 大于等于$ p/ w% @5 V, B9 o, `; a' A5 V9 b
<= 小于等于
# X- i; v2 t8 G8 H( k9 [$ `<> 不等于9 e& F$ A# C! m5 {
!> 不大于
# U' F- _5 r  w! f+ k5 r  R!< 不小于
. I3 d# X5 {) U) z1 @, k/ I例:返回96年1月的定单
* g! ~# q5 S. {& @9 v& a5 nSelect orderID, CustomerID, orderDate
9 o- k9 l) X* y  k, `FROM orders
- |9 }. d1 E# xWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
* s% t& V" o% W$ a* a注意:) U' d, S& Z' R
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
- y( T, y# @1 g, _6 G9 i! O例:
1 ]+ U6 p! M. @' zWhere orderDate>#96-1-1#: w2 s5 X6 P% e" J
也可以表示为:- N* x$ z: z6 |/ f) q
Where orderDate>Datevalue(‘1/1/96’)% \9 w. E% J4 w0 J( A8 `
使用 NOT 表达式求反。
! X0 P* r- ^4 [  v例:查看96年1月1日以后的定单+ [( Y% Z* @* z" j! X. X
Where Not orderDate<=#1/1/96#
& i9 [- O8 z& B: C2 范围(BETWEEN 和 NOT BETWEEN); |& ?" Z* j6 e/ \; D
BETWEEN …AND…运算符指定了要搜索的一个闭区间。3 L1 X. c0 K4 L  v+ C& Z/ z. U. t
例:返回96年1月到96年2月的定单。
7 L; x& U9 y5 h5 _) H# Y" ~* sWhere orderDate Between #1/1/96# And #2/1/96#
5 y- W( y9 |7 @: {3 列表(IN ,NOT IN)( }1 M: F6 j0 g  v3 X
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。! z" r# I+ D3 w4 y# h
例:要找出住在 London、Paris或Berlin的所有客户
) g3 @8 F% |  `& F7 KSelect CustomerID, CompanyName, ContactName, City' p! j' Z% E( R: `/ d% E% N
FROM Customers
& C; u) u" B! c8 ]" iWhere City In(‘London’,’ Paris’,’ Berlin’): ]' N2 ^* C9 E7 {5 I
4 模式匹配(LIKE)8 u; t% u+ z& `/ c5 n0 x
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
: E( v+ l, {3 y/ p) o, q$ R  ELIKE运算符里使用的通配符! z( H6 c( B, o9 T8 A0 }+ {
通配符 含义0 K7 @9 z2 i) \
? 任何一个单一的字符
8 q: }5 D: {. j. w1 s; ?+ i0 N* 任意长度的字符
. y2 B$ Y  ?/ E! ]* y5 G6 ~  ~# 0~9之间的单一数字
$ K  s& {; t, k+ \; t[字符列表] 在字符列表里的任一值
# q: X0 k' m  i: h[!字符列表] 不在字符列表里的任一值
  m+ H+ n+ Y7 t( w- 指定字符范围,两边的值分别为其上下限
) U6 d. G  Y7 G: O( C例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
3 o! p% k+ Q. L6 ^. t$ A/ YSelect CustomerID ,CompanyName,City,Phone
5 I( w( A9 l1 r( TFROM Customers
7 O7 u( I$ A  D/ b0 wWhere Phone Like ‘(171)555-####’/ x3 c. E. z0 j
LIKE运算符的一些样式及含义; s9 m" q2 e/ j. T6 `& i
样式 含义 不符合6 `6 G. M+ O: H" n; S9 ?1 h. d2 ~  s
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255, [2 s1 P) m# i. F$ B, {' \
# LIKE’5’ 5*5 555( x. q$ }' S8 A8 I/ A7 G$ [" U+ Z
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5" e8 g; ^, M1 ^3 }. B  n8 N
LIKE’5##5’ 5235,5005 5kd5,5346' k" z9 T! U' B9 K: r& S' T: P
LIKE’& R/ p. Y( _, p6 E7 V
[a-z]’ a-z间的任意一个字符 5,%
# I* A* [3 R0 w8 OLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1' n5 j+ M; K' C9 q" f
LIKE’[[]’ 1,*
7 l& L+ G* X" h. y0 m三 .用ORDER BY子句排序结果$ k0 D" @# V. N8 K$ J9 E8 `1 k
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
' Q$ t8 {  ]& N% M: p0 d" t, eorDER子句中定义了多个字段,则按照字段的先后顺序排序。
2 Y1 s/ T; e7 u( c; [) e0 O9 j例:  n- |0 H6 R5 J0 l, ^7 ]7 ]* R
Select ProductName,UnitPrice, UnitInStock
6 h' ]0 v* V, E5 {FROM Products
8 _, b3 @, r( s9 SorDER BY UnitInStock DESC , UnitPrice DESC, ProductName7 s, [( Z* [6 ?2 R5 f2 t" Y( ~7 F
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。1 ~( c- U; O8 E
例:下面的语句产生与上列相同的效果。
% }) U! ?+ V6 z  `! N, qSelect ProductName,UnitPrice, UnitInStock
0 {4 E8 W: W' d8 e0 g' ZFROM Products
/ R( l6 E' m) k$ {6 {" PorDER BY 1 DESC , 2 DESC,3; N) q, U+ [0 o8 x% \- _7 T' v( l
四 .运用连接关系实现多表查询
( q' X# R9 ]; s0 w  ^. t! K/ R例:找出同一个城市中供应商和客户的名字' b9 C2 q3 }4 j/ f: z' |) A* J
Select Customers.CompanyName, Suppliers.ComPany.Name
  X$ @$ N. O9 \6 f+ E- U; E; `FROM Customers, Suppliers. ?) b% G) Y; q% Y4 |7 J  Z
Where Customers.City=Suppliers.City
. @: \( m4 k* s, f; t- P) x例:找出产品库存量大于同一种产品的定单的数量的产品和定单& z) G6 }3 u, w0 |& N- n
Select ProductName,OrderID, UnitInStock, Quantity6 o! t& |- r0 T3 U
FROM Products, [Order Deails]" }* a3 b- \" N! L% o
Where Product.productID=[Order Details].ProductID
) S' F% V' T/ g$ ^: L# zAND UnitsInStock>Quantity
: u! G5 Q3 T, y/ \: M3 f4 J8 k. x另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
: ^4 ~! V" e) L8 I  `6 U3 C: V7 z- V语法:
& |4 S$ p2 w0 w: o, K9 X4 z+ oFROM table1 INNER JOIN table2  q0 a: A+ x# o3 @. V9 g8 t" p
ON table1.field1 comparision table2.field2' w) B! p5 d* y1 }$ }, v) k6 {
其中comparision 就是前面Where子句用到的比较运算符。
7 O# s% x# a+ f6 VSelect FirstName,lastName,OrderID,CustomerID,OrderDate
; i7 N2 M4 v& ?& B. mFROM Employees6 v3 v, `( B5 G
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID1 A3 a1 F! u6 r) ?
注意:, ^9 k, |8 S/ ?# E
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。+ m, \: ?6 D  B- W
在一个JOIN语句中连接多个ON子句
# v! Y; {' G, E. |- O语法:0 A. I/ b  `; C( i7 ?- i
Select fields
, M' u! g8 H# S3 N% L8 c8 I' SFROM table1 INNER JOIN table2
6 S+ {! c" _, zON table1.field1 compopr table2.field1 AND
- c0 t, e7 r8 xON table1.field2 compopr table2.field2 or" X4 Y/ L- x2 W. G7 U
ON table1.field3 compopr table2.field3
% l  L2 ?5 @! |& m/ t1 I6 e& P也可以$ n- K) ^9 `; B
Select fields
8 ]& a0 [6 x9 C; zFROM table1 INNER JOIN
9 y* J: p( u8 A- ?(table2 INNER JOIN [( ]table3
" o: c, W7 T% s3 e) W- U[INNER JOER] [( ]tablex[INNER JOIN]
# R0 I. l9 c9 M' |8 a: R' eON table1.field1 compopr table2.field1' G" P6 Q7 T; W" |8 [
ON table1.field2 compopr table2.field29 q# o% e" R; Z1 a/ q/ m
ON table1.field3 compopr table2.field3" F  g; E- G. l; W' v: T
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
* }) s" r0 z' g  |3 K$ s! t" A& OFROM table [LEFT|RIGHT]JOIN table2
' Z4 ^8 `8 B) D& L7 h9 n0 ~5 CON table1.field1comparision table.field2" _7 x$ b5 Q! @, @$ P2 T2 F
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
  c$ x- d! y$ m1 h. y. v: S例:不管有没有定货量,返回所有商品# V0 O+ B) y4 [
Select ProductName ,OrderID$ a* Y$ R$ J& N# {; {" E$ w
FROM Products. L/ i) ~5 }0 }9 s9 N
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID# T; T8 G1 _# q- g9 Q& ^6 Q( _
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
: C( d3 j/ l2 @例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。+ h# o1 d; y: i2 B7 t+ j" s8 S
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。7 J6 L) ]- ]4 A$ x' ]# |; @
Select *
* o& I) y4 `; I" jFROM talbe1
3 e  E' v0 M9 f& e- ^1 GLEFT JOIN table2 ON table1.a=table2.c5 n, j  `! W5 `6 c( J7 n5 P
1 连接查询中使用Iif函数实现以0值显示空值
, L% D9 E% D1 V3 K( D. kIif表达式: Iif(IsNull(Amount,0,Amout)0 u9 |9 p8 V  B
例:无论定货大于或小于¥50,都要返回一个标志。
3 R6 D/ m. e# wIif([Amount]>50,?Big order?,?Small order?)
- k! ]! G3 `# o  }3 e+ G$ U( f五. 分组和总结查询结果
" Y. C" k! }0 ~7 d  y3 b* z在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。) T) e8 I5 g1 w  O: c
GROUP BY 子句的语法
; X9 `9 l; D! ~* l1 ?Select fidldlist0 t/ i1 w4 `8 {* Q  Q: O: _, K
FROM table
. N  Z* \) x; w: QWhere criteria" X7 g! b8 Q! }
[GROUP BY groupfieldlist [HAVING groupcriteria]]/ S) v! A( Y% k
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。4 L" F1 Q4 y/ j; Y6 {
GROUP BY字段中的Null值以备分组但是不能被省略。
& l& C/ G# Y. d' \8 G4 O在任何SQL合计函数中不计算Null值。
, z8 e( _+ x1 B: c* Z0 eGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。7 V# U. Q8 \' z+ o  D5 r) \) q4 t
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。9 H# y0 s4 X5 K3 v4 f7 F% ~+ [
Select Title ,Count(Title) as Total1 w) W7 `$ n. g0 t; D. H5 c+ J
FROM Employees
7 f6 k1 P' t. R, @2 q0 h' MWhere Region = ‘WA’
4 o' p! w0 p" f" ~0 LGROUP BY Title: \; W5 i& S% ]: T+ b
HAVING Count(Title)>1
8 @6 B8 Y# B  m( Q0 ZJET SQL 中的聚积函数, |. Z& P; M6 K- D
聚集函数 意义% I# u" @5 b8 }
SUM ( ) 求和
5 S, S" g% u0 d$ [1 i; ?" }# E8 gAVG ( ) 平均值
* q6 T1 K/ b2 G# y/ ACOUNT ( ) 表达式中记录的数目4 f! v! c* C! ]
COUNT (* ) 计算记录的数目2 d& n, I" E' i. t( b) L
MAX 最大值
* f4 r# ]) _/ [8 V2 iMIN 最小值9 n; I0 C! v9 N/ J
VAR 方差
* d& f3 w: _6 @8 |6 U& l# LSTDEV 标准误差
" r6 W! Y! P7 w6 s! o- V6 GFIRST 第一个值
5 M5 H8 ^, c* O5 vLAST 最后一个值
0 n" M7 c  w0 d六. 用Parameters声明创建参数查询
2 }# [4 i% S! V# }# g/ F, X( \  _Parameters声明的语法:" Z8 [+ L5 |1 x# i. Y% j- l
PARAMETERS name datatype[,name datatype[, …]]  I, [. ~% Z( b' ^% @# `% }/ t6 J$ x
其中name 是参数的标志符,可以通过标志符引用参数." ?  M. _4 x1 ]9 k
Datatype说明参数的数据类型.3 l) o% s+ }* U3 i
使用时要把PARAMETERS 声明置于任何其他语句之前.$ }+ `% v9 p4 J; y. i
例:
' s1 g9 D8 Q; T# P+ u/ ?9 z' lPARAMETERS[Low price] Currency,[Beginning date]datatime
2 U$ b- B6 c+ o) f6 T7 |9 BSelect orderID ,OrderAmount
% j* r1 ?) v# ]. ZFROM orders) d/ I# j" @/ J
Where orderAMount>[low price]+ |2 B6 H- ^' ^# }7 |% z
AND orderDate>=[Beginning date]$ H7 w- B& o" a, ]' H! ^2 B' D
七. 功能查询- {2 Z/ I4 n0 ?* M
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
$ ?1 r) h5 A* v$ _8 ^1 更新查询  l8 g4 u8 C; Z2 c2 A
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
6 e8 R% V, t! s4 z8 J; `; w更新查询语法:! R. e) U# U4 S: R5 m
Update 表名% X0 a% I. s# r2 T
SET 新值
4 T8 @) I5 ^0 n9 U5 k' O  e2 |Where 准则0 Q& h$ L9 I! X6 W
例:英国客户的定货量增加5%,货运量增加3%1 r" A8 }# N$ i* v) @+ b0 h  ?
Update OEDERS
$ j8 |/ W# d. L: V- F# |SET orderAmount = orderAmount *1.1" z# A* z$ ]# [; _
Freight = Freight*1.030 j6 Y: w8 ^6 i4 j* O% u+ O
Where ShipCountry = ‘UK’& @0 e! T7 i4 q4 N: y( |3 g
2 删除查询
% l! s1 ^4 V  z( G+ n3 q5 e$ PDelete子句可以使用户删除大量的过时的或冗于的数据.
# T  t; Z; b0 L2 [6 T注:删除查询的对象是整个记录.
- g- b, h" b3 [3 N' L+ [Delete子句的语法:
4 e; q5 j, o4 j: ~Delete [表名.*], q+ [& z, N3 _
FROM 来源表/ w, v& G6 _. K- b# a/ U) S, G' M
Where 准则# \! E) V9 N$ E" Q
例: 要删除所有94年前的定单' p7 a* l! L- C0 \, r4 H& p2 w
Delete *7 r' v2 I1 `& @& u+ l
FROM orders1 X3 H( I. i1 o$ ]6 D' q! c$ ?
Where orderData<#94-1-1#  [  |: Z# H+ e- ~; Y  Z
3 追加查询1 H# g5 s+ l- B' V4 f* V3 o& y
Insert子句可以将一个或一组记录追加到一个或多个表的尾部./ r5 {/ B; J5 P9 A) s4 k
INTO 子句指定接受新记录的表* h1 s* B) _$ d' G  X. ]
valueS 关键字指定新记录所包含的数据值.
3 l/ {2 \0 |8 v  w0 }& D8 nInsert 子句的语法:2 N% E2 a: K* C4 G, O
INSETR INTO 目的表或查询(字段1,字段2,…)
3 c. d" q* h" Y* d0 vvalueS(数值1,数值2,…)  ~2 p3 D1 }( D' w5 S! s
例:增加一个客户
) c5 W! n2 ^* Q$ {+ r$ |; Z6 GInsert INTO Employees(FirstName,LastName,title)
. f, [" e! r. l( d0 vvalueS(‘Harry’,’Washington’,’Trainee’)
, R# R) C- }" A1 T  C7 {, n4 生成表查询
6 J- }- N" X/ m! w$ U( x4 b& V可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.1 v6 u4 O6 c7 ]- A! J  Q% }
Select INTO子句用来创建生成表查询语法:% w. R" v) B3 z0 u" Y7 |9 t7 ?
Select 字段1,字段2,…
% g- ?6 H/ g6 j4 pINTO 新表[IN 外部数据库]4 I( g5 F2 d9 C$ }/ g! b
FROM 来源数据库
4 s: E8 y8 m% N' \1 _, i5 E+ a- nWhere 准则
9 }1 i  ?' c$ f7 t+ l( _3 U4 n例:为定单制作一个存档备份$ `* g4 ]. m% {5 J3 z+ j; b
Select *
; s- q+ p: o9 q( y$ I4 pINTO ordersArchive, r! P3 [) h; b/ _4 t( m: n; t
FROM orders+ x5 p4 Y5 J( E  N9 j( {# b
八. 联合查询# M. u5 _3 z: Q3 T+ N
UNION运算可以把多个查询的结果合并到一个结果集里显示.7 b$ f/ z8 }/ \& Q, P/ o
UNION运算的一般语法:: `# j! {; n, k3 x+ F& n' H( ]
[表]查询1 UNION [ALL]查询2 UNION …
! R( E9 X1 P. I例:返回巴西所有供给商和客户的名字和城市
4 a' u% a6 k9 _8 L$ a* U8 f6 XSelect CompanyName,City% Q/ W( f! f& v! u2 h( v+ w/ ?
FROM Suppliers8 i' W: B8 o- X) \. z
Where Country = ‘Brazil’
3 n3 o; N3 V3 hUNION, J7 Q. F' W8 J! \6 X
Select CompanyName,City
+ @3 @& ?( f; Y& r8 r( rFROM Customers
! L) w% I* a1 O& M3 uWhere Country = ‘Brazil’+ L7 r/ k3 ?5 @
注:
! K8 o( K+ Q7 z- p* U$ S3 R" V. h缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项5 u& U+ n( ~- W  z2 w5 S/ a+ P
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
- K* m6 L4 ?5 b; X9 e. X/ @* N每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.( B" t( K. W8 y6 Z/ @0 j1 w# i, T
九. 交叉查询
+ p" T. `5 X! O2 @+ v0 D交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
6 `! b# L+ V* Y3 a, lMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
2 d3 A. m8 @4 K$ n0 G7 T/ aTRANSFORM aggfunction9 {1 P. J* i# ^9 _! E2 V6 \! X/ a0 k
Select 语句
! E( r2 I6 v/ C0 V- n" {GROUP BY 子句2 x3 T2 ?0 ]  }6 J
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]! ?% h+ i, M0 ]( r' U
Aggfounction指SQL聚积函数,
" H% T) @( s9 W0 V- {0 qSelect语句选择作为标题的的字段,
- ]. @, U# _* \3 @GROUP BY 分组
5 X1 \5 Y( o% K" l! _说明:
# w5 P8 W2 h2 q, HPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.  {7 V* H9 t/ ~9 J! \. U  F: A+ k
value代表创建列标题的固定值.8 |) k& b3 O- R; `- j
例:显示在1996年里每一季度每一位员工所接的定单的数目:
4 M& Z7 x6 F+ c8 c5 w% w& P# T7 yTRANSFORM Count(OrderID)4 c) z$ @! u  @( L
Select FirstName&’’&LastName AS FullName
3 V2 U! c7 s1 |' kFROM Employees INNER JOIN orders8 S0 `2 a1 Q3 h& A5 ~
ON Employees.EmployeeID = orders.EmployeeID2 I- i+ p2 B! @& `$ }
Where DatePart(“yyyy”,OrderDate)= ‘1996’
8 {0 a: C5 O( q2 @  v7 R# JGROUP BY FirstName&’’&LastName, j. q* \5 R8 g: E& {
orDER BY FirstName&’’&LastName
; K0 X; e4 l3 WPOVOT DatePart(“q”,OrderDate)&’季度’
) w0 S) I& s- I' T1 }9 A! ~十 .子查询
5 w% A# ?3 U+ Q8 K! [/ f  m/ \子查询可以理解为 套查询.子查询是一个Select语句.3 e3 w, t- m( @" l1 d3 X# {, r
1 表达式的值与子查询返回的单一值做比较
! Q; g6 `4 W0 F语法:
& H* B3 c* I5 n表达式 comparision [ANY|ALL|SOME](子查询)
/ L5 h& B; \9 h  r3 K8 Y& E说明:
4 r1 R0 e+ q; aANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
7 w+ i+ y) x2 _; @例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品  R1 Z3 I' o7 l7 m$ k& C
Select * FROM Products, Z; [: e7 i" Y5 x
Where UnitPrice>ANY
8 {  H! r) P1 G, U8 L- T(Select UnitPrice FROM[Order Details] Where Discount>0.25)
& [) n( n- D5 ~; \, `5 n8 `- d. ~2 检查表达式的值是否匹配子查询返回的一组值的某个值
% J7 d9 l1 q! }) Q语法:
1 c3 W* |6 B/ L" D3 f[NOT]IN(子查询)
2 c5 b- K/ y4 a, G3 V2 W例:返回库存价值大于等于1000的产品.
6 c# g2 Z0 I" g. A& q+ l3 X6 qSelect ProductName FROM Products
: j. d. z' y1 x( H4 s- U& }! T! x+ YWhere ProductID IN8 I4 I( I( ^# ]1 u' y
(Select PrdoctID FROM [Order DEtails]4 K5 e0 Q( E; G, V$ v; O
Where UnitPrice*Quantity>= 1000)
4 L5 B1 K0 v. a" c3检测子查询是否返回任何记录+ P7 ?: v, ^; \( l# E" v9 ?
语法:% D! M# s! U" N; V" M
[NOT]EXISTS (子查询)
2 R; R- U9 C5 i+ i例:用EXISTS检索英国的客户$ R! S- q( b+ {  @; C  J; U0 D
Select ComPanyName,ContactName$ y1 d8 Y& C  D( c
FROM orders
/ ?1 A8 g' ~3 a, G" B8 AWhere EXISTS3 q0 `6 z6 u, j4 q* Z
(Select *
# M- w4 w  @: y6 o2 wFROM Customers
# O$ p6 ~0 y8 b9 |: @" {( l9 j5 h' MWhere Country = ‘UK’ AND
# x, X3 e( \) j8 f# c8 M  z: s' XCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-9-23 01:34 , Processed in 0.027002 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部