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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法* X& q. h8 W4 P; d) L5 A
8 P+ E' s% c( o$ ?
select distinct 字段 from 表名
; E6 y, O9 M$ ^distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。' u- H7 J8 z9 g3 ]
一.Select语句的完整语法为:
6 a4 ]) o; J2 `. M! `/ O  VSelect[ALL|DISTINCT|DISTINCTROW|TOP]
' V1 d/ W  [1 ]6 q, P) P/ f{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}8 s$ k- l# G1 B
FROM tablee xpression[,…][IN externaldatabase]  o2 J/ I3 m' a6 ~' [
[Where…]
7 e; V; h6 s- O: ~" z  D, K2 }[GROUP BY…]( p8 `, @" ^. y) q' P
[HAVING…]3 n' e, e6 o' N4 {9 T1 Z
[ORDER BY…]; K5 ^1 P" V  C; O! C  |3 J9 U: [/ N
[WITH OWNERACCESS OPTION]4 C, y/ O$ p4 U/ c6 M6 T, n
说明:
, L5 T: Y. y$ j- j' I$ U1 G用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。, n0 A8 Z% j3 |. H1 Q% t1 U: I9 \
1 FROM子句. s. y1 E6 q& \2 J
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
7 X) K" L( R3 }- ~9 z例:下列SQL语句返回所有有定单的客户:" y0 b- r1 `- b1 e& S- u1 ^
Select orderID,Customer.customerID
8 S+ M: t2 F  M" zFROM orders Customers; w& z8 A4 w$ {: b
Where orders.CustomerID=Customers.CustomeersID  j( r3 {& f! t- n9 ^
2 ALL、DISTINCT、DISTINCTROW、TOP谓词5 _" w% L6 C+ ^2 U% U
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
2 d. y. S/ p! n  ?2 m1 c例:Select ALL FirstName,LastName
0 [" S( L& U8 a$ r7 ^: e4 mFROM Employees
  D  P) u4 X) M(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。9 M, G( n( a* q1 |$ c* C5 [
(3) DISTINCTROW 如果有重复的记录,只返回一个
( C2 c+ t+ B  C& g3 E5 Q' A(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)1 S$ ^8 p  P3 H
例:返回5%定货额最大的定单4 o( h2 u. D$ C7 S+ J
Select TOP 5 PERCENT** J  X/ c* `9 X* m7 B
FROM [ order Details]
  P9 E8 q( F8 l( g% F  s" D' C6 t) G* porDER BY UnitPrice*Quantity*(1-Discount) DESC
& R- P6 y$ d6 G: \) g/ j3 用 AS 子句为字段取别名
2 s6 g; |& j6 d% _8 O如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
9 a7 W/ t) ^7 c! s例:返回FirstName字段取别名为NickName; W0 ~  Q( M) t8 @
Select FirstName AS NickName ,LastName ,City
/ O8 i% J2 P5 KFROM Employees7 _6 s9 y, v, V8 z9 w( n
例:返回新的一列显示库存价值% g+ D7 V/ b% X! C2 T$ k: ?0 c
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock: v! g$ s: e8 d0 d$ ?! b) E
FROM Products, L( x; i$ q" i- L7 Q5 B
二 .Where 子句指定查询条件
" q; h- E5 G# |2 B6 c2 r- N; N  @  }1 比较运算符# |3 l0 G8 Q9 z( Y( q
比较运算符 含义
) m4 n/ M5 Y" g6 a= 等于
+ ]& W6 S- K& ]> 大于' \- ]: T5 s! ?4 P4 h8 R$ \
< 小于
. ?: i! G( d/ o: w& M. @6 C" |>= 大于等于
" }3 T7 l. S# W5 e; h5 x6 d3 _<= 小于等于
* z! Q5 \( w1 W. m6 l5 I* ^<> 不等于
  S% X8 M2 J( Y1 |!> 不大于* a( l5 q9 e! h; |* x
!< 不小于. ]% ~" |* j4 i- e
例:返回96年1月的定单) U, x4 a" E; U5 p
Select orderID, CustomerID, orderDate  \- V! k- ~3 j$ H  y0 \% w
FROM orders
- G# [9 J, u. t/ X# [Where orderDate>#1/1/96# AND orderDate<#1/30/96#4 v0 d) R1 H+ C% q% Z
注意:1 {- q- h3 T# H% k4 h0 C5 Z/ A% t
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。0 ?" ~+ H$ M4 d- m+ m, Q. f1 o
例:+ g7 ]2 L$ g& `- t4 y0 w4 U
Where orderDate>#96-1-1#
, {$ w% N8 W0 s; F$ F$ f也可以表示为:
4 M: `- h6 X4 X' RWhere orderDate>Datevalue(‘1/1/96’)( a2 f& P1 J9 |. w$ e  V. T
使用 NOT 表达式求反。( B+ H( p6 K3 @( B" F6 O
例:查看96年1月1日以后的定单
0 }" ^0 B( I5 y% L+ X/ C' OWhere Not orderDate<=#1/1/96#/ B  `2 C5 ~* ]! b8 c& K, t
2 范围(BETWEEN 和 NOT BETWEEN)
; n8 V2 g/ n0 M$ tBETWEEN …AND…运算符指定了要搜索的一个闭区间。1 J" j9 L: I5 B5 W
例:返回96年1月到96年2月的定单。& ^) v1 q- U; h: Y" F
Where orderDate Between #1/1/96# And #2/1/96#
) ?6 a% r) r8 f, T: x) d3 列表(IN ,NOT IN)
* f% U5 ^2 U6 d( _IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
2 T3 j$ F4 [8 i: e. ^2 _: F例:要找出住在 London、Paris或Berlin的所有客户7 A- F, t* v- o" j* v% z) r
Select CustomerID, CompanyName, ContactName, City
2 J& f. ~8 K) b0 ]8 UFROM Customers9 E6 N7 N0 o1 ?! N9 ~0 W
Where City In(‘London’,’ Paris’,’ Berlin’)) [. ?# i+ e$ c2 a; @6 G" A6 V
4 模式匹配(LIKE)( n9 o; O" E! K+ d/ W0 W: x
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
7 z) U9 `$ M: m7 v! Z  r7 B" E) w! ~LIKE运算符里使用的通配符
+ L6 I, u$ T. U4 O# ], `$ ]通配符 含义% E3 ^7 k0 e; l, R  \/ M9 u5 v& ~
? 任何一个单一的字符
; M, V+ Y, b3 ]- ~2 _# g/ x1 K' ?* 任意长度的字符
2 q6 ]0 O# F6 {7 P# 0~9之间的单一数字3 N) T. C4 w- C5 z4 B' r7 |
[字符列表] 在字符列表里的任一值
" O& o# q7 ^8 B" b[!字符列表] 不在字符列表里的任一值
& L  d+ k$ O9 x& ?- 指定字符范围,两边的值分别为其上下限
5 N' C. M/ R' P7 ?$ ~例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户1 x' N) B* q( U! n
Select CustomerID ,CompanyName,City,Phone- w- W1 C6 X3 V# h% ]9 }
FROM Customers% A  n: {3 V' s
Where Phone Like ‘(171)555-####’* B" z$ B* D2 }) W" T$ D' q% q$ b
LIKE运算符的一些样式及含义" M+ l! }  H) V$ C5 h
样式 含义 不符合
! M6 l3 `# v$ g% M# ILIKE ‘A*’ A后跟任意长度的字符 Bc,c255
% K1 d2 L; S' a. Z6 ~# LIKE’5’ 5*5 555, E7 s3 j) F2 k
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
9 V1 J' h8 p, x( jLIKE’5##5’ 5235,5005 5kd5,5346  x, w1 _. _  e
LIKE’7 [: _+ G0 `) q) G- c# Z0 |1 F
[a-z]’ a-z间的任意一个字符 5,%# \* D' a0 T$ Q5 E- X7 C6 {' }5 U
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,13 \# V1 H5 g9 `: x# X
LIKE’[[]’ 1,*4 V# n. t# c2 N% b
三 .用ORDER BY子句排序结果9 K7 c) i$ u  r: A& M
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
$ C& }2 A" @! V4 G5 V6 \/ ?orDER子句中定义了多个字段,则按照字段的先后顺序排序。
1 x- E* Y. A/ F7 C% s例:
( n' j) F& m. ?" A+ f8 ZSelect ProductName,UnitPrice, UnitInStock( M2 o: `- z' H( k% b% j; a) o( s% M
FROM Products' j; j3 P$ ]* O9 v# G/ Y
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName2 K$ W/ J3 V7 @$ t
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。. l0 T, }0 t) X# l' y+ m
例:下面的语句产生与上列相同的效果。& D7 |" {+ e" d& u. ?5 e/ }; [
Select ProductName,UnitPrice, UnitInStock: \7 k3 }4 _3 Z" p, d+ T
FROM Products
* \4 v3 C2 v9 j" K0 @orDER BY 1 DESC , 2 DESC,3
4 L9 c% y3 a6 L四 .运用连接关系实现多表查询
8 b. z% z/ U6 G- O" U" n) [' t例:找出同一个城市中供应商和客户的名字
+ t  \0 {6 ?, K% hSelect Customers.CompanyName, Suppliers.ComPany.Name
. n& x5 i4 ~/ ~/ p! G4 RFROM Customers, Suppliers  Y$ w4 m8 W0 ^/ d' n6 a. h* f% w
Where Customers.City=Suppliers.City- F$ Y' c. W: `, w% k
例:找出产品库存量大于同一种产品的定单的数量的产品和定单: U3 y+ b7 I+ M; R0 g4 l
Select ProductName,OrderID, UnitInStock, Quantity* J6 ~- O. e6 d0 p  l( u
FROM Products, [Order Deails]
# i; y0 n; h- z# x' C4 vWhere Product.productID=[Order Details].ProductID
$ V4 ^9 g: k, A3 z$ [8 V4 oAND UnitsInStock>Quantity
4 V( a7 w! N$ s7 F另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN2 [5 q3 q4 t  Q( ~  ~$ ~8 Q
语法:
) y' Q+ ~4 A) T' ]2 e* A- {; RFROM table1 INNER JOIN table2
0 v7 E5 ]  r3 c' }" qON table1.field1 comparision table2.field2" |7 g9 I5 S$ S9 j
其中comparision 就是前面Where子句用到的比较运算符。
# N$ d8 k1 j) V( c* XSelect FirstName,lastName,OrderID,CustomerID,OrderDate
+ l/ H1 X; ?# J. w- C" XFROM Employees
, ]" x( m9 q9 c, ]6 j& hINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID/ O3 h+ c" B4 T& Z! g
注意:0 \2 n" }5 G8 ^, T6 t& X
INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
3 Q1 X) W" c2 j# Y- `2 ^在一个JOIN语句中连接多个ON子句+ V6 P; [/ c: w, m1 M: n$ z
语法:& Z. v3 K# h# o: [. c2 w
Select fields
8 S- A8 k9 ^' C" AFROM table1 INNER JOIN table2
/ j/ }# b3 l5 }" d0 iON table1.field1 compopr table2.field1 AND. l- l2 M, U+ \, D2 o
ON table1.field2 compopr table2.field2 or
6 }$ B5 h8 _3 Y. S9 T2 `' ?ON table1.field3 compopr table2.field3
4 {: _' w5 d) R! y* {+ y也可以
( D: T. `+ m+ W- @8 Q7 S: {Select fields
$ U% s# v2 Y5 A/ W3 L9 A  Z" xFROM table1 INNER JOIN
1 a& }- G1 y1 V: c(table2 INNER JOIN [( ]table3
  M" s! I% F: V1 S/ c4 [[INNER JOER] [( ]tablex[INNER JOIN]
+ e& h; R) T) ^. GON table1.field1 compopr table2.field1# k; I" f8 }' T5 h  O
ON table1.field2 compopr table2.field2
7 a. M( K1 E: m: u1 `7 i6 n& ?ON table1.field3 compopr table2.field36 f# E* a' l( T' B
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
$ d- N) w1 h, z6 {0 d) z& L: TFROM table [LEFT|RIGHT]JOIN table2' P  E' f: g1 H' S0 ^9 N, j
ON table1.field1comparision table.field2/ o& H3 a" }# z* H" u0 J3 M) r9 H# L
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
" `3 b8 W$ ^# d5 O例:不管有没有定货量,返回所有商品
% K4 ?' s7 t2 c2 G: ]. USelect ProductName ,OrderID3 w+ n9 P! U- H. m( ?% I0 N% s; o
FROM Products: j' \# p0 F4 T4 h3 M' R7 [4 V9 G
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
# h" D) v( `( m3 Y) @9 |. z' @右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。3 k5 d- t7 ^& n/ g6 f2 y
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。. p; v; A- R* g0 @% {% O
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。7 h, P4 D* B. {% b+ i. L" K
Select *
4 B# C; j) j  J* b7 aFROM talbe1
) ]6 o. J0 X" [9 uLEFT JOIN table2 ON table1.a=table2.c. P# }9 p. D6 }* `; D
1 连接查询中使用Iif函数实现以0值显示空值
7 J1 J0 k$ L  h9 @: `+ ]Iif表达式: Iif(IsNull(Amount,0,Amout)
' V* l; M1 H! u6 r- J$ {; n例:无论定货大于或小于¥50,都要返回一个标志。
1 X8 c+ N' }* `Iif([Amount]>50,?Big order?,?Small order?)5 E- [$ v# e1 X/ N0 |! v/ X
五. 分组和总结查询结果# s6 a# r1 b9 O' x
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。$ d- z9 L, z# o
GROUP BY 子句的语法
7 w& i# y" g' `+ d1 SSelect fidldlist; a4 [3 |) |& M" w. L* H
FROM table
1 X6 @7 X5 l( EWhere criteria
0 ]8 q* G4 J3 \6 ~[GROUP BY groupfieldlist [HAVING groupcriteria]]0 @, c6 `4 r1 K/ {6 ?0 M
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
3 Z8 F, _1 T; Z1 ~9 EGROUP BY字段中的Null值以备分组但是不能被省略。
3 H+ R: r: _, p* V% `: ^' c% @9 a在任何SQL合计函数中不计算Null值。
6 i( {7 P* K# G/ u4 NGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。& m' |) g! X8 N: v- c1 e
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
5 G: x& Q6 t" ^- ASelect Title ,Count(Title) as Total2 Y% {1 ?/ m- |% ~# t
FROM Employees6 g0 y8 b* e0 s* }# R3 S; I
Where Region = ‘WA’. y' N; H% {% Y
GROUP BY Title& P  y( v6 C7 e) a
HAVING Count(Title)>1; a; `  a- E  P
JET SQL 中的聚积函数5 J. a$ q( ~/ t- x8 a" y- W
聚集函数 意义
0 R2 Z( B: ~/ p0 [0 x, i& E1 L  b: kSUM ( ) 求和: I6 s% G% d9 v# }
AVG ( ) 平均值5 m6 q  Y' F& `! B- D! m
COUNT ( ) 表达式中记录的数目
* k5 T8 P( Z0 z, `COUNT (* ) 计算记录的数目9 v2 C2 K! b, U0 @) Z, o1 O2 `
MAX 最大值
7 s4 [& b6 j! ]3 a  j) ?MIN 最小值  C3 x* X. `" e5 p- H
VAR 方差
) V6 a% d# P8 QSTDEV 标准误差5 _# l' E! b- k0 [4 V
FIRST 第一个值
" C' {  f1 g, h  _7 G( K! ELAST 最后一个值; U3 u& g! [# {$ J/ g
六. 用Parameters声明创建参数查询! s  C  U: l) q5 ]: ]9 [
Parameters声明的语法:# ^) i$ {0 S0 J6 u
PARAMETERS name datatype[,name datatype[, …]]3 W+ k5 _0 h) n2 L1 I
其中name 是参数的标志符,可以通过标志符引用参数.
5 Z5 a% b/ e6 d% `' a. ?" L7 i3 F# \1 @Datatype说明参数的数据类型.' ?& w. Z1 y* r
使用时要把PARAMETERS 声明置于任何其他语句之前.
4 K# j  w, i+ z, T例:
# I) q3 I4 U* YPARAMETERS[Low price] Currency,[Beginning date]datatime) U- C% L1 x/ M: Y  `7 k* `
Select orderID ,OrderAmount( r$ L7 {0 B& O6 w7 m
FROM orders
- W% m" M- _- m1 o: mWhere orderAMount>[low price]
+ }3 H0 O4 c7 k7 s6 R5 ]AND orderDate>=[Beginning date]$ `! x  p" x6 F' v- Q4 `* e" p
七. 功能查询
4 g" F) B) x8 C. c: z- t& f: Z所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.
* ^7 q: }, P* V6 V; Q) j# w1 更新查询: t' X2 _% C  ?4 c' l
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.- H' ]/ P1 o$ [6 Q
更新查询语法:
/ R% T0 \% w  GUpdate 表名
. R& N0 f+ t$ f5 E0 _% k' a6 \) _SET 新值
. J) `9 l- n5 D6 G4 I( t2 wWhere 准则
% M" S( O5 @" j9 C6 j6 }" C例:英国客户的定货量增加5%,货运量增加3%
0 C; Q6 W2 K0 @3 mUpdate OEDERS* V, }( P$ i* ?  Z2 M4 I
SET orderAmount = orderAmount *1.1% m9 s8 v! V5 f+ T- Q/ a- @
Freight = Freight*1.03' I3 z! ~! m0 U, k% c
Where ShipCountry = ‘UK’4 W4 |3 S8 a1 h
2 删除查询
2 g; l. u& ~/ X: B# b3 vDelete子句可以使用户删除大量的过时的或冗于的数据.( y. r' K+ t: z; `
注:删除查询的对象是整个记录.
% A+ C. S1 d9 n( a3 hDelete子句的语法:
- [" [' F0 M9 Z- uDelete [表名.*]
$ e+ _* n2 o) f7 dFROM 来源表
: F" ^- L! V/ D5 j6 A0 j% YWhere 准则
; m' @9 r& y7 R7 w. p例: 要删除所有94年前的定单
- L7 w9 W; {5 z$ e& aDelete *3 u5 k0 z' j" M7 u* k8 G
FROM orders& e* }: @  |9 Z3 q  S4 j
Where orderData<#94-1-1#
* q9 R  ?8 v5 S2 r( n7 ?3 追加查询# C: B7 v4 `; {& p/ s  J
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.1 Z* [4 J/ M% X& b
INTO 子句指定接受新记录的表  k( E3 |; t9 l; f$ j' l
valueS 关键字指定新记录所包含的数据值., q* m0 y4 s/ G; M+ y+ W* G
Insert 子句的语法:
& g- \/ j# l: M! dINSETR INTO 目的表或查询(字段1,字段2,…), g$ ~! ^+ v& b) B
valueS(数值1,数值2,…)6 V6 |9 M, L6 a' r4 [& r9 F" L
例:增加一个客户
/ C6 j' V% \# f% |# h. N; A+ r% [Insert INTO Employees(FirstName,LastName,title)8 _' {$ Z  I9 |* R5 _; f
valueS(‘Harry’,’Washington’,’Trainee’)
7 T" [/ L9 e  ~/ c& O  C4 生成表查询. x: s- ^/ _5 ~1 R- H& ]7 a8 D- a
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.' R  ]& j- x. C& t1 O
Select INTO子句用来创建生成表查询语法:% v- a5 Z7 I  ?$ N+ b' P. U
Select 字段1,字段2,…( Q9 ~- w4 q4 |. t( S
INTO 新表[IN 外部数据库]
: V; E3 r1 p3 X5 R1 R/ JFROM 来源数据库
8 D# _/ p) n' \Where 准则
8 O4 d' S$ q5 I% u: ^例:为定单制作一个存档备份
6 K6 v4 U$ \7 W* {( HSelect *
) J! D  F* Y/ W7 B2 uINTO ordersArchive* ]' J7 f: a! S* O& Z; ~* ?
FROM orders7 V+ {/ j. K6 j# {; B  [
八. 联合查询
" [" ^1 ~$ |2 F' r, GUNION运算可以把多个查询的结果合并到一个结果集里显示.
5 D( B" N* r, SUNION运算的一般语法:
9 a0 ]7 j0 j* ~" l[表]查询1 UNION [ALL]查询2 UNION …: E& v8 b& `# ~+ p
例:返回巴西所有供给商和客户的名字和城市0 m6 ]0 \/ D  j1 V
Select CompanyName,City
/ O& O0 V0 m! }* P+ iFROM Suppliers3 z4 u! \! m$ ?6 {  B) g
Where Country = ‘Brazil’
. X& m, c6 N' m  z9 PUNION- @4 r* ^3 ]# u
Select CompanyName,City
1 H0 O* K: B1 e/ P0 fFROM Customers9 Y7 T8 r6 R6 B- ^5 w
Where Country = ‘Brazil’+ a& \2 b! F3 T6 v+ x1 A& t
注:5 X9 w1 [3 B. s' Z( [; b7 ^
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
5 v; u* b$ K3 l# P/ a8 L7 BUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
9 V* m. |  v7 P. c1 a每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.3 {2 U5 g0 Q6 n; s( d5 W
九. 交叉查询
8 |  z, s6 e# W  ?- r1 e交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.. y5 ~8 ~4 Q; J  M) t
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
$ f* V. w% Y5 g) b7 CTRANSFORM aggfunction, A* W2 p) H4 J0 Y- c4 ^6 _
Select 语句
2 I( w! E4 n$ L9 UGROUP BY 子句
* U, c% w% V. T0 P; s2 ^0 A6 o0 n- p) d3 WPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
" D  G) U& O/ z4 Q% qAggfounction指SQL聚积函数,' D# |: v" H) G$ [3 Y' T8 b4 Q
Select语句选择作为标题的的字段,
* u7 ]. W/ ^: a! @) GGROUP BY 分组
) k0 j& w% {. P* p, |2 t% e* o说明:
3 O  l1 N) a; O  ?8 ]* @Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.$ Q4 i, D1 e2 E  c/ e: s% |
value代表创建列标题的固定值.
5 h# J+ ?! K, J( M/ V  K+ L! g例:显示在1996年里每一季度每一位员工所接的定单的数目:) a- _- ~$ J, b( |- t4 x5 v: n
TRANSFORM Count(OrderID)$ A+ S: o! P' }
Select FirstName&’’&LastName AS FullName
& n& z9 o5 S! `% I1 l- q. QFROM Employees INNER JOIN orders
4 R& S- t0 L# v5 ?3 e' F5 }ON Employees.EmployeeID = orders.EmployeeID
  u8 o1 X! N) }( E/ AWhere DatePart(“yyyy”,OrderDate)= ‘1996’5 F1 f3 `* N. D. {: @2 A
GROUP BY FirstName&’’&LastName
0 c2 Y7 {( _% Q7 k7 G0 i' g# r4 MorDER BY FirstName&’’&LastName
0 V; r5 |8 }$ N8 VPOVOT DatePart(“q”,OrderDate)&’季度’# t6 l0 M% Z  {' i
十 .子查询
2 j! U, [1 c& N6 H+ E7 D子查询可以理解为 套查询.子查询是一个Select语句.
  W7 @3 L" i& R2 I+ x1 表达式的值与子查询返回的单一值做比较/ u& T; \3 S2 r- F3 j
语法:" g1 q* k8 `2 x: ^  J
表达式 comparision [ANY|ALL|SOME](子查询)
6 W" Y. p4 q5 v) J说明:
! H- T* q4 j: z' [& h4 P& k1 l. ~ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
8 D- h! H& T: L% H% _' d例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品5 c9 S4 A7 p7 _5 D/ \
Select * FROM Products
6 t2 ~. d+ H  O7 [Where UnitPrice>ANY2 m' y7 @# _7 x
(Select UnitPrice FROM[Order Details] Where Discount>0.25)' }% Y2 _' C; b. p! p
2 检查表达式的值是否匹配子查询返回的一组值的某个值( G; |# l& E( A: ~! c& x
语法:( y( S- A% A+ @# N7 Q) ~" \
[NOT]IN(子查询)# o* J, o  s7 Q* R" F
例:返回库存价值大于等于1000的产品.
$ r5 J# y, K- s+ S9 H% G' uSelect ProductName FROM Products( ^7 [1 ^" }: m/ d: o! C
Where ProductID IN/ s+ S$ V$ N9 l% [$ b& l
(Select PrdoctID FROM [Order DEtails]6 Q& ]1 k0 h/ N- }9 e) l
Where UnitPrice*Quantity>= 1000)  F2 f6 A) G  R2 |& X, [1 e$ n
3检测子查询是否返回任何记录
* R6 S( j& }9 a$ Z( p语法:
" i5 y3 q4 u5 F7 i[NOT]EXISTS (子查询)
6 ?5 }- `7 E+ E# E例:用EXISTS检索英国的客户
' ]/ y! O3 n# U3 DSelect ComPanyName,ContactName
% P( g& B! V. @0 K8 a* JFROM orders! S1 J" s/ N6 B- q1 H2 }. t
Where EXISTS' h, k" o. S) x/ q0 Z* ~, s! n% b
(Select *
6 q+ O) l! g! ?1 |$ ]FROM Customers
8 z. o. h; w2 `  p! R# {  RWhere Country = ‘UK’ AND' P9 v; H" B+ l( A- Z. `# h
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-4-19 18:33 , Processed in 0.031201 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部