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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法
* v( W' {: M4 X- S' o4 F( i. n4 f9 c2 Z; h
select distinct 字段 from 表名) U1 Y' u7 y+ e- [" ]
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。& U( E! B0 q  ~0 g0 b- g- d
一.Select语句的完整语法为:
* p6 U9 j' Y) R5 z2 eSelect[ALL|DISTINCT|DISTINCTROW|TOP]
: r4 @5 O  g' g* s) k  _{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}1 X  C5 e$ g& Z* K& X- i
FROM tablee xpression[,…][IN externaldatabase]
& k* R5 {6 Q: y1 Y: H[Where…]
6 t; {* k$ H( h[GROUP BY…]+ P0 c$ r% @: i8 e9 q; A1 o  J& Z
[HAVING…]
- E0 c' N0 a: n) D[ORDER BY…]
% ^" K3 j5 n! Q* @% T[WITH OWNERACCESS OPTION]
% q  {+ k5 H% C6 c说明:, I2 X9 y; N, K) E/ R0 F% U8 e) N
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。3 I1 E( G* z8 b! |* `9 c+ x
1 FROM子句
5 b5 I  Q) S- `. t' \% fFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。& ~/ g+ e, n- Q$ L% U
例:下列SQL语句返回所有有定单的客户:# W/ a: d; p$ J" }$ J
Select orderID,Customer.customerID7 H7 i% G+ Y0 o' l* m
FROM orders Customers
3 e7 I0 G" e4 E- l4 b' x( \Where orders.CustomerID=Customers.CustomeersID
3 i( L# `! ^& M" p9 z3 W  M2 ALL、DISTINCT、DISTINCTROW、TOP谓词: o- p& c3 ?  z4 y6 V* O
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。* q9 E- J# b" @; U! F% K" q) \
例:Select ALL FirstName,LastName
- {! U! l* J5 ~& fFROM Employees
& ~. Y/ s0 U0 x" T6 c8 d" y(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
$ E) v  V) z$ i4 g' M. j' B(3) DISTINCTROW 如果有重复的记录,只返回一个' u  ^( b8 J5 I) @! X7 A( @7 m
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)# r& R  |' r2 z( W) d2 h
例:返回5%定货额最大的定单
  h1 V; I" q4 i% U, Z1 jSelect TOP 5 PERCENT*7 |2 t2 ^9 s& C# I1 m
FROM [ order Details]& w- ?; t* q& s" S; j; w! `
orDER BY UnitPrice*Quantity*(1-Discount) DESC
+ H/ D) ]6 d6 Z! Y; n0 u8 e3 用 AS 子句为字段取别名
: W$ C0 U0 t4 Y9 a: _如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
4 b0 S+ ], T+ T6 \0 V& s& w例:返回FirstName字段取别名为NickName$ |$ ^- a0 y. I
Select FirstName AS NickName ,LastName ,City
$ a# |# L  l; U, o2 E  vFROM Employees
# h7 o# i0 Z1 n( @+ D例:返回新的一列显示库存价值
. V, R' K. ^/ m! h% w, gSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
/ x% ]2 h& u) Y3 O% T$ l9 l9 W+ YFROM Products; @; b9 d' L5 A% ~; J, I
二 .Where 子句指定查询条件
8 e- v! m6 o$ Y) _' D- x) n$ V1 比较运算符
/ D0 A4 u- t  {' g( E比较运算符 含义
0 D% {. d6 C, E= 等于
! v5 b0 w0 \5 m4 B> 大于
% b: [# f& @& A$ r# y& I3 q7 S< 小于8 u  z$ X8 R. o- k( k
>= 大于等于
( N% q8 N: u+ E6 F5 V: G<= 小于等于' Q7 ^. n9 F- T. k; p6 D6 N
<> 不等于
7 s; ?3 F; c/ d- d8 I) K  C!> 不大于
- R- W( j% Z3 {9 C!< 不小于9 p3 S8 l, ^0 [; F: V) T1 O! m! ]
例:返回96年1月的定单
# B. G0 A  |5 {. }2 [2 fSelect orderID, CustomerID, orderDate0 v+ X4 ~6 F4 ~4 Q) p, N
FROM orders4 C/ L; M7 M+ h/ i
Where orderDate>#1/1/96# AND orderDate<#1/30/96#% ^8 }5 H- B5 @2 F/ I+ x
注意:0 R) U' i9 [& S! ^, R! V! g: y
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
. u1 u& M0 ]1 h- q& j# A例:" H, D- ~4 i3 e; k  \
Where orderDate>#96-1-1#9 T/ u9 B) U8 Y' L2 P
也可以表示为:
! W% s4 y% q  T  z' o$ `Where orderDate>Datevalue(‘1/1/96’)
* U- s' s5 S" O/ M  q  k1 [使用 NOT 表达式求反。
8 p+ m; }9 C- J# x# r+ N  O' z) F# T) L例:查看96年1月1日以后的定单
$ r% ?% W& P" n# k) nWhere Not orderDate<=#1/1/96#
# W& ]. `2 R+ C" W) F7 S2 范围(BETWEEN 和 NOT BETWEEN)
" ~, d+ w7 `0 \$ N% g1 y5 cBETWEEN …AND…运算符指定了要搜索的一个闭区间。" X2 z; H& h. c* W( P! N' H
例:返回96年1月到96年2月的定单。$ D' f' f  s- [; p- X- m
Where orderDate Between #1/1/96# And #2/1/96#
! _7 q/ n- T7 m2 }6 X3 列表(IN ,NOT IN)
1 J9 n! u/ f% X' B8 O) _6 g6 aIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。6 R+ }5 T0 K$ `2 t) B! ~
例:要找出住在 London、Paris或Berlin的所有客户
3 I/ y7 V( Z  k) O  YSelect CustomerID, CompanyName, ContactName, City
3 \" l' Q" b: ]FROM Customers- X5 ], i! M- P; |
Where City In(‘London’,’ Paris’,’ Berlin’)# N4 q' u: o& v, a! k# v- x
4 模式匹配(LIKE)
  m- |# u: m6 X! N8 L$ ~& U8 cLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
$ X. A: [7 y1 h2 ~" oLIKE运算符里使用的通配符
4 j, Y" n: ^. x9 B: D) h通配符 含义
0 E% O/ U" M! y$ x? 任何一个单一的字符9 j" Z! w8 V9 a5 Z, i
* 任意长度的字符* B0 h: Z3 M0 r3 b. C, I
# 0~9之间的单一数字
9 I& n0 }: B8 S3 T, n# N  N5 E% Y[字符列表] 在字符列表里的任一值+ H' E, q0 ^; ?. L' F
[!字符列表] 不在字符列表里的任一值1 n" X5 f6 D3 N7 n
- 指定字符范围,两边的值分别为其上下限
# b7 J' A& ]: V, {例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户, [& s; n0 r: {7 V! x
Select CustomerID ,CompanyName,City,Phone
6 d$ d# S7 s1 J5 h0 i3 q! M( u% zFROM Customers
9 Y2 e  b# Q; l$ H& \Where Phone Like ‘(171)555-####’) D9 c  q0 e" i* c) }0 p
LIKE运算符的一些样式及含义" w6 n- B, `7 Z  m3 f: B) B
样式 含义 不符合
. M8 ~3 J' P  {LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
2 H  @6 G8 [# a2 ^2 M9 N# LIKE’5’ 5*5 555& z+ g) b- V+ P# O
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
- \8 z6 w% ^" ~2 y/ ^LIKE’5##5’ 5235,5005 5kd5,5346
8 ]; e* W+ t$ F3 o. \: ~LIKE’
  v% R/ i& F/ V% S4 u[a-z]’ a-z间的任意一个字符 5,%
# Y9 v) l1 o% ]! |6 KLIKE’[!0-9]’ 非0-9间的任意一个字符 0,18 i! c3 e: n. N
LIKE’[[]’ 1,*! z6 q$ G" P) g+ E: I
三 .用ORDER BY子句排序结果
# Q% v$ w3 E; ~# k/ x! s2 \- XorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
3 x1 ]) g6 a: s+ X8 SorDER子句中定义了多个字段,则按照字段的先后顺序排序。0 K4 V' u2 G1 N" o5 Z. ^
例:  O/ I& u" \# ]0 z" u& y
Select ProductName,UnitPrice, UnitInStock# C1 ~! J! q# s3 M5 w. [
FROM Products
+ N% l' [* y: v" {4 Y# iorDER BY UnitInStock DESC , UnitPrice DESC, ProductName+ z. T* K/ y9 \
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。5 F$ c6 C' ?5 c' e$ C# u+ W: H
例:下面的语句产生与上列相同的效果。
- b9 ]- U- T* U* ?' l2 P8 kSelect ProductName,UnitPrice, UnitInStock
. U& n( r2 M$ z( t. B- j, XFROM Products# o3 `- r& o0 V. n2 Q. U( H/ E/ x
orDER BY 1 DESC , 2 DESC,3
, H  |8 @  R, y: H四 .运用连接关系实现多表查询
7 a$ d4 w5 \( `$ k1 s! n/ m: M例:找出同一个城市中供应商和客户的名字
# m( ]6 _/ `/ G  k  |' b' \Select Customers.CompanyName, Suppliers.ComPany.Name" s3 I. `) K+ u0 h
FROM Customers, Suppliers
3 ?' G( [, q# n8 b; A0 X/ \0 aWhere Customers.City=Suppliers.City
5 [, q# _0 W% h: \8 E# t, l: c例:找出产品库存量大于同一种产品的定单的数量的产品和定单% o9 W* r; s" \
Select ProductName,OrderID, UnitInStock, Quantity
; Z; e! ^$ L5 w2 f: aFROM Products, [Order Deails]
; `$ W# g8 y" bWhere Product.productID=[Order Details].ProductID- `8 o- V# s& w5 g+ n3 Z
AND UnitsInStock>Quantity
6 @1 @  i) ^  K* G  ?8 E# T另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
9 }+ R; Q# L: c语法:" z5 z" k; ^* j& }0 \
FROM table1 INNER JOIN table2! K0 \" Q5 `  q5 W9 I" j4 y
ON table1.field1 comparision table2.field2; K! ~) j2 C; w  C/ R$ E; u9 a9 x1 B6 T
其中comparision 就是前面Where子句用到的比较运算符。
; H8 p! @  n+ s2 y- Y( gSelect FirstName,lastName,OrderID,CustomerID,OrderDate
3 f' |& r( Y( E$ `4 mFROM Employees+ {% z& f; M2 _* ]& T3 o# L
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
& R8 _! D# \8 n( e: k注意:) f: m' V1 P, H+ M3 o
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
0 P% _/ ?7 J# c  }在一个JOIN语句中连接多个ON子句
" t/ }. r2 ~5 T' B6 H语法:/ m5 v1 k- s  ~- }5 ?( P* @
Select fields
) {8 T+ g* x' A: B" j$ _+ x5 FFROM table1 INNER JOIN table2
2 o) E: V$ V3 R1 O5 L$ O- F+ {& `, NON table1.field1 compopr table2.field1 AND$ Q4 X  W4 g! _# E6 X- I
ON table1.field2 compopr table2.field2 or* W: Z( N& Y: u$ `
ON table1.field3 compopr table2.field3
& _+ t. T" C( E1 A也可以- ?3 X  |: j" ?0 j$ G  @0 y( x3 K
Select fields0 |0 h% f7 [/ L  t% B$ \8 k$ U" ~/ B
FROM table1 INNER JOIN
6 W" T1 E5 u0 @% c# K) C' v8 L(table2 INNER JOIN [( ]table3  Q2 Q% C+ z# S, q; }5 X( f9 t8 |
[INNER JOER] [( ]tablex[INNER JOIN]
6 O+ a+ j1 N0 o% P6 xON table1.field1 compopr table2.field1
7 i, X; ?7 s0 q: J& pON table1.field2 compopr table2.field2
5 v! j! d# ?8 }  W; r, U, v3 W7 |ON table1.field3 compopr table2.field30 ?5 y( n  C" Q/ ?# p
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
* j% _' v; N+ b+ h# i/ t$ {FROM table [LEFT|RIGHT]JOIN table2
: i3 L& S8 c2 [. r) mON table1.field1comparision table.field2
1 Q$ I$ J- P4 @7 [  d" G用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
& F$ K. u/ v5 y) ]4 S例:不管有没有定货量,返回所有商品4 E' g" w6 \; ]# N8 r$ H+ a+ h6 k
Select ProductName ,OrderID
1 R2 @( s% K. {/ I2 YFROM Products( C9 {9 Q2 W2 d+ u
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID" c0 D3 ]6 [+ s5 ]. x4 q
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。% |. U8 @( W# j/ n7 S' }1 l
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
7 r5 z2 Q8 K  s3 p空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。# @- f& `1 l" \( d  O* Q
Select *7 S: M( D$ t% T( o
FROM talbe1
, u$ A& a6 {9 p% \5 \LEFT JOIN table2 ON table1.a=table2.c
1 r+ T! ]2 }0 e2 Z  a+ w) }1 连接查询中使用Iif函数实现以0值显示空值
1 B% q' c3 o2 h' U" ^& w  y2 e7 ^Iif表达式: Iif(IsNull(Amount,0,Amout)) Z1 k! h+ p; D( B5 W" f- j+ q' I
例:无论定货大于或小于¥50,都要返回一个标志。1 G, n. W* F% }; D
Iif([Amount]>50,?Big order?,?Small order?)% b( O' u) G& k4 M/ ~: c
五. 分组和总结查询结果
# m1 h" f1 j! T; @* q在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
7 W& q, y$ G# A! ~GROUP BY 子句的语法
# z: }8 f) z& YSelect fidldlist' o: Q3 y% J9 N" X
FROM table. H: n* b& U- A" D
Where criteria
* y& M4 N7 V9 m9 |+ V5 M; ?[GROUP BY groupfieldlist [HAVING groupcriteria]]& M' L3 [& \7 j  |: A' ~
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。' r3 I! {% z/ T, j2 V$ F# I) c
GROUP BY字段中的Null值以备分组但是不能被省略。1 [) l, L1 i  d6 _% V
在任何SQL合计函数中不计算Null值。, V% y' d( u7 g8 V9 x+ Z' C
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
# L8 w5 D6 ]9 f  w例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。# F: q" y5 V  i/ a6 X
Select Title ,Count(Title) as Total' p7 g, }9 ^5 R) A: \
FROM Employees
) P- C, H6 K. _6 T4 qWhere Region = ‘WA’6 B+ M; t1 h$ e1 i- L$ z
GROUP BY Title
0 L8 j: N" b! [0 _6 O0 @HAVING Count(Title)>1# N. c& z& O- M9 Q5 w# i4 j
JET SQL 中的聚积函数
( t% V# B5 }1 w) j聚集函数 意义
1 u7 h0 E: @1 n1 C  YSUM ( ) 求和+ Q" `3 b0 a/ ]
AVG ( ) 平均值
. J8 a9 r. I9 [2 z" Y- PCOUNT ( ) 表达式中记录的数目0 K8 L7 a# e& e) }# v
COUNT (* ) 计算记录的数目
! p4 f* A' U2 `+ K2 g4 ^: fMAX 最大值& A# K4 [5 Y+ Y2 B0 k
MIN 最小值
4 r1 C; \4 D  F% k; v) vVAR 方差
& k) }- {$ [5 f: U% W( L: xSTDEV 标准误差0 U& {) M. k6 F; p& a9 B
FIRST 第一个值4 c3 L# v: B9 U5 w5 N  h; g& V
LAST 最后一个值
! [0 C0 ^6 p! S! ~9 B$ h7 R六. 用Parameters声明创建参数查询# ]% s6 M9 m% e2 W" i
Parameters声明的语法:5 o* ?! n! |) p- r5 a
PARAMETERS name datatype[,name datatype[, …]]
* k' ~3 r# u7 e其中name 是参数的标志符,可以通过标志符引用参数.
8 a; Q) l2 y$ {4 x& h. W: K8 BDatatype说明参数的数据类型.9 `- b' F6 I$ \+ q8 |' a
使用时要把PARAMETERS 声明置于任何其他语句之前.
! E( S% N5 z5 S% ^& v, q* f" T例:& [7 k- t5 c& B0 b2 {
PARAMETERS[Low price] Currency,[Beginning date]datatime
4 ]: A% g" E( y+ qSelect orderID ,OrderAmount
2 ~, F1 |; z. Y! J' |" OFROM orders
5 P9 Z: J9 R( Z; O  h8 K  [Where orderAMount>[low price]
1 Q' a4 |. [4 yAND orderDate>=[Beginning date]
! r, q' c! J$ c2 F# k0 T七. 功能查询
, F* Q8 G3 ]. a  G7 e. X所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
& c7 J: u2 |5 |& Z$ s1 更新查询) U9 Q7 X. x; `
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
5 g, T0 @: m6 C8 z( {) q+ {" v更新查询语法:
6 Z8 J# g  P5 o! @- RUpdate 表名
: B& T" J- K8 J' n+ q" G5 lSET 新值% ^! k* l/ g' Q8 C" R3 S
Where 准则4 W3 N4 l) Y0 K' Z+ E$ G5 Q1 e
例:英国客户的定货量增加5%,货运量增加3%
9 |' L1 o/ [) T$ u- e+ {Update OEDERS! y% ^/ u! a# b* _6 O4 z( `
SET orderAmount = orderAmount *1.12 X1 M. S8 k# \& v& U) y2 \
Freight = Freight*1.03
2 W- Z. E; S' sWhere ShipCountry = ‘UK’) Y3 J  a! N; @
2 删除查询
# C2 X% h) N; Z( YDelete子句可以使用户删除大量的过时的或冗于的数据.
. n! _- |  i9 C1 n* n8 \$ m1 s注:删除查询的对象是整个记录.& j. Z/ E* r& X, V! M: T4 l% b( W
Delete子句的语法:
* q! V, m8 [5 T6 G$ L! `& zDelete [表名.*]* g0 ?' Z* p. ~% b( P
FROM 来源表2 z5 z" G* c/ l8 {/ k) s
Where 准则! _! P, z( K8 x! }
例: 要删除所有94年前的定单7 n5 R8 W% h6 d8 l# j
Delete *
- \6 Z, _5 j, v" F4 DFROM orders
5 t8 [& l, ?2 o# V) d+ n: u5 KWhere orderData<#94-1-1#
& @0 g, P1 @& w( h3 c" g1 k3 追加查询
/ _, f$ B- ]3 d5 ]Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
+ @7 S( j& H9 E* f4 B+ pINTO 子句指定接受新记录的表
+ Q( Y0 M' V$ {) qvalueS 关键字指定新记录所包含的数据值.
; E5 c; E6 o' @, I3 GInsert 子句的语法:- i; j% D9 u3 S0 S2 f
INSETR INTO 目的表或查询(字段1,字段2,…)
* u1 U- L2 l4 B/ @3 }7 z  H+ mvalueS(数值1,数值2,…)- \9 W9 S& `+ D- m" Y7 F8 e
例:增加一个客户8 N! r' a# L# c9 [8 l4 L
Insert INTO Employees(FirstName,LastName,title)+ k0 n- B1 T/ d- m# F8 E2 L5 m
valueS(‘Harry’,’Washington’,’Trainee’)
/ H* g  O! E+ X  h$ Z4 生成表查询! Y1 N; p& j1 b6 V9 {
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
2 P- d4 H( z! M( R7 Y, l0 WSelect INTO子句用来创建生成表查询语法:
. k8 q5 ?) b" L# L* v$ k% B* B" y# wSelect 字段1,字段2,…! B$ @. U7 C* U
INTO 新表[IN 外部数据库]: K+ q0 @5 J6 ~1 z
FROM 来源数据库
/ r7 S9 p8 h: [. ]Where 准则
7 G. e1 y' A8 Q$ P# ?例:为定单制作一个存档备份; O! ~- T0 O2 X5 W$ ]) c1 F. U
Select *+ m- l; C1 l# S, R
INTO ordersArchive
6 C& \: H& L1 G' h" i- F- N1 EFROM orders% F0 {6 v. @4 @1 @2 j7 j- ]
八. 联合查询6 x# R' [' C6 x& I( A8 s
UNION运算可以把多个查询的结果合并到一个结果集里显示.
/ n* e1 w6 @5 j8 V9 nUNION运算的一般语法:% M' J0 ~" B% G* _, ^
[表]查询1 UNION [ALL]查询2 UNION …  [6 L# C3 b8 i
例:返回巴西所有供给商和客户的名字和城市
0 {6 u" l7 ~" t% {$ nSelect CompanyName,City
2 }7 h" y5 m; oFROM Suppliers
0 Y: _' v2 K- S! aWhere Country = ‘Brazil’+ P( e$ a( ?5 r7 D$ Z6 F5 h
UNION* x* x$ a& B) g. ^7 e) c4 q
Select CompanyName,City
0 A5 {# X- v4 ~* |FROM Customers& G  V7 c9 V1 L* G
Where Country = ‘Brazil’
1 U. w, J/ I8 d0 G注:$ B7 @- v( f5 y6 u  `( V3 c
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项* ]" ]. k$ H0 L7 E7 J+ B
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
+ e0 x" ?2 \, S% n" Q9 E) B每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
% ?1 f1 P. m. h) }/ A九. 交叉查询9 P" B& p3 \. `1 W
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
3 f0 V; M* U! I( JMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
' P! g, U/ f9 F% G; v5 s: s/ gTRANSFORM aggfunction/ j' t1 _6 b# h+ Q' p% e  K
Select 语句+ P% T! |+ v/ p, w' S8 K
GROUP BY 子句! C2 D2 F; T5 l  p; p& Y5 p
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]! Q! T5 \- G2 q, w5 r; t
Aggfounction指SQL聚积函数,( c' @" l7 P! f; ~3 u
Select语句选择作为标题的的字段,
  R. s% i1 X  T7 eGROUP BY 分组$ B4 m5 F' y- |7 j; @7 K
说明:! |% j( N5 t% l3 h! g
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
' J0 G) ^0 ~+ k3 vvalue代表创建列标题的固定值.
* w7 M1 M2 o& v- r  _5 }' }例:显示在1996年里每一季度每一位员工所接的定单的数目:
3 q: c3 _$ C. r& v) Z# `9 ^TRANSFORM Count(OrderID)' f- H9 r$ `. a/ E3 @9 j
Select FirstName&’’&LastName AS FullName3 W7 m6 G6 w  ?$ ~
FROM Employees INNER JOIN orders
7 ]' |6 [( t- ?' L. s  hON Employees.EmployeeID = orders.EmployeeID9 ~5 m7 Y/ q- `9 T
Where DatePart(“yyyy”,OrderDate)= ‘1996’2 N: y* B7 L5 A! W3 ]
GROUP BY FirstName&’’&LastName
  S5 I6 g2 F5 _" g* XorDER BY FirstName&’’&LastName
/ H5 Q) p' N8 E7 `  BPOVOT DatePart(“q”,OrderDate)&’季度’; L+ C$ w( G7 ]' m7 ?4 U
十 .子查询  i0 I4 M. ?8 X( A
子查询可以理解为 套查询.子查询是一个Select语句.
$ e) o8 {' R. q; d1 X9 t1 表达式的值与子查询返回的单一值做比较
1 i  X- P: y, s+ I$ G0 K3 T语法:
! n& [( S4 k- ^, H) Q0 M+ g2 i表达式 comparision [ANY|ALL|SOME](子查询)
+ I4 {4 w8 U0 M& [! R6 e说明:
" Y8 E! f3 r3 [- ?8 G( k9 I2 DANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.8 [& p+ U6 p1 U4 B/ {+ D
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
) w2 `9 c4 _' r. ?Select * FROM Products
9 K* j0 Z1 h' HWhere UnitPrice>ANY% C, J' X7 m3 l" |4 r( |3 u
(Select UnitPrice FROM[Order Details] Where Discount>0.25)6 W$ N+ R2 f6 o( w& P; \" }
2 检查表达式的值是否匹配子查询返回的一组值的某个值
1 ~+ B% k3 T7 K' |2 B- N5 p0 k+ `$ j6 }语法:; L- L! v6 s+ t$ Q7 j
[NOT]IN(子查询)
  d7 b& c. B2 ?+ w7 [. h0 K例:返回库存价值大于等于1000的产品.  w2 p9 t# l" F7 M! P, w* L1 d; j
Select ProductName FROM Products
  P1 M0 L) X* w& U) U5 eWhere ProductID IN% U, s% f5 X! N0 _) d
(Select PrdoctID FROM [Order DEtails]
4 f$ @7 B. J( lWhere UnitPrice*Quantity>= 1000)
; l1 H5 U) o/ x0 }/ p7 E3检测子查询是否返回任何记录
: N* F& G4 `( v2 a1 k: f语法:- j. P8 d9 B, q. F
[NOT]EXISTS (子查询)( _  u* k4 t8 G1 u$ r
例:用EXISTS检索英国的客户
5 k8 P( w8 D' r. q" \. X! mSelect ComPanyName,ContactName/ O; a- d6 w, x- ]4 e4 O
FROM orders1 @9 U. M- ~2 _$ R$ t# u  S
Where EXISTS7 r7 @) {5 R$ ]( T; K
(Select *
  f* L* v6 _6 d0 @$ R2 q8 LFROM Customers
8 ~6 o. V, N! [8 e5 y  T8 nWhere Country = ‘UK’ AND9 S9 G6 ~& n; R" |7 R( X7 c8 X
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-1-15 19:52 , Processed in 0.027002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部