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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法& a/ x% |/ J8 A7 J" j# `! I. u
: |& h# `& a( U  L) P6 ]! {
select distinct 字段 from 表名
( g! S; b  U  _distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。! x8 E. M( N2 O% p
一.Select语句的完整语法为:
- N  m5 a  \. C; g0 USelect[ALL|DISTINCT|DISTINCTROW|TOP]
3 e4 t8 G1 B$ h9 e{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
  v. e: ~0 b# J, i( z; }9 z6 ~. _FROM tablee xpression[,…][IN externaldatabase]
$ I. G2 d$ R% [- ?[Where…]
4 s. H# h3 I$ _+ x[GROUP BY…]: J( B$ ]" g, v6 e) Z2 ?! t" W
[HAVING…]* O  i& n" p0 X: E  F# s
[ORDER BY…]
) Q" H/ u9 D4 {  }[WITH OWNERACCESS OPTION]6 g% v1 m- S6 s  _& ~' C" r
说明:9 G7 a2 T8 |! K' _9 n
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
! v+ `( ]* U" p1 FROM子句
/ Y" z& E8 o5 S6 O; \FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
, v1 b( \& n; j* ?' C4 u5 r例:下列SQL语句返回所有有定单的客户:% v; r2 V+ R* S( H5 o! Y. \9 `2 I7 F- N
Select orderID,Customer.customerID
3 W; t: C, {7 }+ a* ZFROM orders Customers% g3 H5 c% h; u3 c2 u( k; d6 v
Where orders.CustomerID=Customers.CustomeersID
; |% e- Y6 R9 P4 ^  b$ ?) z2 ALL、DISTINCT、DISTINCTROW、TOP谓词
% S( E2 C( v- }" ~8 v(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。+ D5 }, D" Z$ k3 p4 ^
例:Select ALL FirstName,LastName4 V3 _! C7 m. `3 l" A
FROM Employees  S( r, O( I/ S  }
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
9 \- d. `. m( V4 V! x(3) DISTINCTROW 如果有重复的记录,只返回一个/ \' f8 H; q4 H0 o( r' J
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
  X: s6 C9 |2 B例:返回5%定货额最大的定单
7 s& ~7 d9 }" X2 e5 @& [2 W. CSelect TOP 5 PERCENT*
5 V# i' \1 M& N: {2 g0 f7 j: \FROM [ order Details]
8 Q; E$ G) b" s2 l$ S9 u1 H! E0 PorDER BY UnitPrice*Quantity*(1-Discount) DESC
! s& w: V5 ?& f2 Q& q3 用 AS 子句为字段取别名' d% V/ ]4 M# h9 u
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。8 ^) y6 z& ]% Z  d- I* [& d) }
例:返回FirstName字段取别名为NickName
* S  `8 w8 ^% O; s7 p9 u! bSelect FirstName AS NickName ,LastName ,City+ S, \# a" j$ p% n$ l
FROM Employees  G! x- j6 Y3 I1 q
例:返回新的一列显示库存价值9 a% e. w# N5 q' C/ I6 }4 c  J
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock' |' I# [- \3 @. H- I( c
FROM Products
  w, E9 G- r. [7 M二 .Where 子句指定查询条件1 `# h, e2 G" P" h' }1 r4 G/ g4 X
1 比较运算符
# S) G5 q$ ?- l比较运算符 含义  @# a& t+ A7 i
= 等于0 x+ s( K3 `. u8 u" t2 a9 S& X
> 大于" x1 `$ M7 v' b, R
< 小于3 t) Q4 h' M/ G) E# d' d* |- R
>= 大于等于
8 k% B) y8 M5 t+ ?+ G( z1 x<= 小于等于
8 K5 g7 s5 S% X9 ]' Y<> 不等于
- j  S) G1 e5 [2 X# g!> 不大于
8 `( G* o9 o, \8 |, O! L!< 不小于: X4 ^2 Z; K0 z8 }  e1 Z+ b
例:返回96年1月的定单
  d! d. m9 }7 u% u7 H: YSelect orderID, CustomerID, orderDate
# y& H8 u# Y( D' ]" ]FROM orders  k2 ^7 k; e2 B; j7 L9 \
Where orderDate>#1/1/96# AND orderDate<#1/30/96#( C/ B8 ^- Y$ a9 t
注意:
: v+ {; x8 {0 _& i! dMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。$ O0 l  C% S9 S# |) n+ l
例:& x. }, e& c% s& p- o$ K
Where orderDate>#96-1-1#& _9 \: Z: L( A. Z& x# Q, H0 W3 p
也可以表示为:
; O6 s- u+ l" l* N+ m; WWhere orderDate>Datevalue(‘1/1/96’)6 H; ^% O( K- @
使用 NOT 表达式求反。, M6 @* C4 {' {9 o
例:查看96年1月1日以后的定单
0 E% {% U7 o8 v  F0 V9 Z" l( RWhere Not orderDate<=#1/1/96#2 l4 [, h' W0 ~( b8 M5 b% L
2 范围(BETWEEN 和 NOT BETWEEN)
$ x9 I" X3 B5 W4 o: o8 dBETWEEN …AND…运算符指定了要搜索的一个闭区间。% f8 S9 `2 `, J7 G
例:返回96年1月到96年2月的定单。  B# ~/ ~9 m  m: b) W4 q
Where orderDate Between #1/1/96# And #2/1/96#4 j1 \" }$ r, U) f0 @; O. m
3 列表(IN ,NOT IN)9 [- V- s$ G( T8 J6 A6 ]- f5 p
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。) ^! `+ |0 E. R, }9 o
例:要找出住在 London、Paris或Berlin的所有客户
! m" N$ N: F9 tSelect CustomerID, CompanyName, ContactName, City
+ w) j) K4 d8 z( g: B0 yFROM Customers9 y# O! l7 Y+ g+ O, d: m$ k* ~
Where City In(‘London’,’ Paris’,’ Berlin’)
4 F4 S' `5 D$ D6 J4 模式匹配(LIKE)
" I- }/ t8 z: RLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。( t+ ?+ x  ~$ Z3 X) L
LIKE运算符里使用的通配符* U9 \' @8 l1 h( ]$ U
通配符 含义
8 ?  k, V' k/ y' x/ g? 任何一个单一的字符7 m& Q8 t; v7 v1 v
* 任意长度的字符
9 L8 u" q4 r( \: N- Y5 O# 0~9之间的单一数字3 `) d3 e8 p" x0 ]$ Q9 v1 f
[字符列表] 在字符列表里的任一值
8 [6 O, d+ i% k" m- P9 H[!字符列表] 不在字符列表里的任一值
  S! E8 d) I* k! g- 指定字符范围,两边的值分别为其上下限7 U0 J# I; T, o
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
; p. Y" v/ ^2 s2 k7 _" sSelect CustomerID ,CompanyName,City,Phone
* a# ~* D, z, a9 _( H' mFROM Customers
% Q7 P  g% L/ T+ vWhere Phone Like ‘(171)555-####’. M7 n  {4 s7 l+ b  J
LIKE运算符的一些样式及含义
$ ]! |9 ~+ c' v. g) z样式 含义 不符合: Y; G8 _) Y2 m
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
% |; l: w' T) J6 s7 T. k# LIKE’5’ 5*5 555
' [$ P! o4 S- g4 [. W, p( ?0 W0 r; KLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
( K9 b; u# R( bLIKE’5##5’ 5235,5005 5kd5,5346
, R, V1 k$ A5 e# f* {- [1 _% c$ oLIKE’; s% `% d- g& D3 Q$ h$ m" U, `
[a-z]’ a-z间的任意一个字符 5,%
3 v8 r) h; b8 [LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1& R7 W, Y$ D6 e6 g
LIKE’[[]’ 1,*1 D% P+ V5 }) T) {& q1 \8 a' ^; `3 Y1 O
三 .用ORDER BY子句排序结果5 I6 C; y4 b! r4 b4 A, N. p
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。6 P! I7 |# U1 r  A9 v
orDER子句中定义了多个字段,则按照字段的先后顺序排序。& @& S9 M$ q' q( E3 r8 H4 l0 g7 k
例:
7 i; C" {0 P4 J* a; xSelect ProductName,UnitPrice, UnitInStock' E1 d* c% }, [5 ]. A9 z. n: V! Y
FROM Products
9 O  I* X) Q7 P( o) u" DorDER BY UnitInStock DESC , UnitPrice DESC, ProductName6 @5 ]+ \4 M8 m6 K
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。" I5 w/ h# Q! R: u4 j' t
例:下面的语句产生与上列相同的效果。& ?0 R) e, p4 x3 |. e: ~+ Z
Select ProductName,UnitPrice, UnitInStock
% _: E+ S- @  Q# M: ]7 _9 [FROM Products
2 H: ^$ I# |) X+ H( e8 a% x+ [orDER BY 1 DESC , 2 DESC,37 l6 p- R: O0 e( F
四 .运用连接关系实现多表查询' c7 R, C& C  u; t% u9 M, g5 }
例:找出同一个城市中供应商和客户的名字8 x8 L- z  f# @( a
Select Customers.CompanyName, Suppliers.ComPany.Name
, U9 G7 c& F) N1 V/ B! GFROM Customers, Suppliers; [- K' b/ P% x8 `- T* j
Where Customers.City=Suppliers.City* R/ p; C% r: I0 e4 M3 H9 m9 d7 g
例:找出产品库存量大于同一种产品的定单的数量的产品和定单( T/ Q! {: w& i1 A/ C) W
Select ProductName,OrderID, UnitInStock, Quantity: ~" i, M: ]3 `
FROM Products, [Order Deails]
  @# X( G7 g, S: e' }8 qWhere Product.productID=[Order Details].ProductID
7 b: d- J. ?& }6 hAND UnitsInStock>Quantity+ S7 V; j. n' z: t3 v% l
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
3 v) e0 B/ l- G8 _语法:
6 L6 d, ^- g: q: ^FROM table1 INNER JOIN table2
3 K8 `+ ~) }$ J- ~/ D9 GON table1.field1 comparision table2.field2
( A3 F1 z( s2 [+ l4 E6 w: ]其中comparision 就是前面Where子句用到的比较运算符。
; F0 I  a- u3 o) }+ C; tSelect FirstName,lastName,OrderID,CustomerID,OrderDate
8 f6 {" b" W7 S* x& R0 qFROM Employees
( a0 T' ^6 n5 G0 U+ s% z0 f& nINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
, U1 u9 j0 ^1 k8 F, @/ Y7 M注意:) V- Q' Y9 j) L" f; C3 s$ a. f
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。. [0 ~( B$ i5 @* u1 _  W$ r
在一个JOIN语句中连接多个ON子句  e3 C5 O+ D* l
语法:. @0 d5 s/ H- U  [
Select fields
5 m9 h' n; p, v5 z  v) H% A4 b" \- yFROM table1 INNER JOIN table22 u0 e; U$ W6 K9 J
ON table1.field1 compopr table2.field1 AND
* t" ?' i' c) X' P5 S+ `ON table1.field2 compopr table2.field2 or
" @  h; v. q+ BON table1.field3 compopr table2.field3: X! V- ^# @3 O! M6 u4 }7 }% Z& R3 E
也可以; ~* r, r- C- R5 K, ?* x
Select fields' y3 C2 V" ^; g4 L
FROM table1 INNER JOIN
8 ?! l3 [/ V4 h7 a8 K" ](table2 INNER JOIN [( ]table3
$ H' E2 o+ S, `2 q3 O& J$ w[INNER JOER] [( ]tablex[INNER JOIN]% c" R5 h9 k5 s1 E- E
ON table1.field1 compopr table2.field1
9 G6 c: e9 o  t  V: {ON table1.field2 compopr table2.field2
- r3 t0 r& A! R& SON table1.field3 compopr table2.field3
. s( w8 J( o- y, [! {外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。. p; m# p1 _3 H$ Q
FROM table [LEFT|RIGHT]JOIN table2# E! z" [/ b/ M" H$ N  ?7 Z4 H, ]
ON table1.field1comparision table.field2
4 u$ \' A2 O9 T2 M7 E用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据5 g2 `: Q& t. M0 y% l
例:不管有没有定货量,返回所有商品
# G2 t! `* s0 p# }' YSelect ProductName ,OrderID
4 {2 D" B+ M( d3 k9 k$ t% }. qFROM Products
# ~- M" |( ^8 \# @& fLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
% U0 ]: }* x9 b0 R. g右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。; R3 K! h. d. [. Q) b
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。" X5 \. d# j9 Z# T3 U
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。+ `5 N9 h, d5 n( P8 F2 q- E
Select *
1 w0 K+ J: _# F) BFROM talbe15 J4 P: S: `- A
LEFT JOIN table2 ON table1.a=table2.c
6 h1 B& e" s7 U. g& k; |1 连接查询中使用Iif函数实现以0值显示空值7 b% m  t; d; G/ R4 v% r
Iif表达式: Iif(IsNull(Amount,0,Amout)
! r2 ~% J: |5 O0 B5 I; e例:无论定货大于或小于¥50,都要返回一个标志。
2 x5 d0 Z( ?9 M( F' o( q9 X; a& W& wIif([Amount]>50,?Big order?,?Small order?)
, l7 K* u6 s6 c% H+ ^五. 分组和总结查询结果
; s* I& E' \, m" ?在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。) z, k* y# }# V' E+ h* P1 a( ?
GROUP BY 子句的语法' i& a' {4 K6 R
Select fidldlist
* a; J; p3 e, `; j- HFROM table; |: R8 c$ V1 A6 B
Where criteria- _/ J0 @& G$ Z1 V
[GROUP BY groupfieldlist [HAVING groupcriteria]]" |" A( o  A( u) i; O
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
4 Y& D; x5 H5 AGROUP BY字段中的Null值以备分组但是不能被省略。  a1 K) m8 s# Z  K# e/ g
在任何SQL合计函数中不计算Null值。
* x! g. I1 a; F: a/ E9 qGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。2 s( X5 M5 h; E! }! P+ f
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。3 P! B; ~' a! P$ h, T
Select Title ,Count(Title) as Total
6 [, y; \' |% b6 o( h9 @FROM Employees  ]: ^* W4 w- R4 V3 h
Where Region = ‘WA’
: C2 P$ |6 J, J0 W( A: D  ZGROUP BY Title. ^# B& I: i; ]0 |. |- k% s4 h) J) ^
HAVING Count(Title)>1, ^% }2 _6 @$ \( i2 p% d  {
JET SQL 中的聚积函数( n' c; q* ^6 w. Q+ E
聚集函数 意义
1 `: X# O" @6 N  T4 l/ VSUM ( ) 求和
: y5 F* B* s" Z% {* X) f6 gAVG ( ) 平均值, R% h7 y5 b; j! i. k
COUNT ( ) 表达式中记录的数目% L1 V7 O7 l+ k! U+ _# _" o8 C
COUNT (* ) 计算记录的数目
9 ?3 j" Y6 ^) A8 B. O7 H/ MMAX 最大值2 }! Z) Z2 `6 j, A) l
MIN 最小值" s$ o& Z+ d8 s! V: }
VAR 方差5 k. ~2 x* |4 c+ N- @7 G& x
STDEV 标准误差
; y4 k0 {6 ~, \: ^9 z  L/ a: yFIRST 第一个值2 }0 Q  {$ h) T( ]! D
LAST 最后一个值+ K# K4 B1 e0 c" W
六. 用Parameters声明创建参数查询4 o- ~6 F9 w" w1 f1 h! i  H/ G
Parameters声明的语法:4 T6 m+ s+ b: a: _" |- t8 r
PARAMETERS name datatype[,name datatype[, …]]
8 R/ ~* Y/ k- ~/ U$ p/ G其中name 是参数的标志符,可以通过标志符引用参数.& ~* z# Z! l& B$ }7 ~
Datatype说明参数的数据类型.
3 C; Q( W  ~% H) [使用时要把PARAMETERS 声明置于任何其他语句之前.
' c0 R; E1 Z: h例:; x* K% M, x5 r5 n; {
PARAMETERS[Low price] Currency,[Beginning date]datatime. N; G0 c& b' }! q9 ]; Q
Select orderID ,OrderAmount/ O( y* |3 g9 S% M& _4 d
FROM orders
( r/ _8 t: T5 OWhere orderAMount>[low price]
1 [# I7 R  C1 hAND orderDate>=[Beginning date]
; F. Y" A* V! Y2 U8 f' q8 @: O七. 功能查询* ], F2 |5 @1 J
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询., u) B8 r& J+ _
1 更新查询9 b' Y: d! S4 V6 _+ p" M
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
. K0 B  {! d# \* m0 C/ g1 R2 {, D更新查询语法:/ y* D/ Y* U$ y: k& }- D
Update 表名4 V/ v& c. k4 ?: \$ q
SET 新值
6 A/ ?5 ~+ L) x- i; sWhere 准则
( @# k- x! \* y例:英国客户的定货量增加5%,货运量增加3%/ M* U* G0 J  q, P8 r" }4 Z/ N6 B
Update OEDERS0 c4 c) }3 d2 Y4 B. u
SET orderAmount = orderAmount *1.1
  X+ e  H5 [9 T+ ~9 [* S# \9 dFreight = Freight*1.033 A$ y- V+ Z, W0 p( _
Where ShipCountry = ‘UK’
. q! y7 I- x# _: R- r, k$ a2 删除查询
3 N" t) P2 s+ D$ F1 {  Z1 ^6 cDelete子句可以使用户删除大量的过时的或冗于的数据.0 p6 K% H& C5 e2 q7 R5 A7 N1 f5 A
注:删除查询的对象是整个记录.
& ]/ |5 S  r2 S* }Delete子句的语法:
! C1 O' \9 O  |: NDelete [表名.*]2 E( [) u; [: [
FROM 来源表4 ?+ W) [: c0 c) }8 t1 |, T" j
Where 准则" C/ U, [" p/ e" ]7 v
例: 要删除所有94年前的定单
+ ]; C5 z9 h& N  c+ ]Delete *- y9 f/ W6 [. Y. f  k" i0 y
FROM orders
+ v  o4 G0 R" u/ V. s3 X# fWhere orderData<#94-1-1#
( a% S1 y: S( {/ R7 E& o2 ~* ?& Z3 追加查询. s, h; l: _. D7 y
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.* T  Y! J4 S+ J( W+ n
INTO 子句指定接受新记录的表7 y, l$ j3 z. ^0 G$ K
valueS 关键字指定新记录所包含的数据值.
/ {7 i" b& ?( t; E# ~1 P8 W% |  pInsert 子句的语法:
( j6 E4 V" s( L5 F' P' k9 UINSETR INTO 目的表或查询(字段1,字段2,…)
. o) ?, r- h# n% ^( M. evalueS(数值1,数值2,…)% p) _  M- A, c+ W8 G4 i" b
例:增加一个客户. K* o$ x6 m& b' L' F
Insert INTO Employees(FirstName,LastName,title)
1 I* @, e; B# w' I" ?valueS(‘Harry’,’Washington’,’Trainee’)3 L1 T' Y, }1 }# v) _! q; Y# I
4 生成表查询
2 s$ U! b  O7 p/ B+ k5 \* `# Y/ V可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
+ c8 E5 d9 R  e& c: q: y! y! [0 wSelect INTO子句用来创建生成表查询语法:1 d- O9 k% X. ^/ \. d
Select 字段1,字段2,…
$ D1 v4 {( h' cINTO 新表[IN 外部数据库]* w$ N: M: V9 ]/ B
FROM 来源数据库& u8 W' b, R$ d4 |! r# ~0 X
Where 准则
  M4 _7 B1 i& n; j# \例:为定单制作一个存档备份
  c6 d1 f+ u& I! N6 t. p  ~Select *  v. f, q8 a8 D& \6 H4 _3 b; V
INTO ordersArchive
8 ~0 v2 l% A( O, ]0 ^; dFROM orders
" i! n3 z& n. r& Y7 I八. 联合查询
5 R3 O- A( g, |6 Y+ a% C8 U! m- xUNION运算可以把多个查询的结果合并到一个结果集里显示.
+ Q' k: T& r, b: V+ P5 ^UNION运算的一般语法:
& F; r+ d( I& V[表]查询1 UNION [ALL]查询2 UNION …' \- z, ~' `8 Y1 I' y/ v, c' ]- m
例:返回巴西所有供给商和客户的名字和城市
: k5 v& g% p1 W$ ySelect CompanyName,City
# i+ v% y1 e& K: r4 h1 z' Q, O( l  fFROM Suppliers
5 f$ Y7 d1 V( t( W( ?3 G& FWhere Country = ‘Brazil’" w6 s4 u% [# C" {
UNION) x0 |% D5 \  {
Select CompanyName,City
) u- z6 R, e# Q, _FROM Customers0 u' e7 C+ i! ]7 }
Where Country = ‘Brazil’
; ~- h& @- x: t/ q( J+ V注:( O7 [- ^$ K% b; b! `, v
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
4 m& B! ^1 q1 Q) |# m$ R2 HUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
4 ]$ ?) A; u. t! f; T% Z7 k每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
9 B, Y& g! Z$ g( M+ q九. 交叉查询3 O# h  q7 d9 ], O
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.0 m: o# A& r/ @: U, R+ S4 U* E# G
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
6 P8 A. p9 z: a8 t7 jTRANSFORM aggfunction
3 ]+ T* u6 _9 S4 K( c/ J' TSelect 语句
6 g0 d0 E) `/ gGROUP BY 子句5 I& N4 V" e. v# y
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
& M6 K4 z  |& a5 m- q5 H- X2 uAggfounction指SQL聚积函数,
7 x& a. v3 a3 y3 ?3 sSelect语句选择作为标题的的字段,/ J8 x  L5 K$ p/ m) q( e# E. ^9 d
GROUP BY 分组
3 U/ Q* l9 e$ G  x+ i/ B% i7 i" z说明:
' ^$ v- P5 @' T3 rPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.% r3 Q1 [4 Q6 F3 e$ D% k8 O$ r2 l
value代表创建列标题的固定值.9 O: @- q1 f! f) f# C
例:显示在1996年里每一季度每一位员工所接的定单的数目:
% t1 H$ ^. l5 K; @/ f8 GTRANSFORM Count(OrderID)6 k4 W6 v# F1 c; x3 u" P% e
Select FirstName&’’&LastName AS FullName
/ `0 g# g) M$ I. b% aFROM Employees INNER JOIN orders$ z* m! v8 n# z  b, M/ `
ON Employees.EmployeeID = orders.EmployeeID
2 X# U3 b* z/ z% ~; TWhere DatePart(“yyyy”,OrderDate)= ‘1996’% |, d' D6 ?# G! g
GROUP BY FirstName&’’&LastName
9 j, k! k8 K6 A! j3 ^" S' V3 ZorDER BY FirstName&’’&LastName
" \: |/ l# G* _8 k/ e( [: oPOVOT DatePart(“q”,OrderDate)&’季度’) K  y1 O" Z3 |7 G9 b
十 .子查询, ^* J: x' {- c% `$ _8 q- m! a9 x
子查询可以理解为 套查询.子查询是一个Select语句.
4 p7 ^! \) k; X. w, o7 N1 表达式的值与子查询返回的单一值做比较8 L9 m+ n5 i! j( o0 r  v$ n9 S0 f& n4 L
语法:
: ~, U9 X) s  X+ b- c2 E/ _表达式 comparision [ANY|ALL|SOME](子查询)
1 D* @5 s: I' L5 H  k7 n说明:9 m4 x2 v$ S& g+ ^$ q. A5 X
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.  H+ C. F+ U: M2 Z7 C+ J! u
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
+ f" h. W9 v0 T- E$ j8 w! aSelect * FROM Products0 J8 i* ?7 r  q' O
Where UnitPrice>ANY* K: A! @+ a  \0 ^/ K0 T
(Select UnitPrice FROM[Order Details] Where Discount>0.25)! n$ [6 U& R0 w8 O9 o
2 检查表达式的值是否匹配子查询返回的一组值的某个值. w6 `; g! M; @: ?. t" `
语法:- j" e( [2 V3 M6 H9 l9 b0 u5 I
[NOT]IN(子查询)
  ^9 G) r% q: w例:返回库存价值大于等于1000的产品.) e4 `: f* M; q( ?( c$ C
Select ProductName FROM Products. N+ e9 ^( W% _! X& f. e- r) a
Where ProductID IN9 k8 J! k$ K" D6 y; A8 M; S
(Select PrdoctID FROM [Order DEtails]  f- p6 O) @) \* ~" L7 P
Where UnitPrice*Quantity>= 1000)
0 u2 k8 [3 y. R8 l, P' y3检测子查询是否返回任何记录4 v6 G0 T/ j( e
语法:
1 o' i9 C; J  Y" ^3 ?, F* j% i- q[NOT]EXISTS (子查询)/ T, j0 t% `1 q
例:用EXISTS检索英国的客户
( K3 o2 m, h6 X$ j' D) p, n1 X. USelect ComPanyName,ContactName' @: R) B" M$ k4 S) [
FROM orders6 ~4 D# K4 A1 Y: Q0 F& `/ |
Where EXISTS
. v1 d/ k) n! r' J# e& G$ K(Select *! n8 y; E% L3 t2 @" W- s6 z
FROM Customers. {! q. ?9 a6 m  t6 B5 k
Where Country = ‘UK’ AND& p) Z0 q) ~# |+ {  R% m$ X
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-11-27 02:56 , Processed in 0.026002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部