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

标题: Access如何筛选重复数据以及Select语句的完整语法 [打印本页]

作者: 帅哥    时间: 2009-11-10 10:28:12     标题: Access如何筛选重复数据以及Select语句的完整语法

Access如何筛选重复数据以及Select语句的完整语法
0 G& D; l' m$ p1 d7 T
* f, b& c3 O6 E& T% Mselect distinct 字段 from 表名5 X& Y# ^  X1 |1 ]: G
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
* i- }, q% }$ t, X3 M8 K4 C一.Select语句的完整语法为:! B6 j! P9 i! b
Select[ALL|DISTINCT|DISTINCTROW|TOP]
  ^" s" ~) Z( G% t/ W5 ]{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
; K$ o/ n! N0 v  ]% `FROM tablee xpression[,…][IN externaldatabase]) Z4 u% H& Z0 |  P' V: t8 j
[Where…]5 w( h8 d$ j( G) F  w& a
[GROUP BY…]( C: b& j' ]$ W8 [  m2 i" t
[HAVING…]7 J* j2 A$ z) R) T
[ORDER BY…]" l' S% B0 _! G: n2 p8 G
[WITH OWNERACCESS OPTION]* M7 f( W. Q* J/ o* u' J% K
说明:, q6 b. V; s  ^) L3 P5 G/ X3 m1 _
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。3 C& u: x  Z' h. x' G% g
1 FROM子句
! z9 g& m  y) J- R2 `  c+ UFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
! [1 [( m& f8 p+ [  C7 |" S例:下列SQL语句返回所有有定单的客户:- e, T6 U3 s6 o$ c
Select orderID,Customer.customerID
/ G3 w4 }/ t; i$ N7 U  A( v: s7 q; TFROM orders Customers& ^1 l. k3 ^& x5 j
Where orders.CustomerID=Customers.CustomeersID9 g1 {9 P1 R; g' o  e# d9 d
2 ALL、DISTINCT、DISTINCTROW、TOP谓词9 Q: |/ R4 X3 l7 O) `0 u
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。' u, K1 O0 H" a: E& }- @* K
例:Select ALL FirstName,LastName
" m5 A& j2 h* w  ]; b" [FROM Employees( p" T9 y2 ~& I# l" G9 E
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。' W1 X4 t% c9 X# f9 L/ U; b0 H1 i! d3 O
(3) DISTINCTROW 如果有重复的记录,只返回一个- F# Z) h3 `& Y; v( |- Q& ^) h; P" _0 _
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)2 q, ~7 F- V( o; M1 Z/ a' k3 U
例:返回5%定货额最大的定单
( l" [/ O0 F$ M- S& GSelect TOP 5 PERCENT*1 a- {# Y) S! e7 E/ v3 x# J9 T; i
FROM [ order Details]( E; X9 }3 ?4 W4 u/ {
orDER BY UnitPrice*Quantity*(1-Discount) DESC* K; m& [( d' x& M7 o5 I: m" ]8 H
3 用 AS 子句为字段取别名2 P* H7 M. `6 ]  O/ W- {
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
/ e$ ]' v& n* e0 t6 S例:返回FirstName字段取别名为NickName0 R, P: v5 a3 G. Q
Select FirstName AS NickName ,LastName ,City
5 v- K/ s7 H* t* j" n) W" SFROM Employees
0 S1 [3 P; m3 U" `/ X' G' z) }& N例:返回新的一列显示库存价值
5 n1 ]# @" D& ]Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
# o; ?- \4 k& G# k% HFROM Products$ M2 G; Y, V- f8 U' U
二 .Where 子句指定查询条件
2 q$ a& u7 \, u. r" h1 比较运算符
- M$ A& B" X$ b' R4 h比较运算符 含义
% a/ z" D# ~1 A- u! i= 等于, z6 A1 J8 ?5 ]
> 大于# J. m1 W+ {" }) p% }" i
< 小于' r+ Y: v7 }) |1 s, e: @- F( e
>= 大于等于+ p8 Y* j% E: `! Z' z
<= 小于等于
$ |: {) B1 w6 K3 i% _/ C<> 不等于  |( b# Z2 {' v4 b, g
!> 不大于
1 f- n* Z1 C5 u2 t, T- R3 S+ n!< 不小于2 g# p8 {/ u5 w9 m& _
例:返回96年1月的定单
2 }5 E9 P; w4 b5 ASelect orderID, CustomerID, orderDate! z4 `9 `8 _# q* ^* W
FROM orders. c  @! E# S; B7 k4 I
Where orderDate>#1/1/96# AND orderDate<#1/30/96#' J" G- J, G, p( H
注意:
% X- i1 y1 h0 Q' t7 pMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
% V3 `, p0 C, Y( X2 J& d: a' q9 w例:. r: R" P$ t3 P1 x
Where orderDate>#96-1-1#
: V1 h5 O; \/ i0 K+ r也可以表示为:
- r+ f& d) G2 J8 ]Where orderDate>Datevalue(‘1/1/96’)
$ R9 t  W8 M6 v8 ~9 _* j8 n使用 NOT 表达式求反。( R& w9 y' V0 `% }0 {/ z' @( B; D5 S
例:查看96年1月1日以后的定单
) Z( |. L( d4 D  ^9 @+ m: D+ tWhere Not orderDate<=#1/1/96#8 B5 b$ [7 ]4 V$ }0 i" y' E& h* G
2 范围(BETWEEN 和 NOT BETWEEN)/ ?) o" K( [8 J- _/ @8 h% x
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
. \$ M/ d  |4 k: d例:返回96年1月到96年2月的定单。
, a1 g* B8 h& }; H+ jWhere orderDate Between #1/1/96# And #2/1/96#
$ P3 V7 m& @' Y3 a8 z3 列表(IN ,NOT IN)
/ f6 c2 }+ C9 j: q* c! u, Q0 jIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
  Z, u" [# X' `9 A9 R例:要找出住在 London、Paris或Berlin的所有客户" o3 ~" _1 o% C' p2 N
Select CustomerID, CompanyName, ContactName, City
( H! o. k1 T7 m% v9 J2 U1 jFROM Customers0 U0 v" }6 Y7 a2 C5 g( z! c
Where City In(‘London’,’ Paris’,’ Berlin’)
( q0 Z' b; C! ^4 模式匹配(LIKE)8 q/ s1 Z+ s5 c
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。% m1 u+ B4 P9 c
LIKE运算符里使用的通配符
9 i7 S0 K& o. K通配符 含义% m9 R' @  z1 V8 @+ o) h- G# j
? 任何一个单一的字符
5 o% M  A8 Z& K7 {: c* 任意长度的字符6 Z1 s' R# n- d+ C* v
# 0~9之间的单一数字6 a5 L+ z4 G9 [# Z% T6 d1 j
[字符列表] 在字符列表里的任一值2 ]# W( v- f, c% d% U$ Z& p0 Q
[!字符列表] 不在字符列表里的任一值
' V7 A$ X( b+ |4 R- 指定字符范围,两边的值分别为其上下限0 W8 I& R+ `" o
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
" G7 L  d+ e4 x+ N* E2 JSelect CustomerID ,CompanyName,City,Phone
) M, E7 Z/ @% H$ I1 IFROM Customers2 M9 C+ D$ [( _
Where Phone Like ‘(171)555-####’- ]! p& R! N/ e8 i  r4 ~
LIKE运算符的一些样式及含义6 t& v' a# c2 m* K% Y  G
样式 含义 不符合
; R8 Q) r1 B" T: X; T7 e; gLIKE ‘A*’ A后跟任意长度的字符 Bc,c255: e6 Q2 I0 o2 V$ M3 l9 \5 a
# LIKE’5’ 5*5 555# A9 J- p& k" _9 V$ F5 s: Y, M1 i- X
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
3 ?% F* R6 G5 q1 ?LIKE’5##5’ 5235,5005 5kd5,5346, v; ~. U/ F0 K
LIKE’
- o. D5 Y3 T0 w3 M7 G0 R/ G& {[a-z]’ a-z间的任意一个字符 5,%
, W7 A! x5 t" m- k8 d: O1 ?LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
- B& ^5 Y3 V4 b3 n' _) a# hLIKE’[[]’ 1,*
3 x( C+ ?- L2 @2 J三 .用ORDER BY子句排序结果- a: @6 S9 |8 a
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。5 l  [8 K2 @0 Z0 z* l) J6 ~5 k
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
) m# w5 ~& v/ h9 _3 H& p) ]# a例:
+ P7 d) @3 U3 t& [Select ProductName,UnitPrice, UnitInStock1 v% `# P* O' k# L0 ~
FROM Products
. P7 l4 k4 u0 c  GorDER BY UnitInStock DESC , UnitPrice DESC, ProductName
  g) H4 i: Y/ s' _5 [. T$ yorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
3 X/ Y+ Y' p0 e9 w" L5 n/ N8 {2 H例:下面的语句产生与上列相同的效果。/ L" t; y9 e# T6 _; T8 @4 L
Select ProductName,UnitPrice, UnitInStock& g; b* U& \. r: N& D4 E
FROM Products
, H9 b1 ]8 r$ h8 a, |! F  forDER BY 1 DESC , 2 DESC,3
/ z8 U, l: O  y  A四 .运用连接关系实现多表查询
5 B6 l. @' i4 `- |例:找出同一个城市中供应商和客户的名字
* u$ W" z0 n' A* c) W! f5 uSelect Customers.CompanyName, Suppliers.ComPany.Name
9 e  {0 v9 Z2 T1 {) z7 ?! gFROM Customers, Suppliers
  x' R/ C* p0 _9 wWhere Customers.City=Suppliers.City
6 i  H- U; D% u例:找出产品库存量大于同一种产品的定单的数量的产品和定单! n8 U! s7 d& [  O( x* x
Select ProductName,OrderID, UnitInStock, Quantity. ?2 Z, F) M3 U
FROM Products, [Order Deails]2 g9 B; P9 V3 k5 A! X0 D
Where Product.productID=[Order Details].ProductID2 C, v0 O8 E/ m/ B
AND UnitsInStock>Quantity; b  E1 {- O8 j  w: @+ Z+ P
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
% o" m* w& C- V* O0 {9 v语法:
3 E& @( E6 L5 M, W- i9 y+ wFROM table1 INNER JOIN table2
( O/ O! S. @2 ?# Y9 y; |5 S: h' HON table1.field1 comparision table2.field2
  a2 [+ b$ Z' E/ Z/ Y' L其中comparision 就是前面Where子句用到的比较运算符。5 J3 s8 [( |7 O3 v3 R' o$ \, B/ Q0 r
Select FirstName,lastName,OrderID,CustomerID,OrderDate
3 B& K' \/ a! }) R. ]FROM Employees
1 G: ^0 b3 o. CINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
( G% ~8 G0 z0 h注意:
7 P4 ?; g: \4 W& ^4 jINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
6 U; F7 ^& V, e) `2 ]7 y在一个JOIN语句中连接多个ON子句
. V/ a! z/ _! x' R* C语法:5 K. e* M6 @. m; l
Select fields! H4 ]2 O6 N& T9 ~6 C# |
FROM table1 INNER JOIN table2+ d1 [4 O" A$ i! \' G) l7 z
ON table1.field1 compopr table2.field1 AND5 z7 b" M0 _: O( M5 h0 T
ON table1.field2 compopr table2.field2 or) N: `1 @/ O& N  c2 W& g$ s2 ?, G
ON table1.field3 compopr table2.field3
5 W: r9 a# v$ ?也可以$ z$ e. f+ E4 T1 }, y
Select fields
$ O1 F  b0 |! v6 R6 d7 ]FROM table1 INNER JOIN* X2 c, g2 Q' ~0 Q) t1 \4 K
(table2 INNER JOIN [( ]table3& v" X* q  Q2 F
[INNER JOER] [( ]tablex[INNER JOIN]
  r! v/ {' V7 w2 K% x: kON table1.field1 compopr table2.field1
6 y7 J. G7 a9 z( f. i. hON table1.field2 compopr table2.field2
  s- l- Q$ K/ `! V) [* D: ^ON table1.field3 compopr table2.field3
7 G/ f; B# ]9 o" \9 E6 L! u外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
( X8 S# R" T$ z2 X2 g& @% YFROM table [LEFT|RIGHT]JOIN table2
: x# V! _6 A$ A# TON table1.field1comparision table.field2; O) T* \7 s+ H0 U0 x4 E
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
; _  {3 R2 h4 o例:不管有没有定货量,返回所有商品) j" f- C) X$ B- Y8 h2 E
Select ProductName ,OrderID+ n1 O1 {$ ~6 }7 h  u
FROM Products
1 k, l: J2 q  _7 WLEFT JOIN orders ON Products.PrductsID=Orders.ProductID7 K) c) q' |% J4 k5 z- f! `
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。8 b+ O& x( Q8 Q  k; N' _
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。- x% W+ o9 ?3 I9 ~
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
* q; ^+ N- t4 G7 jSelect *
1 q3 |& [( k8 f* k3 T+ m1 zFROM talbe1
* Q. R$ x( m9 w, YLEFT JOIN table2 ON table1.a=table2.c, ^2 M* n/ D) ]4 D+ c  X$ ]/ ^
1 连接查询中使用Iif函数实现以0值显示空值* T1 E* _! R7 l7 p
Iif表达式: Iif(IsNull(Amount,0,Amout)
% X! |9 v% m* j8 T例:无论定货大于或小于¥50,都要返回一个标志。
) P6 D* x1 f5 eIif([Amount]>50,?Big order?,?Small order?)
. [; i3 ~% B* ^五. 分组和总结查询结果
0 I) ^7 A2 t. S3 f  [在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
7 |0 M$ `, f, \, b: O/ u4 JGROUP BY 子句的语法
' r/ W& }7 ?, I; |( V7 p7 Q2 f( VSelect fidldlist
5 J5 I; l3 k2 u% ]1 B& |FROM table
2 s! n! u+ ^! s3 r2 `0 D! ~. oWhere criteria
! a  Q0 ~' }, g. k! ~+ @7 e& y# M[GROUP BY groupfieldlist [HAVING groupcriteria]]8 a1 _5 ?6 @- ?  d# w3 F
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
7 l4 L6 e1 i; a9 R+ \5 TGROUP BY字段中的Null值以备分组但是不能被省略。3 w7 t: I; S" T
在任何SQL合计函数中不计算Null值。
" ^' c2 x7 D3 B3 }/ ^! G3 g' jGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
* k, [! W+ n& i5 I1 q" L1 o例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
, N7 T2 g& \; CSelect Title ,Count(Title) as Total
4 X, ]' h8 |5 PFROM Employees
2 h" A4 Z$ b& D9 m" sWhere Region = ‘WA’9 i; _& h7 I1 x$ U& v5 R% S
GROUP BY Title) l) c& a6 g& f# [% `- |
HAVING Count(Title)>1
/ G! g% Y3 k  t+ FJET SQL 中的聚积函数3 B# a4 v( m  x; y# m) p) D
聚集函数 意义
" E$ T; g3 A/ XSUM ( ) 求和
5 ]* t/ B2 ^7 q, P( {AVG ( ) 平均值4 W  @0 ?: N; w' u1 W& G# t! y
COUNT ( ) 表达式中记录的数目
: K" Q( i' S3 y* D* lCOUNT (* ) 计算记录的数目
3 m# L3 [) K  aMAX 最大值1 y. @  g( S9 `$ e5 q
MIN 最小值
/ Z$ i1 m+ B) r5 d& _$ @( a3 K  ^VAR 方差: ^, c% q8 z# s' g, F4 `
STDEV 标准误差
+ U  ~. K& E9 E% LFIRST 第一个值! Q4 \8 G  \- s( }! w
LAST 最后一个值
$ n5 ~/ Y5 ]  L/ h六. 用Parameters声明创建参数查询
" J! C9 ~: p, ~+ K9 _& [Parameters声明的语法:, _. }8 Y7 P/ F* k  R' }8 ]; n
PARAMETERS name datatype[,name datatype[, …]]' G$ X) V3 w  O
其中name 是参数的标志符,可以通过标志符引用参数.) I& [$ a! e2 l5 ]
Datatype说明参数的数据类型.
  D' M7 E0 t3 [使用时要把PARAMETERS 声明置于任何其他语句之前.
) U1 \' s/ B+ `" ^5 S例:+ E$ ?8 K1 _% x7 d, f0 J
PARAMETERS[Low price] Currency,[Beginning date]datatime
+ o9 Q2 X4 b" u# t: n! ~Select orderID ,OrderAmount0 F, \9 V3 K7 j, p6 M
FROM orders
9 f0 ?$ J. ]; P  mWhere orderAMount>[low price]
5 X) y0 U: o1 {5 SAND orderDate>=[Beginning date]
# r% J- p( [5 z! X/ T; d/ p6 L/ U七. 功能查询" e) Z2 S+ V0 A( P
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
  o4 T2 I& S2 e& z: Z# x1 更新查询
/ ~$ y1 ~  h$ `5 O# `. `/ yUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
- ~" p2 ]! {$ Y1 j  S# N更新查询语法:
0 `, H9 J6 E; w2 ~1 g; d0 BUpdate 表名
  r  f+ A* f- N8 \. b! mSET 新值
4 j+ Y: O' X! M+ N) e. b: \Where 准则
3 U8 I4 b, g$ r3 B* X例:英国客户的定货量增加5%,货运量增加3%
" B, y- a# e# }9 [! W6 o3 BUpdate OEDERS' s& d" F; M0 m- \3 `  X0 h
SET orderAmount = orderAmount *1.1
) B1 M0 q  c0 x2 G. ?1 V- fFreight = Freight*1.037 G# N2 U6 f$ g8 ?
Where ShipCountry = ‘UK’
: f) j: R0 ]8 q; S2 删除查询
5 a$ @3 p( B! t4 ?Delete子句可以使用户删除大量的过时的或冗于的数据.: q+ }2 ~" ]( h0 t4 q
注:删除查询的对象是整个记录.
% h8 F- H' F% }2 b  P# LDelete子句的语法:6 E+ y' e- o/ e+ V. U* I$ R8 u
Delete [表名.*]
+ Z: H3 T/ K2 ^* eFROM 来源表; O4 s" _/ S8 Z) _! U( P
Where 准则1 ~6 @6 `$ ^1 t2 k/ P$ C
例: 要删除所有94年前的定单1 m7 B7 V; N, g2 o/ \
Delete *
) T2 a, h# c" ~. v( FFROM orders0 h6 u4 n# s( V" r3 O2 s
Where orderData<#94-1-1#
4 c/ ?6 k2 l' s" e: g0 G3 追加查询
! j; m6 o9 B% e8 h: t9 VInsert子句可以将一个或一组记录追加到一个或多个表的尾部." c1 p4 X; d- D7 W
INTO 子句指定接受新记录的表1 T; [4 a  W" m, Y1 y
valueS 关键字指定新记录所包含的数据值.
& P- |1 F' C9 d. J2 u0 jInsert 子句的语法:! C/ H6 v& F% c' t! g2 v- u4 u
INSETR INTO 目的表或查询(字段1,字段2,…)
5 I! u5 S3 z0 }valueS(数值1,数值2,…)
# |% u, N4 n4 U9 H: z例:增加一个客户
- E( u. Y6 l* c/ G/ }$ e0 n- bInsert INTO Employees(FirstName,LastName,title)/ W1 T8 d: b% Z# V4 I% u! g2 H! g
valueS(‘Harry’,’Washington’,’Trainee’)& b0 L4 l3 u  W4 ~) U
4 生成表查询
( ^; u3 x& }1 b2 C& W( G  k可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.( j1 F( I( `& J' k
Select INTO子句用来创建生成表查询语法:, J  |& F- A% ?) G% h  _. \
Select 字段1,字段2,…
1 l8 r9 X# A" K% Q6 vINTO 新表[IN 外部数据库]
$ l5 c( j( D$ x' E7 y! JFROM 来源数据库/ D9 L% J# l6 b, c: |  s" E1 D
Where 准则
6 x. `8 ]% Y/ b3 P例:为定单制作一个存档备份
2 J( y' b' b% sSelect *% J5 J! p% L* e
INTO ordersArchive
5 P7 ?% o+ B3 c: D$ a7 C" x/ ~' s+ U  yFROM orders
& G! o& u- T1 ~. f+ \7 p5 c八. 联合查询; d( _; s- {' H# P, u$ q6 c
UNION运算可以把多个查询的结果合并到一个结果集里显示.
0 b/ [) p. x; O+ {7 r5 ^* {UNION运算的一般语法:
- A- g( P" Z4 S[表]查询1 UNION [ALL]查询2 UNION …/ K! t2 c( o% R1 E" w
例:返回巴西所有供给商和客户的名字和城市1 q, T% h7 k; L1 j6 P+ o- N' k
Select CompanyName,City% _! E2 |, o6 L; {& r! v% w( L
FROM Suppliers3 D: J0 n3 q+ ]: W4 D; u1 @
Where Country = ‘Brazil’: [9 i6 g& {1 D5 s$ M
UNION& d2 O# Q1 f% ?6 {1 Y, x
Select CompanyName,City( K7 e/ P6 a" w8 z: u, ^4 c
FROM Customers# ?7 h$ E4 X' \2 }
Where Country = ‘Brazil’
, K3 x3 w* \; E; i% P2 x注:8 z. j, Y7 I9 \. P
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项) V& c! R1 Y% b% M/ T5 _% ~3 `/ t
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
- T+ A' ^5 n4 \' A每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
8 d, _! g/ {6 v& E4 O) q九. 交叉查询
2 B/ Y, o6 j( O7 D8 _& Q. k# {交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
# t0 [- f6 o% R. L' H$ M' V' NMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:/ ^* T6 V: |/ c! N* @. b
TRANSFORM aggfunction
% r3 `0 a: Y! t* d* J8 P! g6 XSelect 语句
) s2 m* C/ z, O% K6 [( hGROUP BY 子句; w% C$ M, H$ K9 J, X8 |& Q1 h
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
! f* X) W# X$ A$ cAggfounction指SQL聚积函数,
6 s; T! i: A+ I) s8 y$ lSelect语句选择作为标题的的字段,
* h& X3 {' k+ l  ]' I" QGROUP BY 分组
4 g& t# L, J2 v0 q% w说明:
3 c7 A9 a3 m- i- cPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.& O1 j6 a! J6 X9 J( T. ?6 B& N3 O
value代表创建列标题的固定值.! A6 a3 o/ N2 J: m& _! k- f
例:显示在1996年里每一季度每一位员工所接的定单的数目:5 N* W# V  z. a  j
TRANSFORM Count(OrderID). d7 k; [; l7 C* G+ q
Select FirstName&’’&LastName AS FullName
2 A5 e2 l* k  CFROM Employees INNER JOIN orders/ ~. ^9 i: Z) L7 I
ON Employees.EmployeeID = orders.EmployeeID/ l. w% n- e; ^# D& n! B: ]
Where DatePart(“yyyy”,OrderDate)= ‘1996’
5 c/ V7 v& a9 B. N7 Z- z( {, TGROUP BY FirstName&’’&LastName8 B" s5 `+ k' v1 y: H
orDER BY FirstName&’’&LastName2 k. ?7 z. t4 }( E7 s" Z* P% T
POVOT DatePart(“q”,OrderDate)&’季度’: [5 h$ c4 ?; D
十 .子查询
, q$ X' u7 `4 v2 [子查询可以理解为 套查询.子查询是一个Select语句.
6 w. _0 Y* v. A1 表达式的值与子查询返回的单一值做比较: e9 I9 ]2 _# k: F  H
语法:; R9 a7 }. C. u/ K* \
表达式 comparision [ANY|ALL|SOME](子查询)
% u( T7 d% m1 X+ ~" t( V# [说明:
/ i& |8 D* n2 ]7 Z. u4 x1 QANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
4 N; c3 @/ r* L* [0 _% g例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
3 n9 F2 A* }1 ]Select * FROM Products7 M5 q. P: ~  t! u6 I) w5 Z& q! f
Where UnitPrice>ANY
: k4 B3 r$ s( L1 C$ b3 h(Select UnitPrice FROM[Order Details] Where Discount>0.25)
4 w$ C3 E' T: _% @1 m% K  U8 C2 检查表达式的值是否匹配子查询返回的一组值的某个值
# ^2 z/ {6 q" g$ s6 j# x( z语法:
9 e4 i% [9 p' {8 y: {: e[NOT]IN(子查询)
1 _4 B3 d, t) j) K例:返回库存价值大于等于1000的产品.# J. y6 @% f% |% k- Q+ p
Select ProductName FROM Products( o* n6 k* m4 ]  Q5 N# r- X
Where ProductID IN
1 ?7 I5 y; w/ c' N( \(Select PrdoctID FROM [Order DEtails]
$ D3 J% A0 |* j% P# GWhere UnitPrice*Quantity>= 1000)
  L5 o( \" \0 T& x5 M$ H0 Q% E3检测子查询是否返回任何记录
" R  |3 D6 @$ d8 Y语法:2 M: p- Y7 l! e
[NOT]EXISTS (子查询)
8 O$ O/ K3 y5 i/ t/ ^例:用EXISTS检索英国的客户' B0 q2 O2 n  M
Select ComPanyName,ContactName: u1 P1 m( }, g- `0 g+ k, I
FROM orders- N  a. l3 m! V+ I
Where EXISTS: g( K8 h8 i# t7 F* U; d: S
(Select *. ]7 |' C4 c: W7 [6 l8 E& |6 M
FROM Customers' y6 A" k/ i0 t; G7 v3 {- |
Where Country = ‘UK’ AND
' C: ~$ l1 M7 vCustomers.CustomerID= orders.CustomerID)




欢迎光临 航空论坛_航空翻译_民航英语翻译_飞行翻译 (http://bbs.aero.cn/) Powered by Discuz! X2