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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |正序浏览
Access如何筛选重复数据以及Select语句的完整语法
$ h) B* k" n5 Y4 ?: m) _4 k8 M: ~0 L1 g9 @! U3 v6 V' f. S8 |
select distinct 字段 from 表名( a/ Q8 W2 i1 T) R/ C$ w4 R+ |" ^
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
/ f" `7 q. o. U一.Select语句的完整语法为:
# B& y7 h  G2 C  _4 `: bSelect[ALL|DISTINCT|DISTINCTROW|TOP]. ~' [: p3 \% x% h5 H9 @2 U
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
$ {, G9 u3 _. {FROM tablee xpression[,…][IN externaldatabase]3 W/ {: X: i( U
[Where…]. o' w" i  B( K- ?9 ^+ i, I( j
[GROUP BY…]
2 w0 n1 w5 H2 g  U/ |4 e0 f, ^# v[HAVING…]
( E7 _# Z/ g! y# [6 S0 o[ORDER BY…]: k5 p: v  |2 h5 L% ^! _
[WITH OWNERACCESS OPTION]2 i) U; B# ]7 q) b6 b& H; t# ?
说明:
% a4 d# S2 d$ |# x. R4 O用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。. p* F& a6 v) Z2 e" ?/ [( q
1 FROM子句
! i7 c$ E5 F9 k! f* M% iFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
  Q3 D/ y% K/ C例:下列SQL语句返回所有有定单的客户:8 D, J9 `% }$ q& \4 R% o
Select orderID,Customer.customerID
/ `+ I- f  w: l( ?; \) c! qFROM orders Customers! W! w" I5 C' O! X1 _
Where orders.CustomerID=Customers.CustomeersID
1 V0 B, ^2 k7 e0 L* ]9 F8 H$ p2 ALL、DISTINCT、DISTINCTROW、TOP谓词
( M1 q% a1 F0 D$ k0 |(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
8 n6 X% ~0 r# J7 j; s例:Select ALL FirstName,LastName
) ?; `8 F7 p# b( u; QFROM Employees
# B2 o% `/ ~0 \1 |6 P(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。$ h% o5 Q7 O  D5 e* v
(3) DISTINCTROW 如果有重复的记录,只返回一个2 C; l0 Q4 x! N  L
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)) P* H0 }& m+ Y9 K
例:返回5%定货额最大的定单
6 u  \, S: G. p' W  ^" |Select TOP 5 PERCENT*
, Z" I! x# ]# K+ B: CFROM [ order Details]0 }) I- d# A8 J5 |
orDER BY UnitPrice*Quantity*(1-Discount) DESC% O' g- Y+ I! i/ \
3 用 AS 子句为字段取别名
* h1 ~7 u6 w' U+ F; C如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
- p8 C) D/ R2 Q% d* e  F! I% O例:返回FirstName字段取别名为NickName
% r9 K4 F- E/ N' FSelect FirstName AS NickName ,LastName ,City
  h0 Z- A' r% u$ h" \. QFROM Employees
7 B4 ]7 O: l2 U& e例:返回新的一列显示库存价值
) R. T1 E4 g0 _Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
- z+ Q3 f% q! y5 p) [% O5 mFROM Products) _0 P9 H& Y+ G2 ]) ~8 b8 p. q, w. ], u( ?
二 .Where 子句指定查询条件% y7 T7 }. B5 o+ F8 ^/ G; ?/ @7 E
1 比较运算符
0 o. |$ j0 s) c7 U# Z比较运算符 含义
4 V' K* r5 T, g% P8 _: ]- j" [  D= 等于1 T, F+ @- l0 W- @, X* G
> 大于8 O+ d5 I6 Z) u# Q% ?( L& V
< 小于
& V& i: A& k7 t1 L' D4 Z9 O% q>= 大于等于. J: ^* V, i/ L( y) b( t; I0 Z0 z
<= 小于等于
4 B5 n& \+ i+ Z# Z: ]: t6 f9 @1 S<> 不等于4 T  O9 O  Y+ E
!> 不大于
; k. E; F+ @" r!< 不小于2 w% D( r' h4 D# [+ y# |
例:返回96年1月的定单9 P% T/ E5 x3 w" ^) C
Select orderID, CustomerID, orderDate! W) [4 }: p& C; v" S/ j7 I
FROM orders
  e5 p0 y0 Q- C3 e& I  ]; K6 b. TWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
" G8 z4 K/ y, [' u, Y" P% ?5 f注意:8 x6 O- b5 S9 N2 @5 o+ N# Y, B
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
3 c1 G! @' `' D' k例:* n$ M. W3 C7 x& L1 S& g8 |
Where orderDate>#96-1-1#
0 z2 U) q- Q6 k. V( R也可以表示为:
3 z% |, C6 U$ s/ uWhere orderDate>Datevalue(‘1/1/96’)- o* c( x' b+ `
使用 NOT 表达式求反。
: T1 s9 s# W% T/ j" o例:查看96年1月1日以后的定单
  n" W, w8 L$ G1 aWhere Not orderDate<=#1/1/96#+ Z  [. N* y/ V% s" R" j2 m& @1 @7 o
2 范围(BETWEEN 和 NOT BETWEEN)- `& I% A( ]4 H  K. Q+ s
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
9 Y& R; r3 n7 _例:返回96年1月到96年2月的定单。
' g0 Y7 r2 R; C  @* jWhere orderDate Between #1/1/96# And #2/1/96#8 l" h4 g( {0 R
3 列表(IN ,NOT IN)" L! C$ ?$ H: p6 ]4 x8 S- b
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。( k* g' I% b. x) y+ n+ Q. M
例:要找出住在 London、Paris或Berlin的所有客户0 A" f0 {8 O9 ~5 j7 N# w
Select CustomerID, CompanyName, ContactName, City
: [% ?7 [) u" O6 v  @3 yFROM Customers
+ e- v7 n, |9 ]% b2 F( d: OWhere City In(‘London’,’ Paris’,’ Berlin’)+ Z' D+ m  x3 l. O2 `
4 模式匹配(LIKE)8 L# |4 a. J- o9 b( h, ^
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
; z& G! ~+ l1 f, cLIKE运算符里使用的通配符
- {4 m/ Y- K' G$ `通配符 含义7 `. V: r% v% a! \- l9 n
? 任何一个单一的字符
% Q. b0 E% G$ D9 Q* 任意长度的字符( ^0 a0 _2 `" u* q
# 0~9之间的单一数字# G2 h+ V" S2 @2 ^
[字符列表] 在字符列表里的任一值
9 I/ L1 z6 U/ d6 u4 O9 q6 i$ p8 {[!字符列表] 不在字符列表里的任一值& ^: `$ H" Y4 x5 w( G
- 指定字符范围,两边的值分别为其上下限# a' w3 C  o' E5 [7 r2 O
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户, N0 r4 d: F4 F+ {  `! Z; U
Select CustomerID ,CompanyName,City,Phone& Z, D# u5 @& X- R4 U9 X
FROM Customers
8 }8 j: |& `4 M3 N0 jWhere Phone Like ‘(171)555-####’
% P% X. l  B3 x5 yLIKE运算符的一些样式及含义
& w; i5 W8 j0 P样式 含义 不符合8 g, Z, E/ B) [4 B; k; v# [
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255( i+ M. T$ H5 G# F
# LIKE’5’ 5*5 555) N- N+ N7 \* H; ^8 ]! x7 I& v
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5& a& I! `( n, Q3 I, Q; j* q
LIKE’5##5’ 5235,5005 5kd5,53469 B' y; C" j9 ]
LIKE’4 l8 p% c; V8 c. p  v. ?# t& J
[a-z]’ a-z间的任意一个字符 5,%
4 \2 s( @1 j0 y! zLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
* t0 w6 |& e- r8 F. G. m+ I5 iLIKE’[[]’ 1,*
, k- n5 N( G7 c/ }三 .用ORDER BY子句排序结果; ]# `9 V7 a9 r. W
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。: ^3 Y8 ^, Z0 ]4 @/ R5 C$ X
orDER子句中定义了多个字段,则按照字段的先后顺序排序。$ e# n& \& [, C4 h1 B) N, v
例:
0 W0 {" D& w+ c- gSelect ProductName,UnitPrice, UnitInStock
6 }, n4 E4 N) [% s% X4 BFROM Products
( {0 y+ G; E' {/ M# BorDER BY UnitInStock DESC , UnitPrice DESC, ProductName! A/ f0 i1 y* k7 E8 q2 b
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
& y' A; H% Y  X例:下面的语句产生与上列相同的效果。
6 h  e: T7 v- V& K) fSelect ProductName,UnitPrice, UnitInStock1 i! x( Q5 E+ ], d& N
FROM Products
% D) t- A& k2 P& S6 Q5 P7 SorDER BY 1 DESC , 2 DESC,34 @$ v! _, q% b5 n& {& U
四 .运用连接关系实现多表查询& F0 [; L6 ~+ D, ~
例:找出同一个城市中供应商和客户的名字
9 w: h# y2 [8 a: {4 ]7 a0 {! S9 {Select Customers.CompanyName, Suppliers.ComPany.Name1 q4 ]7 v$ \6 b0 d% A9 I
FROM Customers, Suppliers5 r* \; Z* I: B( L# N
Where Customers.City=Suppliers.City
; m  y, E7 U- l5 ]/ s" T* w例:找出产品库存量大于同一种产品的定单的数量的产品和定单. S( C5 Q/ {( z1 `7 [# r) Q" n
Select ProductName,OrderID, UnitInStock, Quantity
- V9 v9 r# ?  C. v$ XFROM Products, [Order Deails]
/ c$ C8 c; r# l6 L7 S$ RWhere Product.productID=[Order Details].ProductID& [( U$ j, B! k' t( d
AND UnitsInStock>Quantity
7 t" [* U6 P  s, Q3 u0 ~2 a另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
: `. \6 L- B( w语法:+ b7 P8 X' W: c( q  k1 @# t
FROM table1 INNER JOIN table2
/ l! `) R& l: A- Z, L. }! JON table1.field1 comparision table2.field2
6 v3 ?, K1 ?3 g) v" e/ H1 N* J其中comparision 就是前面Where子句用到的比较运算符。
" {  q# S* T/ d% |Select FirstName,lastName,OrderID,CustomerID,OrderDate' ^6 [2 ]2 V+ b4 k$ V8 M! _
FROM Employees# t+ N, w- Y: U/ `2 r/ L9 g" p: ~% `
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
& H- ?8 P4 u$ L5 l5 K) g注意:7 _& I4 m2 _0 m2 F1 k, V! y* `' b
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
. L7 H% M* z. q3 k4 o+ \$ L在一个JOIN语句中连接多个ON子句! D/ ~, g# n" s; i" J: f1 ?
语法:
9 c$ k  t0 n0 C" h/ [  xSelect fields
) O" ^+ X' z0 c6 w: xFROM table1 INNER JOIN table2) P# e2 t. q- U. Z" i& M
ON table1.field1 compopr table2.field1 AND
) z% F8 L/ U4 L0 i, l6 wON table1.field2 compopr table2.field2 or; x* l! x) X7 A3 }3 \  J
ON table1.field3 compopr table2.field32 }3 P4 b# m' X' q
也可以" t9 K. ~! B, V
Select fields: M, V! f: T6 h# m; p/ [
FROM table1 INNER JOIN
# h3 i* D4 Y) s6 a4 A9 R2 l(table2 INNER JOIN [( ]table36 W/ r+ J; T  _. `8 Q' W9 E. W
[INNER JOER] [( ]tablex[INNER JOIN]  A* t* Q3 K$ W' M+ t# j2 ]. n
ON table1.field1 compopr table2.field1
. B: @1 {% L" e( V) i, i; `+ }ON table1.field2 compopr table2.field2% b! A8 a* U- h$ }& j
ON table1.field3 compopr table2.field3
$ h# e8 v% Z4 }& ?) K; _; D外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
2 Z) d8 `' i  y' ?5 \" FFROM table [LEFT|RIGHT]JOIN table2$ f& B- ~) L: r/ C# N
ON table1.field1comparision table.field2
5 K  F: s9 D- x) I  ]% s用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
& R; m- P4 U4 B3 n# O( |! h例:不管有没有定货量,返回所有商品7 w1 f* \$ ^! F8 V
Select ProductName ,OrderID
  ]" P# i5 A( Y# d. AFROM Products4 C' Y5 M: E( N
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
! p: B9 u" A1 Q' z% U2 v3 b右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。. B' M% ?" b9 a4 S- c3 e
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。1 I. `, T; A/ Z! f5 u: ]: G. _
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
9 m8 @9 A- `2 U  B: R& q; \3 X0 CSelect *) [8 N8 ?+ A# x1 M6 e. b
FROM talbe1& O6 J5 q6 g: F2 i) w
LEFT JOIN table2 ON table1.a=table2.c0 T( @' ?7 ]" q+ E' G7 m* a
1 连接查询中使用Iif函数实现以0值显示空值, t& c. q. p* x% S. {5 m/ ]
Iif表达式: Iif(IsNull(Amount,0,Amout)
, s7 D5 d9 I& G: l: G例:无论定货大于或小于¥50,都要返回一个标志。
* M$ Y* l/ w6 R. F' i6 ~Iif([Amount]>50,?Big order?,?Small order?); l) H/ z& _. }1 f2 S! u/ U
五. 分组和总结查询结果/ t1 J1 i( X2 Z( z
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。) _) `" h; S0 k
GROUP BY 子句的语法/ T! t3 ]2 `+ k/ E: {; |" ]: a5 _
Select fidldlist
! R# i, o0 I6 c3 |4 G$ o4 jFROM table9 G0 ]! S- e; y0 ^6 o; C3 a" H
Where criteria% H' u  S! \# W( j; d2 O
[GROUP BY groupfieldlist [HAVING groupcriteria]]2 j8 @5 @# c! P) z: y7 [
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
$ \8 _. B  ^# C4 s6 E. ]7 sGROUP BY字段中的Null值以备分组但是不能被省略。6 W7 t$ L/ u0 N) m" r1 X
在任何SQL合计函数中不计算Null值。
% t  J, c, U3 x9 J* a! pGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
) A: ?1 ^, V4 d: o) {6 F例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。* ~& A' r+ U  k: j
Select Title ,Count(Title) as Total1 v! S" h& D9 R; Z: J
FROM Employees1 U, q- L8 l' J8 f% J- m
Where Region = ‘WA’& y# u& [  R! u; X1 e
GROUP BY Title5 f- A. c- I# Y5 V% G
HAVING Count(Title)>1
8 l8 b1 x4 ]( e* [0 PJET SQL 中的聚积函数1 H6 D# q/ ]3 v' n6 s
聚集函数 意义
1 [+ e, Y1 \) n+ r( pSUM ( ) 求和
, g1 _! B! L& W, qAVG ( ) 平均值- q; x, E; M6 e6 a8 h& v
COUNT ( ) 表达式中记录的数目0 L* l1 A% G8 k* T2 E- _+ I" w
COUNT (* ) 计算记录的数目5 [; [; {) e. p" R( X# E4 _
MAX 最大值6 t$ g( r; g) F3 ^# f# I
MIN 最小值2 i: @8 ~% K6 h% Z$ l' Z+ H& D* m
VAR 方差
; j) S6 l" Q" o, LSTDEV 标准误差
4 n8 u! f1 W) UFIRST 第一个值
* l/ e1 P( M; W  mLAST 最后一个值; ~; z4 T' W* x
六. 用Parameters声明创建参数查询
; Y3 f6 w, v& x  m) gParameters声明的语法:
. ?$ L" g/ ^: B$ ^  U& b" {5 ?  PPARAMETERS name datatype[,name datatype[, …]]
4 {$ \2 F  g( J! M9 n其中name 是参数的标志符,可以通过标志符引用参数.* G% ?7 A3 M  q1 ~( x. Z/ v
Datatype说明参数的数据类型.  u: l; f9 Q7 K; m1 |
使用时要把PARAMETERS 声明置于任何其他语句之前.
* w+ v4 c+ v" Y# o( P3 }$ M; T' }7 B例:
3 f, \0 E8 s$ {+ ~2 JPARAMETERS[Low price] Currency,[Beginning date]datatime
- G9 A+ T- u3 s$ RSelect orderID ,OrderAmount6 Z8 ^6 C& P' A; ~7 d0 I+ B3 H
FROM orders; }2 M# |$ ?- `" S' J
Where orderAMount>[low price]+ }% R# q  X$ S: G- L( B
AND orderDate>=[Beginning date]. u! D' T, b' }7 r' X! t
七. 功能查询
+ U2 q4 d' f; v% |8 w; l所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询." V. }% A0 ~8 P  ^7 B' c
1 更新查询( h/ X1 D# f8 {; y+ g% }
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
+ f0 S+ I9 e; {# I3 {4 I更新查询语法:
- T: q& _+ f- H' p) z. a; ZUpdate 表名# C& H  _' r7 H# @- q: X* X! E* b
SET 新值5 K& X: |2 H3 s9 F; \, D) k  ^
Where 准则% N2 h0 R' N/ A' R1 c5 f8 `" E
例:英国客户的定货量增加5%,货运量增加3%
! ?7 n6 N8 L8 g8 J5 R' OUpdate OEDERS
' h$ g$ ^: @% gSET orderAmount = orderAmount *1.1
' Y' \' w- C3 f1 X8 H1 kFreight = Freight*1.03
+ B3 ~, N, N/ x, |" _0 V5 [Where ShipCountry = ‘UK’
4 j1 B3 E( D$ n0 F2 删除查询4 Y- a2 c2 n6 H" @9 J
Delete子句可以使用户删除大量的过时的或冗于的数据.2 H/ x! \- A2 x1 `8 c# q8 r9 \
注:删除查询的对象是整个记录.
- t3 X# F" p) [/ M5 R% c1 qDelete子句的语法:
5 F$ Q& o& Y2 D1 q/ TDelete [表名.*]
; c! y0 o! N. t0 @9 i$ AFROM 来源表
  t+ n9 N" {) C. r, _/ C" yWhere 准则8 v$ l5 S+ |+ _( K! o% l
例: 要删除所有94年前的定单/ O2 x$ x0 I, V- ^) }
Delete *
. h( Y4 n( V' `$ m4 e8 bFROM orders
0 R' y2 U. j1 ~2 d- i7 O7 WWhere orderData<#94-1-1#
5 {7 |+ v/ {! A! ?4 b3 追加查询3 G, l9 E! F# X* a' ?
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
2 C+ k5 @( l0 R3 C3 u; C* uINTO 子句指定接受新记录的表# w9 I: x7 {7 Q8 J! N5 G
valueS 关键字指定新记录所包含的数据值.
" e8 k! b( u& m6 P! iInsert 子句的语法:
* ~8 N% z& {% d2 H- w; ^5 T' cINSETR INTO 目的表或查询(字段1,字段2,…)7 N0 s. E  `9 {/ M5 v
valueS(数值1,数值2,…)
- }4 |: Q5 ~; D3 d; i0 t" P  c6 L; n! [) ?例:增加一个客户# I  `' ^! z4 p6 D
Insert INTO Employees(FirstName,LastName,title)
8 ?& v* k$ h! l* `8 P1 |. K( l6 yvalueS(‘Harry’,’Washington’,’Trainee’)+ K, h+ U( h+ a# ^
4 生成表查询8 h$ _' A, P" M: B6 s
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.! C) U9 x3 S6 m) J+ R! T8 Y
Select INTO子句用来创建生成表查询语法:
4 K, S# E: J. e" k( F" uSelect 字段1,字段2,…
! ]& u9 ]. ]5 z( }6 K0 K; ZINTO 新表[IN 外部数据库]8 C' {* {0 t  S) z& x* ?
FROM 来源数据库2 ~6 l6 P2 P# ]8 w' O
Where 准则
; P; x! {% Y& C0 t7 }, M例:为定单制作一个存档备份
% E2 A& R7 b$ K3 d5 zSelect *
: u- }$ G: x1 ?5 z8 BINTO ordersArchive: C4 \0 ^! d% {& P$ o3 z
FROM orders
# ^! V6 v$ A6 Y8 l) X0 K八. 联合查询9 g8 Q' H7 i/ }- y  G+ [
UNION运算可以把多个查询的结果合并到一个结果集里显示.% \- X) k" ]$ }* U' y
UNION运算的一般语法:
* c/ L0 f: D( @3 x[表]查询1 UNION [ALL]查询2 UNION …1 B# f+ @0 `2 n7 D( a9 d# I" W
例:返回巴西所有供给商和客户的名字和城市
2 i7 K; k+ _) BSelect CompanyName,City
0 s( J  u/ N5 R. R+ ?; N7 mFROM Suppliers2 [2 j" {4 P( b7 C, z
Where Country = ‘Brazil’" Q% k. o. x6 Y, _2 `: l
UNION
- v$ M. [9 J$ s& V/ S0 m# y3 U0 DSelect CompanyName,City1 V3 A# x) `: e" u2 L
FROM Customers& w3 g& R/ w% F" u1 ^
Where Country = ‘Brazil’
% v, s1 Y" j9 U& N9 `$ p注:
. d2 l- P: p  X3 ?缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
; [2 C- @3 s+ a2 X/ [+ ^7 kUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
6 J* B1 h; h$ w- I4 P3 e; e1 S每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.' ?' ?& ]4 g: n  g
九. 交叉查询! k- V; u6 I: E' @. N, X& Y' o
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.' X6 W5 t9 i4 X$ T) ^) T
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:- E" J. ~8 ]4 i' A2 p$ X
TRANSFORM aggfunction
( n9 K* F1 Q4 v, S$ o9 b4 x; x1 sSelect 语句* p8 J9 p' o) {1 D. M
GROUP BY 子句8 |3 j5 a+ Q- |% K7 ^  P  F
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]% H( E, J& i$ o" _2 e
Aggfounction指SQL聚积函数,; S4 P/ Q  M( i2 y
Select语句选择作为标题的的字段,) t, U0 [& D* M, ?6 l0 j+ C
GROUP BY 分组# j8 [9 |' H1 z) |
说明:
2 D2 m7 H2 e+ Z3 |# z- y' |5 J% WPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.8 _, t$ Q' k' U% t1 `* n
value代表创建列标题的固定值.
* @( x5 }( m& c/ ~1 _# u例:显示在1996年里每一季度每一位员工所接的定单的数目:! u# [+ k$ c* A+ {
TRANSFORM Count(OrderID)/ e* L4 O3 l. J+ Y/ t8 b3 j
Select FirstName&’’&LastName AS FullName" @7 M8 h+ E$ Y# h1 N2 a+ ^2 V
FROM Employees INNER JOIN orders+ x3 z5 D. v: `; z5 I$ H. F1 k+ V
ON Employees.EmployeeID = orders.EmployeeID
4 s/ {7 ^+ z( i! ^) }: a3 [Where DatePart(“yyyy”,OrderDate)= ‘1996’
' P0 I/ p2 L, p1 fGROUP BY FirstName&’’&LastName
5 |, G7 N5 q2 q( i" P* x! ^orDER BY FirstName&’’&LastName
8 ^& I4 z! J1 F! _2 s" _POVOT DatePart(“q”,OrderDate)&’季度’
! I$ W# }: F  g9 {十 .子查询/ Y% V. ~2 Y% I. }
子查询可以理解为 套查询.子查询是一个Select语句.$ m! ^9 {" _- k& X8 l. G
1 表达式的值与子查询返回的单一值做比较
4 y% U( g3 ?2 ^. Z) c语法:. J1 r' F5 s% i7 _
表达式 comparision [ANY|ALL|SOME](子查询)
/ a' n) t0 V6 \5 ^8 ~1 L说明:
* w5 D/ D2 S% d/ ^. j* C9 oANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
9 s2 v( F3 w. A* }0 f例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
% {) y$ F1 _0 B' CSelect * FROM Products
) N) [6 o  [) [9 @Where UnitPrice>ANY3 l: ?: ?( R0 U& u; ]' e" ~
(Select UnitPrice FROM[Order Details] Where Discount>0.25), ^% R. I2 u+ z2 s- X- B3 C
2 检查表达式的值是否匹配子查询返回的一组值的某个值
0 m" f0 ]! h) l语法:1 u& D4 x  J6 p( E& b1 i
[NOT]IN(子查询)7 k' _* \5 h0 L3 x# D0 h
例:返回库存价值大于等于1000的产品.. I; g8 k, w3 x, n$ q* G* W
Select ProductName FROM Products/ h- B& M( C; y; m& V2 B2 L
Where ProductID IN! t$ @  B% {5 \7 s5 @* |
(Select PrdoctID FROM [Order DEtails]7 ~% Y, Z* Z5 B
Where UnitPrice*Quantity>= 1000)8 I! l% i* x. W' T
3检测子查询是否返回任何记录" q1 F0 b& [9 n% ?
语法:; x( S1 j$ o# T! n4 j5 Z
[NOT]EXISTS (子查询)* L8 j6 v+ P3 q6 r
例:用EXISTS检索英国的客户
& w3 r7 b$ t" j% M% N0 S3 d0 XSelect ComPanyName,ContactName
. f- N" k$ z" i% \/ aFROM orders+ y$ z9 i& k  T& @- B' \) d! q
Where EXISTS
1 j/ `& ~$ M/ B, O(Select *
3 X0 t' g9 h/ IFROM Customers
+ n0 y# N6 K& VWhere Country = ‘UK’ AND. e" c0 Y. z1 F0 ?* I3 q$ d7 u8 o* a* {
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2024-5-21 01:11 , Processed in 0.015600 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部