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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
  {: w+ S7 _5 }6 F
8 f: S) Z" P& e- h* X% P$ X1 lselect distinct 字段 from 表名; g6 Y4 W- A, @+ k' {
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
( C/ s7 t) Y# _( ?+ ?2 M一.Select语句的完整语法为:8 b% _1 S" k: U- V& s
Select[ALL|DISTINCT|DISTINCTROW|TOP]5 I3 G& Z+ ?8 }6 @2 [4 C/ W  t
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}/ B( I6 f* A4 T6 [  ~% t/ l8 Z
FROM tablee xpression[,…][IN externaldatabase]( b4 i/ q5 E0 T- Z% L3 b) j
[Where…]
# Z9 B4 w3 U% K3 W; r+ E4 n[GROUP BY…]
" _! V8 d+ B( b* ][HAVING…]& I6 [. ?2 Z. X$ u
[ORDER BY…]) d4 h* F1 f1 k- k2 V1 }4 S, b  T
[WITH OWNERACCESS OPTION]
; ~5 {4 t3 u% g4 X说明:
+ o. @& p7 t' @  F# L) ~8 G- d用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。/ @. u$ I. T/ S# ^
1 FROM子句
6 d" i- y5 W$ xFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。% t2 {. W. B2 u1 C" L
例:下列SQL语句返回所有有定单的客户:
7 F+ y3 D6 Q& k, g: Q, nSelect orderID,Customer.customerID
. Y/ N8 U8 E9 M6 t( VFROM orders Customers7 m, F: }4 Z# a0 x, L% @
Where orders.CustomerID=Customers.CustomeersID
9 L  f2 |8 m. G+ N" r2 ALL、DISTINCT、DISTINCTROW、TOP谓词
( {: b' ^- `6 I, m3 ](1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。3 L7 t  _5 d6 e) i2 n% Q$ t
例:Select ALL FirstName,LastName
% M- q, S5 d& p8 g5 X+ }, b% t7 `FROM Employees! K8 J: ]2 ]' W3 U& a7 L; ?
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。+ t" P  ?1 h1 i' ]6 z
(3) DISTINCTROW 如果有重复的记录,只返回一个, W% Z- L/ l* H$ O7 J
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)8 i" O4 j/ Q# c! n. E/ x# X: C
例:返回5%定货额最大的定单8 z" }  P, [7 a% s" |2 |
Select TOP 5 PERCENT*
9 w9 f9 H% G0 V# k+ qFROM [ order Details]
  P' F3 b1 a0 c1 n; sorDER BY UnitPrice*Quantity*(1-Discount) DESC
) m1 o5 d7 j$ S( ]  z. c3 用 AS 子句为字段取别名
3 A! O6 q0 B, z如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
& _. f2 y" ?/ R: v例:返回FirstName字段取别名为NickName) a3 ~- @9 R; F2 a9 D
Select FirstName AS NickName ,LastName ,City' \: b+ _) i8 y$ ]9 `
FROM Employees
+ Y1 B2 e, U7 w* J例:返回新的一列显示库存价值8 A; O- J4 P/ ?3 c4 |0 z% F; L
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock- `: d& t- u7 M  M2 \9 L
FROM Products
5 O8 \/ F0 D! P# q! t8 `" R% P4 v二 .Where 子句指定查询条件
% j2 {8 U7 n7 f( a1 比较运算符
( l& T" \6 x7 C+ {  ?7 z% s比较运算符 含义- |) K# A  c" n* I2 \+ d# e% M
= 等于$ W) p% V( ?8 [5 E. j
> 大于
, G: D5 ?# o- ^% H, ]< 小于
" d! r8 a8 L) l$ y& j2 ?; A>= 大于等于# D/ K9 ]$ }4 _, w
<= 小于等于+ U( Y1 V6 Z: K' e. C) H
<> 不等于; r3 C  U2 v4 \+ p$ x% X4 ~
!> 不大于
9 o9 q4 i/ W4 H! u  o!< 不小于" g( T: e* B* L& w
例:返回96年1月的定单! k+ o6 g  K& Z; W
Select orderID, CustomerID, orderDate% _6 ]% C, l! x6 ?2 F/ Y2 o
FROM orders% w: T$ f+ ~( M# o
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
: S# O: R/ n& s* l$ |注意:
3 N0 _( i1 x$ U; VMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。- Y& t  [3 d; d5 a
例:# p6 {8 U0 \% i9 ^) J* D# \
Where orderDate>#96-1-1#
% O3 b! {/ R: T$ i也可以表示为:9 j2 |8 K  r1 m+ l7 R
Where orderDate>Datevalue(‘1/1/96’)
; m( T% u% A4 B% N) n2 x. A使用 NOT 表达式求反。3 Y) t, ^9 u8 q4 b  u3 W4 G  j
例:查看96年1月1日以后的定单" d0 j/ {1 {$ @3 {) R& r& t
Where Not orderDate<=#1/1/96#9 N  \! h/ C) g, X
2 范围(BETWEEN 和 NOT BETWEEN)' H2 }1 W3 K7 j7 H
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
+ }; @$ |; z/ Z& R0 d$ b8 S- w( @例:返回96年1月到96年2月的定单。
5 Q% \* ~4 C% X1 F2 t  KWhere orderDate Between #1/1/96# And #2/1/96#! U( l% N' i* Z- |
3 列表(IN ,NOT IN)& e0 R/ C5 J( T2 D- |
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。1 E5 g$ F* c' R- w( t) S
例:要找出住在 London、Paris或Berlin的所有客户
& j4 Q; k% }( V, a1 v6 ISelect CustomerID, CompanyName, ContactName, City
, H6 N. e, r8 y* {FROM Customers
! Z" x+ z8 j0 X' Z6 IWhere City In(‘London’,’ Paris’,’ Berlin’)
  s0 I  }4 A% u- P! X1 M5 u0 n4 模式匹配(LIKE)
. \1 ?- _7 ~8 k, p  k# [0 lLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
: r1 B( l8 o, E3 Q; w4 ~2 n4 dLIKE运算符里使用的通配符
. a3 C4 b! g( ~( q通配符 含义
' c9 i* o3 b; g( _9 h+ \9 V? 任何一个单一的字符4 R# z- E0 v! c- y- y
* 任意长度的字符2 A: b+ Q! l- S, w
# 0~9之间的单一数字
2 t  F* c. N4 [5 @! d6 f6 e[字符列表] 在字符列表里的任一值
3 ?/ S3 F& _, F[!字符列表] 不在字符列表里的任一值
8 J8 u/ N; I  [- Y) N- 指定字符范围,两边的值分别为其上下限
( |# y0 N3 }6 {3 d/ @1 c例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
1 U4 ]% `0 C$ Q- _- Y! J: lSelect CustomerID ,CompanyName,City,Phone& ?/ f: \4 c; ?( ~. f
FROM Customers
$ L6 u. v2 O! ]# w9 [, y0 j( x  SWhere Phone Like ‘(171)555-####’
8 v1 Y. V- B7 u$ `9 }LIKE运算符的一些样式及含义
  V% W& A' v9 j1 u3 c样式 含义 不符合2 o3 q8 I. t  Z7 q* Q
LIKE ‘A*’ A后跟任意长度的字符 Bc,c2551 ~" u8 f& [- x( l4 Q8 ?! k
# LIKE’5’ 5*5 555
) Z& ?, o$ ^/ B+ G, v. o, B2 dLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5: n( C: U/ c+ G' `: E& d/ B3 d5 |) `* b
LIKE’5##5’ 5235,5005 5kd5,53461 Y2 [9 b5 C1 b2 z$ ?2 y* H* W# Q
LIKE’  p  G- f' I- _0 w! B" f' K4 G  |& H
[a-z]’ a-z间的任意一个字符 5,%% x# q& r2 K' o& ]6 F4 z  D" e
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1# D- s; @; _$ b! \
LIKE’[[]’ 1,*
/ a5 |$ g+ E( F7 x- `三 .用ORDER BY子句排序结果
, G* v9 e" T. V  w. v0 zorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。8 C9 r% l! h. |) t% \
orDER子句中定义了多个字段,则按照字段的先后顺序排序。8 D- u0 `5 B) a3 I. s# ^3 X( L$ u
例:5 \- J- W5 S$ u. {& n
Select ProductName,UnitPrice, UnitInStock" `7 s1 q5 q* B: Z* r
FROM Products
3 b" ]5 K  n' b) H' L) P. G" GorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
9 _- J# i. M4 V; ]4 w/ U+ GorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。3 {( h% i* F5 h6 [0 M6 s! r. k& z! `
例:下面的语句产生与上列相同的效果。; q+ d; [; y4 f& k( N
Select ProductName,UnitPrice, UnitInStock
# X3 q5 O( M/ vFROM Products
* T3 b% Z$ a1 V1 ]4 f) g" `: H! H8 qorDER BY 1 DESC , 2 DESC,3
5 Z, j* P/ q+ I1 K5 K四 .运用连接关系实现多表查询
. W+ u  c+ v% }9 q3 `- M例:找出同一个城市中供应商和客户的名字
3 x5 u( ~1 X  T  o/ }& n6 \% o* ?Select Customers.CompanyName, Suppliers.ComPany.Name5 m8 }# v- m' F: f" O) v- o' e
FROM Customers, Suppliers7 H7 E5 \4 t: b) s
Where Customers.City=Suppliers.City/ O8 ~  T, W$ r5 j8 U: K- r9 d
例:找出产品库存量大于同一种产品的定单的数量的产品和定单% x6 k  T4 d9 W& d( l+ ~
Select ProductName,OrderID, UnitInStock, Quantity
% W% a# c6 \& ~$ M6 _' z: B/ pFROM Products, [Order Deails]: Z1 Y' f7 W( c$ \0 e! h
Where Product.productID=[Order Details].ProductID
. w- l7 X# K+ Y, _0 o6 M1 i, nAND UnitsInStock>Quantity
' a. Q8 m/ H! p) J* y另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
' ^3 v5 K2 x. K. s语法:" I; G! x2 z! Z8 u( N. {* T9 ~7 w2 H
FROM table1 INNER JOIN table2
* ]. B; G: \' L0 E; lON table1.field1 comparision table2.field2# {% t6 D( _( s2 o
其中comparision 就是前面Where子句用到的比较运算符。' w4 e7 {: H% ~. G% E" ]$ w) N
Select FirstName,lastName,OrderID,CustomerID,OrderDate
' a( k1 Y/ p/ D* XFROM Employees
( D! ~/ x7 X% o- q( N$ {* G2 d/ mINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
5 q0 U/ c, J, K; j0 n2 X$ f9 n注意:
$ W% V) g& X; EINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。1 J/ m. ~( }7 z- x7 v  B8 T
在一个JOIN语句中连接多个ON子句4 w% [4 m* n3 j% G% H
语法:$ j- h( s' K9 n+ k. x
Select fields
7 V$ k' V( e9 O7 _FROM table1 INNER JOIN table2, S/ x4 `' M% t, j6 K" F
ON table1.field1 compopr table2.field1 AND4 |! i% |9 m5 g2 @) w3 o
ON table1.field2 compopr table2.field2 or
% q/ _9 f5 @" ^ON table1.field3 compopr table2.field34 _* P% H+ B1 [, e( `0 ?$ @; z
也可以! U  v' X; I* i7 ?0 B4 M
Select fields. c. J/ w# G4 S- i- v
FROM table1 INNER JOIN
* @* U+ J) Q: M1 y1 ](table2 INNER JOIN [( ]table36 g6 T2 @& a9 d* G  n; m' [5 c/ x
[INNER JOER] [( ]tablex[INNER JOIN]
; n" c$ w9 w* w' d: {# _ON table1.field1 compopr table2.field1
$ p$ v( C- w3 w+ y- R" rON table1.field2 compopr table2.field2
% l; Q- l1 ^1 F" j+ p# s) N1 oON table1.field3 compopr table2.field3: P& Q* k  t  r" X9 H2 d$ s
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。8 f/ {( T) ~4 R
FROM table [LEFT|RIGHT]JOIN table24 L, f9 g$ @* \, x* U
ON table1.field1comparision table.field2
$ h0 S/ i/ G* x% t) P用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
, Z: H: O7 _. P" n例:不管有没有定货量,返回所有商品1 b2 C& g4 W0 k, i# H! |$ T& |% s
Select ProductName ,OrderID4 [* O6 M. ?# i
FROM Products8 V1 M  I, B1 `, n' F( e) n
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID' R/ s4 m* l% `
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
7 j4 Q! f6 t& J1 J例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
' X9 Z' S/ U2 i. _0 L空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
7 P9 g, n% K3 ^5 l% K6 X" y4 aSelect *
# U$ [2 |# K  ^6 FFROM talbe1
4 P3 q3 M9 [- d1 j, zLEFT JOIN table2 ON table1.a=table2.c1 ~2 E8 ?- v; y
1 连接查询中使用Iif函数实现以0值显示空值5 C: u% b1 i1 B& f' T* _/ N
Iif表达式: Iif(IsNull(Amount,0,Amout)- w" T4 p, Z7 F) o. r' U- }
例:无论定货大于或小于¥50,都要返回一个标志。! D" i  B: N; K" J9 b* v
Iif([Amount]>50,?Big order?,?Small order?)) M5 P/ X0 @0 _9 Q* u$ t
五. 分组和总结查询结果( o( V& g9 u5 Q% Y9 F8 f- f" N5 W
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
  g, O9 L0 C; @( GGROUP BY 子句的语法& u* G) h' ~. |9 Z+ I" l
Select fidldlist5 x6 Z* j& t. F, V6 |1 U
FROM table7 R0 g  D$ L* Z- k5 a" w; z
Where criteria
2 h2 C5 U9 p+ n6 p5 Z[GROUP BY groupfieldlist [HAVING groupcriteria]]
( S; e, r  X& J注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
2 @/ s' w8 X! c8 I3 c' i; s" wGROUP BY字段中的Null值以备分组但是不能被省略。
0 Y; G9 s1 v* Z/ r& C! Y在任何SQL合计函数中不计算Null值。# }# V8 n% v9 j/ t9 o( q4 J
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
& D! k/ B$ S; E' E例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。, h+ [  j5 l' k- Q6 y* F; w
Select Title ,Count(Title) as Total
1 j! w! l) u1 V  H) s' nFROM Employees" D$ R8 Z$ m( R5 p+ `
Where Region = ‘WA’" Z$ X" c7 M, a, o4 P) x7 G, }
GROUP BY Title4 t5 z9 a' b# u& U8 y
HAVING Count(Title)>1$ b3 i. {0 w$ ~  M4 N% g1 A
JET SQL 中的聚积函数, x+ o, x. ^* m8 l1 l3 l$ v
聚集函数 意义5 h# |  o% q9 F$ z  k
SUM ( ) 求和) r. p0 U) a4 n# ^1 b! V
AVG ( ) 平均值
- Z+ b. y: O) d9 ^4 ACOUNT ( ) 表达式中记录的数目8 j: ^3 l" J" [
COUNT (* ) 计算记录的数目
" Q- V' l  @7 ^/ R; `! U6 ~MAX 最大值
. B- _$ l/ f! [# X1 A7 u- j8 s+ ?3 ~MIN 最小值# C; J% w9 o) f( e) K
VAR 方差
- T2 |3 r2 T3 S# {' }STDEV 标准误差
7 i9 E# l( P! k$ R% |- ~8 y& ^FIRST 第一个值
* Z9 K% E8 ?8 ^$ d( i, pLAST 最后一个值
1 H0 e; y+ k/ m6 X, R六. 用Parameters声明创建参数查询
/ S% P7 S& t2 p+ i, TParameters声明的语法:
2 P7 b) B/ ?. q3 m5 V9 {PARAMETERS name datatype[,name datatype[, …]]; V& w% g6 K2 h  r3 ]
其中name 是参数的标志符,可以通过标志符引用参数.5 u) a6 _+ i7 r1 V
Datatype说明参数的数据类型.
6 c$ J0 R' y* k使用时要把PARAMETERS 声明置于任何其他语句之前.. K( d+ {, C) Q; ~0 K6 m
例:( Y# E4 l7 |' j5 }0 K: F, m
PARAMETERS[Low price] Currency,[Beginning date]datatime
) d+ v+ P& P5 @: `  y* rSelect orderID ,OrderAmount
0 q. d9 N  j+ K& O' t4 mFROM orders
! K( c' B% ?  A, QWhere orderAMount>[low price]
: W# Z! G4 C5 |' {- F: BAND orderDate>=[Beginning date]8 S% C0 l1 B6 l( s7 w) U
七. 功能查询
$ w" b) ~# b: z4 \$ Y6 P; W5 {, G所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
5 |, v1 s0 M) B1 w. h) I+ b1 更新查询9 {/ Q0 ?& K4 |8 I
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.: P! Q$ Q- |/ W+ X! [* I
更新查询语法:9 r1 i) ~. K/ S( w
Update 表名6 l' O, H6 m; l% g- \3 c+ Y! b# v
SET 新值
1 W: ]3 ~- ]3 `/ U/ gWhere 准则0 n0 _) w1 i# `) t; h% ^% r- D
例:英国客户的定货量增加5%,货运量增加3%
/ [8 M7 b' i; y. |" O( M1 m$ WUpdate OEDERS1 x/ R1 F' _& s! d# _! i
SET orderAmount = orderAmount *1.1; @9 f0 Y5 n9 m6 }: K
Freight = Freight*1.03
9 s; [/ H3 x, J# H" X% G& h# PWhere ShipCountry = ‘UK’
) `7 ?/ ?% ~6 }+ j/ d2 删除查询8 C+ _3 K9 `5 q" O
Delete子句可以使用户删除大量的过时的或冗于的数据.
1 i% E) g. w8 i2 ^注:删除查询的对象是整个记录.
9 {3 a- X: {0 t7 b: v0 h; {Delete子句的语法:
2 @7 O5 P! M, ]1 y9 tDelete [表名.*]
% B) c. e8 S$ G4 F  R8 {2 iFROM 来源表
8 ~; N' N; O# GWhere 准则
' s3 \/ P, d+ @例: 要删除所有94年前的定单
2 }8 W2 \0 G7 l; }' o# fDelete *0 V, l( i# E4 C0 e
FROM orders- y5 K0 G. P* p8 @, Q0 g
Where orderData<#94-1-1#7 Z3 U* e! U! _8 f
3 追加查询' G! T: i6 X/ A4 A5 f
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
: `+ `+ G9 P: x* X) r5 [6 p+ ^INTO 子句指定接受新记录的表% S! X- U+ ?8 d0 L
valueS 关键字指定新记录所包含的数据值.9 j/ s; u9 N+ ?8 W3 T( w
Insert 子句的语法:
- Y) R( a4 `6 ^INSETR INTO 目的表或查询(字段1,字段2,…)7 k) W+ \6 M  X; A% J# {  Y9 i
valueS(数值1,数值2,…)
# |( |0 `1 c2 B0 M3 `4 @1 B2 Z" ~. k( R例:增加一个客户
5 j* H' |; `1 I+ m  |Insert INTO Employees(FirstName,LastName,title)
1 s  \6 \; K# @: `& GvalueS(‘Harry’,’Washington’,’Trainee’)  C" {, K' s' Z$ G
4 生成表查询) }9 G% {' L, r' A& \
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
) B! `: G9 I) U- C; tSelect INTO子句用来创建生成表查询语法:& p2 {- D( `% {7 O7 M& X2 q9 Y
Select 字段1,字段2,…
+ R0 }; q9 X7 V" e" F# K0 _" L" FINTO 新表[IN 外部数据库]
- c0 ]* _2 a3 F- LFROM 来源数据库6 |' X7 B4 t8 }7 a* l& V# r
Where 准则
3 p) _2 N' h& }( b; c例:为定单制作一个存档备份8 j, J' d1 U. k; u
Select *0 v( {1 k! m, l/ u- ]$ U: N
INTO ordersArchive. m& f, s9 e4 M' x% Z  E- j
FROM orders" a1 @- ^* ]5 q8 J5 B  M  O& T
八. 联合查询
' [9 }* E0 \4 C! i- b8 ]UNION运算可以把多个查询的结果合并到一个结果集里显示.
- ^! F" u1 W5 @* {& c6 G1 H$ \UNION运算的一般语法:
1 d5 B' E/ L1 G% U$ U( r3 I- N: ][表]查询1 UNION [ALL]查询2 UNION …2 [4 ?2 \/ I! Y  y2 ]# b& P
例:返回巴西所有供给商和客户的名字和城市
$ ?9 H; ?! T! t7 V7 ISelect CompanyName,City
) I: m8 s' m! T6 rFROM Suppliers
- W# `9 i& G5 u, B( C5 \7 iWhere Country = ‘Brazil’7 o; i* I$ _' [5 M0 Q; V/ }
UNION) A2 [" @6 S; E% H7 J+ e+ f
Select CompanyName,City3 B& ]( r2 c/ K
FROM Customers
* H& `5 D3 \8 v7 N* @, a# p+ VWhere Country = ‘Brazil’: l  y+ N; D( t! i; C' e
注:
( i/ X; O# ~# r; t缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
7 [7 V' E) W3 T& A: b, ]! KUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
$ A- G5 f$ J. I9 i5 m7 H4 [每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
% H" B+ Z+ X, j+ e' M# J% p: A九. 交叉查询
% x, o3 d* c% g# s交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.' ]" W6 T( r( B
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
  ?; y; p; X8 f% L+ BTRANSFORM aggfunction
. K  r$ G9 N( p4 b* [- N* qSelect 语句
2 b. I  V% g  g7 Q4 w/ p' x! {GROUP BY 子句
4 _% O+ e) r/ j0 `: l8 f' RPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
/ y4 @, K0 o1 v" T* Y' |+ }" h. GAggfounction指SQL聚积函数,
, i& \, _( Y+ o" L8 ESelect语句选择作为标题的的字段,7 [) y: s" ^0 b/ r. O, M
GROUP BY 分组, [6 x' k2 Z3 z
说明:
" ?8 a& b! b- U, p4 L6 gPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
1 r6 @, N- q/ d* M. R" ?value代表创建列标题的固定值.
6 {6 q5 c# p& v" N6 U( c: ?例:显示在1996年里每一季度每一位员工所接的定单的数目:8 @9 d5 @7 z& y! @* t
TRANSFORM Count(OrderID)
( S; v6 T4 T) `% ]Select FirstName&’’&LastName AS FullName
; j2 Y) v9 n' q. H3 KFROM Employees INNER JOIN orders
7 i; Z0 T9 Q: n$ n! b4 L- {' v; DON Employees.EmployeeID = orders.EmployeeID
% p( o8 `8 b5 c1 T& p5 s4 cWhere DatePart(“yyyy”,OrderDate)= ‘1996’
7 T( G+ J2 x7 jGROUP BY FirstName&’’&LastName) A+ g2 t) T8 N* K) J4 I- G- T
orDER BY FirstName&’’&LastName
) r+ J. o% [( r: IPOVOT DatePart(“q”,OrderDate)&’季度’
# k( L* V  E1 R" g十 .子查询9 p) r* j) U) `2 H6 h4 C) d
子查询可以理解为 套查询.子查询是一个Select语句.' D4 O& I' Y7 u/ I  X4 k
1 表达式的值与子查询返回的单一值做比较
! L2 k2 B5 `# m7 f. {! F语法:, H. \9 o. U$ `% G" i  c, p
表达式 comparision [ANY|ALL|SOME](子查询): ?2 a, {. f) N
说明:
( s& @2 f) l9 o1 T" OANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
, O( T- e( M0 ^/ p% ^例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品6 p' t1 e. p4 \7 `1 l# w5 b
Select * FROM Products/ a0 j. ?* K* `2 I0 M
Where UnitPrice>ANY% g- ]' V* w1 L" n$ \
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
% u. ?/ U6 a& T4 \9 Y0 Y$ t% c2 检查表达式的值是否匹配子查询返回的一组值的某个值% ?4 H4 s3 M, n
语法:; d" k9 o) m6 b9 y2 ~
[NOT]IN(子查询)
7 X, h5 d) A& @% f, ]例:返回库存价值大于等于1000的产品.
# h* N* D8 Q7 hSelect ProductName FROM Products  C3 J; g$ V. |1 }
Where ProductID IN
/ i/ X0 V- X" i2 _(Select PrdoctID FROM [Order DEtails]  F4 {; H% T" h( E$ T
Where UnitPrice*Quantity>= 1000)
5 t' J, }4 q2 s2 j) ^3检测子查询是否返回任何记录2 v- l6 d* F* n, K- x) V
语法:
9 Z& [( ]( h" P8 Q: U[NOT]EXISTS (子查询): D, n1 u( ~# S' l
例:用EXISTS检索英国的客户
5 l5 R, V( \& g9 u) K4 BSelect ComPanyName,ContactName
  J4 b+ W+ f2 r$ B' ZFROM orders
/ n% @% i( E" C  LWhere EXISTS
+ O# T# @; a* s& Q" w1 s  t(Select *
+ g. E3 B9 _" T0 p1 Q0 p5 rFROM Customers! ?$ G5 F' V- N
Where Country = ‘UK’ AND
& z: G- w6 g$ T' V) UCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-1-13 13:17 , Processed in 0.026002 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部