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