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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法5 D& |$ P' {* D' s9 s
0 z( c$ g+ X( C+ l8 W0 T
select distinct 字段 from 表名8 M" B: o- p# J" v8 a! x7 _: G
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。8 |1 H* Z: D# G! a
一.Select语句的完整语法为:
, g* ?1 [( q3 ESelect[ALL|DISTINCT|DISTINCTROW|TOP]1 B- B6 s6 r% S9 |  `" {
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}3 M4 I$ ^8 t3 G) M/ O
FROM tablee xpression[,…][IN externaldatabase]
% ~( M. z+ Q1 I$ r- {5 N[Where…]
6 R+ M. ~6 U9 T[GROUP BY…]
, Q* i' [3 _; j! Y6 H& z[HAVING…]) ~/ J% A) z. G: S" T& X( u
[ORDER BY…]; P& {5 c7 I4 U! H+ X/ J% T3 B
[WITH OWNERACCESS OPTION]' D7 f" G7 P3 p5 V' G
说明:; t1 j/ V: w0 j# w# q0 T
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。' V. |) W8 v( A
1 FROM子句1 B; ~7 J$ d# G* u5 g) W
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
* f0 o* c8 i/ Y. H2 A例:下列SQL语句返回所有有定单的客户:
7 Q8 X- O* Z1 b4 q5 I4 rSelect orderID,Customer.customerID
( t5 \1 U, Y$ R8 i; v" p, FFROM orders Customers
  ]2 F) ^( v- p' rWhere orders.CustomerID=Customers.CustomeersID0 D( ?! t5 Q; s; k5 _* S  @
2 ALL、DISTINCT、DISTINCTROW、TOP谓词: }# @6 f( H: m9 g9 M& n
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
9 ]6 n; o0 C6 r' a1 y. G( j例:Select ALL FirstName,LastName
8 n1 j% u- ^; ?4 @/ n( h5 JFROM Employees
$ ~9 t# L5 r) `% a5 b: ^& W) m(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。& Z2 }: z; {$ v/ }
(3) DISTINCTROW 如果有重复的记录,只返回一个
+ T, v' Y  \. r* o7 i6 B7 @, m* Y(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
6 c! i( E7 r9 D( F例:返回5%定货额最大的定单
! y2 ^: [) z' W* Q3 dSelect TOP 5 PERCENT*; n0 i5 J; A- I1 X3 Y7 \: \! Z
FROM [ order Details]/ \4 _3 o7 @! T- K4 s' u# l# @
orDER BY UnitPrice*Quantity*(1-Discount) DESC! N5 V7 Y6 n: _: P
3 用 AS 子句为字段取别名
; Q3 T, R$ ^1 L( W如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。0 x* U2 X! w/ ?
例:返回FirstName字段取别名为NickName+ w. J* ?4 A4 _+ P" Y/ b* x# K
Select FirstName AS NickName ,LastName ,City' H9 w5 \. J2 [* V; o& U; r4 G
FROM Employees/ ]6 P1 L) c1 i$ p! ]
例:返回新的一列显示库存价值
8 B5 N1 ?. _  g  }8 X; n( u' ?Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock% F( _: P! O) Z) f/ M0 y
FROM Products
& \& }* l) z5 L6 A( y二 .Where 子句指定查询条件
2 _8 N$ P/ r. J! V8 V4 e1 比较运算符2 g$ `& ~. T) F0 G8 f8 f  }! j; S
比较运算符 含义
2 q4 ?' Z9 g$ ]; ~! r8 k= 等于1 E" V9 }1 H. ^9 \6 @( [- J6 h
> 大于
5 Y$ x- J/ ?& w3 E: G, i2 N, |9 u% r< 小于) F; _2 C+ x  S# D
>= 大于等于" V- I; @. ^3 B. w8 U
<= 小于等于* C8 C& Q- z3 P8 m
<> 不等于
/ U5 B. ~, E5 D" g, d- S% ^!> 不大于
5 x( R6 ^* ~3 m4 Z) C!< 不小于+ p( V( h) h+ m! I, u" y8 B
例:返回96年1月的定单7 b  x$ J9 J" u% ~  H6 b
Select orderID, CustomerID, orderDate; V% h; x6 A; ?& s7 K0 Z
FROM orders! Y5 |8 X6 r7 {
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
' j) Z2 `1 I' U! Y注意:( E) e& Y/ Z2 Z% a
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。6 O# J; K# h% G1 @9 C
例:' Y7 `& g; S! @  N
Where orderDate>#96-1-1#( P" X  }/ ?. C% V1 B
也可以表示为:6 ]3 i1 y' g& `7 X
Where orderDate>Datevalue(‘1/1/96’), F8 U4 `. ~4 p* e0 F0 `2 b
使用 NOT 表达式求反。5 ?# g4 z. |* r5 Q% t4 o8 ]
例:查看96年1月1日以后的定单
) K0 j% N2 \  }7 G2 J! _7 K9 lWhere Not orderDate<=#1/1/96#; J' A' i* E* d0 r/ x% {
2 范围(BETWEEN 和 NOT BETWEEN)6 I( u) A7 B) J, h% i" s
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
. v, E4 f+ A+ M% V- i5 T8 z例:返回96年1月到96年2月的定单。6 y: v1 |4 m; k7 w5 ?# J7 z* t
Where orderDate Between #1/1/96# And #2/1/96#% \) c' J9 n2 W3 d4 u
3 列表(IN ,NOT IN)
3 R7 {4 v$ o$ I, s" O- [: ?IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
9 A) C% N- ?. Z2 I  ?" @例:要找出住在 London、Paris或Berlin的所有客户
1 m. Z* i4 I* J) F2 ?Select CustomerID, CompanyName, ContactName, City0 G- A. ^) _/ j  g% j
FROM Customers
, @0 X8 d, @- L- _8 l  yWhere City In(‘London’,’ Paris’,’ Berlin’)- _9 G! y0 }9 ?
4 模式匹配(LIKE)
" i+ i  f& J1 P$ sLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
0 G$ X7 F$ v1 n- ?, v* |+ nLIKE运算符里使用的通配符
- z! Y4 K% ?' {/ l8 _- d通配符 含义( x1 ]. c7 ]& M1 ~6 C( Z
? 任何一个单一的字符
. ]) U9 _! A+ H" ]* 任意长度的字符/ Y$ U2 y/ i; j5 _
# 0~9之间的单一数字
7 f- ^$ U% G8 [+ c[字符列表] 在字符列表里的任一值
9 _8 w, I& u" g[!字符列表] 不在字符列表里的任一值
6 a; g, L" H) V+ ~1 m- 指定字符范围,两边的值分别为其上下限
, o. }! l, P+ S3 c/ O7 `3 ?例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户2 G$ [. K9 h% m/ H
Select CustomerID ,CompanyName,City,Phone- W: p, T5 Q) _( p! T
FROM Customers& P0 N/ I+ H" W1 p
Where Phone Like ‘(171)555-####’
/ Q2 s' @/ W5 w# p0 hLIKE运算符的一些样式及含义
" S0 `# }* g/ w9 ^! {# T: q& h  Z样式 含义 不符合  Z* S9 _. G" G+ Q1 l- j
LIKE ‘A*’ A后跟任意长度的字符 Bc,c2553 Y; M2 p' p) a3 F
# LIKE’5’ 5*5 5552 I7 m3 Q' y! ~2 N" C' f3 H
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
2 G4 s+ c6 e, z" GLIKE’5##5’ 5235,5005 5kd5,53464 G" p  t/ n1 H2 ^8 I
LIKE’
+ @$ J( R9 n* S1 c  i: L7 m[a-z]’ a-z间的任意一个字符 5,%
# p& I4 s# u9 {LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
. }: r1 d% z$ E, h5 gLIKE’[[]’ 1,*
5 ^/ |$ F* s4 i: O三 .用ORDER BY子句排序结果
/ D8 M! B4 Q. m+ k0 H* C* S6 }orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
9 ]# D: ?" F# W0 L; R/ O5 |orDER子句中定义了多个字段,则按照字段的先后顺序排序。
' I5 H/ E% M2 D3 t, p例:
* a4 N9 O, b3 _# N8 `1 ZSelect ProductName,UnitPrice, UnitInStock4 z7 S  f; r! B% V
FROM Products) I& f- z( J) t6 Q" d" }
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName* [5 H$ l6 A$ O9 z5 b7 e
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。2 X8 t3 p; P" l1 T
例:下面的语句产生与上列相同的效果。+ o& F1 U3 w( M* b3 c6 D5 f
Select ProductName,UnitPrice, UnitInStock
5 j; S6 {! N4 o6 o  G( g  i4 s+ x8 |0 ~FROM Products3 d* B2 l& }2 R6 S/ _, d
orDER BY 1 DESC , 2 DESC,3
6 F+ L$ \& {* g! `( a四 .运用连接关系实现多表查询: |  P8 ?8 P- y# j; x2 L
例:找出同一个城市中供应商和客户的名字" G0 U1 D3 a' H/ y- ^% k
Select Customers.CompanyName, Suppliers.ComPany.Name
: ~# |5 p4 W/ Z/ @: xFROM Customers, Suppliers- j% ~/ m% o9 p+ Q( W9 z9 Q
Where Customers.City=Suppliers.City1 Q# Q4 }2 t' M1 K. }7 j
例:找出产品库存量大于同一种产品的定单的数量的产品和定单" P% K( m4 ?- ]3 B1 ^6 v
Select ProductName,OrderID, UnitInStock, Quantity0 Z5 e( p/ E9 v4 a3 G4 Z
FROM Products, [Order Deails]
6 \/ w9 G! d2 L9 Q' L& L& V! kWhere Product.productID=[Order Details].ProductID# f9 l& P6 `! y! ?5 H3 b
AND UnitsInStock>Quantity
+ @' U1 {! o: P5 j6 Z另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN1 H- L6 @: `& z/ v: m
语法:" K% ]8 P3 M; w' @2 v
FROM table1 INNER JOIN table20 _9 w+ c/ F" D
ON table1.field1 comparision table2.field2. u! W4 z& V5 S7 K
其中comparision 就是前面Where子句用到的比较运算符。* x( h, E* R9 G2 e: y  \6 J9 c- `1 ]
Select FirstName,lastName,OrderID,CustomerID,OrderDate
; o5 Q+ X7 m. e' c$ y% G0 D, c# d6 v$ WFROM Employees
6 C6 M) v2 z4 q/ C9 VINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
# p$ V6 [) B( O6 s% ~2 u注意:* U) t) j! N7 r
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
6 ]8 x6 K0 w2 v0 t) |# k, U* F! t% E; X9 E5 z在一个JOIN语句中连接多个ON子句8 b. O  b1 v2 I, }% y
语法:5 [9 v- ]/ k# F
Select fields
+ G/ J4 C$ v- TFROM table1 INNER JOIN table2
' c! e& c3 ^1 P. F2 _4 w! ]ON table1.field1 compopr table2.field1 AND; g/ ]7 |& `- ]6 X! L" ?% N; U
ON table1.field2 compopr table2.field2 or) Q3 o& S2 ]3 U3 F4 z: d
ON table1.field3 compopr table2.field3  X& V% ?  N8 [" \6 s2 k
也可以
" W3 M- _+ b1 W; @4 _Select fields: d0 y, t' X' U. l1 ]* a- }: w5 s: q8 q
FROM table1 INNER JOIN
  V% b6 U6 s; n# J  `(table2 INNER JOIN [( ]table3
& i8 o2 F* P) d- N[INNER JOER] [( ]tablex[INNER JOIN]- e) o* F& q5 [( q" ?
ON table1.field1 compopr table2.field1
. F( }3 o3 T: x* tON table1.field2 compopr table2.field22 W) Q  }/ w+ j) j9 V
ON table1.field3 compopr table2.field3* m5 P  A+ T0 X
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
5 F; H% p% Z' L' l% Y- {FROM table [LEFT|RIGHT]JOIN table2% \: c5 z. }6 o# W  \( J6 g- n, h7 \
ON table1.field1comparision table.field2
- [; ^+ n' o- s  z" X9 o用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据* w0 j8 Q2 V' s" [8 ^1 m) K
例:不管有没有定货量,返回所有商品) K, a5 V3 R( g
Select ProductName ,OrderID
' i* q8 B6 A* F  E7 U  e4 OFROM Products, |% ^& r: @) F. A7 D6 u
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
) ^" p$ q  F/ W9 q# W6 {右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。. j1 j# X* T' c, Q9 Y3 O% i. ~
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。( ~/ L% r; g( Q! T
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。7 y8 {2 Q3 t% z/ G, U; |4 G
Select *- P) u8 ~# x' q
FROM talbe1! n( t, |0 Y0 B& V+ l4 D/ |/ q$ @
LEFT JOIN table2 ON table1.a=table2.c
- u' w' g+ H; @" [1 连接查询中使用Iif函数实现以0值显示空值
6 z# F: v; r2 j1 i( S+ w0 yIif表达式: Iif(IsNull(Amount,0,Amout), J8 K& ?; x" |
例:无论定货大于或小于¥50,都要返回一个标志。
- O' E* O2 N9 ?Iif([Amount]>50,?Big order?,?Small order?)
. n7 o8 |, U5 I, J% e* u  G五. 分组和总结查询结果
3 N# P: M" }; C. b6 f" `6 F在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
* \; Y4 `* G" M" [/ n' Q; c: j3 H/ xGROUP BY 子句的语法; N2 {) Z; N8 u4 A( C* k
Select fidldlist  n( [' H9 ~/ V+ [
FROM table
" T7 K9 S: e5 w" k8 tWhere criteria
- N- V/ ]' {6 ?0 \: S( H, ?- t[GROUP BY groupfieldlist [HAVING groupcriteria]]
  V8 \0 I/ ~7 N) F( B1 i注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。8 A- j9 m. ^* n/ p
GROUP BY字段中的Null值以备分组但是不能被省略。6 Q2 t: v8 l8 _
在任何SQL合计函数中不计算Null值。
: G, u* c8 Y; O( VGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。; w6 [! q. w/ p5 W' ]
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。& }" ]; C+ d3 D5 B) E& e) i
Select Title ,Count(Title) as Total, F( d& x" ^& S; E( k& g, z
FROM Employees7 d1 p2 H* c9 A$ B5 K  R
Where Region = ‘WA’
8 j- [5 S5 S2 s) k; V5 V2 VGROUP BY Title& ]: f. Q  O4 h9 p: q
HAVING Count(Title)>1
; ]$ t/ ^$ B2 l  U8 [9 W& qJET SQL 中的聚积函数; G+ [2 d' \% U+ ~
聚集函数 意义
. q; S9 J6 h, j2 J, nSUM ( ) 求和
( o: I9 A' c7 Q; Z+ s* H9 VAVG ( ) 平均值) g" O9 C& t" B2 ^/ H
COUNT ( ) 表达式中记录的数目/ n) I7 F# {) y- G, Q7 h
COUNT (* ) 计算记录的数目
% `7 J0 c+ \# |' pMAX 最大值5 E, S5 S- ]. P' D. D9 N1 c3 t; h
MIN 最小值8 q- a& M& Y' s
VAR 方差$ ?4 s" [+ x) _
STDEV 标准误差
8 ^( J: w* Y7 K) s, {" |9 t, _FIRST 第一个值
2 E, I0 ]8 s& zLAST 最后一个值
- d" _' \/ k5 L- d( }( L& m1 B/ j六. 用Parameters声明创建参数查询# O" Y9 h! ?2 ]
Parameters声明的语法:5 |7 X- ?1 G" p, s& k
PARAMETERS name datatype[,name datatype[, …]]
+ t1 P6 ?$ f4 L  P. d1 k其中name 是参数的标志符,可以通过标志符引用参数./ R* J2 O% e: ]5 Z; _% q4 K
Datatype说明参数的数据类型.
( \( C0 ]! i4 w使用时要把PARAMETERS 声明置于任何其他语句之前.. k( ?9 }3 I2 |/ y  G% H
例:& a8 R# ?- H" a' P1 C5 L9 k) ?
PARAMETERS[Low price] Currency,[Beginning date]datatime
8 z7 k2 W# I/ o6 ^, ?( C2 @Select orderID ,OrderAmount- K( c# m9 l) h, D  e5 ?3 |
FROM orders" }% l2 x. A+ N. e9 _& E
Where orderAMount>[low price]
: B  q" e1 O3 i' k$ H& U# w0 QAND orderDate>=[Beginning date]% Q; `1 T8 n3 p9 l1 w
七. 功能查询
" d- t" |8 f: B所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.2 ?/ t4 r, B4 X! S$ i
1 更新查询: g- }  i1 d3 J$ k5 O
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.0 {8 }# `7 @- s' o5 [. P  F
更新查询语法:
# ~+ u6 A+ [5 UUpdate 表名
6 P. t+ F! b: t) e9 PSET 新值+ g) r) A: T6 n
Where 准则" C! s) e! r  @% I  c0 A
例:英国客户的定货量增加5%,货运量增加3%0 e- p% g' h% x9 Q' e
Update OEDERS2 t, b3 D# b) T/ D6 ^$ w7 p
SET orderAmount = orderAmount *1.1
, z2 a* O! n) AFreight = Freight*1.03! F, t# G; Q* K3 W1 Q" Z3 H
Where ShipCountry = ‘UK’+ [% `* `2 _, v8 D9 a
2 删除查询- t* Y7 \: y" U8 h3 A
Delete子句可以使用户删除大量的过时的或冗于的数据.
7 [1 E# m" w* E2 A+ i/ p- G+ L注:删除查询的对象是整个记录.. t2 Z1 T8 d! I
Delete子句的语法:
+ b  m$ [; U* `5 F1 H& D& t, e5 P. f! J. yDelete [表名.*]
# n, @0 _2 ?( W& y, w9 |FROM 来源表( L) A. o& \0 v
Where 准则
! A* H' G7 ?$ B% l" c5 z例: 要删除所有94年前的定单/ @: r0 t- N8 S! {' }
Delete *
! w' x6 I% T! I  n9 c- G  z6 w0 R( R% rFROM orders: u- Q7 O; L( K# j) e! O
Where orderData<#94-1-1#4 d  H9 Q2 r3 a& z, r1 x1 i. P
3 追加查询
% Y1 r4 m- M* T' a: t+ GInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
) ?2 N1 k' r; y  c2 ?INTO 子句指定接受新记录的表
, {% F5 q2 e% T/ avalueS 关键字指定新记录所包含的数据值./ m- Z; V% ~1 p8 M; V5 W' ^
Insert 子句的语法:
' y- q/ F! M0 PINSETR INTO 目的表或查询(字段1,字段2,…)3 J+ W( a+ h$ _
valueS(数值1,数值2,…)1 g7 ^- S% Z9 w4 {2 l
例:增加一个客户, p1 ^8 y. P( k/ G$ P0 o  K$ V3 h
Insert INTO Employees(FirstName,LastName,title)8 B, [2 s" b+ q! H  }
valueS(‘Harry’,’Washington’,’Trainee’)6 ~2 x. h3 Z7 W6 Z' y2 ~2 |
4 生成表查询& G0 z8 U$ u/ x
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.' u& l5 v2 D* S  r
Select INTO子句用来创建生成表查询语法:- P5 J  u- o# H! h
Select 字段1,字段2,…
& V# T# k" T' G7 dINTO 新表[IN 外部数据库]
5 t# W: B) J4 r9 n9 NFROM 来源数据库# u' s; X+ Z/ d  i8 J# X
Where 准则( G4 r, l! O7 j: }% M
例:为定单制作一个存档备份
$ H/ M4 S" R0 ~Select *  {* A2 H5 H/ U. y: Z7 t
INTO ordersArchive
9 c$ w  ]/ N9 c' YFROM orders  S# W  ~. w1 |. G+ g
八. 联合查询& R6 p1 y( I/ }8 j
UNION运算可以把多个查询的结果合并到一个结果集里显示.
. U7 L* \; }; `0 e/ p& G4 |UNION运算的一般语法:; `' w$ f* S8 h
[表]查询1 UNION [ALL]查询2 UNION …
' T9 y% [9 h& b7 D& ]例:返回巴西所有供给商和客户的名字和城市. o0 T( L* d$ z) U- B3 w
Select CompanyName,City, h' Y' s& D( S( o& }! G/ |3 ^  P
FROM Suppliers
& D) S. b% t# [Where Country = ‘Brazil’
$ }$ e. r* t- T+ C7 {$ g. \; \UNION
7 K: l8 q1 J0 \5 YSelect CompanyName,City( S5 \$ Q! Y5 T# W6 s
FROM Customers4 s: f) w& B3 q" c) z+ Q) S' }
Where Country = ‘Brazil’' G+ c. E2 A# k
注:
2 I) H/ Z5 E2 N缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
% U" N# C/ I/ D8 ?) _4 z8 J- oUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
3 M+ x# t/ \) K. N  M每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.9 }% f$ |- d' H  f- E; p, B% N
九. 交叉查询
5 W0 N; ]2 f5 H' k交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
. {# `. J& p- ]) H: lMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
) |+ }6 s- j9 z  D3 |TRANSFORM aggfunction0 w; h; i% C& r6 h) n
Select 语句( E( ?& j9 s/ B  [" n" H$ U
GROUP BY 子句) b/ m) a) v& U: k9 U+ X
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]' S+ m2 p$ H) P; [. I5 x: g
Aggfounction指SQL聚积函数,
+ B) a6 |$ i. L3 B" VSelect语句选择作为标题的的字段,
: ]6 x# }2 n: E8 h; B6 M' l) iGROUP BY 分组
" D* u8 e" B' S" o* b7 G' C说明:
) H4 g" k/ s+ R# ~Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值., n0 b1 U7 w/ ]4 g  {7 ^
value代表创建列标题的固定值.9 W( ^  [% y1 B- h( K
例:显示在1996年里每一季度每一位员工所接的定单的数目:
* c4 a* J/ K$ Q2 H, hTRANSFORM Count(OrderID)* K7 c  k9 S. m1 f
Select FirstName&’’&LastName AS FullName* B  q8 f7 E( h# W/ A6 S# t
FROM Employees INNER JOIN orders
; G, y1 {; }! H7 lON Employees.EmployeeID = orders.EmployeeID7 }" Z$ ?% P( R0 V( ~: j# \
Where DatePart(“yyyy”,OrderDate)= ‘1996’, ^2 w" r( b0 U' h
GROUP BY FirstName&’’&LastName
" M$ S# z# ]8 q; C& x  i, z; sorDER BY FirstName&’’&LastName" p5 V& o4 P) I7 d& ~7 h, f) \7 _
POVOT DatePart(“q”,OrderDate)&’季度’; ]2 J! i+ x& L& A2 w0 ^9 I9 {
十 .子查询+ i' i4 y) ~( \- ?2 a# ?% `& z
子查询可以理解为 套查询.子查询是一个Select语句.0 O1 X+ o0 b% c7 O$ U* |
1 表达式的值与子查询返回的单一值做比较) ]/ z7 \0 k& m( q, e0 S/ Q1 C; o
语法:2 {+ ~3 C6 D$ _0 R3 }6 b
表达式 comparision [ANY|ALL|SOME](子查询)0 A* D4 K8 N: T) x8 ^! H
说明:
! m5 w8 q9 w8 u2 R; MANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.5 X2 h' t, v$ L- W9 N
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
. B( n5 ]8 @" _Select * FROM Products
5 G/ D5 l1 N2 t  j- I# I) J* LWhere UnitPrice>ANY" j- d5 k" B2 F# L4 ]% w  |5 y
(Select UnitPrice FROM[Order Details] Where Discount>0.25)5 W5 i4 n0 s& `9 Z! X. r
2 检查表达式的值是否匹配子查询返回的一组值的某个值
$ ?% P, q- G3 E! F8 `语法:
8 X: y- c# p, Y* m6 t0 u' a' S[NOT]IN(子查询)
$ u) P8 x  F! `' H例:返回库存价值大于等于1000的产品.. b; I, X2 d$ ^# ]4 i; ^9 `
Select ProductName FROM Products* i% o- ~2 x) q
Where ProductID IN
/ ^0 V- ]/ T- x% `9 N(Select PrdoctID FROM [Order DEtails]! F3 r; {8 e8 d) g5 H! V
Where UnitPrice*Quantity>= 1000)
: W: ]. M1 l/ b' h, e) u( ]3检测子查询是否返回任何记录
6 Q, B/ e) N! t! n: s( e: x( y5 m" l语法:
, s7 s$ F6 u# s! r3 n* g[NOT]EXISTS (子查询), L% q4 ]# {0 c+ [/ q
例:用EXISTS检索英国的客户
/ d8 W' U2 p) G5 _5 q6 Y8 ?Select ComPanyName,ContactName; ?% j# @, k6 x0 z3 x: L) W  I
FROM orders0 Q& `, O' H( ^% V( F' O: T+ ?
Where EXISTS- X6 I) X2 Y9 S/ T1 O5 _' H
(Select *0 X$ n$ t' |7 G5 E
FROM Customers7 X; ]6 O, @2 Q1 P8 ?1 m$ i! J* f
Where Country = ‘UK’ AND/ J0 |3 S- J: G7 Q/ Y
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-4-20 01:55 , Processed in 0.031200 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部