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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法# E; s8 u  G4 M9 s1 N

/ ^8 m9 e8 E' Mselect distinct 字段 from 表名
, W1 T& u8 C- gdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。, G/ ^) X/ }9 V; Q7 _3 h& w5 V
一.Select语句的完整语法为:4 B/ n% v3 V' U
Select[ALL|DISTINCT|DISTINCTROW|TOP]
8 \! |: ]/ i+ {5 ?9 U' q{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}: c7 i0 ?. _+ M8 A- }; |0 B% l: Z
FROM tablee xpression[,…][IN externaldatabase]
; G" V1 ^% \0 z7 A[Where…]6 R& J: b+ y  A& o/ h% J* ?
[GROUP BY…]* \& I, p2 W0 Q
[HAVING…]
' S- {5 U' b! e$ o' ~[ORDER BY…]
) f/ m0 ~" v0 ]9 H0 D  k[WITH OWNERACCESS OPTION]- B; n( f6 N3 r2 K! z
说明:+ t0 V; u3 i, N0 F' N  G7 `5 d
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
4 X- S+ J8 H' `0 u1 FROM子句
2 V) c; }7 t  V1 b+ IFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。) ^1 e( f7 a/ J7 X$ |( o; G
例:下列SQL语句返回所有有定单的客户:
/ g3 s+ X* K% m9 P& M$ dSelect orderID,Customer.customerID9 j. ~) e; [1 V8 _2 y
FROM orders Customers
( a! L9 e! h& i+ X7 U5 J+ ~Where orders.CustomerID=Customers.CustomeersID5 U! I. A  b3 c; s% u
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
( K0 v; Q/ S4 E" Y& O4 F, h(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。* E$ ~! _$ @/ _& ^
例:Select ALL FirstName,LastName
. v) Z$ M( r/ \* v" GFROM Employees6 y, k* |6 w" v; }, T
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。& F- c0 f* c7 v* f
(3) DISTINCTROW 如果有重复的记录,只返回一个
) q# U/ d+ l+ Y$ h- w(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
6 L4 v5 q* J5 O1 N6 b: ~例:返回5%定货额最大的定单
0 g+ f' e  I; p$ a' A6 o& M8 j1 U9 DSelect TOP 5 PERCENT*5 E& R$ K* o2 n2 @* ~' e
FROM [ order Details]. K" m, [: _5 Q4 D, i" o& y
orDER BY UnitPrice*Quantity*(1-Discount) DESC
! O+ o" F3 l& h- F, v2 J! h3 用 AS 子句为字段取别名" b9 P$ p( M! j* Y+ Y
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。+ \3 S2 c( ]: ]$ x
例:返回FirstName字段取别名为NickName' O; X! c1 v! i5 I& d2 _
Select FirstName AS NickName ,LastName ,City
+ h! ~6 [! t* d2 ?! t" F- M) ]FROM Employees
5 g( X- m  w; T  r例:返回新的一列显示库存价值8 r/ q" s4 y3 x, ?
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
0 S' z2 D1 J, A# [5 ^# p4 e" fFROM Products
( c. K# U/ ^% s7 l* T  l二 .Where 子句指定查询条件0 `/ l( U6 x( v. [0 u
1 比较运算符
' z! f) G8 n3 m* l! \比较运算符 含义
& N$ B( g3 {; B& N  \! @# Q; t= 等于
# T/ [# W0 d# |( Q* L> 大于
1 Q9 G8 @" n' N. p# A9 N0 x< 小于* V% r" d/ D$ S# s
>= 大于等于
& l+ }0 q: @# T  v  J1 b. m+ H2 y<= 小于等于
" ^# _/ M: S6 K1 X1 O<> 不等于: Y8 ^* s9 h1 W; U( U
!> 不大于$ f  G1 B$ I/ Z
!< 不小于5 f6 w5 V$ s0 _; p" _- Z
例:返回96年1月的定单; b7 I# n9 d% V4 Z: d
Select orderID, CustomerID, orderDate" B. w3 a  p4 ~4 ]. P% v
FROM orders
) M# x5 r$ ^$ j' C! rWhere orderDate>#1/1/96# AND orderDate<#1/30/96## B" ~7 R' O- i; X7 B# g5 M9 a0 _
注意:5 P$ f0 [- N) G& Z+ W5 J& _: W$ n
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
) J( f& ~& |) b1 p8 b# u6 P例:7 y. ~" x) B' v
Where orderDate>#96-1-1#! X/ J, p6 A' E: q# P
也可以表示为:
/ o1 t* r! j; y) s- CWhere orderDate>Datevalue(‘1/1/96’)8 M- o& t  x' l# N2 g1 X
使用 NOT 表达式求反。
: D6 J( F9 }! }例:查看96年1月1日以后的定单
6 ~! W: `3 l7 U/ O4 X: p# A' nWhere Not orderDate<=#1/1/96#  m  V2 I6 N, M* ^
2 范围(BETWEEN 和 NOT BETWEEN)
3 R, w, Y, b+ K' Y# IBETWEEN …AND…运算符指定了要搜索的一个闭区间。& V9 Q6 J, O2 n) {) u# T
例:返回96年1月到96年2月的定单。) H/ a9 _: I, h) t  p% a6 w: M
Where orderDate Between #1/1/96# And #2/1/96#
9 A+ c- P% l& }1 _2 E" j1 j  y1 ^3 列表(IN ,NOT IN); J. [# b! ?5 a1 U; U% {
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。; e& e6 Z, C8 i1 |- N5 p: S6 \% d
例:要找出住在 London、Paris或Berlin的所有客户
  F! p3 R+ e' b5 W, }3 sSelect CustomerID, CompanyName, ContactName, City
- J: F0 |( P- }/ PFROM Customers
! \2 b4 B% u, j# }) tWhere City In(‘London’,’ Paris’,’ Berlin’). D) p. F6 q- ^0 W. s1 H3 v
4 模式匹配(LIKE)
. x- h8 i; f/ F* `8 RLIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
' X1 i" `) G7 S& a; RLIKE运算符里使用的通配符
8 [0 C# O4 L2 s8 r+ a7 o通配符 含义7 I0 R. m3 i% T# u! O" B4 o
? 任何一个单一的字符
3 d( M& \$ o* m. Z% c  i1 y- }* 任意长度的字符
: @1 e) Z1 p" h4 p0 L' w- [5 ]# 0~9之间的单一数字
) q, m( K3 a( T# ][字符列表] 在字符列表里的任一值, W8 W4 C8 J  P* @
[!字符列表] 不在字符列表里的任一值
& w  E' M3 a3 f- 指定字符范围,两边的值分别为其上下限- d; P( g6 y, @/ P  Z  }1 H+ j, y
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户4 Z* R  \  A0 Z
Select CustomerID ,CompanyName,City,Phone
. T5 g: y8 d# d% ~- KFROM Customers
& O9 V. }; z! o) H9 F* lWhere Phone Like ‘(171)555-####’& N: `. V/ }3 R& Y
LIKE运算符的一些样式及含义. Y2 k8 i/ P0 {% r, z" n- M3 y9 q
样式 含义 不符合6 R& d5 V0 [9 p
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
0 S" ?, Z- u+ ~, S( b# V/ f& H# LIKE’5’ 5*5 555
* w" {  A( m$ y, |LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5$ p3 w# Q$ o# A2 E* I+ C0 z; h
LIKE’5##5’ 5235,5005 5kd5,53463 d  W5 w( h6 y& z8 p
LIKE’  [# |! s9 O* d8 e% Z3 t% d
[a-z]’ a-z间的任意一个字符 5,%: d* H& J  ]; W) `+ }6 i* ?
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1* K: @  C  S- N: Q# J
LIKE’[[]’ 1,*( |$ Z! _/ o: g2 t1 \3 z
三 .用ORDER BY子句排序结果
7 R5 p: t8 Y6 Y& L  O6 VorDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。: a; x1 Z9 H+ i
orDER子句中定义了多个字段,则按照字段的先后顺序排序。
9 I9 y* c+ O4 j4 j/ T) _% ~例:+ s0 ], V0 K8 i. L4 N+ ~! e4 W
Select ProductName,UnitPrice, UnitInStock2 N1 v' u% l. S
FROM Products
% z8 }% x4 X( Z/ k, v( ^- b! R1 IorDER BY UnitInStock DESC , UnitPrice DESC, ProductName) R1 J% J0 A) `/ f7 G
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。4 A/ z; O, }5 a6 J8 z5 h! m: c
例:下面的语句产生与上列相同的效果。
5 Q) J3 G3 c; e- T) GSelect ProductName,UnitPrice, UnitInStock5 L# b! q9 i* z2 x% R9 N; a/ w! m$ ?
FROM Products
+ E7 G, u. p, Q  a( i; V2 LorDER BY 1 DESC , 2 DESC,3
0 E  {* z9 j' p" J四 .运用连接关系实现多表查询9 L# n: Y( g2 K" E' Y/ V$ N4 ?
例:找出同一个城市中供应商和客户的名字( v8 }- B: ]& z) W' B
Select Customers.CompanyName, Suppliers.ComPany.Name
5 ~6 z. w3 g9 [5 S* D3 PFROM Customers, Suppliers
, j2 s* v8 z& d) k1 }+ ~* j8 DWhere Customers.City=Suppliers.City
( r6 R  i% O, o* A  n% ~例:找出产品库存量大于同一种产品的定单的数量的产品和定单2 C6 h( ~. C9 k5 \5 a
Select ProductName,OrderID, UnitInStock, Quantity2 M* G( z% k, T  [
FROM Products, [Order Deails]
! c- g+ K9 c+ R+ MWhere Product.productID=[Order Details].ProductID
5 G  p% i* Y* |- f' j$ s3 eAND UnitsInStock>Quantity
% O1 W0 @& N' d. }4 {另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
: B$ a3 {5 M, o5 R% z语法:
. p8 ]. x# b* N$ t8 P" jFROM table1 INNER JOIN table2' F/ E8 m) V& j; \! K) n
ON table1.field1 comparision table2.field2) S) J0 b' e. Y7 T  k% o& {' w
其中comparision 就是前面Where子句用到的比较运算符。
/ W& G* W+ T- ]1 |" s2 ]) ESelect FirstName,lastName,OrderID,CustomerID,OrderDate; T0 l* {, I% U2 p7 F
FROM Employees: r+ F$ u) \0 K% B# }
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID0 e0 A! v4 I$ N0 A# E; H! E3 K
注意:& ?) y5 x" w- p9 L0 S
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。9 t7 _; b+ e. o; I" h$ i3 [
在一个JOIN语句中连接多个ON子句& v6 {$ s9 G" O8 P; A2 _: g3 \" W% c! p
语法:
- G6 i( W& |; E2 n# eSelect fields
9 ~8 l5 U: |% MFROM table1 INNER JOIN table2
" k& e8 n  Q2 p  T- JON table1.field1 compopr table2.field1 AND" a! {: y7 {( r; r( G4 j
ON table1.field2 compopr table2.field2 or
6 r5 x" |. Q8 g9 F" fON table1.field3 compopr table2.field3
6 ~& ~/ l9 Y" Y. X/ }也可以3 o6 ]+ a7 M( v( D, f# F& K
Select fields
) q$ h7 W4 @1 m8 b% i7 L8 T& X+ VFROM table1 INNER JOIN
$ Q& K" Z+ O: h. Y: ](table2 INNER JOIN [( ]table3" j/ v) _: a  \9 t& v
[INNER JOER] [( ]tablex[INNER JOIN]
: {/ Z! a9 K: Y- S8 x5 [ON table1.field1 compopr table2.field1
& {( @: z/ x' t  n9 eON table1.field2 compopr table2.field2- u. k* U. I2 s3 O
ON table1.field3 compopr table2.field37 c2 r7 K" Y6 _) |
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。3 ^6 j7 U8 D$ a+ i9 ?, g/ P
FROM table [LEFT|RIGHT]JOIN table2
. h% }" e8 ~' q. i! r# D9 JON table1.field1comparision table.field2' J$ ]/ n1 a: p; z6 u
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
0 L+ C9 v; |2 i& i例:不管有没有定货量,返回所有商品$ g1 b4 i  t% u2 z3 s" }
Select ProductName ,OrderID0 }( B+ v9 Q3 P  A" Q
FROM Products
6 n4 U9 w7 w, ~* a! \LEFT JOIN orders ON Products.PrductsID=Orders.ProductID& u& x+ Z2 w# i( ^4 C9 U
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。( X: F  @/ {8 F9 Q4 ~
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。7 \2 _2 l5 D4 b6 Q  l+ \/ o
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。! h( g/ q5 X; p! D% `
Select *+ ?4 w$ G; O; j
FROM talbe1  a; y# M/ a( m
LEFT JOIN table2 ON table1.a=table2.c
) D+ l- W' V, p1 p8 O+ }1 连接查询中使用Iif函数实现以0值显示空值- w6 F; O7 E4 h, N) U
Iif表达式: Iif(IsNull(Amount,0,Amout)$ ~& I2 n0 B6 ~" b' `
例:无论定货大于或小于¥50,都要返回一个标志。
' @9 [% U, V' U& P8 l  GIif([Amount]>50,?Big order?,?Small order?)
' f) X  w0 y: c2 g0 q1 ?0 [五. 分组和总结查询结果9 Q* q% g6 c( N0 {2 U0 R
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
. h/ G+ v& Z; Z8 TGROUP BY 子句的语法
$ {6 E9 C# X2 i9 XSelect fidldlist. t" o; l( `0 y8 r2 e
FROM table
. U- P; G' f. s0 D# G; w, Y6 hWhere criteria
7 V; C' j9 \! x6 v# B[GROUP BY groupfieldlist [HAVING groupcriteria]]
' c9 y; y" m. b/ J注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
# Q8 S& ^7 e1 z8 B! H! e9 z9 fGROUP BY字段中的Null值以备分组但是不能被省略。
9 M7 ~! R7 b0 @9 u: e在任何SQL合计函数中不计算Null值。
. S  G1 h: C! w6 _7 J+ l; RGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
( O6 h7 Q& W9 D2 L" h) T例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。$ H8 ]2 F0 f: i- y$ k5 w
Select Title ,Count(Title) as Total9 K2 |; C' P8 T) _3 ]. K& o2 \% [$ m, }$ d
FROM Employees
/ v) k0 Z7 {  BWhere Region = ‘WA’4 [( Z" g, O7 b2 |
GROUP BY Title
! i' X3 i( j- I: `% Z# pHAVING Count(Title)>1
* G6 x, h# K/ t) CJET SQL 中的聚积函数
, J7 v5 |* \# M聚集函数 意义
; J/ @' o  x1 B; U+ |# lSUM ( ) 求和* C, j: W) J  s
AVG ( ) 平均值" g0 p$ E/ J/ ?
COUNT ( ) 表达式中记录的数目
" j* F. H1 Y6 c$ o0 YCOUNT (* ) 计算记录的数目, _. R5 ?- f9 \  y
MAX 最大值$ `2 d$ d8 W) i+ ^! @. K
MIN 最小值/ @! c( p' k$ A' k4 G# T
VAR 方差
% R% P) d. V0 Z+ R$ L7 lSTDEV 标准误差! l# e7 }3 W0 l/ R& k1 a6 p
FIRST 第一个值
9 D& k# g9 B! ^. P" B: ^/ W) eLAST 最后一个值
7 Y  t/ X- h: N5 X, M1 f& J六. 用Parameters声明创建参数查询
2 ~( _/ W  O4 fParameters声明的语法:  N/ X6 f6 u1 x7 @  U6 K
PARAMETERS name datatype[,name datatype[, …]]
/ a: a% ]3 k% r/ C其中name 是参数的标志符,可以通过标志符引用参数., m' @$ X# s% P# m- H5 b3 i! s5 d' f, E% U
Datatype说明参数的数据类型.4 S& ^( P. n9 m! K
使用时要把PARAMETERS 声明置于任何其他语句之前.
# Q/ |, B; v* }/ R7 \7 L2 }例:
- a9 @" b+ F1 A! I: dPARAMETERS[Low price] Currency,[Beginning date]datatime
, A6 b+ t( k% tSelect orderID ,OrderAmount9 R: P2 Y  w  j! h9 z
FROM orders, U" ~; H% C# s' M" I# }. v1 O
Where orderAMount>[low price]
5 Y. U0 w, v1 K- W* dAND orderDate>=[Beginning date]
  o, x" r/ B# M% p+ K七. 功能查询3 W( S% f# J6 d1 h2 V% A3 F
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.- A+ l; k& z5 O$ Z" Q; v
1 更新查询
: ?6 k, @5 @+ O# P0 OUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
2 E5 a9 \: o7 M, n$ H更新查询语法:
; q) \+ g3 V9 Q: IUpdate 表名
- r& i/ B+ l! Z1 ]/ v1 C0 d- M2 ]SET 新值
# t! g* O7 [( U4 {' O$ K+ }Where 准则& d5 B# M$ v' _  R1 @
例:英国客户的定货量增加5%,货运量增加3%9 g9 F, l/ @* y2 x
Update OEDERS
4 z/ x% t1 P/ r/ f  \) g$ QSET orderAmount = orderAmount *1.1: q& J/ f  D3 `6 H  `; q
Freight = Freight*1.03$ ^! u! @8 G( U7 E# K0 p+ @
Where ShipCountry = ‘UK’/ v6 ^( g% I- j
2 删除查询. H- r# U3 C' U( X* v- T3 U
Delete子句可以使用户删除大量的过时的或冗于的数据.
) S/ }% K. t0 ]1 O% `3 @( s注:删除查询的对象是整个记录., \! u: B6 r- f6 e7 ~# y; ^
Delete子句的语法:
0 c0 w" }4 R8 N- UDelete [表名.*]
4 k% b! ~6 U9 s1 c. m( V' c' bFROM 来源表
4 t/ w. R; ~$ `* M" r+ l% {  HWhere 准则& V( N- ?+ e  F0 Z
例: 要删除所有94年前的定单' k; n  b: M4 C1 T1 `1 l+ }
Delete *3 T% `" S8 P/ r  o( I3 @
FROM orders
+ E5 s3 l' n$ u  j2 W$ L1 C! ~Where orderData<#94-1-1#* @8 H' i7 F# b
3 追加查询0 K! g: B0 Y, ^. f* D0 p
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
2 i- ]( x% {7 ~7 v1 e; WINTO 子句指定接受新记录的表! B0 s+ S2 H- r7 ?6 Q3 E$ a2 H
valueS 关键字指定新记录所包含的数据值.. ^' A# M% Y# }3 f0 I/ n( Q
Insert 子句的语法:
2 ]: M4 X- @& |& MINSETR INTO 目的表或查询(字段1,字段2,…)
6 s) J3 L' W: S, r$ R% lvalueS(数值1,数值2,…)& x1 H) {/ t6 G4 T! l5 D
例:增加一个客户/ Y, m2 r) x$ W* v0 v7 g' t
Insert INTO Employees(FirstName,LastName,title)
* M9 j: u' g: u2 R2 X2 `valueS(‘Harry’,’Washington’,’Trainee’)
2 O! J: X0 y8 J7 D! _  @4 生成表查询
# K  M, ^/ f4 d' ?$ o; F$ b可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.9 |$ Y6 l. ~5 L0 Z
Select INTO子句用来创建生成表查询语法:2 `/ y- O6 A, i
Select 字段1,字段2,…: T- O5 u% Q5 H/ _2 ^( w
INTO 新表[IN 外部数据库]
3 z. x1 J1 {9 fFROM 来源数据库
/ Z+ [! V% y) h* J3 P- {3 ^Where 准则! @( I# R2 C& Z2 q
例:为定单制作一个存档备份
2 F; t7 [  t) K' BSelect *
2 T, k- b( _( ?& F) eINTO ordersArchive
: s- ]9 j* F/ h+ N2 E( l# b* aFROM orders5 ]5 f  u4 d/ O- f7 Y1 }( w& @# d
八. 联合查询3 p. P% {1 S( |4 G% i
UNION运算可以把多个查询的结果合并到一个结果集里显示.# t8 m. ]1 p7 j& T$ ^8 m
UNION运算的一般语法:
5 V4 z* Y* x2 Z3 J9 F. A& b[表]查询1 UNION [ALL]查询2 UNION …# B: \! f1 g, F5 A7 D
例:返回巴西所有供给商和客户的名字和城市
5 x+ V5 S6 A* a7 k( j9 n  T3 l: s: ySelect CompanyName,City. z+ L7 O" ^6 W, M' o
FROM Suppliers2 f, s5 j/ T! b
Where Country = ‘Brazil’
  K1 M$ `  f& R% e6 Q9 eUNION& [' Q% a* @0 c6 x; E; l
Select CompanyName,City
( d: _' Z* x% a+ oFROM Customers
5 f4 P0 p  D; S9 i- e* m1 CWhere Country = ‘Brazil’
# k* m# R( O% \- ^+ t( S注:# t- i9 A2 r8 U6 L( D& Z
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项3 [* u. _9 t' ]% o% Y# }
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.1 W3 d. D1 x# O' R/ }7 n
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.6 k, f4 V0 W- t8 S5 G
九. 交叉查询; {( g- `* p; _2 Q; M
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.; |6 A! w: `$ _5 {2 H3 B
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:- n, `3 p/ f1 ]9 X* H" C3 }1 y
TRANSFORM aggfunction& ]! u% y& O6 R; W7 k
Select 语句
  m5 Z" k, ~3 l& I% m, cGROUP BY 子句, d# z9 u! K0 T& v$ [* Z" J) D$ G
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]; G" L# _. B4 S- N# \$ b
Aggfounction指SQL聚积函数,* u9 u0 u4 Y0 R3 s3 N6 i; D
Select语句选择作为标题的的字段,
, k% z5 ^* ^: yGROUP BY 分组, F/ H* K+ P8 P, v* r
说明:
2 ~7 [7 E7 f. D+ p# SPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
, {0 M6 p, e9 \1 L% avalue代表创建列标题的固定值." {+ k# a; ^% q5 v
例:显示在1996年里每一季度每一位员工所接的定单的数目:  |, z0 @1 g8 p2 W% N0 I
TRANSFORM Count(OrderID)
# P* W  o; Q: I1 [Select FirstName&’’&LastName AS FullName2 m1 g0 r# ^4 k: J
FROM Employees INNER JOIN orders
7 z+ f: d7 O. J( p, mON Employees.EmployeeID = orders.EmployeeID
& _5 R$ R6 q8 M( b/ b+ K& L6 E/ TWhere DatePart(“yyyy”,OrderDate)= ‘1996’8 g( Y* |4 u3 @6 K
GROUP BY FirstName&’’&LastName8 M6 ^5 W7 p; _' j0 K
orDER BY FirstName&’’&LastName2 `3 ]) C% f) ^6 K
POVOT DatePart(“q”,OrderDate)&’季度’
1 S- z! B7 k3 [. y7 u十 .子查询, g$ O6 D9 r+ V4 G9 K2 h. ]
子查询可以理解为 套查询.子查询是一个Select语句.
& p  I! Q, ?( M* c% `7 [6 {7 X1 表达式的值与子查询返回的单一值做比较
# s# I( @/ S: ?* G/ M3 }语法:
8 _5 |* S3 q9 m( K0 {表达式 comparision [ANY|ALL|SOME](子查询)
6 W* h; M" Y; `' s- Q* R9 a说明:
5 t* N4 P" u# j" H) l  mANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.( y$ N3 o# x% Z3 |6 S# W
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
3 F. I4 O1 F- Y7 ]) ZSelect * FROM Products
3 a5 Z* ^0 `/ ~% B6 b3 K' s5 bWhere UnitPrice>ANY
; h1 ?3 e( R5 m6 _' f4 ?(Select UnitPrice FROM[Order Details] Where Discount>0.25)) I+ ?( \) b& l/ t$ @. D  F
2 检查表达式的值是否匹配子查询返回的一组值的某个值' r6 q, G' M# B) _$ z. M4 y
语法:5 m; g: z. R+ l4 ]
[NOT]IN(子查询)3 j6 Z% x  k/ E' v% f
例:返回库存价值大于等于1000的产品.# s* b$ o" Z& Z, R9 `7 r
Select ProductName FROM Products
4 c; d# L* T" }* h. nWhere ProductID IN
3 s3 N& M7 i! Y( R& G& Q- P/ [* n1 p(Select PrdoctID FROM [Order DEtails]
  n; f; U) ]3 t( K8 s# i4 `' oWhere UnitPrice*Quantity>= 1000)4 s0 R$ M. i; b# |( j1 C
3检测子查询是否返回任何记录7 H1 s" V; c3 J4 e5 y0 w% z- `
语法:" d& V2 k5 F- D' c
[NOT]EXISTS (子查询)5 f+ w, C" [4 J
例:用EXISTS检索英国的客户% q& g! b' T; j+ J, J8 O$ U, i2 N  [
Select ComPanyName,ContactName" Y2 `6 N8 r" K5 Z
FROM orders/ f# v7 N$ W1 i: M
Where EXISTS
/ r+ \) M& E# o(Select */ H& v5 `8 i  n7 h- G3 N, H; E
FROM Customers$ d  F2 J' a8 J3 z" G8 O
Where Country = ‘UK’ AND9 ^5 I, Q% X4 [! G- O8 e
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-10-5 00:41 , Processed in 0.027001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部