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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
4 e3 T0 T: v* I4 N0 a/ J. ]0 i
" D8 d4 I, O5 G% H! ^9 {- O+ u: R' \% zselect distinct 字段 from 表名. p5 ?% U5 L! C0 r* H6 n; T
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
3 O, V4 t  a: B  x一.Select语句的完整语法为:) @5 X8 k$ D; r6 c6 E+ x
Select[ALL|DISTINCT|DISTINCTROW|TOP]  E1 k8 H7 k: E7 W0 a  l* ^
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}: a* i2 ?5 @2 i
FROM tablee xpression[,…][IN externaldatabase]
1 ?' Q, d  T; D0 b" Q' n[Where…]
: o. b/ q; W& r: C, n+ C6 D[GROUP BY…]/ w* i% P: `4 w) ~* N
[HAVING…]; q7 H- R' ~  x' D
[ORDER BY…]8 @) H! [/ L, C# U
[WITH OWNERACCESS OPTION]
6 S, e+ l$ b# s% w- x1 B说明:* G) k3 L; c: y: K0 L
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。3 ]3 l. z) ]( W5 \
1 FROM子句
; m7 V, c( A8 h$ D* J, uFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。. i9 N) \$ t% M" m
例:下列SQL语句返回所有有定单的客户:+ U' N- D: l3 E: I
Select orderID,Customer.customerID
9 o  T  d0 @( ]2 t& R/ F/ Y: DFROM orders Customers
5 G, |7 r7 b9 I" nWhere orders.CustomerID=Customers.CustomeersID
$ N$ s4 G2 R3 w9 m8 i& y2 ALL、DISTINCT、DISTINCTROW、TOP谓词
4 B/ N( q  Y0 `(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
* t+ X6 g( |1 Q0 J7 `4 W; Z例:Select ALL FirstName,LastName' a4 \$ L5 d" b; ^% H1 S4 s
FROM Employees" w. Y  q. O1 o# Z1 B
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。8 b; Q% E2 f8 D8 W/ `1 H6 S
(3) DISTINCTROW 如果有重复的记录,只返回一个
8 a9 P& e5 U' g* X* `8 C(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)9 c, f3 R) w, W1 A
例:返回5%定货额最大的定单6 p. M) g( f1 c4 t7 X# v
Select TOP 5 PERCENT*
  d6 D2 k$ o, I' t0 Y. \FROM [ order Details]6 m# V4 O4 s: `7 v) W9 O
orDER BY UnitPrice*Quantity*(1-Discount) DESC1 j* Z$ r" b/ o0 A1 U
3 用 AS 子句为字段取别名
& n2 @  g9 P' e! n9 W' B如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
5 L6 e0 r" F5 `! z% b& E1 A5 V例:返回FirstName字段取别名为NickName
! \; m) ~, ^- k, V$ j' NSelect FirstName AS NickName ,LastName ,City. R$ g$ M$ T  {9 _+ z; b. I
FROM Employees1 b. m1 N) j  ~& _3 S
例:返回新的一列显示库存价值$ z9 C% d7 M, A* X5 y. l" Z1 h" ?
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock7 f; z' c% ^; [  x
FROM Products
' E; w  T, i; N. G/ B二 .Where 子句指定查询条件, \) e* w, `+ h; m
1 比较运算符
2 c. m2 o  t1 |  X1 G6 ?" O比较运算符 含义  K5 X- y# m. ]
= 等于2 H" |+ T1 ?3 r# E) u
> 大于% x% N) r% p" N1 C
< 小于3 S5 s) _5 k! L  B) s: z3 e
>= 大于等于
& b, M7 C, F7 O" j9 f* F& A% }<= 小于等于
% x9 G5 i, ~$ {1 j9 |# |( |<> 不等于
: B) w: h/ u  ^8 o! n' M!> 不大于6 x7 K" ^6 C9 u( p
!< 不小于
$ P6 {( X9 Y+ h/ [例:返回96年1月的定单- A& U' q# c0 ^$ P/ d7 N
Select orderID, CustomerID, orderDate
& V! A8 i  l" G8 }8 @7 i1 cFROM orders
& X' b- J, l6 CWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
  f( K; t1 R6 l: f0 ~+ \8 o注意:
: K' y/ `9 M8 G9 U6 s% SMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。6 r2 J2 Y/ [. `) v$ P/ `7 Z1 G+ H% E
例:8 g* f7 x, Q3 y4 l; w
Where orderDate>#96-1-1#% [9 u# w- i& K: C# H! c" E: j
也可以表示为:& @! |# p% {; \. [9 \
Where orderDate>Datevalue(‘1/1/96’)6 e! N1 Z* l" @" C5 o) U0 [
使用 NOT 表达式求反。
% {( x- {4 J0 M! ?例:查看96年1月1日以后的定单1 U' [, D2 [% D% D
Where Not orderDate<=#1/1/96#
* N9 p8 W) H7 N3 A" g7 H- r% A2 范围(BETWEEN 和 NOT BETWEEN)0 T0 N' p& A- b5 y! K) V
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
+ ~6 O$ ~4 D7 |2 T" z2 U例:返回96年1月到96年2月的定单。
  Y& Y, q  Z( w: S; r4 MWhere orderDate Between #1/1/96# And #2/1/96#
% ~* N  G. a2 _3 o$ M+ V3 列表(IN ,NOT IN)) i6 W% |5 Z; i& R7 f% S: L$ J, ^! C
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
6 t/ O2 }5 R0 H, q$ U+ l2 I例:要找出住在 London、Paris或Berlin的所有客户! A6 Y+ m7 d9 D  ^
Select CustomerID, CompanyName, ContactName, City
7 K& e; l% `. I2 a/ a5 iFROM Customers1 C( Q8 t7 p; d) P9 X. E( s2 Q- v, g
Where City In(‘London’,’ Paris’,’ Berlin’)
$ M$ J! U* [2 e: ^- C* i4 模式匹配(LIKE)
* p0 I% P. Z" e( l" u& M  bLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。1 q3 }2 A; L+ H) @. M
LIKE运算符里使用的通配符: j+ _# `4 \; @* \
通配符 含义" H; Z# b4 `! c$ v) m1 ~: |
? 任何一个单一的字符' P9 G. k9 z" C
* 任意长度的字符( C' Q! t/ F5 f' K+ x
# 0~9之间的单一数字
4 Z4 a3 }2 e; R* ][字符列表] 在字符列表里的任一值
3 s+ d  h, P! O[!字符列表] 不在字符列表里的任一值
5 p/ h7 S; q& f! o- 指定字符范围,两边的值分别为其上下限6 d& \1 @. l4 `+ \$ i
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
$ h, W/ Z& e- a8 ~7 y, B' rSelect CustomerID ,CompanyName,City,Phone% B; f# h  G( G, c
FROM Customers
9 c! s- }- g% n' Y% T3 W) ?# RWhere Phone Like ‘(171)555-####’
6 R" K; ]+ c0 u. [. A  JLIKE运算符的一些样式及含义. L. B7 P9 {, H) i% g! p$ `
样式 含义 不符合
! \8 E+ g; P" H" |6 k1 yLIKE ‘A*’ A后跟任意长度的字符 Bc,c2550 x2 w5 O7 S% D0 W! p
# LIKE’5’ 5*5 555
3 J2 W& o! t) q' ULIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
7 t$ a1 r: y5 q/ gLIKE’5##5’ 5235,5005 5kd5,5346
8 W1 @8 x7 U. z0 o# M/ e2 O# }LIKE’
, |+ f2 X3 ]3 {( H* i[a-z]’ a-z间的任意一个字符 5,%
' k; N1 Z% ~% e9 ^9 |2 Q8 hLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
5 o; ?2 M1 N" {+ \3 o4 Q; B9 o! q: C" _0 XLIKE’[[]’ 1,*
% h2 y/ o, K; o" U三 .用ORDER BY子句排序结果
3 e) N1 H. S, n. M8 G4 A) korDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
+ I# L# I6 U( `* V6 Q  G. g& m5 ForDER子句中定义了多个字段,则按照字段的先后顺序排序。
$ a! I$ c. S3 @6 i$ J$ j# W( n( q例:
: X' }' o% Z# ]! _4 G8 ]3 {; g" lSelect ProductName,UnitPrice, UnitInStock4 ~# z- o# {' l+ _9 ?' p
FROM Products
/ m0 u$ Y& o7 g( T+ q! f6 V$ q4 corDER BY UnitInStock DESC , UnitPrice DESC, ProductName4 y6 D+ K) L& N$ s' d+ c1 o
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
( c/ Z& [9 C% U2 S4 T例:下面的语句产生与上列相同的效果。
% J" x- j% h2 ~: y* NSelect ProductName,UnitPrice, UnitInStock
) g( {' t7 l; x- X! iFROM Products
% n+ x/ I2 v# _8 A, o/ p+ gorDER BY 1 DESC , 2 DESC,3
0 r  }$ X3 X3 m& N# I9 l8 k四 .运用连接关系实现多表查询
7 G$ u( D8 ?: W# ]7 {" ?1 L例:找出同一个城市中供应商和客户的名字# L; N9 V1 G' D1 K9 S
Select Customers.CompanyName, Suppliers.ComPany.Name
8 D( r' z2 l0 f  uFROM Customers, Suppliers- F. m$ T, @( y) X2 J
Where Customers.City=Suppliers.City
& j1 d/ `6 F; I6 G& ]$ q0 S# \例:找出产品库存量大于同一种产品的定单的数量的产品和定单, d3 f4 H! q7 D6 D0 [: ~6 x
Select ProductName,OrderID, UnitInStock, Quantity- i3 h9 B2 `4 Z! n( I8 P
FROM Products, [Order Deails]
# ^! ?' |3 _2 y7 ?; \Where Product.productID=[Order Details].ProductID
4 t, w' Q- y  [% e! R- p9 bAND UnitsInStock>Quantity
0 v- z0 @8 E4 K0 h8 Y4 ~; ]: \" G另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN4 q) @+ \: l. P* q% k  H2 j
语法:
+ U: a+ ]+ Q# cFROM table1 INNER JOIN table2
5 p1 ?4 \% P, }7 k$ _5 b/ }/ QON table1.field1 comparision table2.field22 y; c! |$ _, k: i9 v; O9 c4 V
其中comparision 就是前面Where子句用到的比较运算符。
. b4 T% y: m0 dSelect FirstName,lastName,OrderID,CustomerID,OrderDate" o$ [, g+ t; A3 J7 T' Y
FROM Employees* Z4 f  l* e# C: {8 H' s" z
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
3 X0 Z/ ]- M9 D, O4 y注意:" }) E% k$ Y7 ^7 ~$ J5 i% `1 k
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
- y9 ^3 v7 [+ ]( S9 F在一个JOIN语句中连接多个ON子句. f! F1 A- n: n+ q* }: e
语法:; e9 X3 m4 l( \4 T! v7 K4 \' f+ F) l
Select fields' D# |/ Z- J+ W4 r# u$ f4 R2 _8 f
FROM table1 INNER JOIN table2% w1 X2 a) W% r
ON table1.field1 compopr table2.field1 AND( c5 [4 v0 Q9 O$ i+ Z) w: q5 j- Y
ON table1.field2 compopr table2.field2 or
! I! ~! }; N0 `ON table1.field3 compopr table2.field3& _! D4 q' S! S, c- {2 D' K
也可以! o6 U4 H0 u( |8 T5 e5 Z( D3 C
Select fields
7 V  K3 P3 u+ z2 \FROM table1 INNER JOIN! S! S. I% N: t3 ^# l
(table2 INNER JOIN [( ]table35 z# G! Y- P+ C8 [2 F
[INNER JOER] [( ]tablex[INNER JOIN]  B" H; T' R7 y
ON table1.field1 compopr table2.field17 O) |8 C( n9 q; T/ }
ON table1.field2 compopr table2.field22 s* Z& t- K' K& f0 }5 Z9 i
ON table1.field3 compopr table2.field3
1 U9 ?! S  X. N& @外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
1 B, E. U' [& `' NFROM table [LEFT|RIGHT]JOIN table2
  A0 Y$ Y' X, g2 J& l8 H/ vON table1.field1comparision table.field2
, g6 U9 g' m/ s& p用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据4 U2 V- X: ^" X* ?9 f
例:不管有没有定货量,返回所有商品9 G% s4 k: ~) D$ |1 r' F8 y
Select ProductName ,OrderID3 n. }1 e; ]6 Q4 r' w
FROM Products# x7 A7 U8 b, t' \3 A1 `  J  T
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
8 e2 d! C1 C5 e7 O& i8 r: k5 G右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。) Z: b/ f1 U% s. @/ @+ {2 `
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。0 C( l( m) Q* g8 m  U+ S
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。) }% P4 d. `. Y* u. e
Select *( r8 W, e# G/ n% K; F. j9 _
FROM talbe1) }4 y# W+ g4 }3 E" H) B
LEFT JOIN table2 ON table1.a=table2.c
3 E5 i+ _0 a7 S' r' a& O1 连接查询中使用Iif函数实现以0值显示空值4 B. M5 Y  {6 `1 j) X# E3 i4 b1 ?
Iif表达式: Iif(IsNull(Amount,0,Amout)
2 b# k% o1 ^9 g! j) {例:无论定货大于或小于¥50,都要返回一个标志。
/ x! d" R0 d) E( ]7 aIif([Amount]>50,?Big order?,?Small order?)( U, Y  J. ?- F$ i3 [; V
五. 分组和总结查询结果
9 |' v% }; }2 l9 Q7 P在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
2 s& a$ z& ?* e% b. HGROUP BY 子句的语法2 a+ k1 b) e/ ?9 z6 [. R$ [
Select fidldlist
$ D1 n' J* a, ~% V! h1 O8 z9 EFROM table
5 w. E7 S1 s# _" c& QWhere criteria
  B5 R* v6 U% i* w3 l. R[GROUP BY groupfieldlist [HAVING groupcriteria]]6 h, i- ^; ~+ z/ K; v: t
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
, m, _/ w3 W3 b8 G: X( n6 vGROUP BY字段中的Null值以备分组但是不能被省略。
  g2 Q* m/ V+ Z* n在任何SQL合计函数中不计算Null值。8 k9 I) y3 |( y6 a8 J: Z+ M
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。2 t: Z& `7 }+ K2 u) o- |7 [
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。1 _5 J$ x! E. A" s; x
Select Title ,Count(Title) as Total
/ m8 H! X5 I, J8 a& w  j  PFROM Employees
3 l0 R1 e5 s, g  ^0 a. k0 x7 UWhere Region = ‘WA’$ Q3 N! R6 x, V& r$ g8 F9 E* ]0 u
GROUP BY Title) E( D* K2 c. s9 C9 |5 @/ @
HAVING Count(Title)>16 o9 V4 E. f3 M+ V$ q6 j9 N
JET SQL 中的聚积函数
7 T- p! Z: d7 X聚集函数 意义1 L9 N* p4 c: m$ E+ P
SUM ( ) 求和
0 ^+ ?8 e0 f$ c+ i+ i* L. V* KAVG ( ) 平均值
* u6 p& j( V: x1 p, _6 jCOUNT ( ) 表达式中记录的数目
! B: x9 u9 K, A3 P! a, k2 c8 VCOUNT (* ) 计算记录的数目
* l8 a4 U. L( ]9 D: ?9 A( ]7 ^9 IMAX 最大值2 f# x+ |( |/ u5 S
MIN 最小值
# H3 k# S  z$ g! ZVAR 方差
  `9 R' x2 Y: h: N8 l, x! XSTDEV 标准误差, ~! n5 Y" Z- n* D
FIRST 第一个值
7 V$ ?+ ~* ?& gLAST 最后一个值; w* E( @& q" f, p$ _! Q! p/ s
六. 用Parameters声明创建参数查询+ O( s+ b' X. O# M- S! W
Parameters声明的语法:/ E% g: N  l- e1 O+ ]
PARAMETERS name datatype[,name datatype[, …]]
7 R+ i5 ]: h: A) M" _其中name 是参数的标志符,可以通过标志符引用参数.  h# \  n8 `+ T3 b
Datatype说明参数的数据类型.! D! W2 J' g! n$ E1 i
使用时要把PARAMETERS 声明置于任何其他语句之前.
5 K0 o9 H0 m0 _& i" q1 X; k例:# C4 n4 u6 H9 j" P( H
PARAMETERS[Low price] Currency,[Beginning date]datatime
4 U/ f$ x+ D/ ySelect orderID ,OrderAmount
9 X! H  b2 Q- x/ r, D2 i* U# }% TFROM orders# f- H+ p7 K  h' ]0 W+ u
Where orderAMount>[low price]& U9 m, u& ]+ m2 C
AND orderDate>=[Beginning date]
5 f# y8 j8 w0 f& u1 S七. 功能查询4 R) |: r- e) F7 ?' ]9 \! C
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
6 D  |0 G" D, ~2 ]8 |1 更新查询
+ d8 `0 N" d0 a5 M3 \# {$ WUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.5 G4 Z2 H0 F- A' s
更新查询语法:
6 I) ?8 B2 p4 d6 cUpdate 表名" w+ C! h# D7 k4 ?
SET 新值6 ~% O- E. L1 J- P, G
Where 准则9 Q. l, w) P* o% ]5 g7 w9 {
例:英国客户的定货量增加5%,货运量增加3%
- k  T2 }$ B) {& I* @1 b+ w# PUpdate OEDERS0 J# A  Y( [4 E% m
SET orderAmount = orderAmount *1.1* D: N" I9 m( ?: q
Freight = Freight*1.03
/ \" Y) W5 n% n1 ?& @6 F2 iWhere ShipCountry = ‘UK’
9 b, _9 O/ e. t, G2 删除查询
" f* \' A( i# m* V3 v. K: ]: M% I" n  SDelete子句可以使用户删除大量的过时的或冗于的数据.7 Q; E! q# Z% o6 J5 j
注:删除查询的对象是整个记录.
& T6 ?3 j' i  h& X$ V4 {1 @6 u' s/ IDelete子句的语法:
; B( K4 A4 [: V3 w9 W' O* x" GDelete [表名.*]
* H: [6 t9 S: W8 {) W9 V! CFROM 来源表
8 g$ e3 o! {6 J" x# XWhere 准则, ^, u. S8 @: E  f# C" F- f
例: 要删除所有94年前的定单
% U# j* F( O9 h. |; qDelete *. e0 W( y% V3 p
FROM orders$ ~+ \2 }+ |- {8 W
Where orderData<#94-1-1#
0 `3 E& b7 G7 S1 I$ \4 d3 追加查询
, Q3 z# f& x. ^1 G1 y* [9 PInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
/ R+ H2 Q2 u* O7 HINTO 子句指定接受新记录的表
* U6 ]4 I6 h* H7 EvalueS 关键字指定新记录所包含的数据值.) a8 s0 |$ z; r; O$ L
Insert 子句的语法:# Z. `' F. h/ y5 h- v0 L3 y
INSETR INTO 目的表或查询(字段1,字段2,…)
$ \5 s; G0 x9 U# N, n8 H4 [# \valueS(数值1,数值2,…)
7 M! R5 b4 z& x& f* _例:增加一个客户
" _2 h: y" @, J; T9 \Insert INTO Employees(FirstName,LastName,title)
" {8 j$ p  r: E1 w% T2 XvalueS(‘Harry’,’Washington’,’Trainee’)! {1 w% C5 r5 f5 R
4 生成表查询% P/ j1 V5 W: S* V1 W/ @
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
8 e7 _) n! _' s+ OSelect INTO子句用来创建生成表查询语法:
/ U1 F: Q0 Y6 F7 y* z8 E' J4 A0 kSelect 字段1,字段2,…
: e! H. Z+ v+ J2 cINTO 新表[IN 外部数据库]
! K* r5 E" o, q+ [9 BFROM 来源数据库
0 L. G& T$ U  k5 W/ C, f% mWhere 准则
, D; o. ~% x" M例:为定单制作一个存档备份
4 R" @7 U, f: kSelect *
; o) b( D0 N6 t" O8 k" M: B. `- G/ @; jINTO ordersArchive0 V- \+ j' H/ k
FROM orders3 E( p5 Y* U' Z9 N3 O, a' x
八. 联合查询1 i# ^; ~& m! z
UNION运算可以把多个查询的结果合并到一个结果集里显示.7 E0 @0 O" O( P
UNION运算的一般语法:
4 T1 H  q, b" e6 k: Z# S) Q[表]查询1 UNION [ALL]查询2 UNION …
& M5 X3 ~# X, r6 d例:返回巴西所有供给商和客户的名字和城市0 K0 Q' t9 S) t& o+ j
Select CompanyName,City$ K$ C6 q4 x9 V  K! Q1 H
FROM Suppliers
  c. W) B0 G( w5 [Where Country = ‘Brazil’$ i% H$ M$ g2 U; w( `
UNION
, R: d7 F! K/ @0 E  |) r6 [& @Select CompanyName,City6 e4 @* C* O2 N5 b
FROM Customers
& E# S3 J7 n0 s  C/ ^7 c8 tWhere Country = ‘Brazil’! h: d$ C3 S8 d; ^- G9 E
注:% P' @6 O) ?. s" X
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
. V- l! c  K# k3 m7 P: _UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.6 a4 b' V; }, I5 b  f2 W1 b
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
# h* M$ L/ `. @. ^$ N5 X九. 交叉查询3 p- n1 w$ M% N& |" e3 o4 r3 v" {
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.2 z# C6 i( v7 U$ n2 n' y+ L
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
+ u% N. u$ f+ C" e) aTRANSFORM aggfunction
9 D" L# H9 @$ N- E" X0 hSelect 语句3 T& [; p( t& i( Z
GROUP BY 子句/ }7 T8 `1 S4 R7 A0 P! g
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]  X0 u( H9 d8 E  B% T* u
Aggfounction指SQL聚积函数,9 u4 A) m( N: P6 E# E/ W# Y- @
Select语句选择作为标题的的字段,
+ t+ f/ p3 P( w/ k; AGROUP BY 分组! o- S: v* ?4 ~
说明:* w: ?0 ?! B; o- ?$ |
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.9 K$ W) y" s6 n! r2 P( M
value代表创建列标题的固定值.
7 Z4 @5 X1 l0 o- G7 K5 u例:显示在1996年里每一季度每一位员工所接的定单的数目:
9 v. e! L8 X" N& z2 q- s2 DTRANSFORM Count(OrderID)* g2 ]% Y# `" q" y% y5 G
Select FirstName&’’&LastName AS FullName' U& s/ u' t" q0 x. u
FROM Employees INNER JOIN orders
$ J" F2 T2 ~: {, ?" P- [# ~# nON Employees.EmployeeID = orders.EmployeeID
2 l8 E# B/ r0 X8 [: AWhere DatePart(“yyyy”,OrderDate)= ‘1996’
- J  e  Q* c/ U3 b3 J: r0 {GROUP BY FirstName&’’&LastName3 M2 d1 h9 M, v5 o2 D9 P3 b
orDER BY FirstName&’’&LastName! _$ N8 r, m% A( |+ K  ~
POVOT DatePart(“q”,OrderDate)&’季度’
: k8 |. ]$ h; W: e5 l; `& y十 .子查询
8 n. a) e( ^* _4 `+ F7 k子查询可以理解为 套查询.子查询是一个Select语句.
/ [( n( [. ^( {- U) F; a9 y4 m1 表达式的值与子查询返回的单一值做比较7 E( e+ d. S; d) ~- p2 y0 u
语法:
7 H' Z' n# \! u* }# s表达式 comparision [ANY|ALL|SOME](子查询)4 J- I4 X; x% _' K. F" M" i  d
说明:, f& F; a0 K8 B) q. Q$ Y2 @
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
  j6 w, i- v# }/ X( _, V: S6 C例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
# W6 M% r8 v) g6 y0 y- ISelect * FROM Products
3 D8 l& B- F: R+ G/ e$ N) w6 Y6 }Where UnitPrice>ANY
, m1 d: q9 z( I0 ~. @6 C(Select UnitPrice FROM[Order Details] Where Discount>0.25)' u5 N( C8 s1 m5 R6 A- M
2 检查表达式的值是否匹配子查询返回的一组值的某个值6 u' c' ]- G$ [5 a6 L* _
语法:! e) M9 a) A  S/ L  o" C
[NOT]IN(子查询)
5 @8 Z; S* j: Z$ q例:返回库存价值大于等于1000的产品.
. U8 v- c+ Q1 R% H* b) W3 U% bSelect ProductName FROM Products+ O; M2 e" g$ E5 j) h' k: c2 d
Where ProductID IN( ?# `9 Z3 U8 A& p0 A
(Select PrdoctID FROM [Order DEtails]
5 w: b" i, {  h, U( ^$ hWhere UnitPrice*Quantity>= 1000)( S6 ~+ T1 o% t
3检测子查询是否返回任何记录
  A3 z9 h$ m/ l8 b语法:
1 l2 v  ]- _2 d! w[NOT]EXISTS (子查询)! N& O3 h5 m5 f3 K3 N/ N* N3 n% A
例:用EXISTS检索英国的客户/ ?5 @4 f2 ?0 B# w: R
Select ComPanyName,ContactName; A1 V* F/ [! l* m) V; n3 d
FROM orders
3 V. ]0 A3 u7 \+ ?- ZWhere EXISTS
, \5 K% g/ H. ~+ _# ~* x; k( a; y9 h(Select *
: P1 g3 t' j$ L3 d3 C" eFROM Customers
! b: [" ?* Q9 }' _Where Country = ‘UK’ AND- E6 b' n$ ]3 @) N5 t' G% K
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-1-12 13:29 , Processed in 0.027002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部