航空论坛_航空翻译_民航英语翻译_飞行翻译
标题:
Access如何筛选重复数据以及Select语句的完整语法
[打印本页]
作者:
帅哥
时间:
2009-11-10 10:28:12
标题:
Access如何筛选重复数据以及Select语句的完整语法
Access如何筛选重复数据以及Select语句的完整语法
p+ X- p* k- ]6 {/ J! r+ M; c7 Y
1 Q2 J: j7 Q& f, b7 m2 ]( B; ]
select distinct 字段 from 表名
" x4 ]# \+ |! ~0 U
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
! s. S# V$ J% }9 {+ A
一.Select语句的完整语法为:
& e( x2 k( J& k4 l9 L: s
Select[ALL|DISTINCT|DISTINCTROW|TOP]
2 D- o" ?4 N8 \' Z$ ^1 l
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
: p9 C! n0 Q# c/ |
FROM tablee xpression[,…][IN externaldatabase]
5 Y0 w' _. f T; ~ v
[Where…]
) t" p5 U% w( z+ X4 K3 U
[GROUP BY…]
6 {% N4 K0 X( L. r7 W& M: \+ z
[HAVING…]
! q3 p; \$ K* ?3 \3 x( P
[ORDER BY…]
2 T% z1 e1 n9 p' j I3 b; a
[WITH OWNERACCESS OPTION]
( r: [0 h! Y: J V/ V) E) O: S/ g
说明:
3 O; J \4 f- K/ S4 o+ E
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
# Q; i( z6 n. w: q
1 FROM子句
5 I* y$ C& s1 j$ x( Z
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
+ T& I/ ?4 U0 @8 m) j
例:下列SQL语句返回所有有定单的客户:
- Z3 p4 M; z+ F% d) x7 b# n" U
Select orderID,Customer.customerID
; w$ q8 Z9 c3 l+ y G1 S6 D, p
FROM orders Customers
( {1 I: h3 |7 M( m ]. y/ ~
Where orders.CustomerID=Customers.CustomeersID
/ U) ^2 v5 t6 K8 U! u& t. ]6 Q7 M2 H
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
2 }# Y' z7 V0 l' @5 S' J
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
8 W* T2 {. y! N! Y% N3 @& x
例:Select ALL FirstName,LastName
0 ]* J4 J. o/ }3 K4 r
FROM Employees
* t0 v8 P7 g6 [3 K
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
7 ?& @* C* ^; W" T( L* `
(3) DISTINCTROW 如果有重复的记录,只返回一个
( f W& j8 r. m2 i1 n
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
3 }7 T. O0 j# h* {
例:返回5%定货额最大的定单
, s$ F, I2 H, I6 ~
Select TOP 5 PERCENT*
& C& C, I; L1 \! g- X. ~. Y/ F
FROM [ order Details]
8 f4 a( M8 Q- @( p5 x/ Z
orDER BY UnitPrice*Quantity*(1-Discount) DESC
9 |8 d& t8 B* V* V0 x
3 用 AS 子句为字段取别名
% v7 {6 I% @2 V4 g/ N0 m5 U( b
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
8 _) Y) M: C2 J* \7 F2 y4 e
例:返回FirstName字段取别名为NickName
# `3 N2 B5 J9 r$ O2 f- M
Select FirstName AS NickName ,LastName ,City
. y. i% q/ g8 y( H
FROM Employees
# u% d" Z6 p: {: m
例:返回新的一列显示库存价值
3 w0 \0 \; Y+ H& c2 P6 O
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
q0 M8 l& q6 S
FROM Products
# D4 z" c, V ~( z! B- [
二 .Where 子句指定查询条件
, w/ L! j0 P* U, \
1 比较运算符
1 X- x. Y$ ~" j* k* Q* h
比较运算符 含义
0 u2 S4 w! `5 N: t v; v1 \; w
= 等于
) n0 x6 S t' x
> 大于
9 |/ g" I/ b- b) i, i
< 小于
) d" i4 ^$ C8 U. O( Z3 ^! g4 w
>= 大于等于
" I; X* D1 r" z' ^
<= 小于等于
! o$ l! o9 t3 w5 w, g1 z0 R
<> 不等于
& T: E/ ^0 _8 M2 D0 F0 V. a9 P
!> 不大于
& s9 v% C, _- a
!< 不小于
2 F2 w- \- b0 } M9 m/ _
例:返回96年1月的定单
x: p/ [( R5 f% C- u$ @
Select orderID, CustomerID, orderDate
, P. e7 }( p; V7 @, L& j
FROM orders
) _9 m. ^( N% ]7 y# U2 q3 Q
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
! t, x; y- V2 v) j, W& h5 L
注意:
3 X, j: p3 X1 e- A6 N8 ^5 I/ [& w
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
7 L8 P/ u8 ^; i. g% e' V( Y/ G6 k7 ~
例:
x' Z8 ^; I6 a) v0 b3 s
Where orderDate>#96-1-1#
$ c) z, [ O+ j& I
也可以表示为:
4 u$ n5 K: K$ j' ]6 [
Where orderDate>Datevalue(‘1/1/96’)
$ J5 b" o) |0 p
使用 NOT 表达式求反。
4 N. G b. x- o; J
例:查看96年1月1日以后的定单
2 s6 B$ w, v( b
Where Not orderDate<=#1/1/96#
( [- w' _' V5 p* }
2 范围(BETWEEN 和 NOT BETWEEN)
2 Q4 h* o1 h: t. @1 g, y
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
% M A4 s1 ~/ U
例:返回96年1月到96年2月的定单。
6 @" S9 t6 P$ k0 O$ o& s
Where orderDate Between #1/1/96# And #2/1/96#
& a9 ?7 d6 ]% l$ z8 e+ D
3 列表(IN ,NOT IN)
$ ]( |: ~2 o4 I1 v& u
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
$ [6 S* M6 u! |/ L1 q" K
例:要找出住在 London、Paris或Berlin的所有客户
: T! E1 D; q/ u: q" J7 P y
Select CustomerID, CompanyName, ContactName, City
0 C: p& o' D+ o/ L( Y4 v
FROM Customers
2 u! ~- R" V! `) L# U+ _
Where City In(‘London’,’ Paris’,’ Berlin’)
9 c) H1 _" h+ Y; I
4 模式匹配(LIKE)
2 m( m$ A. ]0 X1 U7 l, |+ q
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
% J4 e3 w5 e: d/ `( M
LIKE运算符里使用的通配符
2 S: Z+ k2 C' q
通配符 含义
, y$ ]5 U2 j2 g x, @" D
? 任何一个单一的字符
" |( e% i( ~; {& |
* 任意长度的字符
5 f, g; o4 \* b& K+ M* j% N
# 0~9之间的单一数字
; u' {! F. W% y& l: x* e
[字符列表] 在字符列表里的任一值
+ j! c/ R! i) k7 K! k
[!字符列表] 不在字符列表里的任一值
{8 z$ W) e5 m% x
- 指定字符范围,两边的值分别为其上下限
+ k R4 q% [0 e! u) a2 c# k- K
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
6 J$ g5 \/ k$ f. D- o
Select CustomerID ,CompanyName,City,Phone
. `2 o7 ~' Q) e
FROM Customers
$ R6 `, z' @ T/ K
Where Phone Like ‘(171)555-####’
: r8 Q0 q. A y3 M& Z! f5 Q6 m. x7 e
LIKE运算符的一些样式及含义
! ?: q( v- S# w) J7 u
样式 含义 不符合
+ U' I7 E3 d& F9 k: J0 r
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
3 f4 w4 b, b' n' S) B/ {+ F
# LIKE’5’ 5*5 555
. N+ M9 t' \) t, Q6 T8 i6 p" W) r
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
$ e3 R, B* F, F# ~5 J _7 e
LIKE’5##5’ 5235,5005 5kd5,5346
3 n# W8 D. F2 Q% b
LIKE’
8 {' O, @% w: I: R
[a-z]’ a-z间的任意一个字符 5,%
! [1 X- X3 G, \! L! a6 a4 ]8 H
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
% v9 ~) l+ `- _4 {6 ^0 @
LIKE’[[]’ 1,*
5 }& V R1 l4 K) Z- R6 B/ t
三 .用ORDER BY子句排序结果
3 `/ J" T- o" \- Z/ |2 r* k1 u! Q
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
9 l8 W. M% b& r' X; x) A
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
9 @" _* G$ U& k1 P7 ]( ]& d
例:
. X# a4 p3 k% J9 W7 x4 g
Select ProductName,UnitPrice, UnitInStock
# F2 \8 H7 H5 k6 ?% S
FROM Products
4 l, r8 h9 D% N. \
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
. |* k( a* S. O, s& q2 w
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
+ H" t- H c( j- ^2 P
例:下面的语句产生与上列相同的效果。
. v" u4 k0 P( R2 ^
Select ProductName,UnitPrice, UnitInStock
% i3 |+ w% h9 W; ^. k* n6 h
FROM Products
/ M. ~1 S6 D; i9 ^9 ^* J# ]
orDER BY 1 DESC , 2 DESC,3
/ L! Z8 M' p. F
四 .运用连接关系实现多表查询
% _3 M& P% h' a0 }* y4 T8 y
例:找出同一个城市中供应商和客户的名字
6 O9 X4 M% T% K
Select Customers.CompanyName, Suppliers.ComPany.Name
! R2 s, S L& Q9 q/ c
FROM Customers, Suppliers
6 U3 S2 p G7 B: @% ~ k
Where Customers.City=Suppliers.City
; v0 D& ^' _/ ^ `' T6 x
例:找出产品库存量大于同一种产品的定单的数量的产品和定单
2 O3 u, \7 [6 A6 J3 P, m' t
Select ProductName,OrderID, UnitInStock, Quantity
3 y8 G( i r) }9 P0 T* u" `0 d
FROM Products, [Order Deails]
% r- u" B0 G9 W& U+ v
Where Product.productID=[Order Details].ProductID
1 B" e! _5 [7 q' C$ J' Q1 [8 y x
AND UnitsInStock>Quantity
! Z1 Z& Q4 y- I
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
% f9 j4 Z _# a- J5 c
语法:
/ X- c4 Y" y6 l- u( u
FROM table1 INNER JOIN table2
/ ]# m( n. f( ?* ]" _: u& @0 T+ }
ON table1.field1 comparision table2.field2
( A- k5 P5 u3 {. v/ H/ u* E
其中comparision 就是前面Where子句用到的比较运算符。
% j: @' S: R5 S/ j/ j% x
Select FirstName,lastName,OrderID,CustomerID,OrderDate
8 L$ {$ `! q! K [3 ]4 W E
FROM Employees
8 ]( S7 o7 @) k4 |4 K- {
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
+ v. \7 n: o3 b" w a; ?1 S
注意:
2 I1 k0 F& u( `7 K! w' k% b
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
) s( K) |# M; ^+ A- T( m
在一个JOIN语句中连接多个ON子句
" {- T+ Z! n" T$ D& J2 V7 R* m8 Q
语法:
& ]+ R3 @& G) F
Select fields
- j" Q6 X4 n, J( m4 [8 x1 T; ^
FROM table1 INNER JOIN table2
& J: h; Q2 s( u4 s2 l
ON table1.field1 compopr table2.field1 AND
5 S7 I b$ j' O0 F: d
ON table1.field2 compopr table2.field2 or
: M8 i! ~2 Q% Q8 D
ON table1.field3 compopr table2.field3
: V) w/ s8 N: h6 ^9 K
也可以
4 T/ ^2 W W0 p3 R: ?9 t
Select fields
/ `: l: C4 i8 T9 P' U4 T1 t- {6 u
FROM table1 INNER JOIN
" @+ a7 \( b- Z1 e* M! Z: H
(table2 INNER JOIN [( ]table3
& y3 Z& [% t0 V
[INNER JOER] [( ]tablex[INNER JOIN]
6 b" T4 _0 s( G6 q: M7 i. r! J8 M- i$ T
ON table1.field1 compopr table2.field1
: D9 \ I9 _3 g% d
ON table1.field2 compopr table2.field2
3 t7 G4 H+ J5 V3 ^) f6 J3 G
ON table1.field3 compopr table2.field3
) R$ i+ n1 o4 e# f3 m {, u
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
h% N, C3 j4 w* f
FROM table [LEFT|RIGHT]JOIN table2
4 o# W# h0 ?. c& V% {! F
ON table1.field1comparision table.field2
- ]) @8 f" r0 d2 d# A0 o0 V- h
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
9 z0 x6 E$ D: ]3 d4 {
例:不管有没有定货量,返回所有商品
8 V9 y! I) K+ @7 [
Select ProductName ,OrderID
+ H% B q% u' _+ x) }) A8 D
FROM Products
_: ^, _* b) G) e% w. G( T3 I0 X
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
2 b! p; \/ F$ u* v) y; ]
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
& J7 k! c/ h) _% r) h
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
7 O2 W( [8 G+ P w
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
# V$ }2 C; ^0 A3 m& {% ^
Select *
: _# r, e9 e6 E1 a
FROM talbe1
& g8 n% C, `5 |# @1 a1 R# Z
LEFT JOIN table2 ON table1.a=table2.c
/ Q& P7 H$ x! X, T7 M! [: a& f
1 连接查询中使用Iif函数实现以0值显示空值
. k) a# g! n1 C+ J) h4 K! T1 j
Iif表达式: Iif(IsNull(Amount,0,Amout)
* a" D' g7 k1 H! Y. U( w: d
例:无论定货大于或小于¥50,都要返回一个标志。
" ]0 E4 S2 R4 x5 [1 e
Iif([Amount]>50,?Big order?,?Small order?)
9 F/ [( K, Z6 U" F4 L- Y
五. 分组和总结查询结果
9 K0 P4 z" g( G) b
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
( [+ A( i+ g t* i% Q
GROUP BY 子句的语法
- N% S0 j# g7 M! @
Select fidldlist
% f- g- M# `7 p
FROM table
3 k: ~0 M8 Z& |) o
Where criteria
$ Z$ m. t! N6 K3 B8 T) H( G$ G2 E
[GROUP BY groupfieldlist [HAVING groupcriteria]]
: s9 Q" ?6 H0 z# `1 n# D* B
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
0 v/ ]9 p3 l" X% c; T0 C. N+ L
GROUP BY字段中的Null值以备分组但是不能被省略。
5 N& y! E, S m h3 G" W4 f; _& u
在任何SQL合计函数中不计算Null值。
$ w5 M0 Q& f) a$ [
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
. L( N3 x; B0 \ W% P# w. r
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
5 Y3 }% Q5 M% g [. o. C
Select Title ,Count(Title) as Total
) Y; H1 r" h1 N' B% U( _$ ]: U
FROM Employees
! C: E) {0 g. \9 l/ |
Where Region = ‘WA’
) Q$ B* f- s3 i0 b: D( b
GROUP BY Title
1 t1 T. W6 \0 S4 v, K8 J# k/ q
HAVING Count(Title)>1
; c/ U/ y8 H' b
JET SQL 中的聚积函数
0 k% ^2 C# N: ]: \$ S" [0 t5 q
聚集函数 意义
# g' {* F+ V/ e+ {9 u
SUM ( ) 求和
8 F; g" W8 b. {; T; ]! a% \
AVG ( ) 平均值
# m$ ^3 @$ V1 i. R1 y
COUNT ( ) 表达式中记录的数目
, d% @1 L# p8 w6 W
COUNT (* ) 计算记录的数目
/ d: f# Q- O( Y' |; L2 O4 B1 r
MAX 最大值
& s9 d( c9 _1 h6 a# k/ L
MIN 最小值
3 k# u M) r$ x& M' P8 f
VAR 方差
7 S6 l2 N: ?# a. z& m
STDEV 标准误差
& w5 x% g7 n1 s( o$ |
FIRST 第一个值
% g% J% |6 S$ d5 X
LAST 最后一个值
/ r$ U/ `: p" S
六. 用Parameters声明创建参数查询
7 b1 i$ n" d0 N# n
Parameters声明的语法:
$ s/ D' g( [" Z8 t6 J& l
PARAMETERS name datatype[,name datatype[, …]]
' k* s, _% Q3 u* d+ l& T( u6 u
其中name 是参数的标志符,可以通过标志符引用参数.
8 E7 b( e) ~; Z; o0 s
Datatype说明参数的数据类型.
4 g& K# i3 h! F$ H1 s
使用时要把PARAMETERS 声明置于任何其他语句之前.
' o" h: X: a& A& I9 W) _" m
例:
; N2 \( i4 i: l2 y# c, @
PARAMETERS[Low price] Currency,[Beginning date]datatime
; K0 W* H G0 J
Select orderID ,OrderAmount
6 a" y1 g5 T. b7 B8 W( d& l
FROM orders
; \1 X0 i, X/ a* u8 C
Where orderAMount>[low price]
/ }7 L' [1 i$ r" @% c
AND orderDate>=[Beginning date]
; k* H5 x' @! _* n; y" t& }! Y
七. 功能查询
. M$ ?2 K# G+ b4 J
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
" k6 L8 D9 }" l7 ~9 s
1 更新查询
/ s! ~+ ?: {2 y& B
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
5 r7 Z- I, r C1 C
更新查询语法:
' Q- x4 C& \) l, ?( W* ^3 x% _5 e [
Update 表名
6 S. l* W8 P; k! ~
SET 新值
; C3 i5 _- w5 R3 }6 N" L
Where 准则
' O; v3 p' r& L4 e7 x* L( _& C
例:英国客户的定货量增加5%,货运量增加3%
8 B3 o' ~+ {, p$ o6 j/ j, E) ~
Update OEDERS
3 V' j# X" k' k, q
SET orderAmount = orderAmount *1.1
8 \3 ?* ]) q, O% g
Freight = Freight*1.03
6 k- _2 i' J$ F/ u& W' d2 B3 w
Where ShipCountry = ‘UK’
' y" [7 U( l; T$ l/ i
2 删除查询
5 f( e2 J2 x( M. P2 u6 r9 D
Delete子句可以使用户删除大量的过时的或冗于的数据.
/ G, z" O/ b8 g+ C5 ?- K1 V. X
注:删除查询的对象是整个记录.
" B8 r" v6 _ P( H( a# L
Delete子句的语法:
. E- T: F2 x3 G
Delete [表名.*]
- N! Y5 b3 T9 T# |0 a
FROM 来源表
: B. J) A6 O4 N
Where 准则
* h$ w) b5 H" K3 G* Y
例: 要删除所有94年前的定单
: b/ V2 R8 z- M
Delete *
5 K) b: M" B; ?% G
FROM orders
8 l5 n- |! N- `# S# a u7 T
Where orderData<#94-1-1#
8 r* k/ T' c* f- ]/ [% o) d8 Z
3 追加查询
- I& b' }$ v1 D R2 u
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
/ V) J# h+ O$ E4 N4 h
INTO 子句指定接受新记录的表
3 k3 A6 y) O- t' q
valueS 关键字指定新记录所包含的数据值.
8 n# C( v! o$ f" g- ^
Insert 子句的语法:
4 z8 F& c; R* N, M' @" d% t
INSETR INTO 目的表或查询(字段1,字段2,…)
, e# o' s' U+ b; S Q. V& Y
valueS(数值1,数值2,…)
* u* h3 |% \1 C+ I% t/ t
例:增加一个客户
+ ?5 T3 W3 Y. F7 p+ P
Insert INTO Employees(FirstName,LastName,title)
) T4 E5 o) I* T2 i6 E
valueS(‘Harry’,’Washington’,’Trainee’)
5 D, `/ R" h6 @. M
4 生成表查询
7 f+ Q: }& Y+ I% ? r3 w
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
' f8 p, t* u! {% r+ F
Select INTO子句用来创建生成表查询语法:
, V! ]7 R k8 T$ x! R
Select 字段1,字段2,…
" n9 O* V/ e7 }- `, T. r
INTO 新表[IN 外部数据库]
# ?/ d' k" n! o) [. _* X5 F
FROM 来源数据库
j( ?( {8 S+ f9 h. w
Where 准则
0 F" H& X5 L; r4 ]" c3 M
例:为定单制作一个存档备份
- B0 {: t& L/ ~1 i$ s1 H! Y8 h+ J
Select *
( g1 }9 V' s E# l
INTO ordersArchive
7 e5 T4 D2 U' W8 V0 Q/ h$ P3 ^
FROM orders
1 {4 y- s9 \) R& E
八. 联合查询
6 i1 M( K4 }3 l; c& |
UNION运算可以把多个查询的结果合并到一个结果集里显示.
: V$ [# R2 ~% q9 n; P
UNION运算的一般语法:
2 n/ B( u1 w. t
[表]查询1 UNION [ALL]查询2 UNION …
* I: L( ~7 R( ^( v, |8 \7 W
例:返回巴西所有供给商和客户的名字和城市
( q' U5 w" ?- m
Select CompanyName,City
& _/ I# i. ^1 A4 }" k
FROM Suppliers
( f- R; ]2 ]$ [/ ^ W3 y: q2 h/ F
Where Country = ‘Brazil’
- ?6 w0 J; S) t
UNION
4 S/ H! m7 t5 a. E
Select CompanyName,City
7 z2 R1 u' t. i0 z/ C
FROM Customers
2 s) a" |( C+ `
Where Country = ‘Brazil’
3 L2 z" Q; C6 h, h. {% V3 [; G
注:
3 m; F3 w- D+ d; c8 `
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
. E9 h9 ^$ E$ V3 f+ k2 X# c
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
k8 ]6 J) @4 @- y
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
4 A1 Q, M9 c+ L1 g0 D
九. 交叉查询
. A5 g% A1 K6 T2 @
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
3 ~6 U9 Q4 b( E) Q! t {
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
" k6 O$ z9 m6 Q& l' @9 d: j: _* }3 `
TRANSFORM aggfunction
" k3 h0 D+ q, P+ v$ q9 ]
Select 语句
( j* \# L& x# i4 C# K. _
GROUP BY 子句
* n/ d! h7 R/ E! x! Y) W
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
7 e9 Y% v7 U: W" q/ f. Z
Aggfounction指SQL聚积函数,
5 Z: H( \1 O% _9 U+ f9 U
Select语句选择作为标题的的字段,
/ z, {7 O2 M3 u: t; }0 y: Z
GROUP BY 分组
) E) o# M5 z1 s1 L5 Q" G! f3 m
说明:
# @! M3 O* [) P$ y4 N1 c7 @; x
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
, p0 E% f8 e1 k* h& E7 {% y
value代表创建列标题的固定值.
& l: m! Z' q- [
例:显示在1996年里每一季度每一位员工所接的定单的数目:
, a0 A9 ]) x" V
TRANSFORM Count(OrderID)
' m( A& \; `2 u; X/ U! i
Select FirstName&’’&LastName AS FullName
1 _% t1 w; d6 d3 |' _1 S( f& E
FROM Employees INNER JOIN orders
& i$ X( x6 n8 @
ON Employees.EmployeeID = orders.EmployeeID
2 y2 U/ I# z; m3 ^6 Y3 C# n% n
Where DatePart(“yyyy”,OrderDate)= ‘1996’
/ j% Q5 B2 c8 ]2 [; V8 s, O
GROUP BY FirstName&’’&LastName
, w% k8 F3 i/ O' n, q
orDER BY FirstName&’’&LastName
' h* p' ~; n3 a$ ^1 g
POVOT DatePart(“q”,OrderDate)&’季度’
% p4 [% V/ O) v' l- k
十 .子查询
, J, L: Y1 w" b9 R& n+ {
子查询可以理解为 套查询.子查询是一个Select语句.
; N/ N7 g4 W6 a+ f. y. d6 I
1 表达式的值与子查询返回的单一值做比较
7 H& h' F. G& ?' j- q$ Z
语法:
- l; R, J! ^7 z( z& d
表达式 comparision [ANY|ALL|SOME](子查询)
: ^- O( p2 B; a
说明:
/ Z% G% z6 R* o& @! {) F0 W
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
- C7 g2 [! v4 T0 w; y0 t0 j W
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
$ F6 J$ h9 i E$ Y9 u
Select * FROM Products
0 Y9 C' b- z) r3 F2 p6 F2 E% f9 Y
Where UnitPrice>ANY
( H& c9 A+ \8 r- S' C
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
4 r+ ^! I2 F# d# Y; |
2 检查表达式的值是否匹配子查询返回的一组值的某个值
( J3 ^# s5 z6 m8 X; l7 h% L
语法:
( m# `3 A* g: Z% S) x
[NOT]IN(子查询)
3 [5 h; P* @* z7 [' `4 k2 ~
例:返回库存价值大于等于1000的产品.
. Z8 n5 D5 }' J0 V! z5 b7 o
Select ProductName FROM Products
+ k& d7 d% L2 T
Where ProductID IN
. D; W& e% q7 P: _# v
(Select PrdoctID FROM [Order DEtails]
% u1 P) q* V2 }* v& B" T
Where UnitPrice*Quantity>= 1000)
' w- R2 M3 j; U& Q4 v7 \, p& X% n
3检测子查询是否返回任何记录
8 R O2 l% z0 q7 @) k
语法:
3 W ~* ^8 q4 L
[NOT]EXISTS (子查询)
' [4 x8 h$ `8 P
例:用EXISTS检索英国的客户
0 v! B! R9 P$ u6 {* M
Select ComPanyName,ContactName
- V0 x1 o4 i( }' ?! Z, F
FROM orders
$ t/ F8 U* B5 b& f6 [/ b) G& q) a3 Q
Where EXISTS
8 n* ]" c, O* o/ Y
(Select *
0 E/ w( I6 J6 m
FROM Customers
0 u: T* ?/ T0 G6 h
Where Country = ‘UK’ AND
% Z9 ?5 M2 n' Z+ i) ]
Customers.CustomerID= orders.CustomerID)
欢迎光临 航空论坛_航空翻译_民航英语翻译_飞行翻译 (http://bbs.aero.cn/)
Powered by Discuz! X2