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

标题: Access如何筛选重复数据以及Select语句的完整语法 [打印本页]

作者: 帅哥    时间: 2009-11-10 10:28:12     标题: Access如何筛选重复数据以及Select语句的完整语法

Access如何筛选重复数据以及Select语句的完整语法4 {# k' @8 ]0 m/ X: H( c

7 a3 T. W5 [1 t  L9 c! @select distinct 字段 from 表名* p5 G7 ?5 }% ^2 P5 ^9 Q5 r+ F& `
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
3 c9 u6 y% E8 P8 r7 p- D9 ]/ }0 r一.Select语句的完整语法为:% {$ s' l  }7 w1 O, F+ Y
Select[ALL|DISTINCT|DISTINCTROW|TOP]
! r( j# \' r+ v, b& Y9 r{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
, o: E0 V! L( ~. u: _0 mFROM tablee xpression[,…][IN externaldatabase]9 q- ?& H/ W* o
[Where…]
9 ]9 c1 {- F9 m6 ~[GROUP BY…]
; i8 C2 c& W2 o/ J  d1 B1 K[HAVING…]
( i" t2 L; ]# ?5 H" y9 \[ORDER BY…]. J  c  F6 Y$ `1 L+ m  C" j
[WITH OWNERACCESS OPTION]
" V6 F. C! M+ e* X6 I, A# B& p说明:
0 e: a1 o& e6 }2 ~$ u; T4 L: S用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
: Y; d5 g. y1 B' z. A1 FROM子句
$ e9 W# S0 _" |$ D% E* H0 jFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
% A6 ~: A) Z% Z6 ]) ^; i+ T; S* c例:下列SQL语句返回所有有定单的客户:) c4 l/ u( C3 t. [4 Y7 A
Select orderID,Customer.customerID% `  K5 k% M) Z0 _: d+ z; K
FROM orders Customers) d) ?4 j" B( i! u, Z2 X/ d
Where orders.CustomerID=Customers.CustomeersID
' p) d, J' e% g* m, w2 ALL、DISTINCT、DISTINCTROW、TOP谓词
8 X2 I4 s2 x: E/ ^& P' g4 i6 h(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
! Y' t  Y$ Q, Q7 X# Q4 B. _例:Select ALL FirstName,LastName$ I: p  u6 q4 `# T! u$ m
FROM Employees* J8 U! H% k: R
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
2 i1 p) _4 q5 Q/ q8 f, x(3) DISTINCTROW 如果有重复的记录,只返回一个
$ ^" @8 `, X9 ~) X7 m) I(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)/ }! C0 N" X- Z
例:返回5%定货额最大的定单$ G% X  A. v0 q  X3 c
Select TOP 5 PERCENT*
$ g' o1 p* d. ~3 P$ w" P7 FFROM [ order Details]! V$ K5 d1 |" _# j7 ^
orDER BY UnitPrice*Quantity*(1-Discount) DESC
; c6 I( t5 K( K1 j9 d+ q/ k, o3 用 AS 子句为字段取别名' ~2 r7 D  z# J  B1 U
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。, i# |. I& h+ y8 }2 S
例:返回FirstName字段取别名为NickName
0 V0 U3 c& Q9 o. O7 NSelect FirstName AS NickName ,LastName ,City4 @1 |' J7 x8 A
FROM Employees/ }, I7 ?, ?3 |+ [" P
例:返回新的一列显示库存价值# X. N- h8 D* x  K
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock+ A( \- F& W0 M
FROM Products
6 f$ J7 [' y! \$ [* P) J二 .Where 子句指定查询条件
7 v9 B. H, F4 b) ]- d6 W7 {. U1 比较运算符& }5 p6 x* P% n+ l4 f9 H
比较运算符 含义
5 ^% Y; S2 m/ O* }) m' X= 等于2 Q) {0 ^. A3 |! c6 Q# Q
> 大于% r8 h( i4 Q, a7 L! i" u) V/ x
< 小于) k8 p, U* r" I5 W8 L4 H( I' s
>= 大于等于1 `0 I4 Y" R$ K' ~1 A; i
<= 小于等于
( Z9 t. y1 W# A4 r( C! i<> 不等于
) J; t& H2 B" s3 y4 k6 X% w, Z/ T!> 不大于
. [* @2 g" W* t/ x: Z6 X!< 不小于
9 q& w3 u8 y$ r: r7 k5 h例:返回96年1月的定单# Y9 t* p  L( ~5 s& |
Select orderID, CustomerID, orderDate
. G7 q. a. H/ x1 LFROM orders
4 A3 K4 K9 P/ PWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
  x- H: q: r* V# W; s注意:. S/ ?9 W; J( F9 T! b# ^: S
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。* E& W  \" A0 S3 @
例:
7 b/ V  _0 @3 c7 ~$ N9 EWhere orderDate>#96-1-1#
- @+ |/ n* K1 S9 G) I( [/ I也可以表示为:
8 \, c' i6 z/ C" h4 K' YWhere orderDate>Datevalue(‘1/1/96’). ^( V3 R; ?! \1 H9 X/ a& f/ i
使用 NOT 表达式求反。
8 Z) C  s) A( L; B例:查看96年1月1日以后的定单
5 V" s3 k4 w- e1 w1 j; bWhere Not orderDate<=#1/1/96#1 F6 z0 `- u" a! |4 v& f
2 范围(BETWEEN 和 NOT BETWEEN)1 Z$ a: r3 E3 w+ x
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
! {6 A7 s- R7 y1 D例:返回96年1月到96年2月的定单。
2 z% M1 ]8 s9 f( C/ c8 L: BWhere orderDate Between #1/1/96# And #2/1/96#
) x. k2 ]- O+ O0 H: ?3 z# k3 列表(IN ,NOT IN)" o+ i$ Q6 t2 U7 |  U
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。9 _. a0 @1 D; i* x
例:要找出住在 London、Paris或Berlin的所有客户
0 W1 c1 u' F* o1 i, \& ySelect CustomerID, CompanyName, ContactName, City1 i8 I: a4 z9 A, O9 c- k
FROM Customers
7 S$ x5 ]! O8 r& @Where City In(‘London’,’ Paris’,’ Berlin’)4 e9 V( r- I" y+ t
4 模式匹配(LIKE)7 `8 q: t8 i- _! [0 v
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
% A; _$ k+ ]0 h. hLIKE运算符里使用的通配符
) j) W0 \; t4 s! c2 H1 E4 {通配符 含义, @) Z: N. ^# P
? 任何一个单一的字符- [( o% V7 \( W& [8 g! L
* 任意长度的字符5 {+ G. @' H: G* p+ F, L
# 0~9之间的单一数字
- V5 v: v9 k; |& X[字符列表] 在字符列表里的任一值
1 S9 I- Q% J, Q6 u6 Q5 X% [[!字符列表] 不在字符列表里的任一值* _  u. ?1 |$ A- z1 P
- 指定字符范围,两边的值分别为其上下限
2 h% S- W# b$ }2 ^3 ?; W例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
# {8 v/ U" W# c: _1 f. }Select CustomerID ,CompanyName,City,Phone
6 a! E: l* Q2 |3 C2 E+ \FROM Customers3 C) Y" l1 [( |! g  Y( |* |; n. g# p; {
Where Phone Like ‘(171)555-####’
5 d  O* L) P, W, C1 @$ c" A) SLIKE运算符的一些样式及含义
: d* x) f; g  G& }* {- j样式 含义 不符合
1 }3 x5 {' q3 W0 Z, \  G6 zLIKE ‘A*’ A后跟任意长度的字符 Bc,c255* c% ]7 Z; J/ P7 N0 X
# LIKE’5’ 5*5 555
: ~1 E# N% e, ^% fLIKE’5?5’ 5与5之间有任意一个字符 55,5wer51 C! z" s3 ^+ _$ f% m# {
LIKE’5##5’ 5235,5005 5kd5,5346  j- g$ f. Z+ c5 a% U; H
LIKE’
6 C4 G: z9 n: g& ^+ o- x$ a* s3 P[a-z]’ a-z间的任意一个字符 5,%
1 j1 O) @0 _4 y7 lLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
6 f4 h0 L. Q( Z- h1 @LIKE’[[]’ 1,*
5 w" U  ~( f4 n0 B' e. [3 q三 .用ORDER BY子句排序结果
  T- d9 z4 M3 \1 n0 S7 n! B5 S& ^+ LorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。' l3 g7 v: Y. p5 r- C4 \
orDER子句中定义了多个字段,则按照字段的先后顺序排序。, V" d9 B5 I0 l
例:
5 s7 n7 ?2 _( [  z$ a$ N( LSelect ProductName,UnitPrice, UnitInStock
/ C3 t; B( \7 UFROM Products$ E9 t. ~9 R- A6 x
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName, N0 P$ Z" O  v2 q7 w/ [. Y
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
, ?" V- j3 c! r: h; z. e例:下面的语句产生与上列相同的效果。
5 i# b0 k2 w" d0 ?Select ProductName,UnitPrice, UnitInStock; O; m8 O2 V1 R! Y& P. k
FROM Products0 e# f2 C1 n0 z+ i# T0 ^% I* q
orDER BY 1 DESC , 2 DESC,3- r( k' u- ?7 X$ N' o4 b
四 .运用连接关系实现多表查询$ O8 k1 t# X7 D! X4 J$ [% P
例:找出同一个城市中供应商和客户的名字- [+ n4 B: r6 z- i7 N
Select Customers.CompanyName, Suppliers.ComPany.Name
2 w0 c2 _3 B, q& M) o+ S; M% i1 c3 ]" _FROM Customers, Suppliers
# ?  R  |0 q4 G! p( fWhere Customers.City=Suppliers.City
6 d0 I6 k! Z* X/ r/ E3 h) _例:找出产品库存量大于同一种产品的定单的数量的产品和定单+ w( Y6 w8 r8 L3 n
Select ProductName,OrderID, UnitInStock, Quantity/ B& e1 T% w, {1 y6 U% \9 ~! ^/ R2 U
FROM Products, [Order Deails]
4 @% W7 J1 }& {, b# cWhere Product.productID=[Order Details].ProductID! d* l, P) m9 S. C
AND UnitsInStock>Quantity! i8 ]% B6 K& m8 @4 U& {# A
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
* |0 H/ `) P) F语法:$ x' a6 b2 Z7 u5 G) K1 {4 N' Q8 J
FROM table1 INNER JOIN table2
1 Y" |3 t/ H4 E9 z5 O4 ?ON table1.field1 comparision table2.field2
+ t. Z$ _  i" U( z2 t( o- t2 Y其中comparision 就是前面Where子句用到的比较运算符。7 x2 V( Y( l# r& u% z3 \
Select FirstName,lastName,OrderID,CustomerID,OrderDate- u" {: O! X! j% X
FROM Employees
1 @  a# U- b3 }9 r; I& f0 Q$ s# r" x! GINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
* F0 c' O: v/ O2 P- Z4 k注意:
9 v) L0 w1 V& S  DINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
5 i" Q6 H5 S6 |' w( z, Y8 M0 ~在一个JOIN语句中连接多个ON子句! b4 b$ p# v6 i0 I/ h
语法:
3 t# @! V( p8 v% x3 \: b; V4 iSelect fields
* T6 W9 r2 A% h6 i& ^" aFROM table1 INNER JOIN table2
" X" W2 W/ z: B9 TON table1.field1 compopr table2.field1 AND
! {. v8 L! j, ?ON table1.field2 compopr table2.field2 or' L8 M( N, {( @' D
ON table1.field3 compopr table2.field3
) B2 @$ r8 u+ H! R" I( T4 j, o6 d1 E也可以
6 D# ^( m7 q5 j/ X$ G& q5 iSelect fields- |! _& ?: o# T" I9 {+ O4 [
FROM table1 INNER JOIN
" v) \$ z. o: O8 P(table2 INNER JOIN [( ]table3
: n! ~$ V5 j; x" k! K- J[INNER JOER] [( ]tablex[INNER JOIN]0 B* z3 _, V( s0 k, g6 h
ON table1.field1 compopr table2.field1- o8 P# Q1 n1 R( n
ON table1.field2 compopr table2.field29 d) o/ v# o" b! o
ON table1.field3 compopr table2.field3
' n' J% x' {( b外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。* i7 d" W( W/ m( M* @1 q, k2 Y: v
FROM table [LEFT|RIGHT]JOIN table2
0 D# u: |: \5 Y1 [/ tON table1.field1comparision table.field2
- |- Q* [& R$ N& X' h, I9 @) x6 G用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
+ f0 l0 S8 U5 w1 \/ q! Z$ B例:不管有没有定货量,返回所有商品
8 ~4 F  `" U4 d5 N" A2 T, m7 HSelect ProductName ,OrderID, K2 {7 I5 o% V( F. C
FROM Products
: q% X' v- e  E- g' _4 [6 nLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
- |6 J  q. n+ ~0 L& c右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
/ y; o- z! F& T例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。6 b' T) N+ N3 ^( `7 s
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
4 i8 c. A! r0 i- \$ ~Select *
0 A( S9 O* B6 t; SFROM talbe1
/ O1 N. P8 K7 H/ HLEFT JOIN table2 ON table1.a=table2.c  z( I) R% J  \* c% Q
1 连接查询中使用Iif函数实现以0值显示空值7 O% M* f2 a% l- h& t; d! G
Iif表达式: Iif(IsNull(Amount,0,Amout)
3 H/ x' ?" ^3 C$ F) S1 C6 k例:无论定货大于或小于¥50,都要返回一个标志。
, ]" L0 x8 X% e/ k. K# cIif([Amount]>50,?Big order?,?Small order?)
/ T1 A1 ~! s& t- N+ _# }2 b9 s五. 分组和总结查询结果$ m6 d! u) E; z5 p! w
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
. T5 ^& r, L$ R1 j6 w: U7 ~GROUP BY 子句的语法; @) F% r: O+ U5 r
Select fidldlist: o: Q% ~+ F$ j4 \3 L6 y2 \8 j
FROM table6 |9 r# {* H  y& ^4 e* M2 v) B( l
Where criteria/ K$ `5 A4 ]$ H  l" d: d! `$ I$ T& C
[GROUP BY groupfieldlist [HAVING groupcriteria]]! z0 D) I* C, {' W1 T
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
( Y- F) {( z/ x8 H) tGROUP BY字段中的Null值以备分组但是不能被省略。. r1 L5 k1 j! E7 a( y
在任何SQL合计函数中不计算Null值。
/ o% X0 I5 Z1 {5 C4 L6 m) `7 `GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。% K. |9 g6 h$ D, d
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
+ Q- L8 i! g3 R4 W* lSelect Title ,Count(Title) as Total: b6 D9 q  x5 D
FROM Employees" h. o( T! l8 O. n' [0 {/ M' X3 ~% O
Where Region = ‘WA’; k0 Y4 f8 Y( S
GROUP BY Title5 A: V, B! Z  K1 o% q( {  x
HAVING Count(Title)>1  g5 `# x" r' q) T9 y
JET SQL 中的聚积函数) a% n8 C' h$ p/ K2 V
聚集函数 意义
$ e' {) N% R# HSUM ( ) 求和
1 A- y+ A% T" e4 N, nAVG ( ) 平均值
5 L+ ~; D( t* fCOUNT ( ) 表达式中记录的数目
3 G# [# P! e% j7 gCOUNT (* ) 计算记录的数目  o+ \/ M( T6 I' N( O1 q
MAX 最大值
* ?5 u- t# V, X  D5 kMIN 最小值
4 \" P  u$ Y2 ~5 qVAR 方差
# a& {9 {* B; S/ OSTDEV 标准误差
8 \, z9 R; u4 r# P" A' |FIRST 第一个值& K9 h* o0 [  _1 U' c9 z; V$ H
LAST 最后一个值+ ]5 Z7 l1 f5 ~8 _
六. 用Parameters声明创建参数查询# I& b- N% ]4 z, ]- h+ C
Parameters声明的语法:$ M9 @7 _7 T1 O) F5 o- \5 i
PARAMETERS name datatype[,name datatype[, …]]
' ?& l  Z, T2 u* D' F% Y其中name 是参数的标志符,可以通过标志符引用参数.) b! M' n+ o1 G* s
Datatype说明参数的数据类型.
9 `6 Z" Z8 `. M, L  }1 {使用时要把PARAMETERS 声明置于任何其他语句之前.
7 ~/ M& r  q/ _; H* c0 x  Q例:
4 V, g+ u4 G8 e# M" t2 CPARAMETERS[Low price] Currency,[Beginning date]datatime
: ~+ @: O5 z' S8 OSelect orderID ,OrderAmount' m  n9 @6 ]' p- b0 m2 B: u
FROM orders9 u$ e8 N/ w6 ^* O& E% w4 D
Where orderAMount>[low price]2 V) o2 i0 Q5 l' b+ C+ Q6 g
AND orderDate>=[Beginning date]
( j( f6 \6 p" c, }( y七. 功能查询" I/ d1 p) F: ^1 k
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
" x1 v' i7 r0 u2 `1 更新查询
6 V" ?7 D6 Q) X1 r' J' C3 s" WUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
7 m. l3 z% i5 m7 a更新查询语法:
; @5 E  p6 q1 D/ f" B6 qUpdate 表名
4 y3 X( r$ R* E3 i+ T1 fSET 新值
7 H/ C2 M* L2 v# t6 h* kWhere 准则! p6 D8 ~- H4 \3 C2 l6 v6 A
例:英国客户的定货量增加5%,货运量增加3%
# @8 A  \; }# X" [8 `Update OEDERS' v- u! i6 a% Q- W- \9 U
SET orderAmount = orderAmount *1.15 C% B, w1 A2 O- z: c; K
Freight = Freight*1.03
6 z, N' f( U" ]1 PWhere ShipCountry = ‘UK’3 x. m- F& E  Q
2 删除查询
; d- j, a  |" ?6 bDelete子句可以使用户删除大量的过时的或冗于的数据.
3 A/ F* u5 h. d$ h注:删除查询的对象是整个记录.) p7 |+ |* q' s2 C; K
Delete子句的语法:. K/ P: U; G, W! J! a. {
Delete [表名.*]
" |7 b* b  T& PFROM 来源表
* w1 `7 C  E# R1 T6 ]Where 准则
" A/ m" {9 f2 i; o+ I例: 要删除所有94年前的定单
3 P$ Y( E8 @$ T1 a2 QDelete *
4 @" y+ z/ U5 r4 J3 o  [' G5 OFROM orders
! P% @8 W* q# a  e* _Where orderData<#94-1-1#
7 L) k, `/ ^3 k' D3 追加查询
) a3 G9 A# P( v# xInsert子句可以将一个或一组记录追加到一个或多个表的尾部.
4 u$ Q& o  t% t5 eINTO 子句指定接受新记录的表
3 `# F: u, S7 F# T! R, _% CvalueS 关键字指定新记录所包含的数据值.6 e0 a( c' B, x) U
Insert 子句的语法:
& q3 S; o5 w" X( rINSETR INTO 目的表或查询(字段1,字段2,…)
+ ]% C8 Z. [4 P. ^6 |2 dvalueS(数值1,数值2,…)
! l& ]. k% |, \9 a4 a/ k* P例:增加一个客户
7 R( [1 p6 J) u" C% zInsert INTO Employees(FirstName,LastName,title)
, `3 N# b4 k# BvalueS(‘Harry’,’Washington’,’Trainee’)3 Y4 V7 H" [& i  p( l
4 生成表查询
( ]/ s7 J' Z% o2 L3 a3 E$ J可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.! e9 e0 [: b$ \& R9 G3 M4 v  l; H3 A
Select INTO子句用来创建生成表查询语法:
5 C$ n& x( f; ~! k' ]Select 字段1,字段2,…
4 i; H/ S, f. b% o0 ~INTO 新表[IN 外部数据库]9 u+ Z7 r1 X7 |% k; \; v  @
FROM 来源数据库
, P' N3 P. \0 y9 L" y9 RWhere 准则
2 n: v" E  S7 Z例:为定单制作一个存档备份
* D: C9 p6 W4 L. X( c( N6 b' ZSelect *
- k3 y/ t# k- W) }+ B. _" dINTO ordersArchive8 m! P3 G# U% b4 L. ?# k" V
FROM orders
" {0 G5 e1 Q- e& s+ o: Q3 {八. 联合查询
8 v! W& t! P+ \0 _5 BUNION运算可以把多个查询的结果合并到一个结果集里显示.# \# _: L; B) M. H# j/ a' P
UNION运算的一般语法:
, c$ \0 b" U& Q* o- i2 v[表]查询1 UNION [ALL]查询2 UNION …( C5 v' Y$ A* {2 U( e8 A
例:返回巴西所有供给商和客户的名字和城市+ i2 Y) j5 N. X: y0 O
Select CompanyName,City
% o) {5 j' x& u' [0 hFROM Suppliers2 @" d% ^7 z& l# c' J6 s" O/ ?
Where Country = ‘Brazil’) ~% b5 T& R' s4 m. E8 ?' J( K3 @* j
UNION) C# b! |) R' D/ A% _/ f6 U5 ~
Select CompanyName,City
2 b/ V# a5 k( q! k% E! f; c+ ^FROM Customers9 M% h9 Y  N, I
Where Country = ‘Brazil’0 H1 W  ~# L$ q* F8 \0 _! D" J( a
注:+ K7 D. k" V+ g; ?' r* N# B! k' e  s
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
& d* K( S+ @, mUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同./ T/ ^$ _. y' x0 x% j6 \
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.: L7 ~3 @2 _8 z/ A* n$ F
九. 交叉查询
" A5 e. R% g9 I* Z交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.. M4 }- D4 }- Z/ ^5 W
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
8 m% \' M' y+ w% ZTRANSFORM aggfunction
$ i% a# }$ v+ j. {& d1 lSelect 语句/ ]# X. Y8 ~9 q5 z" ?6 V# l* |
GROUP BY 子句
6 ~9 }/ A( R  `) N) U$ U( G4 ?PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
8 ^, {7 ?5 {6 K3 {' j" D. CAggfounction指SQL聚积函数,
) H3 Y4 C. D* I% QSelect语句选择作为标题的的字段,: ^9 E$ E1 O3 a2 s4 I% t
GROUP BY 分组2 B5 b+ g! {8 s5 }* n. [% B# V3 F
说明:
# s7 g, A7 P4 u- {! DPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.6 M5 L( i, q2 \, e) \
value代表创建列标题的固定值.
1 M0 T# ]( R/ M- l6 E* q例:显示在1996年里每一季度每一位员工所接的定单的数目:* H8 C1 \" i% J2 n9 R. R# }2 t
TRANSFORM Count(OrderID)
, p3 s3 @4 r) O. fSelect FirstName&’’&LastName AS FullName" v, X. U6 m! Q, |. C
FROM Employees INNER JOIN orders( |+ _7 \  R! u, n, A
ON Employees.EmployeeID = orders.EmployeeID
' A2 M" s: n2 OWhere DatePart(“yyyy”,OrderDate)= ‘1996’) K, `8 s' d: [: M0 }  S! k
GROUP BY FirstName&’’&LastName
; ?: w  W8 [5 M4 B1 l( }orDER BY FirstName&’’&LastName, y* ~8 v/ _) K" }4 R' ^* v2 l2 q
POVOT DatePart(“q”,OrderDate)&’季度’% u0 V. x4 a4 d, r# y* y' A" {
十 .子查询: H2 F- X) x) d/ \3 @
子查询可以理解为 套查询.子查询是一个Select语句.
2 s# B: I, h  G7 W6 P1 表达式的值与子查询返回的单一值做比较
, o9 `9 |) o& O* T2 x; e! r; Z语法:6 D$ o- G" z7 s( [
表达式 comparision [ANY|ALL|SOME](子查询)5 r. P( q, c" t' B, Q: d  W
说明:
5 G" l8 u- C4 t9 o8 y. Y5 l- }ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.; O8 p3 T+ f# Q& q( q% g' j; z; O
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品) ]0 m  _! O  T& U* a7 p, l
Select * FROM Products
# P5 a, {, r( k( e1 tWhere UnitPrice>ANY9 {6 r% \$ S4 ?5 i
(Select UnitPrice FROM[Order Details] Where Discount>0.25)# c6 W: d5 P* t2 F' S! u$ o
2 检查表达式的值是否匹配子查询返回的一组值的某个值
6 w- n. S3 w( p2 n! C& {& @/ ~* I语法:
1 E0 y1 v) f" L8 Y" G+ p[NOT]IN(子查询)! F+ F: \8 d" s
例:返回库存价值大于等于1000的产品., O, e5 g; [# u) V8 H1 n
Select ProductName FROM Products, l. u- ^4 ]& {& ?& b* _- t
Where ProductID IN) I2 E5 a3 d- S: T2 \1 m3 S/ x
(Select PrdoctID FROM [Order DEtails]' o! q+ T6 b6 f0 }/ n! D4 |/ E
Where UnitPrice*Quantity>= 1000)( K- b: Q9 b! ~5 F1 L
3检测子查询是否返回任何记录
6 c. W! i1 ~  T8 \; \6 d语法:
( I  c8 p# J2 o" ?$ |# }  i[NOT]EXISTS (子查询)( x3 m" X2 ]. D1 @6 `
例:用EXISTS检索英国的客户# a, G! q4 ?3 U- B8 q
Select ComPanyName,ContactName
9 i/ N5 z; W8 w  `# e: ZFROM orders( A6 O% d0 n& `8 H) A
Where EXISTS
+ Y, o$ ~$ D5 Z(Select *5 A& K8 r3 f0 ?& m: N+ D
FROM Customers
7 e5 |/ G/ h; Z3 `; m! qWhere Country = ‘UK’ AND& Z% ]7 [; l$ p. D& W1 C6 a
Customers.CustomerID= orders.CustomerID)




欢迎光临 航空论坛_航空翻译_民航英语翻译_飞行翻译 (http://bbs.aero.cn/) Powered by Discuz! X2