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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
) u- a+ }1 c& B# _, \" L8 }4 |* l) p
select distinct 字段 from 表名# L. ?4 x! B' K0 g
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
/ p' p) ~/ }6 ]2 U8 U8 `3 y一.Select语句的完整语法为:
0 w* u- w( c* R. o7 USelect[ALL|DISTINCT|DISTINCTROW|TOP]4 B3 Z, u$ ~+ B
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
$ f5 ^* f4 H$ e5 L9 D: tFROM tablee xpression[,…][IN externaldatabase]2 P+ G3 f1 z7 v3 e8 u
[Where…]3 q5 h# i) ]4 s  l* t
[GROUP BY…]
, k! t: }6 ]+ q+ x[HAVING…]8 p7 |6 U; I& E% g# |, P
[ORDER BY…]
" {: k, w% e. K6 `4 C/ o[WITH OWNERACCESS OPTION]
: k+ `" p5 |* |$ S+ g说明:
6 l% [- U) L4 Z% w' t3 K用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
; p$ {" ?9 V& O7 r, w7 ]1 FROM子句7 }! C  b' f6 k2 K- w. [
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
0 K, w5 F5 R4 }- ]/ E5 Y6 B( q例:下列SQL语句返回所有有定单的客户:
9 M1 M* P. r) `+ }7 q4 V4 @Select orderID,Customer.customerID
8 u) d* n7 h$ o" z4 sFROM orders Customers0 |) T6 s5 V( O4 \+ j2 q& B
Where orders.CustomerID=Customers.CustomeersID: i" _! R+ H+ J; A$ r! {
2 ALL、DISTINCT、DISTINCTROW、TOP谓词  p8 Y" K/ f4 o0 }; ~. B
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
5 }& A, e3 E2 y5 X例:Select ALL FirstName,LastName
' F, m% a( B; E( sFROM Employees
$ c, S/ w& w8 E(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
6 t6 r6 Y) l1 P2 C+ w0 O, m5 a/ I(3) DISTINCTROW 如果有重复的记录,只返回一个
# R, H8 ?  V* }(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
$ V2 V& L& A9 G: u/ }( m例:返回5%定货额最大的定单8 E: k, [- s* l
Select TOP 5 PERCENT*( W; q% a3 {/ C5 {# }+ X
FROM [ order Details], r( j" z$ b# G3 W/ y
orDER BY UnitPrice*Quantity*(1-Discount) DESC+ H/ i7 V2 u- b- c8 r
3 用 AS 子句为字段取别名
6 q" K# _4 v* f5 L6 M7 w4 U! W如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
. a, H% O5 t% _例:返回FirstName字段取别名为NickName9 `4 H% l$ n. i7 I+ J! ]6 K+ k
Select FirstName AS NickName ,LastName ,City
, |7 f/ \( E4 t2 B0 `. x8 O9 FFROM Employees- F9 v& w4 E: R7 B
例:返回新的一列显示库存价值3 M; i3 n5 y+ I' [
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
; F0 R7 A: k0 qFROM Products
3 Z5 w( v; e1 H2 O2 G二 .Where 子句指定查询条件2 O8 ?- z' I7 H
1 比较运算符
, Z0 L* T& t5 p3 E1 K$ M比较运算符 含义
  h4 S1 x4 `: y* X& N$ R= 等于* j# h- S4 G* p7 s* m5 z
> 大于
( B$ R+ L" r- [< 小于
2 {/ w  `( _; R% K, P3 K>= 大于等于6 \3 `1 O4 o/ u; I/ N
<= 小于等于
! t, [8 Y" I" e0 f) T* s( w<> 不等于
. w# I& b3 m9 \!> 不大于( C9 L6 }; U0 [4 }0 a) w
!< 不小于/ o9 G& r+ {5 k% e
例:返回96年1月的定单- `( G; E7 n( @: o. Y+ g* I
Select orderID, CustomerID, orderDate3 j" v# f! D+ f+ \( p' H
FROM orders! z7 z9 d$ G& ]
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
3 k% c+ O- N' T9 L9 K+ w注意:. [  @5 P  P9 ?6 P
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。2 m7 B/ _2 L  A
例:; J; v5 k6 w  ~& H
Where orderDate>#96-1-1#: ], d. A" e: S
也可以表示为:* e+ z9 L# ]1 K; S' A$ p2 p+ Z
Where orderDate>Datevalue(‘1/1/96’)
) B: W, e* F6 W7 Y, f4 i* J使用 NOT 表达式求反。
# z, G4 R* y( j5 ?1 [: K: K, O例:查看96年1月1日以后的定单( f8 t1 {  v8 Y0 Z0 ^8 D
Where Not orderDate<=#1/1/96#; {) X2 x) l4 g4 f* @: ^4 ~
2 范围(BETWEEN 和 NOT BETWEEN)
5 L0 j+ K) }, G: EBETWEEN …AND…运算符指定了要搜索的一个闭区间。
* Q0 l+ j, }6 J& w例:返回96年1月到96年2月的定单。- r2 X0 C7 N4 _
Where orderDate Between #1/1/96# And #2/1/96#
, N2 B3 l; N3 Q( k3 Y- v4 {) v3 列表(IN ,NOT IN)
, ]' N/ Y: K9 b, D9 X6 pIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。4 _3 r* H' K5 g5 x; \
例:要找出住在 London、Paris或Berlin的所有客户
7 t6 t9 P% i# o/ Z4 v; ]1 {' Y1 xSelect CustomerID, CompanyName, ContactName, City
! g, B8 r$ U; \" Q. o5 p' R$ h) VFROM Customers+ K: H  f" W. `! f
Where City In(‘London’,’ Paris’,’ Berlin’)6 L7 J$ P4 t! t* n$ E, r  W
4 模式匹配(LIKE)
+ H9 U4 x9 V9 q  f0 PLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
% J# l3 ]$ k2 v" wLIKE运算符里使用的通配符' M0 g, Z) g/ k0 v+ }2 A
通配符 含义1 F. W8 O$ j2 y7 ]
? 任何一个单一的字符2 b0 H8 V* j. d. L
* 任意长度的字符
: T: d* _: C2 {4 L# 0~9之间的单一数字* `; p5 X. M! s- d
[字符列表] 在字符列表里的任一值
1 @: O; |; [6 o- X2 a2 w+ t[!字符列表] 不在字符列表里的任一值
$ {$ d; w  ~8 g7 z- 指定字符范围,两边的值分别为其上下限
/ x% `! {7 o0 Q* ]* [; a$ r例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户; }  e3 v5 d; Y& W
Select CustomerID ,CompanyName,City,Phone5 f2 a5 K! E$ I
FROM Customers1 r+ z0 r  _% d* {6 q7 F' O
Where Phone Like ‘(171)555-####’( F' x7 _. `# Q& J( }
LIKE运算符的一些样式及含义
3 d2 ?5 N5 _# g/ p# K7 ?: K9 ^- Q样式 含义 不符合
  x" R! G6 o6 P" YLIKE ‘A*’ A后跟任意长度的字符 Bc,c255
) K& u/ K" i$ ^# {& p# LIKE’5’ 5*5 555
. y% K4 n0 q7 e" p( hLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5) q; L; Z: R- v1 l. O
LIKE’5##5’ 5235,5005 5kd5,53461 Z( g* h7 v% C0 e# o' q) b4 n
LIKE’$ }3 F' _. H# v1 V9 h4 x) E
[a-z]’ a-z间的任意一个字符 5,%, ]7 I! d% F) O+ k" j  i
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
6 h- t9 i* U/ a" P/ C2 v5 e7 z8 pLIKE’[[]’ 1,*( z# B" d4 j) E. V+ h
三 .用ORDER BY子句排序结果
5 i' }( \% v+ e5 P& F; y' ]$ iorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
6 ?0 Y/ E3 F4 k1 HorDER子句中定义了多个字段,则按照字段的先后顺序排序。/ g2 M9 o8 w. I" l& s* T2 i" L
例:% T5 s. R7 C( R/ m
Select ProductName,UnitPrice, UnitInStock& d* Q8 t' j7 y: T9 U
FROM Products& v2 d8 @* {5 D
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName$ V) D2 P. g! E- R% U
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
6 F. m  ?* _7 X1 i例:下面的语句产生与上列相同的效果。  t$ x' ?$ R4 `) S5 b- G
Select ProductName,UnitPrice, UnitInStock
; @. U& b# |2 IFROM Products
) B& e5 z8 l; K0 RorDER BY 1 DESC , 2 DESC,3/ q8 m! c  g" @6 t8 g
四 .运用连接关系实现多表查询# q- N: [- u, X# c$ a
例:找出同一个城市中供应商和客户的名字
  P& T8 b! K1 X* xSelect Customers.CompanyName, Suppliers.ComPany.Name! s8 p  P/ h' U% g. h0 l1 y
FROM Customers, Suppliers
& \8 y3 _4 ~5 T9 ]) KWhere Customers.City=Suppliers.City
- K; V9 D  w  q2 N( o例:找出产品库存量大于同一种产品的定单的数量的产品和定单0 Y$ K6 K$ L/ J
Select ProductName,OrderID, UnitInStock, Quantity' n1 b3 w! K7 }( K, I" R2 W
FROM Products, [Order Deails]
+ B9 b0 {  l3 H) q, jWhere Product.productID=[Order Details].ProductID
2 l  V( k3 P. B% P) FAND UnitsInStock>Quantity
: @: g& t5 s9 P另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
/ j. q, x0 c7 |) i! O6 W4 r. n语法:
" J0 `0 k! E  c& k5 R- u3 rFROM table1 INNER JOIN table28 o# V% |8 h+ U. Z3 K$ U6 o2 P' @
ON table1.field1 comparision table2.field2
, v( \# M" t: r# n+ O( n; v' R其中comparision 就是前面Where子句用到的比较运算符。
6 `  g# Q( b' o3 ~; s1 u8 M# vSelect FirstName,lastName,OrderID,CustomerID,OrderDate. C1 ~& K! o7 K: e9 n
FROM Employees: P* f5 r0 Q. _- ]# }& M2 a7 J9 u
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID3 S  P6 |: c$ C* K
注意:$ d0 H7 @5 @; G  z/ K2 v2 p9 O
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
7 i7 L4 h' c7 m' u在一个JOIN语句中连接多个ON子句  |- |( d$ V% d% u% e2 ]
语法:8 O5 w: V' H6 O1 Y* ^
Select fields
; x; H. Y! W% B* ~FROM table1 INNER JOIN table2( n7 U1 Y( H7 b( l) Z- O& b
ON table1.field1 compopr table2.field1 AND
# p; ^2 y8 n- m$ PON table1.field2 compopr table2.field2 or
& S  K9 Z3 U+ R3 H. FON table1.field3 compopr table2.field39 ]0 l( e+ u& i: F. `) T
也可以. @/ [' @) G! m# x$ d" L8 ?
Select fields8 K  @7 Q+ \% j" R8 v, i& k9 N7 M6 [
FROM table1 INNER JOIN, }2 a$ w  A  c# U+ K2 T( l
(table2 INNER JOIN [( ]table3
9 o7 n" f1 d2 B: [" ][INNER JOER] [( ]tablex[INNER JOIN]# u" f! a4 N3 V( A7 J. G
ON table1.field1 compopr table2.field10 t4 B/ T9 W0 B. J* J9 q0 }
ON table1.field2 compopr table2.field2
; S& ^( V+ ~$ q( W" B' CON table1.field3 compopr table2.field37 q7 c+ [1 d' k) N& [
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。. e* L& e, ], x6 a6 Q
FROM table [LEFT|RIGHT]JOIN table2
0 i- Q5 G0 f7 s+ x6 J/ ~: ]ON table1.field1comparision table.field2
: `/ k! T% X2 j& i" a- _用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据' L9 L7 M  n, i" Y
例:不管有没有定货量,返回所有商品7 L0 X/ I6 G+ t- k* B- i. m- c! i
Select ProductName ,OrderID
8 Z8 i+ l$ K0 Y/ ~FROM Products2 P5 F8 c; Q* q+ C% @2 D$ x2 L
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
0 {9 V; Z& g2 O0 y4 r7 W右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。6 C+ y: k6 E: a0 z% w
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
0 i; J* N1 ^' E" F# d  A空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。+ h* K$ H2 D3 S; \- G
Select *6 B' X) {! E' m0 h
FROM talbe18 {* H9 A$ }. w) e) H
LEFT JOIN table2 ON table1.a=table2.c3 N4 i$ _2 z4 C1 j6 i
1 连接查询中使用Iif函数实现以0值显示空值
! A) Q! V5 ?9 ]1 hIif表达式: Iif(IsNull(Amount,0,Amout)
$ N+ R! r) }- B. g例:无论定货大于或小于¥50,都要返回一个标志。7 F% u" q) \7 J
Iif([Amount]>50,?Big order?,?Small order?)) N0 p& w4 ], k2 i! n
五. 分组和总结查询结果
$ ?/ O$ l" S& f: v* q8 D6 J! g在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
6 Z: s' y8 c: F; w# M7 ~0 k/ d: QGROUP BY 子句的语法( j$ M! s9 p4 ]
Select fidldlist
. L+ ]: ]( H$ I9 S! P/ P  T) hFROM table
; [) E  N% w) X2 D4 @+ EWhere criteria1 O6 s! Z3 s- C4 ~9 \  H& Y
[GROUP BY groupfieldlist [HAVING groupcriteria]]; j, `3 x+ \5 n+ T7 l
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
/ n  n: S" U: k( c. F$ C* W7 i6 {/ {GROUP BY字段中的Null值以备分组但是不能被省略。
. n9 ~  h3 P5 e7 c在任何SQL合计函数中不计算Null值。
* R: m! k5 g4 A' Q& O# RGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
- m( e9 }8 h9 R( b3 Q+ E例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
8 G/ a8 V8 e* |2 `& l: O6 e# k' ]Select Title ,Count(Title) as Total
& q! B+ ^- q# v5 ?: QFROM Employees1 q7 c2 \# Z/ e' U. l
Where Region = ‘WA’9 c. Q2 }6 ^; |* C# e3 u3 Y' n
GROUP BY Title
  \4 F7 v( z/ w: a8 d9 ^HAVING Count(Title)>1' l, x3 f- i6 o# h) w
JET SQL 中的聚积函数
2 Q( o2 j- D6 _. t- l聚集函数 意义5 w8 i& l" C# u( p- t
SUM ( ) 求和( `! _2 g2 {0 h# m7 ^; c3 B
AVG ( ) 平均值
. @6 n. U( W# s! O; T5 b: h1 bCOUNT ( ) 表达式中记录的数目
, E$ a5 p7 L0 c7 p9 d" _COUNT (* ) 计算记录的数目
- L: w$ C$ R$ }: aMAX 最大值7 }; r7 C+ R4 R  H% j* F
MIN 最小值
3 j4 k9 ~8 q7 H+ i9 tVAR 方差5 B" h& {  l; C
STDEV 标准误差
' x, k  ~6 C% j+ s. C5 RFIRST 第一个值/ N' E4 \2 Z. n6 U" b+ ?0 T
LAST 最后一个值
) R# p1 _' m9 t六. 用Parameters声明创建参数查询
- {9 @2 X6 N0 w' c" ]0 K$ zParameters声明的语法:
- g" N! c& y) uPARAMETERS name datatype[,name datatype[, …]]
$ c5 a  J6 Z3 `) Z9 a1 Z: I7 f8 Y其中name 是参数的标志符,可以通过标志符引用参数.* g0 N" V1 x* ]$ F" R2 t! x  x
Datatype说明参数的数据类型.8 r, B  M1 _5 _" M
使用时要把PARAMETERS 声明置于任何其他语句之前.
, H( S* `3 q2 J" U- J( e! j例:
0 f. Q' I% Y# J6 g. uPARAMETERS[Low price] Currency,[Beginning date]datatime
# f6 u! k, a! B/ }9 O$ tSelect orderID ,OrderAmount6 X; y9 w0 o" q% P- k
FROM orders
) b4 m9 i* U( CWhere orderAMount>[low price]
5 K# d7 @* k0 nAND orderDate>=[Beginning date]
, a4 M* ^0 Z1 X% F+ I七. 功能查询
% h2 x9 l+ N( W所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
! u+ y1 r7 S8 x. @- @1 更新查询
9 M# Q& q7 D: j! ~$ A) a# TUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
0 \1 q' |1 @2 i- h9 T更新查询语法:# i5 O. c; H: a  \  d+ O1 W
Update 表名. Z5 l: r+ B( P6 ]( p- h1 e
SET 新值# K" j! d& `6 x4 d9 w  I8 j
Where 准则
9 m# g* X  G+ G4 B8 t9 K" X  C例:英国客户的定货量增加5%,货运量增加3%+ H' x  p/ P/ ?; x5 |$ _
Update OEDERS7 d2 \$ j$ a! O! F" ?. Z6 c
SET orderAmount = orderAmount *1.1
( |0 a! @  c$ S9 Q4 PFreight = Freight*1.03
% @, ]) {% @; X4 p% x1 H( qWhere ShipCountry = ‘UK’
) o; g' g# ]  N5 _( X: L2 删除查询8 k5 b! C- h6 ~# }$ p3 T3 L; R' a
Delete子句可以使用户删除大量的过时的或冗于的数据.
0 V, N# V2 w, Z" n5 B4 P$ |- ~+ [6 t4 O注:删除查询的对象是整个记录.
4 h0 N( h4 c3 v6 r9 WDelete子句的语法:
# `! ^; |  y! J" |Delete [表名.*]  d4 I9 w* u) o) G9 q8 S) @/ }
FROM 来源表
! V* P0 w8 N; t* K  b3 c& KWhere 准则
, _1 P; ?0 `. ^6 X例: 要删除所有94年前的定单
$ m! O- X! ?  V; G. R/ GDelete *
4 ^" C" E9 D1 W1 c5 S& R, k! \: dFROM orders
6 T5 v6 J  I0 i) f0 E( E6 x$ W0 bWhere orderData<#94-1-1#' i7 `& q% L, T
3 追加查询0 l2 ^4 g7 w- t- [! ~
Insert子句可以将一个或一组记录追加到一个或多个表的尾部./ d$ i4 n1 t9 M" e
INTO 子句指定接受新记录的表. `0 a2 m  Z9 z9 a0 w! w
valueS 关键字指定新记录所包含的数据值.
( U% W& D3 ~  x* LInsert 子句的语法:
5 ~" K. f5 J% l! I( p! C4 q9 x) _INSETR INTO 目的表或查询(字段1,字段2,…)
8 j0 U% W2 J9 o$ yvalueS(数值1,数值2,…)
2 d# `! i5 T! x- P2 P' v例:增加一个客户3 K# z+ z. n3 _" c
Insert INTO Employees(FirstName,LastName,title)
6 `* T; j" U& I0 fvalueS(‘Harry’,’Washington’,’Trainee’)
% Q- R& p$ k: y: x4 生成表查询& l% E3 ?$ A0 k+ M8 b/ ~  A  U; z
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础., r/ X# T3 C2 u
Select INTO子句用来创建生成表查询语法:
; E1 a* p( M2 p( D" aSelect 字段1,字段2,…; u1 ~" X7 t, s6 @4 k4 b, Q$ \
INTO 新表[IN 外部数据库]
7 m1 ?7 M4 a+ `- D) \: Z; ?' j7 m* O: iFROM 来源数据库$ [! o$ o6 Q( E/ k8 J8 O$ h) h
Where 准则
1 @. }& I, X3 ?1 b8 }( n5 |/ r例:为定单制作一个存档备份
/ h6 @; m8 N' G  L0 \Select *
$ Z; p2 j) n( J8 m2 cINTO ordersArchive
9 e5 r" R% x( M- DFROM orders
6 I: `( R6 f) J' s) ^4 q八. 联合查询
$ m% ]+ h% L1 w5 T  ~# nUNION运算可以把多个查询的结果合并到一个结果集里显示./ R4 X) G# y) S/ d/ z1 G+ P
UNION运算的一般语法:
) t" p( P& u4 W  i% z( l[表]查询1 UNION [ALL]查询2 UNION …7 ~2 m, W  B2 D) @2 |/ U: U3 `
例:返回巴西所有供给商和客户的名字和城市
: r& C( i1 S# ?2 y; r7 WSelect CompanyName,City
1 L/ w9 u) ]+ b1 J% sFROM Suppliers
6 \3 o+ s2 i' q* AWhere Country = ‘Brazil’3 _; O5 I; S8 C$ @) W# q- r$ p
UNION- V3 D4 J* b: Q' O) C0 |
Select CompanyName,City
5 u6 {: y. o# T- vFROM Customers
5 f% E) p0 ^- `; {% N3 n" n, VWhere Country = ‘Brazil’5 k: `' b" L: ~7 p, L, p
注:
, a) w6 y9 C/ u$ e5 C9 |缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
7 w7 K) o* ?8 ]) }8 J& Z6 `# E) y, XUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
9 M) L7 F  m: t' {6 [# ^每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.2 f' X8 @/ C, S! o: Y. I# o+ x
九. 交叉查询
4 H* y9 U" j& |# z4 O2 j交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.- n. n* O/ n+ Q/ ?# m9 ^7 c6 ^) `3 k
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
* D5 @+ j. f1 f% J5 N$ s, N2 OTRANSFORM aggfunction/ W+ |; b6 n/ G
Select 语句
' E( Y; X: W5 Y$ E7 B- X+ n* _+ I( X( vGROUP BY 子句
7 s: b7 k5 r/ [" SPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
9 O2 Q8 n3 y9 i  |  s# w8 g& uAggfounction指SQL聚积函数,
1 B: \4 _0 L" Q* \Select语句选择作为标题的的字段,6 Y! J4 I' H8 w) e( a
GROUP BY 分组5 M8 A: P" @% c) T
说明:8 n* y" O1 [) `/ K+ I4 [
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
0 e, [7 ?7 \% e, q, U2 lvalue代表创建列标题的固定值.
& C$ w  N2 o* \8 a0 B例:显示在1996年里每一季度每一位员工所接的定单的数目:
5 |5 p4 F7 C( YTRANSFORM Count(OrderID)0 ]$ p+ V6 ?; N2 Y/ p
Select FirstName&’’&LastName AS FullName
1 D* `! L0 K& g% WFROM Employees INNER JOIN orders$ E- f$ S* ^5 E
ON Employees.EmployeeID = orders.EmployeeID
: k8 `3 M& v/ g/ \7 d" M( k' s9 ^Where DatePart(“yyyy”,OrderDate)= ‘1996’
- i% ]1 l0 c3 M8 b8 MGROUP BY FirstName&’’&LastName
8 P# y  c% H. LorDER BY FirstName&’’&LastName
/ y$ [) W1 i$ ?2 R% aPOVOT DatePart(“q”,OrderDate)&’季度’
) {7 f/ H/ R2 y- q" N& }# {! b十 .子查询. `( {* v& S; I; b5 y% Q
子查询可以理解为 套查询.子查询是一个Select语句.
4 M/ O# q3 [$ z; [1 表达式的值与子查询返回的单一值做比较
$ @& G6 I& y' F语法:- S0 b) f" ^" r5 {' \
表达式 comparision [ANY|ALL|SOME](子查询)2 H1 C5 p: y5 S( S
说明:
5 g, G2 L# x( {$ K5 `, i4 c1 \ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.  I0 p% a( ], Q- m! l
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
9 P$ M/ I; E% |* U. j) ZSelect * FROM Products+ Q5 g" k8 o+ W
Where UnitPrice>ANY
! t$ u8 \& h+ d  ^# |. d(Select UnitPrice FROM[Order Details] Where Discount>0.25)7 D* E3 p: e+ W
2 检查表达式的值是否匹配子查询返回的一组值的某个值
, T( N1 W. t: z# l语法:
' N6 d% O! _6 b( H& e4 d% B3 C[NOT]IN(子查询)5 h! U; I$ S5 v/ _& C
例:返回库存价值大于等于1000的产品.
5 n( k+ N  `* bSelect ProductName FROM Products) f3 @3 Q( D( y* B1 h7 U& ]
Where ProductID IN( q4 B. i* E2 J  ^- b6 f
(Select PrdoctID FROM [Order DEtails]! j7 X$ f! ]: A% v4 N
Where UnitPrice*Quantity>= 1000), [  r6 Y, V% d- ?( p- ]% h
3检测子查询是否返回任何记录/ Y, P2 J9 Z( r, H1 |; c; G
语法:' B! N+ S8 z! A4 d, u4 O8 t- }4 p, a3 n
[NOT]EXISTS (子查询)
0 r% O6 R% e; B) c) ~例:用EXISTS检索英国的客户
: f2 W7 n2 H" A" j( eSelect ComPanyName,ContactName) v& g- x/ O, a. x. N
FROM orders
0 I* h. t4 s% k6 ~1 kWhere EXISTS
/ g% l4 ^/ e0 f7 j: F(Select *
' `4 n1 e" A& l5 {0 gFROM Customers# e' B1 _* I  G# O9 l
Where Country = ‘UK’ AND
: {4 k3 z. ?/ I: n# X6 c% K. UCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-9-5 03:52 , Processed in 0.026002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部