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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法5 V& E( t) a# ]4 `! Q0 o
' ?" [7 w& e/ ^# J) Z+ N
select distinct 字段 from 表名
' M" V) L+ N4 ?" F, h7 X7 y/ Kdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。; o$ S2 B+ O% u( [# K! S1 H
一.Select语句的完整语法为:, z2 K- A7 B0 s' p6 q; {
Select[ALL|DISTINCT|DISTINCTROW|TOP]
/ e& {& H: n5 S& X% ]7 {( R{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}" H/ X1 M2 f' I
FROM tablee xpression[,…][IN externaldatabase]& I7 x* P7 y  ?: k
[Where…]
" E% d( b0 }7 ~8 a[GROUP BY…]
  p: {+ E9 o" o" m* i* N& s[HAVING…]
% ~6 j' S+ `$ H3 B[ORDER BY…]
% _7 O, }+ s( A, q  P; |[WITH OWNERACCESS OPTION]
+ Y+ n" ?: ^& T说明:9 L8 K9 L- P1 I4 t6 U% Q
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
4 z& H9 t$ t0 p6 L- S1 FROM子句
5 H, {$ i3 I& F  W. D1 ?. ]FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。) U1 _. K- X1 ~' O- ~  F3 u
例:下列SQL语句返回所有有定单的客户:
1 V* \- H3 |5 ~5 g; d# [7 _, G$ KSelect orderID,Customer.customerID
3 l6 n/ y4 ]0 F- |1 V( ~FROM orders Customers$ d" R, b4 ?# |/ i+ e! F& H' S
Where orders.CustomerID=Customers.CustomeersID8 v7 [/ k" _7 ^  U: Y4 G- x# y
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
4 m: G3 Z. m' k5 K) Z) K0 H(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。& v- B# H  `2 G) o( C& a8 Q
例:Select ALL FirstName,LastName: v7 @5 d* G: p
FROM Employees8 e( M# |, F; U6 K  m8 g
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。5 g" m1 M" A, V) s! D8 @- A
(3) DISTINCTROW 如果有重复的记录,只返回一个. s. g' v$ Q: Q' y& `' i
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
5 @4 A* V* I# z. ]2 }例:返回5%定货额最大的定单
9 I1 W& M% ]+ r# jSelect TOP 5 PERCENT*
' `6 {# E# ?: X' HFROM [ order Details]0 F4 ^, }: Z8 X* Y
orDER BY UnitPrice*Quantity*(1-Discount) DESC
' F, W0 @4 u" O8 I: p2 T3 用 AS 子句为字段取别名
' B; j" A% }! b2 J+ r如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
  M" ?( S; ^3 v2 w+ D例:返回FirstName字段取别名为NickName* B) [/ m4 n$ m7 i) J9 [
Select FirstName AS NickName ,LastName ,City' w$ ^- ]$ ~5 T- w
FROM Employees
3 x6 m! R; X' j- h# a例:返回新的一列显示库存价值5 i% q; M& O* _
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock* f, E; s5 R5 T( c9 o! A
FROM Products
6 n, M* l& A2 H% p/ @二 .Where 子句指定查询条件4 W0 q% d, G3 z$ P3 d1 p# x  A# O. F
1 比较运算符5 g* x# ~6 ^% S. @& C3 l
比较运算符 含义6 z6 A" y( S) }6 x
= 等于
, j0 O( K; j/ z! N3 [3 |/ {( l( _& x4 j> 大于
- Z6 z, {  L% T3 ~& X* D$ l6 A5 F< 小于
/ A8 @- U1 s% s2 l, p  M% T7 A>= 大于等于
6 n3 y8 D0 ]) c; f<= 小于等于# F+ ^8 p' p: x* p: l+ }1 W
<> 不等于. ^+ d; N9 _8 a8 W0 S( h
!> 不大于
- Y5 z" e+ m$ e* X0 ]% e; m!< 不小于# A3 t3 H( i! K2 }" s
例:返回96年1月的定单
5 D3 m, V9 G6 E0 R7 QSelect orderID, CustomerID, orderDate7 Q& F# R- J1 A4 T
FROM orders5 s0 b6 Z; R  T
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
& c* X' X( Q" [* q注意:) ]5 z4 E3 T& Q- L7 B$ L
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。- Y) g$ I" i. A; R9 P: a& [$ j
例:( S3 I5 z7 i0 h; ^" T0 K/ a2 X
Where orderDate>#96-1-1#% Y- M! y: y3 F8 c
也可以表示为:' y4 ?6 O% `- U
Where orderDate>Datevalue(‘1/1/96’)
! A+ t) K, l/ W  ?0 X. Q使用 NOT 表达式求反。4 B+ G! V4 W7 `
例:查看96年1月1日以后的定单. n3 R# K) b# ?9 }. |
Where Not orderDate<=#1/1/96#; _5 T. Z6 R# T# @8 x8 H
2 范围(BETWEEN 和 NOT BETWEEN)3 r) c- u* T2 \( N. h
BETWEEN …AND…运算符指定了要搜索的一个闭区间。; N, J: e! }$ ?& g( w
例:返回96年1月到96年2月的定单。
$ w8 m6 y) B$ v. uWhere orderDate Between #1/1/96# And #2/1/96#
" l# j% ~5 P* k, ^7 Q3 列表(IN ,NOT IN)0 ]+ `8 P6 B- T5 x0 n5 k
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。" I! f& h0 n) {) P7 J
例:要找出住在 London、Paris或Berlin的所有客户( H7 `  W1 P4 G
Select CustomerID, CompanyName, ContactName, City
- U; P; V. b/ i* S! C! `! }" F7 IFROM Customers
+ C  U  J& A3 w* BWhere City In(‘London’,’ Paris’,’ Berlin’)* {* I# O+ x! `: v/ ?, w8 E# o
4 模式匹配(LIKE)
% F' {' e4 p3 Y1 B% D" DLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。# ]. `6 S  k7 u9 J$ ~. h4 z1 z5 b. A
LIKE运算符里使用的通配符
& _1 u& l; ?% ]& D1 Q' V通配符 含义
- I# r4 I3 I8 \/ N  Z1 d? 任何一个单一的字符; c" j4 Y5 L: \5 O& F! C6 |
* 任意长度的字符
7 [' }- y8 \+ ?9 l& [# 0~9之间的单一数字( I. e- N" x- i
[字符列表] 在字符列表里的任一值
" L' J  ~  a4 O$ ~9 X, f, n[!字符列表] 不在字符列表里的任一值9 |- s1 x: X# ~6 y5 f
- 指定字符范围,两边的值分别为其上下限) V  u! m& m1 R- g& B7 r# D# g  x, N
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户; @+ ]# C' r% G
Select CustomerID ,CompanyName,City,Phone6 L+ E( F2 R" D5 I4 H& [% T1 _5 `
FROM Customers9 [7 t1 b7 v  h, _, a" T
Where Phone Like ‘(171)555-####’6 b7 u4 k$ _0 e  ^7 h( T8 g
LIKE运算符的一些样式及含义
, P' `$ z; C  C+ I3 E+ D, H4 ^样式 含义 不符合
" ?5 S& Y6 }; Y# S+ qLIKE ‘A*’ A后跟任意长度的字符 Bc,c255% E2 E- M0 b, c* g  s' N  o
# LIKE’5’ 5*5 555; r+ X9 }1 P. K# l. ]5 f$ v
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
/ R. i, |" w3 b. yLIKE’5##5’ 5235,5005 5kd5,5346
( e& G* X/ X) q; lLIKE’/ o0 ?/ U4 j! P; }4 [9 X
[a-z]’ a-z间的任意一个字符 5,%0 \3 k& p4 V! i& k$ u) E! a# _
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1( r; `. c6 E' }$ I  H
LIKE’[[]’ 1,*- t7 z& M, D; c5 D. y1 h
三 .用ORDER BY子句排序结果
' V7 S" w: [) l0 u% X5 q8 }orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。% m4 R2 \8 C; E
orDER子句中定义了多个字段,则按照字段的先后顺序排序。  J4 M" f) f! E  h5 g
例:
. k- D, C3 ^' a& C; M3 ?% ?; zSelect ProductName,UnitPrice, UnitInStock
+ l3 x( v% w! s0 W, xFROM Products7 X! q2 y' t: b5 O# D
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
" R8 W: t# B! SorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。/ }' j2 k5 `3 B- i  r9 H" C
例:下面的语句产生与上列相同的效果。
* H6 U2 a& o! w' i. [" @8 BSelect ProductName,UnitPrice, UnitInStock" j& r/ M! Q2 `$ j) |
FROM Products, D. }$ I) j" I$ i0 T" t; r+ i
orDER BY 1 DESC , 2 DESC,3
/ _% C# l; W5 g$ x4 u2 w四 .运用连接关系实现多表查询
+ T% ^9 X0 [7 r8 J5 f5 ?5 [例:找出同一个城市中供应商和客户的名字
: t& }5 G' o5 Q+ x  A0 ~# zSelect Customers.CompanyName, Suppliers.ComPany.Name
8 b+ }- S0 {( B% a/ I8 {8 [FROM Customers, Suppliers' C+ y8 F( \; ?: X/ t1 I
Where Customers.City=Suppliers.City# q& ]- Y; [5 W# ~+ y: ?
例:找出产品库存量大于同一种产品的定单的数量的产品和定单% [  n* \' J* J5 T
Select ProductName,OrderID, UnitInStock, Quantity0 D4 \8 G% w; Q  c$ G0 W: d
FROM Products, [Order Deails]) C* r, Q' h  g6 z- v* v
Where Product.productID=[Order Details].ProductID" n  g# I9 W6 V0 `
AND UnitsInStock>Quantity
- r* }& m; `( G+ O另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN( t" k2 @9 Q/ t5 {; v! E
语法:
, m" f. r, u9 L7 T& o1 o7 n% gFROM table1 INNER JOIN table2& l- J, O$ V1 T0 p: E6 m8 e
ON table1.field1 comparision table2.field2
  r' ~8 P# _$ q其中comparision 就是前面Where子句用到的比较运算符。* ~& y3 U. L% ]3 ]% `; F4 J  a
Select FirstName,lastName,OrderID,CustomerID,OrderDate; w8 U! k6 A* G* o4 x  o+ T: ~
FROM Employees
3 b) f, F, d& w( nINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
. ~  {! [8 n7 B" U; i/ U! f) d注意:# T! h$ k* T8 L# w0 ]5 G
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。) M+ }' T% |% {/ {) `
在一个JOIN语句中连接多个ON子句
/ ~$ X1 g7 o! M语法:4 Z* D3 m5 _' f9 `& V1 D* k5 _
Select fields* \9 r3 d: B5 ]0 j2 Y* [; r! g
FROM table1 INNER JOIN table2% R" H/ |+ \5 S' \! ~9 Z
ON table1.field1 compopr table2.field1 AND9 [+ |, f) m; h
ON table1.field2 compopr table2.field2 or
' C0 Q8 F. h- N, A5 }ON table1.field3 compopr table2.field3
, g6 @7 z  {+ `4 d2 j1 n, \0 E也可以, Y/ ~; M2 ^* F" @' d) Z# S
Select fields" h+ U( t3 o3 Q( m" c! W8 I' y
FROM table1 INNER JOIN
, W) C. z/ D, n" L. n(table2 INNER JOIN [( ]table3
. n- p! w, m7 N3 ^[INNER JOER] [( ]tablex[INNER JOIN]$ X7 r# k* c* r2 u+ S, q
ON table1.field1 compopr table2.field1
/ I: s, T* J, G4 ~* H0 R9 s# BON table1.field2 compopr table2.field27 C: m& n% a* ?* v8 Y
ON table1.field3 compopr table2.field3* n/ m* N. S4 P/ w' P. W
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
! w0 ~* i' ~* X# sFROM table [LEFT|RIGHT]JOIN table2; F& S- X3 h5 ]4 J
ON table1.field1comparision table.field2& P2 m) l8 l! q! P
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
0 b. X# b; ]9 E例:不管有没有定货量,返回所有商品
5 s# v  @  N% ySelect ProductName ,OrderID2 ]9 g: T$ v- W% \" A( l+ k
FROM Products# Z. c2 I5 A0 j( P0 [3 b$ n9 v
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID8 Q1 x. i+ J1 \- `0 r4 U- I3 z
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。  }: K) F" X4 n: p; U
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
( {+ {& E! C5 ?! L& F空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。' Y0 {3 {9 c0 C  P# \: j
Select *
: ^, b! v; k0 x: p: K- l$ v; dFROM talbe1/ b( f* c8 Z3 ~5 x
LEFT JOIN table2 ON table1.a=table2.c/ ^; Q" Z. Y+ r/ H1 ~( A$ G- q! D3 o# x' S
1 连接查询中使用Iif函数实现以0值显示空值* L4 k& N! p3 a; i4 y- n1 p- m1 x7 u! `4 {
Iif表达式: Iif(IsNull(Amount,0,Amout)
3 O1 \3 `' H- {例:无论定货大于或小于¥50,都要返回一个标志。
$ x+ h5 W! Q& C3 ]  r7 XIif([Amount]>50,?Big order?,?Small order?)! c9 H4 A% W+ s  k4 w$ ?( ~1 T
五. 分组和总结查询结果. t% Q9 m; q9 C7 F9 n) a
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
; I8 t. ^4 M  Z6 I" X: L# L) PGROUP BY 子句的语法
: R6 v4 @; B4 K4 f0 pSelect fidldlist$ v& C& ~. _. C. |+ y5 @
FROM table- ?% n% f, A2 L5 \3 {
Where criteria: x# Q" u) z9 c, m( X
[GROUP BY groupfieldlist [HAVING groupcriteria]]
- ?5 H6 n0 P1 L- |& ~注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。; l; R5 A/ C$ K) H  _8 G  S; a/ i
GROUP BY字段中的Null值以备分组但是不能被省略。
# p7 t: q0 U* N' y6 v! U在任何SQL合计函数中不计算Null值。7 d$ F* p$ |; X
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
6 p  |* E% j- k" _# w% V例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。" q7 x2 X- t7 Q  q! t
Select Title ,Count(Title) as Total  t$ P3 ?' E; j- }6 e' H. j
FROM Employees
0 P3 h0 ^# h* M: e+ E; ZWhere Region = ‘WA’
8 o& f  D( w; @; }- G. d+ y, jGROUP BY Title* {1 S" S( h7 X
HAVING Count(Title)>1$ h2 r8 F% R& o; Y" M
JET SQL 中的聚积函数( _! I3 p! [- t8 A/ ~0 R- P
聚集函数 意义) _! K0 p9 |8 m: Y6 Q  X+ l
SUM ( ) 求和
& z* b0 Y  n$ [& @AVG ( ) 平均值
9 C- h- ^$ |' b- uCOUNT ( ) 表达式中记录的数目" j- x! w# U& l( n3 _, Z
COUNT (* ) 计算记录的数目! _1 k0 K, ^# k; l3 H! Z. P
MAX 最大值
: i& b! u; X9 N+ x+ n$ aMIN 最小值" N& B, U1 Q" x/ A5 s) u
VAR 方差5 F7 k" G2 V6 \$ N# B
STDEV 标准误差1 e# ~1 U( u1 L4 w9 g! H7 Y1 f
FIRST 第一个值
8 J$ O, ^6 ]* u8 J! nLAST 最后一个值2 X! z2 B* p+ Z( p! _8 R7 r# N$ O
六. 用Parameters声明创建参数查询
5 b' x' D$ k3 U* q! z1 v" vParameters声明的语法:
* |: o( A! F4 \, Y% Y1 a4 oPARAMETERS name datatype[,name datatype[, …]]
$ I5 z' V2 k9 Y& k& h: |. B其中name 是参数的标志符,可以通过标志符引用参数.# `7 n$ \/ }7 q  |9 U; h
Datatype说明参数的数据类型.# e+ [" r. _% U' g0 b
使用时要把PARAMETERS 声明置于任何其他语句之前.
8 [; V7 G5 ~; a$ \# T! x( K例:
( `+ L! v6 O/ y4 q) j: ~* LPARAMETERS[Low price] Currency,[Beginning date]datatime: l7 O8 }3 G# A) O2 N& j8 S
Select orderID ,OrderAmount
+ z! ?+ ?4 n" A8 }, D5 K* UFROM orders
' y, Q7 Y, r/ z' j" |! [Where orderAMount>[low price]
5 f! f1 R3 A3 o; Y0 {4 iAND orderDate>=[Beginning date]1 v" s# X8 c3 E' E4 l- i
七. 功能查询, c# z# z% X* v7 H8 H' n" V/ X1 \1 a% v
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
1 Z1 v& [) Z' H1 o. D2 |1 更新查询
; @/ S' U7 e$ ^' K/ T2 cUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
8 ~/ H+ r: N: E' f  R. M更新查询语法:
* N9 N$ n: s8 RUpdate 表名
, A% |: U  h7 pSET 新值" s7 A. L+ x: b, s9 s) @
Where 准则
5 N3 ?1 K+ U7 L* i5 e! s# t8 `例:英国客户的定货量增加5%,货运量增加3%
/ \& V# @9 v* ~8 DUpdate OEDERS' `; i/ |7 [' O5 E8 \7 ~4 z
SET orderAmount = orderAmount *1.1
7 E/ q( z% Y* m) r; TFreight = Freight*1.03  `; d: F6 J& V4 }
Where ShipCountry = ‘UK’
/ O2 U/ k9 l, |; F( Z8 m2 删除查询
" t7 J& _* Y; m4 r/ \* h8 RDelete子句可以使用户删除大量的过时的或冗于的数据.7 A+ j. m  a4 j# ~4 Q3 e, A5 y
注:删除查询的对象是整个记录.9 g. ~- T# p/ u8 J" y
Delete子句的语法:
0 o4 A0 _( s5 w+ ?8 O, g( Y0 NDelete [表名.*]
3 }$ ]! h, Z! b0 hFROM 来源表3 v( W. D& `6 U. v2 r
Where 准则/ `, Q) Y& A4 l) X
例: 要删除所有94年前的定单
( ~" Y# q1 T: y9 UDelete *
/ J6 t6 i% h9 q5 W4 B% KFROM orders
. e; y: |% y! |: O- P. Y5 IWhere orderData<#94-1-1#, [. r$ m) F4 i
3 追加查询
+ p$ I/ M* h- _2 S  G6 k7 t/ PInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
. S  p& I$ M4 Z) H- Y4 RINTO 子句指定接受新记录的表' J0 b% l( e, {( q  I- h  s+ m
valueS 关键字指定新记录所包含的数据值.
6 V0 H* W; T% Y! [Insert 子句的语法:( d5 @& _4 h1 ]& R
INSETR INTO 目的表或查询(字段1,字段2,…)
4 W/ s: t6 A) C' }9 r0 h3 C# i; n4 NvalueS(数值1,数值2,…)  A+ H) Z0 t* i& B- C# {
例:增加一个客户
  a: {/ d- E* JInsert INTO Employees(FirstName,LastName,title)
/ Q: F/ i) P+ T* c  O! u4 zvalueS(‘Harry’,’Washington’,’Trainee’)
# v: X; X" p* ^4 生成表查询
- ^4 a' R: ~- r$ G) U可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
. {* @% U1 C% P* [Select INTO子句用来创建生成表查询语法:
8 y$ Y/ Z, S- S1 d. I) i  SSelect 字段1,字段2,…
# A9 _$ U: e( s$ Q! T4 M- iINTO 新表[IN 外部数据库]
% ~6 c9 L4 ], O  j$ DFROM 来源数据库1 G* g8 n4 \5 V  i6 b& Z" `
Where 准则
- U# @6 ?) t6 K5 q9 d例:为定单制作一个存档备份
3 v0 V; _4 r. KSelect *
; R7 K- h0 v2 [0 HINTO ordersArchive  d" l7 C% \5 Y4 c
FROM orders
- Z/ p: @8 \6 C& N3 c+ L$ ~) G2 J- w八. 联合查询
6 F. W$ x4 J& @; e# ?( WUNION运算可以把多个查询的结果合并到一个结果集里显示.* o! r: h. _( C! {- `
UNION运算的一般语法:
" }3 S' |/ J: m, ^[表]查询1 UNION [ALL]查询2 UNION …
- k" y; M$ M  C例:返回巴西所有供给商和客户的名字和城市
+ v0 h: ?& y. b/ }' _Select CompanyName,City1 M) h( C# T" J3 a0 h
FROM Suppliers
; Y* G5 h; p3 {8 b8 N+ oWhere Country = ‘Brazil’
  s. T/ a1 a/ ZUNION
' W6 \2 r7 p5 ^* l# f* iSelect CompanyName,City
$ w0 L3 y5 `" X" D$ Y) ^8 kFROM Customers* P# w- ]6 @2 X  N
Where Country = ‘Brazil’
  A# \2 S$ B! U. c注:+ [: _& `- C1 N/ R, R2 e1 [$ b  R2 |
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
9 N( l1 X" s* l; S* M  Z6 iUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.( ?/ `' Y# T, g/ v5 s
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
1 x- q7 d( X! Y' Z3 H九. 交叉查询
. L7 w% b, ]0 J0 [; [+ J交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.$ j+ m; Q+ _2 T! {
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:3 q% {+ {% t9 G
TRANSFORM aggfunction, ?/ x5 R5 L5 k
Select 语句" p4 Y5 H0 N' V
GROUP BY 子句9 q- i! w; k+ `; r1 h; ~
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
6 k' o7 ^+ C* P! q( @Aggfounction指SQL聚积函数,
) R  V/ \( r; jSelect语句选择作为标题的的字段,8 H  K% U" U8 d! Q, c, b, Y* }2 t
GROUP BY 分组/ u# H; Z  r% _6 e
说明:. G5 f; H& E% Y& Z
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.5 i( A6 ~# H8 @3 H" ^# J: D
value代表创建列标题的固定值.( \# [. `( d9 Y! x
例:显示在1996年里每一季度每一位员工所接的定单的数目:8 s5 ]  o$ k8 U3 y3 R( u/ V. e) O
TRANSFORM Count(OrderID)
1 W4 S. a$ d: p. U5 \3 C) E) w8 OSelect FirstName&’’&LastName AS FullName2 c  \; Q* ?4 T
FROM Employees INNER JOIN orders
" K8 J4 P8 ]+ u$ BON Employees.EmployeeID = orders.EmployeeID% ?9 M0 e3 L& S3 S7 g
Where DatePart(“yyyy”,OrderDate)= ‘1996’7 N( P- _% V" N  Z
GROUP BY FirstName&’’&LastName
2 e% ?' ^( ]# A/ l# ForDER BY FirstName&’’&LastName5 q  V9 S8 q; [8 x5 l
POVOT DatePart(“q”,OrderDate)&’季度’
+ d3 T; V8 E5 C8 t0 _3 G. a, [, Z十 .子查询
; f" |# J/ }7 v$ S1 h" N+ k- A3 q9 r子查询可以理解为 套查询.子查询是一个Select语句.
+ j# u! M. F$ l% v1 表达式的值与子查询返回的单一值做比较* V; m0 r0 G  R7 k! R7 H2 M
语法:
+ d5 }* [, H$ B$ b表达式 comparision [ANY|ALL|SOME](子查询)* Z& J+ i( S0 `- b( A
说明:
1 {7 ^4 e; ?, N3 q8 aANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
3 m1 l2 ?! b6 Q& G, c& q例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品0 v; k8 w7 G4 [
Select * FROM Products# r4 G, C8 h. }6 w
Where UnitPrice>ANY. X7 m, F+ V: \$ U! D5 c
(Select UnitPrice FROM[Order Details] Where Discount>0.25)7 p1 [$ G5 ]3 S# F7 \: P
2 检查表达式的值是否匹配子查询返回的一组值的某个值
, W" K1 a0 R/ b: O0 ^# y% h' j语法:5 C" {. F: V# a0 S
[NOT]IN(子查询)
/ Q, H6 ?2 f- M  g- e5 N7 c例:返回库存价值大于等于1000的产品.
7 i6 G# X6 X) a) w5 ]$ QSelect ProductName FROM Products9 F9 O3 p4 l* Z% `. D2 U0 F
Where ProductID IN# ^- f2 I# o! V  s5 X
(Select PrdoctID FROM [Order DEtails]
2 T) k# Y# a/ ~% e8 |( F" AWhere UnitPrice*Quantity>= 1000)+ c% x- v' S8 Q9 d5 S' _: n/ p6 U- w! o
3检测子查询是否返回任何记录; R) w) @5 o+ \* a
语法:; N& p" o# u4 \3 M/ a+ B, [4 S
[NOT]EXISTS (子查询)% O7 v% M5 D* l( M. Z# T* @  v5 ~7 o
例:用EXISTS检索英国的客户) L$ {5 U! }# L" |( K: ^
Select ComPanyName,ContactName6 V/ Z) x. d! W5 f4 _: W  [
FROM orders
# h9 t- Z. p+ |9 j" C+ [Where EXISTS9 p* C4 A& b* j; P
(Select *7 p- q$ W& K# e+ d* H
FROM Customers
; X6 a, V4 p* a2 R7 J5 XWhere Country = ‘UK’ AND, G  H5 M2 g  V" l! t: _- R
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2024-11-25 05:45 , Processed in 0.027002 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部