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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法- ]# \& @8 w- j: P: [3 x! `" Z

3 `0 }/ B. [: A4 ~6 ^9 gselect distinct 字段 from 表名7 u6 c  H2 ]8 U: n
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
& e3 f; j' A  n1 v0 `一.Select语句的完整语法为:1 }  j! Q2 F! _9 e8 W
Select[ALL|DISTINCT|DISTINCTROW|TOP]
8 k9 \$ t# X9 j: h& e- `, i{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
. e! N! u8 A, c0 a- _FROM tablee xpression[,…][IN externaldatabase]8 I3 u8 Q2 |4 K5 A8 u' `# D
[Where…]4 D/ X+ M& g" {: I- @
[GROUP BY…]8 V+ O- C- u, f8 L6 i) L. k
[HAVING…]
- `+ t% J, U* d. `" v[ORDER BY…]+ K8 \4 t, K8 M4 n/ x4 L) N
[WITH OWNERACCESS OPTION]5 Z8 O: E9 R5 {
说明:
* m, m1 X: B9 S* [, ^, t4 _5 Q& `用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
) e9 J; A5 z5 U+ x4 W) n4 B0 m/ y& s1 FROM子句
) J& t1 B7 t% p( P$ X* eFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。6 d6 ^3 ~' Q$ A4 k9 Z8 I( \
例:下列SQL语句返回所有有定单的客户:
% l4 `; Q% s: y! W0 k" b/ {, KSelect orderID,Customer.customerID
+ p. s0 W& T8 E% b5 bFROM orders Customers: @- b1 S6 j/ g8 ~( x
Where orders.CustomerID=Customers.CustomeersID! f& M9 Z, r, ]9 t7 j, }* ?
2 ALL、DISTINCT、DISTINCTROW、TOP谓词2 U: F5 \- W& m- C
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。- G% }  |( O) E. r9 [- F, b+ U
例:Select ALL FirstName,LastName
) k& _: `2 N" }FROM Employees
- f% W6 C+ ]: u& U/ ^  t  L(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。0 }0 `, U- H$ i1 r6 x
(3) DISTINCTROW 如果有重复的记录,只返回一个9 f( d# W! n! h8 o' B& `. c) @* {
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
0 _8 M$ e" W$ w例:返回5%定货额最大的定单5 Y+ p# Z! @1 z( Y3 `
Select TOP 5 PERCENT*: y6 Y! ^; a9 M- i
FROM [ order Details]
" Y! W* F; n1 z& ]orDER BY UnitPrice*Quantity*(1-Discount) DESC
. |& P0 K$ h4 P8 R/ t4 v$ k3 用 AS 子句为字段取别名8 c+ j. c' C( ?7 X
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
+ \/ q6 o5 I& y8 g8 \% Q( N( q例:返回FirstName字段取别名为NickName7 N0 J; T: R2 t
Select FirstName AS NickName ,LastName ,City
" h2 l+ t, g) ]9 O0 u6 fFROM Employees
$ y3 I% D! z+ r/ \- F例:返回新的一列显示库存价值
. c, I3 N  X! ]$ u0 nSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock9 j' R; i6 W6 B
FROM Products
$ C. ^) d8 `  j# ]. i& i- W二 .Where 子句指定查询条件
$ D4 I. z, h9 ]4 N( w1 比较运算符# x; Z" B1 m' s4 G! f+ a0 Q
比较运算符 含义) f0 {3 [3 p; p: L0 w* [
= 等于, h) W' g7 S: J
> 大于$ b2 n% x$ C2 S8 m, ~4 @
< 小于
9 M$ e% ?! \! `  n. |/ l>= 大于等于
# q; q/ B; g( K5 d& ^! w<= 小于等于3 g* g9 K- |3 o
<> 不等于
, u' v" T! u. A0 y% @!> 不大于
/ C3 ]1 E5 L: b, `  l" X2 E6 r!< 不小于
' l: T8 {: y, B. r" F例:返回96年1月的定单( D. `3 P& l" N! E# e5 G* w2 l- F
Select orderID, CustomerID, orderDate
; ~( M3 j: h: X: F, [FROM orders
3 y1 I2 r  i! Y  W4 E9 ?Where orderDate>#1/1/96# AND orderDate<#1/30/96#
  B5 X1 L8 P$ r( k  q" p注意:
5 ^+ a  U: u% D) s; A' h) @+ eMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。% H$ O4 Y2 D: d' |/ a$ B, ~. j5 v% {3 i
例:5 m( U- {) o* M4 ^; e3 C7 A
Where orderDate>#96-1-1#) c( D* t' Z6 b9 M" m5 ?1 r5 V6 M
也可以表示为:
* D1 S3 o# ?  _  P1 ^5 j/ ]Where orderDate>Datevalue(‘1/1/96’)
4 B& W' W8 [0 U( s& N5 w0 _" \9 P+ A使用 NOT 表达式求反。
: Y  R5 k7 B/ R例:查看96年1月1日以后的定单" D0 Q1 N$ f" H& ~' i+ J/ U
Where Not orderDate<=#1/1/96#  ]4 c0 Y& H4 |
2 范围(BETWEEN 和 NOT BETWEEN)) h# n( f4 W' ^5 `1 W
BETWEEN …AND…运算符指定了要搜索的一个闭区间。6 q8 w' I% D7 `" w# F) X
例:返回96年1月到96年2月的定单。, v# ]; l9 N5 B: S* F& {
Where orderDate Between #1/1/96# And #2/1/96#- I' P" h) t& E  T
3 列表(IN ,NOT IN)
$ e/ \+ }  |" B6 N" n& [IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。. d# p( s- i$ z) }, k
例:要找出住在 London、Paris或Berlin的所有客户4 t/ d. ^! p- u  x0 T7 u) X0 Q
Select CustomerID, CompanyName, ContactName, City% Y8 B2 z; V" a6 s$ h
FROM Customers
6 _) i& c- i: [2 oWhere City In(‘London’,’ Paris’,’ Berlin’)
6 D- B+ y7 b& f8 ^/ k4 模式匹配(LIKE)+ ]1 v0 v# |  p' `0 v) ]
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。/ Z2 i: q$ H# s% E
LIKE运算符里使用的通配符
3 J) w  Z3 y* C, G# ^; ?% e通配符 含义- O% B7 N4 C  t  {
? 任何一个单一的字符
. }  \2 T: x# }8 f: v. i0 F* 任意长度的字符
' R2 f1 x2 Q% b# 0~9之间的单一数字
* p! T0 |+ f' m: A3 D" F( K[字符列表] 在字符列表里的任一值
; R  o6 {6 v5 U) d[!字符列表] 不在字符列表里的任一值* Q2 I1 S4 v  L4 v4 P+ B
- 指定字符范围,两边的值分别为其上下限! }7 K/ `% u9 s  F7 ~8 n2 r' G
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
: B% D, z+ r0 H& ?4 xSelect CustomerID ,CompanyName,City,Phone
2 u7 Q; F; h) v( y1 q; @+ i7 dFROM Customers- l3 z6 \1 M+ g& X  C% A; `% j
Where Phone Like ‘(171)555-####’
' _0 E- v& ]7 _0 h7 Q1 nLIKE运算符的一些样式及含义4 [# B: J. J# I! m( K# k
样式 含义 不符合) T$ o0 Q0 g! h9 s0 z% G- f4 N
LIKE ‘A*’ A后跟任意长度的字符 Bc,c2553 l+ C0 }, k; a
# LIKE’5’ 5*5 555
) k& E* _" L) x. e, mLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5$ k8 R  t! r# @* d, g1 I
LIKE’5##5’ 5235,5005 5kd5,5346
+ m" q1 R8 j. S0 N% k; C% w1 YLIKE’
  u. u4 }; c/ q[a-z]’ a-z间的任意一个字符 5,%: O3 l/ W% X5 j) \& s
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,16 {. Z( @& J1 ^# `+ K
LIKE’[[]’ 1,*& N8 x7 j1 m7 t) p% D' \
三 .用ORDER BY子句排序结果
( E* b' U1 _# n" u# N6 porDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。% i, f: M* ?2 U) G5 T
orDER子句中定义了多个字段,则按照字段的先后顺序排序。9 w& A1 b# K, Z  T$ V
例:6 R$ d' u0 `1 @! S% v$ ]+ |* u7 V& @; \
Select ProductName,UnitPrice, UnitInStock
, g& y# {. B/ g& r0 ?FROM Products$ K' z1 J9 J) A+ f; V
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
# S7 X+ Z( i! i/ F: u' O4 VorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。! L0 r/ T- ^& L
例:下面的语句产生与上列相同的效果。, s1 g% \5 K. n- P. y9 ]
Select ProductName,UnitPrice, UnitInStock
" N0 o7 K; \3 ~FROM Products, o) t' l! p; B  w" t! Q
orDER BY 1 DESC , 2 DESC,3
; }+ H2 C& Z& B0 X$ P* C6 G5 w1 ^& r四 .运用连接关系实现多表查询
$ t. L/ S, j  w8 f例:找出同一个城市中供应商和客户的名字& e) Z% P* b( w
Select Customers.CompanyName, Suppliers.ComPany.Name5 d, `" t$ U4 ]& N* H* V
FROM Customers, Suppliers
& a5 v7 j5 k1 s1 Y4 PWhere Customers.City=Suppliers.City: Z/ H2 g: S/ C. X# x8 T7 }* s
例:找出产品库存量大于同一种产品的定单的数量的产品和定单4 n. R5 w9 {2 R; F
Select ProductName,OrderID, UnitInStock, Quantity! ^: P+ c0 _( U  }  |
FROM Products, [Order Deails]/ {2 |/ f  n' N5 s- a
Where Product.productID=[Order Details].ProductID1 s, N- A- S( c: ^
AND UnitsInStock>Quantity& |4 F" L$ h. q; M1 C! G/ \, Y
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN9 ^( I+ w; ^0 N. H6 B
语法:- {+ I. Q6 I; W! f  f8 h; r
FROM table1 INNER JOIN table2
) O+ q* ?: n! n3 ]# O2 U0 e( S2 kON table1.field1 comparision table2.field2  b' U# X0 F) w' n( U
其中comparision 就是前面Where子句用到的比较运算符。
3 z! b0 R" S2 e5 [) s8 F0 L# MSelect FirstName,lastName,OrderID,CustomerID,OrderDate$ d. \, }/ ~$ G  @0 w
FROM Employees
3 [" @8 C6 @, e( `INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
& o6 p4 F- j8 ?# u/ y8 z" x注意:: \( u# z. r# g: ~( p  P4 F& j
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。8 t; K$ Y! `9 F% }) Z1 B* Z3 {; \1 Q7 b7 }
在一个JOIN语句中连接多个ON子句
! c7 Q+ x( `: `% k# P) p语法:
7 T, e# y; s+ FSelect fields
8 ?- A# \! t/ p& sFROM table1 INNER JOIN table2
& n9 L& n. R+ M6 ION table1.field1 compopr table2.field1 AND, w2 O: X( |" R$ o
ON table1.field2 compopr table2.field2 or+ T3 s& O7 t' l# q
ON table1.field3 compopr table2.field3
  G. D# m2 s" C) J! e" ]" f, h+ z, N也可以5 o: M9 P# V& x. T, q# |
Select fields
( `, ~7 G. W+ e8 R7 ~+ \. eFROM table1 INNER JOIN
# [0 n+ Y0 V6 [$ C$ c(table2 INNER JOIN [( ]table36 q5 t/ W4 l' W/ D3 _4 I* u
[INNER JOER] [( ]tablex[INNER JOIN]/ q. [& y& t' E5 T# l- }9 ~
ON table1.field1 compopr table2.field1
/ H( [" h$ s; G0 H4 \( f- k( AON table1.field2 compopr table2.field2
( D' G7 {6 x2 C8 p/ ZON table1.field3 compopr table2.field3' h; Q5 w7 ~. v) W) z8 i8 {
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
+ g8 B, g0 T+ K/ ^FROM table [LEFT|RIGHT]JOIN table2' l" x7 M0 _% `) v$ s/ [
ON table1.field1comparision table.field2+ {( p9 b( }  {2 S" @3 b
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
$ e7 N& @; B5 y) d! ^; |例:不管有没有定货量,返回所有商品& b8 @: J) L7 g  [
Select ProductName ,OrderID" Q% ~  @8 w1 @" e  {
FROM Products
7 S' e9 s' B+ ~3 X' U5 W# wLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
% Y# o+ J& z: h# y6 z7 Z  ]0 V右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。
: B7 {6 B4 E3 m2 }4 `9 T5 u1 k例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
  B4 t% K2 D0 D空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。8 ~. U6 [7 ^9 ]$ I& t. g* L
Select *6 Y1 z. t+ i6 h
FROM talbe1
( `' z0 ~" y+ L3 B, B: y/ }  I* Z/ ?LEFT JOIN table2 ON table1.a=table2.c# k  }; O9 I' U9 U# r: I# `1 j
1 连接查询中使用Iif函数实现以0值显示空值( s* J5 S) p; Y, s
Iif表达式: Iif(IsNull(Amount,0,Amout)
1 G& O/ [; r1 l$ K! Y6 y例:无论定货大于或小于¥50,都要返回一个标志。* x% x: L8 v- j( e
Iif([Amount]>50,?Big order?,?Small order?)" q+ x3 M9 q: y7 G! v1 W. t
五. 分组和总结查询结果
! }! x6 q6 H3 t) [9 ~在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
: W: J- e; }8 cGROUP BY 子句的语法
/ H% S4 o- ~8 M" f+ w9 G; p  x# s8 ISelect fidldlist
( ?+ V  Q. e# r. ^' i' ?' J. TFROM table
2 M4 q( N- }7 V# O" P9 {Where criteria
  y( B- [- W& R* n7 }[GROUP BY groupfieldlist [HAVING groupcriteria]], p& Y# p7 r6 ]: p+ E- [! g) @
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。( A, a! o' S) d) Q% l/ Q
GROUP BY字段中的Null值以备分组但是不能被省略。" A5 G9 x4 n. o2 i$ Y8 v7 f8 }. p
在任何SQL合计函数中不计算Null值。# H1 u) B& x" j6 {
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。, H; t  B+ ~8 e4 y
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
$ {% g. o7 i" a+ aSelect Title ,Count(Title) as Total+ K1 Q* h$ O, a6 e9 [9 i/ ~: I
FROM Employees
3 b; Z% p0 S% ]/ qWhere Region = ‘WA’
  q- `0 W/ U& o2 S# iGROUP BY Title
! i* Z3 H- W4 c% P) KHAVING Count(Title)>1' i9 h& }6 W( M! b
JET SQL 中的聚积函数5 v7 b2 k6 _2 h& M% G
聚集函数 意义( d" m2 K5 u  P) q: k* b
SUM ( ) 求和
1 [! v& R7 H/ \AVG ( ) 平均值
, T0 ~2 {2 |: I  X, I/ \( q4 GCOUNT ( ) 表达式中记录的数目1 ~, V% c' ?+ i6 J1 y  o7 C1 o
COUNT (* ) 计算记录的数目! h; ]9 I9 t: z. D
MAX 最大值% b+ B, ]: m, N
MIN 最小值' w* S6 y' N# [. B: ?4 x& l4 X  M! {
VAR 方差1 r9 E% `7 `5 L! u" j. c) o
STDEV 标准误差
; s& ?& M- K/ V/ B# TFIRST 第一个值2 ~: Q+ ?  z" ~8 W% |$ R$ v- }
LAST 最后一个值
. w8 B  e& y7 }六. 用Parameters声明创建参数查询( t, @! y) q) j1 G  {
Parameters声明的语法:
2 {$ e0 a- U0 O7 g& ~* P6 zPARAMETERS name datatype[,name datatype[, …]]6 f+ x, w5 F+ x# ^: i2 c
其中name 是参数的标志符,可以通过标志符引用参数.
' b; W: j! c2 QDatatype说明参数的数据类型.: k5 A  v) L+ e. c1 e
使用时要把PARAMETERS 声明置于任何其他语句之前.- I4 X7 b% p7 B& [+ R
例:
# p( o7 P! U( u+ S: G6 E( `PARAMETERS[Low price] Currency,[Beginning date]datatime
1 I/ y, Z, B% E, F& W6 v0 U# l3 gSelect orderID ,OrderAmount
: x4 o8 Z5 p3 \* o( ?FROM orders) u$ E( U- `% Y6 r3 L; [+ M
Where orderAMount>[low price]
5 f( ?4 \: F# VAND orderDate>=[Beginning date]& W4 k  C  Q: o
七. 功能查询6 h! A6 ]: X8 M1 M8 Z
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
: x8 y# `$ i% |$ `4 l+ F; x* a1 更新查询. X0 k$ `! s8 E- x
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
: w9 H, ]# ]: {4 {8 q更新查询语法:& L9 c) o" o, M7 z4 [& ]
Update 表名' G9 T1 C! T0 r
SET 新值
3 |$ x9 Q2 I/ H& S( g2 k4 d2 LWhere 准则
- \, ]$ c/ k& v& X/ u( R例:英国客户的定货量增加5%,货运量增加3%
3 j. C, F5 B3 iUpdate OEDERS
% f' I; m2 w. V! z1 Z5 q+ ySET orderAmount = orderAmount *1.13 I, p% O. n* g6 q
Freight = Freight*1.03
+ r# }- n$ G1 M. FWhere ShipCountry = ‘UK’9 T0 P1 V9 g5 {2 ^, @% c3 Q
2 删除查询' h5 s8 }' v0 R- x( B8 ~
Delete子句可以使用户删除大量的过时的或冗于的数据.4 h8 ]5 k( A! z2 W( a" {/ q% \1 ?7 \
注:删除查询的对象是整个记录.
  }) }6 }. C, {3 j& jDelete子句的语法:
1 p$ O5 I. F: M6 v- M: gDelete [表名.*]) ?0 o- Z& w6 m4 p$ W2 U
FROM 来源表8 e/ F# c( u* L
Where 准则
8 |9 Q, B7 q' C; I+ a例: 要删除所有94年前的定单
' l( n( |7 v4 S: s+ v0 SDelete *
: P/ }7 Y, y+ tFROM orders6 r: [, V- ]" R5 x& C  e& U
Where orderData<#94-1-1#
3 [8 B; d- F" S: c3 K; W" K3 追加查询$ Y( I/ N- f' Y: y% r6 ^
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.& `. M; Z6 }4 {+ U/ q
INTO 子句指定接受新记录的表
3 c' \& J0 [3 u) |* C1 E! P- zvalueS 关键字指定新记录所包含的数据值.
7 z- O2 D9 ?' rInsert 子句的语法:3 |3 G5 {# S2 Y! k. {4 P3 }
INSETR INTO 目的表或查询(字段1,字段2,…)1 M7 o; S* w* x  o
valueS(数值1,数值2,…)9 \8 Q" k8 K/ C5 O! p* s
例:增加一个客户7 k7 _' o1 j, b8 D) Z4 ~
Insert INTO Employees(FirstName,LastName,title)6 ^: U2 U) m1 m, X3 b
valueS(‘Harry’,’Washington’,’Trainee’)+ ^! z: N! j! z/ }
4 生成表查询/ Z* m* q# q: M0 Z4 g
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
, k6 X! c# X' {; i8 z( [Select INTO子句用来创建生成表查询语法:
0 j9 d/ R$ q6 L- A) h8 r  Q( CSelect 字段1,字段2,…1 d  d  b9 N; Q
INTO 新表[IN 外部数据库]& S4 C: c6 G, }# o" S, Q9 x7 `9 o
FROM 来源数据库8 ]5 i$ L9 \8 P4 C. y# Z, f
Where 准则6 J* u; g4 ~* c* i
例:为定单制作一个存档备份  h, x/ R1 A* a! |; N; s- W
Select *
+ w9 J: ?9 m$ d- b* T9 u! BINTO ordersArchive
% e* [& v- s% Q+ x0 q9 y( r+ ]! iFROM orders! F" T. E% Z* M% }( p7 p$ A
八. 联合查询! q. d' @9 F# A* u9 Z, c4 I
UNION运算可以把多个查询的结果合并到一个结果集里显示.* h* f4 i1 i/ a5 L* Z+ [  D) o
UNION运算的一般语法:
. T& h4 z4 P9 P[表]查询1 UNION [ALL]查询2 UNION …
5 w3 [7 Q% b5 H; n例:返回巴西所有供给商和客户的名字和城市2 h# r/ w1 D9 N+ `  Z0 t
Select CompanyName,City- W! V. |& r) F: y
FROM Suppliers& w" ^# a2 m8 a: k0 M/ ]* n4 v
Where Country = ‘Brazil’
1 h9 }  M, r  f: h8 j5 KUNION' L& ]% j6 u; d8 B
Select CompanyName,City
. o6 o* o0 u5 V8 v& O8 gFROM Customers
, ]" h9 E" c& c: |Where Country = ‘Brazil’
. q$ I1 T6 V5 y' Q2 _1 v: R2 r% J注:
6 r' ]8 s- l" F% l缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
) m0 w! V) o$ I5 d5 K& q. BUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.% i* D" g1 D' @$ Q% ^" x
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句." q% A2 I0 a0 A  s. g) [8 @; Q
九. 交叉查询8 I3 q% ]: z/ V% g1 ^
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.& a0 L. B4 s5 R# l: \# `
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
* `# R1 x9 n8 N- [  MTRANSFORM aggfunction
2 g: b) G* F( ?' Q' bSelect 语句% y9 e9 r* [" m/ x5 q' ^
GROUP BY 子句6 ?1 c6 k; Y1 [( W' X
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
0 @5 e8 }5 t, h. ]Aggfounction指SQL聚积函数,5 @) X: _( E$ L% Y6 H. i
Select语句选择作为标题的的字段,9 g. S: Y* ^2 i8 L
GROUP BY 分组
# I# J% t1 o  y1 l. B7 g+ U说明:
' _: ]- {9 K2 ?% _0 yPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.7 H9 _- Y6 M' t" ^: F
value代表创建列标题的固定值.
8 l: p. M6 `" \5 s9 a6 b) ?例:显示在1996年里每一季度每一位员工所接的定单的数目:
! M) {. K; h' i. KTRANSFORM Count(OrderID)1 M8 L& Y0 `( e$ K, U/ n
Select FirstName&’’&LastName AS FullName9 }! E$ u- S1 M2 F4 W
FROM Employees INNER JOIN orders  x9 H5 L/ c" O6 l% ?$ n- Y
ON Employees.EmployeeID = orders.EmployeeID
: y4 z  K2 p' e8 o  oWhere DatePart(“yyyy”,OrderDate)= ‘1996’
5 J1 ?( V9 s: P  V) i7 `GROUP BY FirstName&’’&LastName
8 k! @8 ^: i- C0 m' d- morDER BY FirstName&’’&LastName
9 n& U9 a2 ?  \* p7 t. k) YPOVOT DatePart(“q”,OrderDate)&’季度’$ j& M* l% s1 V  ]& @6 o
十 .子查询
% h+ {% ^$ G8 {* o" g" f6 n& a子查询可以理解为 套查询.子查询是一个Select语句.
& Q+ Z! d5 h2 {" \1 表达式的值与子查询返回的单一值做比较- Y7 Q6 u# `: y0 ?2 {
语法:
! Y6 D7 h+ e4 u表达式 comparision [ANY|ALL|SOME](子查询)5 \! d! n3 S( `% Z# k6 d; e
说明:5 M  d6 x: ?" Z
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
; ?7 B7 k. ?* @8 Z+ Q& z例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
/ a/ l+ f" y' c; \) SSelect * FROM Products
. T+ q. K8 ~; \( b5 [: bWhere UnitPrice>ANY5 Y9 ^  f0 v& M' M5 [! V
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
3 ^" k7 ]* q9 g6 r2 检查表达式的值是否匹配子查询返回的一组值的某个值
' Z7 A0 M8 ~! z) N' M1 l5 b+ u  ?语法:& o1 o5 x% |  j- X% o- ?
[NOT]IN(子查询)* [8 w# _& }! ]9 u7 Y8 G/ z/ ?
例:返回库存价值大于等于1000的产品.
  E  M0 b  G  [- C6 u( H, {) }Select ProductName FROM Products
; l: L+ n+ n/ gWhere ProductID IN
' z6 h' B/ \! h) M(Select PrdoctID FROM [Order DEtails]! u$ T0 D. r; z) J, g
Where UnitPrice*Quantity>= 1000)& R6 ^7 |% V: F0 W1 `3 c
3检测子查询是否返回任何记录0 p+ s2 U' s' R; m( O( V
语法:
1 e! G$ O8 Q1 j4 |; B* W! S[NOT]EXISTS (子查询)
1 A' V( r, V, Z7 a$ W, ^例:用EXISTS检索英国的客户
0 b: b% A9 o7 O4 T$ E( {7 s! R. MSelect ComPanyName,ContactName
" ^6 O& e8 N0 NFROM orders: M9 G7 F/ ]# D) p) u  M- V
Where EXISTS/ _3 J$ }2 U3 w) w$ f# L! l
(Select *
' A) u% \! e7 {; `+ ?7 P% SFROM Customers$ d1 P& X6 W  X+ q* U, z
Where Country = ‘UK’ AND
/ Q7 c! x3 i' b, e- s9 J  hCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-9-7 11:38 , Processed in 0.027002 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部