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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法6 K0 G( l( h! K0 ]
. m# |" F8 C3 z/ H, r0 H6 p& }$ i! c, ~
select distinct 字段 from 表名
4 @! f. E. V) {distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。; J+ n7 h+ F$ l
一.Select语句的完整语法为:) S5 k5 c. B. a' @9 [
Select[ALL|DISTINCT|DISTINCTROW|TOP]% y' z5 q7 w; `& e
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
/ W% S, ~5 [4 N' P$ T9 H: {' IFROM tablee xpression[,…][IN externaldatabase]
) D- Q8 `: H; r  R1 k[Where…]6 @# v1 `+ g9 D8 W
[GROUP BY…]
. K( Q$ `: F7 |; a1 c- m" j[HAVING…]
) t1 i3 l! r3 U" o- a# q) ~; ?[ORDER BY…]+ R* w! [4 [; m" |4 k9 y
[WITH OWNERACCESS OPTION]/ a5 n! L. z- I5 h/ e3 k
说明:3 o, a* Z* n! y4 n$ ?8 E. _2 A
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
$ G& z  e' ~; B! k1 A1 FROM子句
1 m7 B8 ?$ q4 qFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。; ^  m2 _$ y+ K+ S
例:下列SQL语句返回所有有定单的客户:- v4 S) {' m* E6 L7 ]
Select orderID,Customer.customerID. m  g6 T8 k0 D5 c) S" X; J; K/ d
FROM orders Customers1 G& {) Q6 ]2 G- q7 ^' `" |+ s) z
Where orders.CustomerID=Customers.CustomeersID. Y! k9 [, _$ r$ [$ [
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
- }8 q8 O8 B; ~(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
2 D6 O$ c7 c$ [, S0 r- A( o例:Select ALL FirstName,LastName
' p( ^" ^+ O6 v5 C- w) a2 TFROM Employees
5 s( h3 h* ?3 x' c(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
9 G4 E& o4 o/ {3 S(3) DISTINCTROW 如果有重复的记录,只返回一个# m% n: t3 u2 C. D$ h0 b) H2 H; `
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
# u4 n5 ^0 W1 m" E! i* e5 x  f例:返回5%定货额最大的定单* d& U' w' y  Z  i
Select TOP 5 PERCENT*
/ t& G/ @* B( K* UFROM [ order Details]
" V* z3 H1 ^2 b. t4 HorDER BY UnitPrice*Quantity*(1-Discount) DESC* d- x2 k. a8 |
3 用 AS 子句为字段取别名1 d0 z& f; X. x+ H0 m
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
7 m4 ~- T5 x0 w6 {" m* P8 ?例:返回FirstName字段取别名为NickName9 n8 d; T, x9 d' f2 T: V
Select FirstName AS NickName ,LastName ,City
7 y7 ?8 c; W6 [/ sFROM Employees
) x4 N6 }1 ~" T" q例:返回新的一列显示库存价值
7 W4 m1 F3 B- m! L! ^2 QSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock& j* c$ [0 p- }7 H. ~
FROM Products- _/ s  n/ B! y  |1 r: s/ j6 V
二 .Where 子句指定查询条件
3 O2 i2 B% d" j5 _0 W1 比较运算符
7 i) }+ I2 Z  t4 I6 J1 k比较运算符 含义/ j5 p6 {/ Z/ P) u  l
= 等于. x' U) O  |6 M! H' q9 T; n
> 大于, m' Y' c/ U7 Y7 C4 h+ |) R: o
< 小于& m. f# r+ P& ]
>= 大于等于
5 g/ ~' g- M- m3 G4 c<= 小于等于
/ N. u1 e* }# j<> 不等于
- I- F9 O. ]; a7 P& \!> 不大于
/ n+ n6 l: Y% F! v: f  |+ P!< 不小于
; h9 M5 F- w: o) S, I+ y9 g例:返回96年1月的定单$ J& j; F8 Q7 R
Select orderID, CustomerID, orderDate1 ~! O( n: @; [# K4 m
FROM orders3 m6 x& u5 D; s" z8 Z+ I9 Z
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
- Z0 R9 @( Q- _' q8 j, ?' E# v0 K( \注意:
* n; q$ s4 H1 ]7 I0 X- D& }! }Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
3 |$ x# V; I- T  i0 g7 K4 @# Q例:
  m% {+ W* f/ ?# t5 q! ~. IWhere orderDate>#96-1-1#- Z( _% ]5 u. S8 {% ~" q: J0 D7 W( V
也可以表示为:8 j& y" p' J8 P) {
Where orderDate>Datevalue(‘1/1/96’)9 L% _! }* [2 l5 ~0 @; \6 T
使用 NOT 表达式求反。
& A/ A8 j2 ^& E) D# g6 x) T$ c9 o例:查看96年1月1日以后的定单* o( N( S8 x/ [( u/ q
Where Not orderDate<=#1/1/96#7 ~2 T& h0 I5 t- p! m- H5 C  p
2 范围(BETWEEN 和 NOT BETWEEN)
5 D0 K) F9 z, e+ b7 F" IBETWEEN …AND…运算符指定了要搜索的一个闭区间。
1 l8 p% J) U6 `. P) C! G1 D例:返回96年1月到96年2月的定单。" f1 {. T) o( [8 c
Where orderDate Between #1/1/96# And #2/1/96#; u  g3 Q' n3 a8 E) w- ^- A/ F* g
3 列表(IN ,NOT IN)
* u& c6 n2 j( A3 g0 e" Q" m/ e2 [, XIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。' X  Y$ g& l) o1 R
例:要找出住在 London、Paris或Berlin的所有客户
. K4 n6 M# j4 r% {3 f+ b7 i1 dSelect CustomerID, CompanyName, ContactName, City
2 F, M% R" c, _. o* b* kFROM Customers2 W$ C+ k; i/ N2 A
Where City In(‘London’,’ Paris’,’ Berlin’)' q" ^4 J% u& h- z6 F! T
4 模式匹配(LIKE), m: I9 z2 E: L( k7 _' L1 u
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。0 V4 ^6 ?, {. \2 y
LIKE运算符里使用的通配符0 l) S! c4 u/ h5 @, `$ s8 J
通配符 含义
8 M7 j. K2 T( w; T0 e8 [* I? 任何一个单一的字符9 D/ y/ Q" t$ s/ B# e6 M$ G. w, O
* 任意长度的字符* }1 x6 X) E7 k, ~
# 0~9之间的单一数字: Z" J" u# L: [, m  h9 X
[字符列表] 在字符列表里的任一值$ s8 }% b! g4 f. O& R2 p
[!字符列表] 不在字符列表里的任一值
1 W8 M9 x4 k1 F+ X* b/ P# D+ d- 指定字符范围,两边的值分别为其上下限
# D- r2 ?3 G: S- {3 ^例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户7 V/ B; g0 @  }* K+ U- o4 W
Select CustomerID ,CompanyName,City,Phone% C! O! m7 x0 z0 u1 j! e
FROM Customers
5 ~% V$ U# ^* f; dWhere Phone Like ‘(171)555-####’  Q- m8 N' t( K2 M
LIKE运算符的一些样式及含义
( D! y# a0 m! N! L样式 含义 不符合4 Z2 X/ x* U- c' c% J6 v
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255: i5 ?9 r2 @- O9 C, Q
# LIKE’5’ 5*5 555
) R  l6 Q' G0 R9 I4 kLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5+ o9 u+ F4 P/ v. t
LIKE’5##5’ 5235,5005 5kd5,5346# v7 r, ^% z. \9 J6 @+ t, ^
LIKE’% C6 c! P6 P# h; j. x
[a-z]’ a-z间的任意一个字符 5,%
/ `4 L: w' E& v; Z+ x& GLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
# `. R- L6 N3 V: k* DLIKE’[[]’ 1,*
( `: X& R/ z: @! }, E! e1 Z三 .用ORDER BY子句排序结果
+ u3 T& |" g# F. GorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。  R$ j& n' G3 n7 t3 S* l
orDER子句中定义了多个字段,则按照字段的先后顺序排序。* j. [. o! ^4 {
例:
. R1 M* p5 q/ ^9 }Select ProductName,UnitPrice, UnitInStock, e) A. V; A( Z4 H
FROM Products8 A% u9 ^% k* A
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
9 W1 d) O7 E* P: torDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。& c9 Z$ J0 L4 S+ g  s% N
例:下面的语句产生与上列相同的效果。
# u4 W8 ^3 ], u8 b0 FSelect ProductName,UnitPrice, UnitInStock
  J/ r/ j7 T0 g1 N2 ]+ ^FROM Products
/ K0 B& l+ I5 h. V8 U# W- C% xorDER BY 1 DESC , 2 DESC,3! c/ x' X  ~% f1 o  l( b: h
四 .运用连接关系实现多表查询4 z$ r+ u$ v! w/ Q# O
例:找出同一个城市中供应商和客户的名字9 ~$ [% l  ?. X' [- y
Select Customers.CompanyName, Suppliers.ComPany.Name
+ x3 J! M4 |  T; ?  c, SFROM Customers, Suppliers
+ K3 x" X; v$ z, K. AWhere Customers.City=Suppliers.City
' x7 t) T3 G- W% F9 B- ~0 d( x- x例:找出产品库存量大于同一种产品的定单的数量的产品和定单
' W+ u& Y! ?& ^) BSelect ProductName,OrderID, UnitInStock, Quantity7 n. l! R! j/ ?* V7 j
FROM Products, [Order Deails]1 g9 `& I9 P$ N0 c
Where Product.productID=[Order Details].ProductID& Y7 O2 N7 Z0 W, {3 h7 Q$ W$ p
AND UnitsInStock>Quantity
6 A* K  w: M9 @- [$ [  [- S1 A另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
2 b& H$ I. u/ j$ T6 [" `3 u" t3 w语法:; D$ u* y* }) x+ F
FROM table1 INNER JOIN table2- V, q: U9 m- o( F" S/ Y; J: s
ON table1.field1 comparision table2.field2
) g' T8 o; E2 l0 q2 x+ u' a% {' C" n其中comparision 就是前面Where子句用到的比较运算符。
4 |: d, C- k/ {6 r( A/ wSelect FirstName,lastName,OrderID,CustomerID,OrderDate
8 }  L; v$ ?: a: v# V8 b; qFROM Employees2 ^. j0 ]; k% W6 u2 d5 i3 f
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID7 |6 K3 z* G& @4 L3 w4 Z
注意:
5 Z7 e) k0 r  ]9 U( l6 F1 E7 wINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
7 P; J! P1 p, D# f1 g5 P在一个JOIN语句中连接多个ON子句
/ o0 j; U4 [# S语法:
1 s% o- P+ P' U9 V6 V9 C% Z2 t7 kSelect fields! F: w2 M) q; s. T* R9 E
FROM table1 INNER JOIN table2: g% B# R" W7 q1 {
ON table1.field1 compopr table2.field1 AND$ M2 U+ Y2 t; H7 d# ]" I% ?
ON table1.field2 compopr table2.field2 or$ |! i6 K$ a$ ~% S
ON table1.field3 compopr table2.field3& B9 E# B$ A% b/ n' C
也可以
- r2 B9 _: {/ m! b) ?8 g5 _Select fields3 O/ G7 K- f6 q' y
FROM table1 INNER JOIN
: U$ x: u5 m7 r% B7 t(table2 INNER JOIN [( ]table3
1 Z! ]* F1 {( i/ v) g[INNER JOER] [( ]tablex[INNER JOIN]
! V% D5 v# {' ]' S. x* h, eON table1.field1 compopr table2.field1
8 Z) g+ p: o& S* _ON table1.field2 compopr table2.field23 P3 ?2 y+ ?# f+ z) m
ON table1.field3 compopr table2.field3" z. a; b5 Q: a( e+ }- m
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。; u( Q1 j3 M1 @/ o/ G3 c1 B  Y
FROM table [LEFT|RIGHT]JOIN table2' k7 O6 w' `. S
ON table1.field1comparision table.field2! r/ z+ a; ]1 m3 q. x* Y
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
( a# `! t6 c* I  y8 c例:不管有没有定货量,返回所有商品
4 m- |* Z. ]5 d* z- M4 VSelect ProductName ,OrderID/ e+ ?# {2 S* y1 W
FROM Products
% s, T( f" x( p  i$ [. |LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
3 X5 |) \" J7 f+ m4 x右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。# C/ Y& J7 \* ]5 F2 I6 i0 t
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。( v7 H+ w1 _# u' h; `+ H$ p! [
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。, L: t! Y2 T( w
Select *
9 o. q* ]8 K4 ^' C' T' u. kFROM talbe13 e! w7 T4 ?, n& A! a
LEFT JOIN table2 ON table1.a=table2.c% `/ z  b# m  J+ c7 _4 R  j+ |2 T
1 连接查询中使用Iif函数实现以0值显示空值7 f$ a' G% z% D) `
Iif表达式: Iif(IsNull(Amount,0,Amout)
, }1 d' ]& `" W. w$ t3 |$ ?例:无论定货大于或小于¥50,都要返回一个标志。
  m# c# L% L$ g1 w: E  \Iif([Amount]>50,?Big order?,?Small order?)+ q9 `! F: m3 |9 s- P
五. 分组和总结查询结果2 c/ @; ^7 g& {$ A& X7 r2 a+ K
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。8 c& Y9 J: J; b. L( R
GROUP BY 子句的语法
, b5 B% a  d+ S, u; O, lSelect fidldlist) G6 W4 O, g9 g( O- e5 \
FROM table2 x0 v  g) H4 S6 r" W$ J% l& Q
Where criteria
0 s$ ?6 V, b3 J/ h9 A[GROUP BY groupfieldlist [HAVING groupcriteria]]8 s" S7 l$ d" L9 H" z+ Y
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
4 s" \8 ]5 M  I) H/ s5 N* O* r; uGROUP BY字段中的Null值以备分组但是不能被省略。
+ }# o" O7 q+ |在任何SQL合计函数中不计算Null值。& l2 K( x8 o0 g7 W7 f
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。- [2 N/ m& M, Y4 x0 ?- u; R3 I
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。) |( E) H4 u" H0 K
Select Title ,Count(Title) as Total5 `* G1 n8 F9 C; {) i
FROM Employees
0 g: F# y& ^8 b7 K, vWhere Region = ‘WA’" `! z9 I+ {9 p
GROUP BY Title
: K# ^( x, G/ v. w; |/ E6 {HAVING Count(Title)>1
6 D% P6 ]# N' F% f" o7 V% C, GJET SQL 中的聚积函数% s5 g( ?0 u& I# x& o9 X
聚集函数 意义
1 Z' O8 n: X/ o/ e% |2 WSUM ( ) 求和3 C1 F$ b! H" q7 Z" Q" B& _
AVG ( ) 平均值$ e' s* p; A* x* {* {( h
COUNT ( ) 表达式中记录的数目
4 G  `" _3 h" o( k8 X& t- ~6 \9 _COUNT (* ) 计算记录的数目
8 |! N! |5 i: [7 g, X# TMAX 最大值- N- A0 B" h" }
MIN 最小值- A) t3 w2 c4 k
VAR 方差% n# x8 X8 G: N! W# T
STDEV 标准误差3 y/ @* D1 b# b  ~3 c
FIRST 第一个值
+ S, A; A6 G0 d! v9 ^LAST 最后一个值
5 h- s5 L) z  o- L六. 用Parameters声明创建参数查询6 f- }; B& x) W: {8 K. l
Parameters声明的语法:
& e( y$ ^2 X: F# y1 {) MPARAMETERS name datatype[,name datatype[, …]]1 D& g- J! e" U9 Z5 q- d
其中name 是参数的标志符,可以通过标志符引用参数." V3 h2 j, `. I# f8 W3 o1 o
Datatype说明参数的数据类型.* P1 Z0 S: n' h, J1 V# N- G) Y6 s
使用时要把PARAMETERS 声明置于任何其他语句之前.
" N* V9 M' W$ k/ g+ _( P" q例:6 t" r$ l: T# x( u
PARAMETERS[Low price] Currency,[Beginning date]datatime2 o7 U( C) e2 A
Select orderID ,OrderAmount6 y* U, t' I4 M+ \+ L- F- {
FROM orders
7 o0 Y+ m4 U! }1 d/ W, aWhere orderAMount>[low price]
& M4 K5 \+ Z* lAND orderDate>=[Beginning date]  }8 B  n4 V- c' H1 D* f) x% x
七. 功能查询
: \! _+ S  Q1 e- ?$ M: x4 w所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
8 A3 l$ m/ ]3 _# L# S2 v1 更新查询. Y2 J+ H1 g) a8 m7 r1 G
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.6 }, D1 t: i8 C4 m
更新查询语法:
9 [+ d8 [% q2 A# G! `8 [0 d- F% A2 iUpdate 表名7 i" D0 G8 G4 o' M. Z- }8 }
SET 新值
' g! k0 P$ o3 |Where 准则
/ v' v/ L  j8 j5 ~1 l9 }' T例:英国客户的定货量增加5%,货运量增加3%9 G8 ]; K- W1 p( E
Update OEDERS
& U/ A9 f2 u* e+ o/ J. }" O3 }SET orderAmount = orderAmount *1.1& h3 m1 \4 \8 J9 |7 \
Freight = Freight*1.03+ h! j" E6 V7 ]' g' L
Where ShipCountry = ‘UK’
! }- H0 U( q. d# A0 D' V2 删除查询% H0 H( F- }# H- B
Delete子句可以使用户删除大量的过时的或冗于的数据.
, Y, t# O  W. s6 M注:删除查询的对象是整个记录.
  o. K4 c& j' H1 G! ~4 |Delete子句的语法:" F+ ]- q1 ~) H% P
Delete [表名.*]$ Q* _0 i3 x8 s- M( i# c
FROM 来源表5 N4 F0 `. B# F+ x
Where 准则
& N. I+ J2 @8 D0 n例: 要删除所有94年前的定单& |4 G; v. M3 K: S' c1 j
Delete */ I' S7 V% ~$ _$ e% y* o8 S4 B9 V8 |
FROM orders8 X- e  Y. E) H3 B7 }. M* `
Where orderData<#94-1-1#
- e. b( K- I4 x5 ?( I3 追加查询1 H/ Q' Z, f, L; d* k# x
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
( q, B/ r6 B% P( t7 H5 A( dINTO 子句指定接受新记录的表
% b1 d, P- a- B. V1 `; ]: t4 c4 XvalueS 关键字指定新记录所包含的数据值.
5 m; J4 e4 z# P( N* T6 L* {2 YInsert 子句的语法:3 T% U6 H  B" z$ y
INSETR INTO 目的表或查询(字段1,字段2,…)* Q" I' [: {) s* M
valueS(数值1,数值2,…)4 [( g6 D8 \& r$ t& Y
例:增加一个客户
5 Q$ F4 ?+ a; R+ L7 I9 A+ VInsert INTO Employees(FirstName,LastName,title)
7 q8 M2 l& @; p- `valueS(‘Harry’,’Washington’,’Trainee’)
1 p7 Y0 q' ?) g& h1 M8 O4 Q4 生成表查询1 \+ v+ l8 H% B3 Y
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
, H) Q- L; M' y/ @2 Y3 O% {+ g5 j5 NSelect INTO子句用来创建生成表查询语法:
, n4 C. t& ^8 u! ^# Z/ i5 m' p; `Select 字段1,字段2,…
; ?3 K' Q* L7 ^6 k2 FINTO 新表[IN 外部数据库], Q1 B; Y. R) |0 s1 g4 t/ b  t% t& ~
FROM 来源数据库
: g* F# D( [  P. s' XWhere 准则% J6 h8 w( W; X" w7 f
例:为定单制作一个存档备份
0 W$ F, a5 o$ jSelect *6 Q+ m# G4 `+ X' X. n% D4 S  n" u
INTO ordersArchive' |1 K# D0 f* \( x
FROM orders
7 e+ a, z. h, x9 c' u; _; ?+ R八. 联合查询
1 W, s; l1 }0 [$ UUNION运算可以把多个查询的结果合并到一个结果集里显示.) X1 w( l3 p# f0 Q
UNION运算的一般语法:( G' X" K2 v* R" N1 l; ]( j
[表]查询1 UNION [ALL]查询2 UNION …, ?0 m: u  Y) D: S: u$ w# r  P1 O9 }; B
例:返回巴西所有供给商和客户的名字和城市* z* W2 o# |5 C' T$ ^$ @. \: U
Select CompanyName,City
# W8 s, G0 u# Q9 w* H& wFROM Suppliers6 I! S& p9 J$ ^7 f5 [' r2 x
Where Country = ‘Brazil’
9 R  f4 t5 T0 O0 ^4 C, s9 i$ uUNION7 s1 S5 ^' y: I0 K8 A1 q. F. Q9 @
Select CompanyName,City3 x: C' k$ a3 U$ L% c
FROM Customers, }: Z% \! a; G) T* A; w
Where Country = ‘Brazil’
0 G/ d. s' \* Q* T注:
2 V6 q7 @3 V& F; y8 G缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项; F4 [* ]6 W7 L& B  N- x% Z
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
+ P# p% X* j$ J: f, c1 o每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.7 F: H# V& \9 y
九. 交叉查询
1 c7 X% ?8 C  @$ h7 L- g# s* r交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.2 L0 n( n  N; y5 W0 n) G+ L
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
  N% R+ F0 n- l& {, OTRANSFORM aggfunction
0 X/ Q  ^0 Q3 GSelect 语句
8 N0 M+ e* N  G% Q, m, o4 A9 XGROUP BY 子句! w2 P' ?4 Z2 [3 t, U) L
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
6 N! l: |& Z. Y% _Aggfounction指SQL聚积函数,0 a8 e' y2 `  H7 k
Select语句选择作为标题的的字段,. |  r8 ^- H2 Z; `- X8 l
GROUP BY 分组
0 @6 Z7 `, S6 x5 X) r说明:
9 ~  t1 {8 W/ ]" kPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
2 T3 O9 G( _( Q( Bvalue代表创建列标题的固定值.
9 _- B7 t) h" N6 D9 V例:显示在1996年里每一季度每一位员工所接的定单的数目:
1 i. Z- i  L2 ~* q( C1 c3 CTRANSFORM Count(OrderID)" _2 i$ o: X% P* W) p. C- _* }
Select FirstName&’’&LastName AS FullName6 k* V2 v2 p* c; e# N4 I  A( v' ]( _
FROM Employees INNER JOIN orders$ R4 J" |3 l) d
ON Employees.EmployeeID = orders.EmployeeID6 ]1 S: q! e# N8 P' l* b
Where DatePart(“yyyy”,OrderDate)= ‘1996’
/ r3 F: j# W  z% _8 w; V/ cGROUP BY FirstName&’’&LastName
- J/ X+ ]4 e. B: n+ x0 D1 horDER BY FirstName&’’&LastName/ D" s/ k  Y) m; h6 ?, t
POVOT DatePart(“q”,OrderDate)&’季度’
0 j5 [; e' k; y7 m/ @( Q9 @十 .子查询  }, T4 `$ F  y: q
子查询可以理解为 套查询.子查询是一个Select语句.5 m2 l$ O" c* E9 Y: L4 Y6 _
1 表达式的值与子查询返回的单一值做比较% K( t( L  a& J! }2 P- Y$ l
语法:& O! O  \% v2 V! V+ w' d& H
表达式 comparision [ANY|ALL|SOME](子查询)" u3 }4 k2 w" p2 F1 ]& T+ F* s
说明:
2 n7 U7 [5 h6 B9 X8 L& Q) dANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
# @" y% `4 j# j% {& B% k例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
& j2 L) ^5 V  x0 R5 p2 HSelect * FROM Products- }5 s1 O$ S7 a1 W: U! I* [
Where UnitPrice>ANY
8 q6 r  A1 i; G2 r(Select UnitPrice FROM[Order Details] Where Discount>0.25)0 W& v8 M9 p, F$ E+ V/ H
2 检查表达式的值是否匹配子查询返回的一组值的某个值
- t  S! i  G' N/ g2 {% x. m语法:
% c8 `2 d3 k' P, U, e[NOT]IN(子查询)
* a, l9 N! z; i% V2 A例:返回库存价值大于等于1000的产品." S4 q' G: q  U/ d
Select ProductName FROM Products# B! q- o$ k; U' B& l
Where ProductID IN
9 ^- ]$ f6 C1 T' X(Select PrdoctID FROM [Order DEtails]
) @9 _2 C' Z/ v8 Q; ]# h- aWhere UnitPrice*Quantity>= 1000)3 t* `& v8 c6 ]5 a- d* _9 ?
3检测子查询是否返回任何记录
" c3 ~/ }: y, C5 z, k语法:
# I0 u% ^( t9 ]" |# ?3 }) N[NOT]EXISTS (子查询): O2 q# \  Z( ]6 K1 f& |5 B3 v9 g
例:用EXISTS检索英国的客户1 ]" s, x2 v2 k) V& f6 P! g
Select ComPanyName,ContactName
' X, O1 L1 k5 g4 NFROM orders1 D5 N5 y* F$ i5 a+ h
Where EXISTS
- V  V* P# l7 O* s9 \(Select *! w9 o% |7 O; |1 T/ H
FROM Customers
! F/ a* W6 w9 V4 K3 u2 rWhere Country = ‘UK’ AND
" o- w" m0 F% U5 M) }1 ?Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-1-13 06:25 , Processed in 0.026002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部