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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |正序浏览
Access如何筛选重复数据以及Select语句的完整语法% T5 M! {! L$ a" g) s) H
2 j' E8 |4 Y3 x8 m# ]
select distinct 字段 from 表名. i9 a! A& I1 h/ e8 o0 R8 J
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
' V* |8 X3 e4 C5 [一.Select语句的完整语法为:
1 A9 b' v& ]  r. i+ GSelect[ALL|DISTINCT|DISTINCTROW|TOP]* i; a! G  }5 x6 z
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}, P; e" }$ o7 d/ i8 B
FROM tablee xpression[,…][IN externaldatabase]& L* L1 }' x' U9 R. ^* e
[Where…]6 ?2 t3 a9 e5 A1 v
[GROUP BY…]
. Q& ?+ _" y1 C$ J9 O[HAVING…]2 Z* s9 F3 d  A* _( ]
[ORDER BY…]( b2 V, R& ^! p  x6 T
[WITH OWNERACCESS OPTION]
8 \) j+ B: _2 S% a6 p: }: W说明:
$ g9 R9 {: f1 Y9 |  Y- l+ \) n6 H% I用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。4 W' ?+ O. |0 }9 e  @' F
1 FROM子句$ h& Z  s/ M7 _8 G2 e
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。- |+ J% X3 I1 J0 B( |9 S
例:下列SQL语句返回所有有定单的客户:
0 u+ u. d5 [2 X/ w: tSelect orderID,Customer.customerID/ i/ l; O8 W: s5 C
FROM orders Customers) c' @8 f0 Q' t) k! s( ^
Where orders.CustomerID=Customers.CustomeersID
$ b, i6 ]9 o3 P* f) x9 q, w) s9 s2 ALL、DISTINCT、DISTINCTROW、TOP谓词
; M# J& X7 J1 z' J3 {0 L(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
# z8 w; W5 A) g' ^! r! K  L/ g! W; h例:Select ALL FirstName,LastName
5 [: z) B0 `, e4 _' w: H. V: {FROM Employees. h. P9 R+ \6 I6 s. Z5 p, V$ Z
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
+ ~# O7 d* i1 P/ c, k& g+ [(3) DISTINCTROW 如果有重复的记录,只返回一个
2 o9 p/ {; g5 n; n/ _(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
7 D+ K* c2 z( g, r# s# E% U" r例:返回5%定货额最大的定单/ p& y  w2 N/ J4 E
Select TOP 5 PERCENT*
* F+ v; N/ _8 N: m0 eFROM [ order Details]9 I( U0 }; \9 X0 ~
orDER BY UnitPrice*Quantity*(1-Discount) DESC
9 t1 m$ {" e# W' }: A2 j3 F) u3 用 AS 子句为字段取别名
* @5 Q- U3 k6 z$ T, }2 a如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。6 G4 T. m& _( ?( m3 T( P& L9 e6 k" Q
例:返回FirstName字段取别名为NickName, W  a. X$ s  p0 C
Select FirstName AS NickName ,LastName ,City
! N- E. p  h3 j2 X$ {FROM Employees
/ u9 N7 t& n2 n$ V  g. a* Y$ R* D5 C例:返回新的一列显示库存价值
2 p: r& m+ u! B% P# YSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
  g' y/ p3 g' MFROM Products) u& U7 S/ u+ v# i
二 .Where 子句指定查询条件
/ F5 y7 \) D) T5 ]  k6 O9 A1 比较运算符1 ^4 `$ U! h! x  s5 ^- W$ x% B
比较运算符 含义
9 i1 G7 Q. c/ O. i" h$ ^= 等于
" s0 C4 W  V! \5 x  ^+ J> 大于
0 A+ V7 B. f) E) M5 U$ Y< 小于! ]. @1 ?* h8 _7 J1 X4 v
>= 大于等于
7 X4 R* S/ v: B<= 小于等于
3 S! a2 B0 }3 B" ?* Y9 x<> 不等于1 c) [  Q& U$ o8 }/ S! S* ]6 v
!> 不大于
! i  S! T( {7 Y* _) P& M8 S!< 不小于, p1 ]( O% ^6 D2 B2 ^
例:返回96年1月的定单* Q  s7 @6 S" a. D" o. b9 n
Select orderID, CustomerID, orderDate
: h' B7 ~& ?5 {& ~. d2 V2 ^7 DFROM orders+ `4 h& ^5 L  I8 y9 B. R- Q/ J! z
Where orderDate>#1/1/96# AND orderDate<#1/30/96#! K7 }9 ~: L6 j# R/ J% A
注意:
7 h4 V! F3 ~# ^* |% _; V( p9 lMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。. j. A8 S3 Z( o, J% B" ]. e1 d
例:
* o8 M0 C: G6 X5 j( EWhere orderDate>#96-1-1#
" b+ |, P/ M+ l也可以表示为:
0 L7 a+ x6 S6 F4 X" }Where orderDate>Datevalue(‘1/1/96’)
8 ]. w+ z1 _1 T使用 NOT 表达式求反。. s% O' S7 H; v8 q/ S) d
例:查看96年1月1日以后的定单* M3 H$ [$ C7 |8 r; M" G
Where Not orderDate<=#1/1/96#
& D$ H: ]" L4 R1 S, p! l9 e2 范围(BETWEEN 和 NOT BETWEEN)
% I5 Q) X& z3 l/ ?5 }) }$ tBETWEEN …AND…运算符指定了要搜索的一个闭区间。, p, z5 g4 D5 F6 l" f
例:返回96年1月到96年2月的定单。* K0 ^8 s0 h- J" M$ Z& k; T0 {
Where orderDate Between #1/1/96# And #2/1/96#7 [( M* N* T/ I9 y3 \: Z
3 列表(IN ,NOT IN)
3 W0 w% U6 W9 P9 I9 o/ `& R( NIN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。8 c5 `) @/ i1 C0 v5 q: m
例:要找出住在 London、Paris或Berlin的所有客户' D! n; S! M* n
Select CustomerID, CompanyName, ContactName, City
$ X) {% T( B0 O  e2 ]FROM Customers
) s* S- w- S  vWhere City In(‘London’,’ Paris’,’ Berlin’). G. x6 r* A+ e( U8 t
4 模式匹配(LIKE)
( o5 J7 A6 q1 K: \3 n+ ^, h; _. }LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
: S  t$ F8 ^, x) F+ H0 x. P  ^LIKE运算符里使用的通配符! U$ M9 z+ y" q* x9 v! z3 B
通配符 含义. _9 j9 d1 E* P& f3 ^! s$ o' d
? 任何一个单一的字符& H; ]  J7 g0 ~* h% w
* 任意长度的字符
. T8 A) `- w* a& A; O/ i# 0~9之间的单一数字
& ~7 p/ w; z2 j/ F& x& K: F[字符列表] 在字符列表里的任一值
8 J* J& X7 H( p[!字符列表] 不在字符列表里的任一值
' y# ^* t$ f9 G- 指定字符范围,两边的值分别为其上下限! U) }& r: b; T; I
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户2 d8 E. K- [; ^( {
Select CustomerID ,CompanyName,City,Phone: b+ E; j; j: l4 @  G! h* M  e
FROM Customers
& G. @' }/ A% b* p5 j) cWhere Phone Like ‘(171)555-####’
; v" ^' R$ q1 g5 z6 yLIKE运算符的一些样式及含义& @: F6 S0 N" R. w
样式 含义 不符合
1 o7 f8 D% S, t% F' dLIKE ‘A*’ A后跟任意长度的字符 Bc,c255
4 L* q2 v: y5 ?# r( x! Z4 g& u# LIKE’5’ 5*5 555" C2 N. c% j' Z
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5) v% W) p4 d  L$ t
LIKE’5##5’ 5235,5005 5kd5,5346
6 `3 _) `! H# K- `LIKE’( ]8 `8 n4 q+ z0 J7 l, n2 s
[a-z]’ a-z间的任意一个字符 5,%
6 }! m1 o2 M% h4 h* x) r) mLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
4 `/ j* T' |- l$ RLIKE’[[]’ 1,*, R' w7 L) a: L0 l& e
三 .用ORDER BY子句排序结果
' `$ W  \/ L' v0 t# O5 ^orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
1 o8 v; W  z2 K+ |  I* s! C* p0 PorDER子句中定义了多个字段,则按照字段的先后顺序排序。
4 g# P9 o8 J- i7 R, U. I& z例:) g  Z2 H, Z+ d
Select ProductName,UnitPrice, UnitInStock% c9 ^6 k3 J7 l' ]. |# ]
FROM Products4 l) g$ w% h: g8 v) Q* M
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName, c+ ~& w$ u+ ]8 i
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
% Q5 y% z* l2 i- q$ C例:下面的语句产生与上列相同的效果。. a- s: O1 A0 x8 N' B
Select ProductName,UnitPrice, UnitInStock8 T: T% n/ G8 w$ {+ g" r
FROM Products
# @6 |+ C/ u% U8 z) X3 C- A" D8 Y' H0 V, AorDER BY 1 DESC , 2 DESC,3
3 W$ _2 p2 _9 S四 .运用连接关系实现多表查询
- ^7 L' i; f7 v3 O2 P1 U' }# _7 q例:找出同一个城市中供应商和客户的名字# y$ F( u' U6 P( i+ v0 g5 j6 Y
Select Customers.CompanyName, Suppliers.ComPany.Name! V4 q/ R) _# j2 f" F
FROM Customers, Suppliers
, _8 b0 ?' m$ f) WWhere Customers.City=Suppliers.City
2 m0 S7 w% b8 {. W+ h! K2 a0 N; }: Z4 k例:找出产品库存量大于同一种产品的定单的数量的产品和定单
# F* C8 m0 u! b9 t# d# eSelect ProductName,OrderID, UnitInStock, Quantity
4 g( V2 H: V+ U4 cFROM Products, [Order Deails]6 n4 {8 t1 V  b5 K2 |( \( t) T
Where Product.productID=[Order Details].ProductID
6 h- T% C$ E! D% Z( f/ \  W( _AND UnitsInStock>Quantity
  i0 }/ t; M  g另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN
( c; B* c3 r2 c  Q语法:
) ^5 m- H" ]- x' A; v/ E9 eFROM table1 INNER JOIN table2
. Y8 Z1 X6 K# eON table1.field1 comparision table2.field21 }6 e4 Q4 ~) w# y
其中comparision 就是前面Where子句用到的比较运算符。, S1 W2 V( f! \( i$ h! H
Select FirstName,lastName,OrderID,CustomerID,OrderDate4 ]& X2 @" C7 r
FROM Employees
- L2 m' X7 k* N2 K& S5 XINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID# b  F6 `" h3 A* C
注意:
* k+ g; _7 i+ \+ {" _INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
9 [! r; y& n7 q5 A& N& Y7 I在一个JOIN语句中连接多个ON子句
7 x8 A" f- t4 h3 _4 X语法:6 e; |+ J  Z) @/ o1 M: J3 X
Select fields; D# x- s- t, x/ {8 C9 b6 c2 B' r
FROM table1 INNER JOIN table2
3 k6 j, T& x, N& WON table1.field1 compopr table2.field1 AND. A: ]+ u; T; S0 A" Z0 e
ON table1.field2 compopr table2.field2 or* H' `- C' O) l7 a; g
ON table1.field3 compopr table2.field31 ?/ h3 d! B8 w0 g2 g0 ^* O
也可以
/ C& {0 }1 q6 B- X( n9 @* P# lSelect fields, \- k) |- g2 F4 w- Z# [
FROM table1 INNER JOIN6 ?9 t' o( q# F+ N
(table2 INNER JOIN [( ]table3
+ E6 b& [( K% n6 F8 e1 U- B* V[INNER JOER] [( ]tablex[INNER JOIN]  o$ z- V! g# d8 F# A6 t  A
ON table1.field1 compopr table2.field1  G6 x/ y, }; i/ W5 e( a( T$ o
ON table1.field2 compopr table2.field2
# b/ T! h8 f* M3 JON table1.field3 compopr table2.field30 ^* i) ~) N# G, u
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。4 |) G( m9 c# p$ m: h4 }
FROM table [LEFT|RIGHT]JOIN table22 Q: _/ Q! T8 d. N: B3 D
ON table1.field1comparision table.field2
8 l; ?6 I; e$ I% K, H用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
% z5 r* L) e" q& F) K2 ~  u: W例:不管有没有定货量,返回所有商品, O8 e6 x/ e5 Y
Select ProductName ,OrderID- ~: K' Q; K  X+ J0 n1 c
FROM Products3 g$ k' v- z5 P9 w6 A1 }1 X% \% |
LEFT JOIN orders ON Products.PrductsID=Orders.ProductID
9 L/ ]: `/ {6 e! v3 W1 f4 l* T右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。3 S2 ]1 k5 \7 D$ _& L5 e# v
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
; _# e6 }% A' T9 N: O空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
" ~# K4 l, \* c" h( kSelect *
, j0 i0 p: j( [& N5 ~FROM talbe1; ^5 M- x! R5 k
LEFT JOIN table2 ON table1.a=table2.c0 n& |" r* w" w/ P* A# Q; w! s
1 连接查询中使用Iif函数实现以0值显示空值$ v4 ?+ X/ c2 P% Q  Z; R/ T
Iif表达式: Iif(IsNull(Amount,0,Amout)
( z5 _* g: u4 g2 ]7 I6 u例:无论定货大于或小于¥50,都要返回一个标志。
& R; L) m( E3 o: i2 vIif([Amount]>50,?Big order?,?Small order?)
; c7 w1 A, u- N9 F! G% I; x$ k五. 分组和总结查询结果( ]  o" v3 x8 _+ l7 y4 l4 r5 D
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。. x3 f! ~0 L' O$ l% \, k
GROUP BY 子句的语法
4 ]* a6 S9 ]  n. l' |! G8 dSelect fidldlist* D+ m4 g7 X  t% l
FROM table4 f3 w' |' v$ E# j" ^
Where criteria
. z2 m" y( C8 C2 F6 x5 e4 h9 n[GROUP BY groupfieldlist [HAVING groupcriteria]]
# O) O- A+ S+ O3 C注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
3 A6 K* r( o- {* |8 KGROUP BY字段中的Null值以备分组但是不能被省略。
6 m3 @0 K; y0 X) {在任何SQL合计函数中不计算Null值。# B2 i9 u% h% |. c  e9 h
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
; n2 s1 j1 s9 \- E例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。! i6 h, B0 g+ g( }3 \: Z6 k
Select Title ,Count(Title) as Total0 [8 ~( ~2 {. f0 }, Q# a; X
FROM Employees" q  }7 x! E3 I) _" d
Where Region = ‘WA’3 U! f: b5 ~$ ?# k
GROUP BY Title3 G& L/ t) e0 J) g9 J8 l
HAVING Count(Title)>14 Y9 g7 l/ |: C% I7 B7 C* ?* b
JET SQL 中的聚积函数
, y  J1 ^$ g2 l, o聚集函数 意义
6 Z3 k, U, S) O3 VSUM ( ) 求和$ \7 Z. |" I. V- H3 g
AVG ( ) 平均值
$ D! x+ N+ G+ mCOUNT ( ) 表达式中记录的数目  @) J0 H1 q# F+ h9 l5 v0 {
COUNT (* ) 计算记录的数目( m: H  g. G7 x
MAX 最大值5 [5 y6 d; `0 K/ W' O/ y
MIN 最小值
8 k  |; q# e! a: C2 T! Z5 gVAR 方差
' G( L/ g" G( v  [7 b/ h* RSTDEV 标准误差! \& B& ?  O' Y5 U. F+ p+ E
FIRST 第一个值8 S2 G- q/ A6 W$ U  ~
LAST 最后一个值& {* b0 X  n& ]3 J
六. 用Parameters声明创建参数查询
6 k+ F1 x/ U: [5 x  F  cParameters声明的语法:
+ y% k4 r/ d; A8 r- nPARAMETERS name datatype[,name datatype[, …]]
$ S( o; Z) c# s4 U7 j$ p1 S3 [- ]其中name 是参数的标志符,可以通过标志符引用参数.% k! c. w( [: y
Datatype说明参数的数据类型.7 i) f; o* a* F( j# y; e; z; w: d$ |
使用时要把PARAMETERS 声明置于任何其他语句之前.% Z1 @2 g( K8 g- g0 ~% e
例:
  L* s% u. y( v' M( t2 A" cPARAMETERS[Low price] Currency,[Beginning date]datatime* {( y9 `8 y1 q# ~
Select orderID ,OrderAmount! [. b3 D! ]4 `6 t4 f
FROM orders. X1 n0 m- Y+ k0 @
Where orderAMount>[low price]
! h  F) d# s$ [: }AND orderDate>=[Beginning date]1 ^1 I. C  f3 K
七. 功能查询
3 a5 I% q: c# Y1 g, {( T) J1 p所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.  t+ j+ @2 S! r# v. u% x. U# Y2 T9 @0 b
1 更新查询
! a9 s* t2 N8 iUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.
0 D; W1 K* R1 Y5 m5 s. _) g* P* x  k更新查询语法:
9 i/ K5 M* I* @& O" T7 EUpdate 表名
5 j9 U* |, j4 y/ }0 T' ESET 新值
/ T* o5 `3 t# t, N2 O- |Where 准则/ |7 }$ N7 a0 V& i2 {
例:英国客户的定货量增加5%,货运量增加3%
9 ^3 F' y0 g+ h  H0 i, t% pUpdate OEDERS
/ ?! ]4 ^: E3 xSET orderAmount = orderAmount *1.1+ d3 ^; K" y  }! ]% C
Freight = Freight*1.030 {3 M. H: Z8 b- M+ R* q* o" x
Where ShipCountry = ‘UK’
2 |7 ?, x- ]; d) Y0 O2 删除查询
. U. j" d' K2 g, S$ F. w& yDelete子句可以使用户删除大量的过时的或冗于的数据.
# Y* o7 }, h- _0 N% A! ?注:删除查询的对象是整个记录.
: \5 {$ L- D/ r) B0 s" SDelete子句的语法:
0 e- ?: F8 u1 A* c6 S# mDelete [表名.*]
( t( N+ T% D2 u4 j: g+ g* G! pFROM 来源表) Y4 s' W- s1 d! [* X. X  i
Where 准则( g3 `' b+ J+ L! K' N
例: 要删除所有94年前的定单( u6 H. e1 t7 Z1 x
Delete *, o) {" q% H+ j$ S
FROM orders1 |5 k: y* p. Z6 i* v& r
Where orderData<#94-1-1#
7 ^1 o0 ~' \9 s* D* M+ N6 Q  O3 追加查询. s) Z' `( m- V
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
& j8 R5 R" b) ?) ?+ m2 H3 X8 _& r  hINTO 子句指定接受新记录的表0 x' T& N+ S& y  n& j( W! ~! Z
valueS 关键字指定新记录所包含的数据值.
# T8 j+ k- ]) g% l* @+ r* [  H4 }Insert 子句的语法:
7 k3 K* Q  h0 w3 x9 O5 D& L! CINSETR INTO 目的表或查询(字段1,字段2,…)
* U5 _+ L) ^, v& L" ?1 u, ^) lvalueS(数值1,数值2,…)) b; x0 x" k% f7 v. b# X
例:增加一个客户
" p& `* e8 d/ O8 y3 FInsert INTO Employees(FirstName,LastName,title)
' h9 [$ z# @2 S6 `1 gvalueS(‘Harry’,’Washington’,’Trainee’), U/ ?/ J' F& H- N
4 生成表查询: A# Y+ ^+ `# \* Q- I2 V
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
, B8 c  `, }. LSelect INTO子句用来创建生成表查询语法:9 j5 C, {8 ]6 H2 B* e
Select 字段1,字段2,…" N# T: j/ L2 P3 Q, Q
INTO 新表[IN 外部数据库]/ p8 j3 }  X# Y1 X7 O% Z, K9 I3 y/ M& J# ~
FROM 来源数据库( \" j* y- ^4 n) m1 |) `
Where 准则$ F5 O1 e: t, Q- X7 u& C/ l; Y
例:为定单制作一个存档备份( o9 w+ _! o0 w2 g4 @1 {
Select *7 x0 d1 b. p* P! K/ b! E: v# s. j
INTO ordersArchive
; {! x- b+ r$ LFROM orders- y8 X1 M2 N! R' g0 [6 X
八. 联合查询  i, T' I3 A; @2 f7 C% F$ u2 j4 S
UNION运算可以把多个查询的结果合并到一个结果集里显示.% |- n6 o+ t- N3 T; Q. [( \
UNION运算的一般语法:" n2 {7 \8 o5 B( x& c
[表]查询1 UNION [ALL]查询2 UNION …
6 u/ t# k/ A' y! X, _4 l* }例:返回巴西所有供给商和客户的名字和城市
; ~  T& g% G0 P; S( e7 x' QSelect CompanyName,City6 ]3 [/ A! Q1 p3 y1 \
FROM Suppliers
5 Y: h2 Z+ S, eWhere Country = ‘Brazil’
. x) \- T. X( x2 V; B/ [% S7 @UNION# z& H7 I% t9 C3 G& H, M6 I5 W
Select CompanyName,City; T$ a( P* n, b4 @! J3 e( p
FROM Customers
/ b" F. a$ B4 L& eWhere Country = ‘Brazil’. b+ c$ ~* y. \3 C& M
注:
4 x8 r  ?. f) h% {; W% F/ `缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项/ h& o; f3 @/ K% K& M7 \) u% C
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.  L& N' \) h8 @# U0 n& ?
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
& O3 d0 z6 w: i. `5 R$ i/ I- O九. 交叉查询- x( Q- c4 D& k. l( K& f$ w
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
% q5 m5 A; O% VMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:5 b$ A; I" {) m, r1 u/ L! F
TRANSFORM aggfunction: O. Q3 E: O# o7 F
Select 语句! Z5 @! H: g; H: G2 {
GROUP BY 子句
: i! ]- i* L$ H2 e5 z. Q  VPIVOT pivotfield[IN(value1 [,value2[,…]]) ]6 P& ]4 v" c, d
Aggfounction指SQL聚积函数,
$ }- X" \# g8 `$ V+ ]' BSelect语句选择作为标题的的字段,
& j9 y* Q. {& q' L& L; U6 c4 \GROUP BY 分组3 L3 `8 A. B3 ?+ k% y% P3 ?
说明:
/ X6 f5 D- r+ h. F1 zPivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.8 {. u: i; a% s. o7 u
value代表创建列标题的固定值.
. m- F0 Q3 m. a! b3 j9 j例:显示在1996年里每一季度每一位员工所接的定单的数目:# h7 ?, a( V; R% I
TRANSFORM Count(OrderID); ]# D2 V7 w" q( l4 f* c7 \2 D
Select FirstName&’’&LastName AS FullName( K# d" Z4 G% e$ `: v! P5 [
FROM Employees INNER JOIN orders! D' e- |! t( K
ON Employees.EmployeeID = orders.EmployeeID: g+ H7 `2 U, e4 ~
Where DatePart(“yyyy”,OrderDate)= ‘1996’8 v. K( l1 U; C0 G: ~& y8 ?0 L
GROUP BY FirstName&’’&LastName8 q& L% G# ?  s
orDER BY FirstName&’’&LastName- t" j9 `- e: k
POVOT DatePart(“q”,OrderDate)&’季度’, J4 v- k" l+ E" s" h$ }; ?
十 .子查询8 _- d1 [: l& I9 n: j
子查询可以理解为 套查询.子查询是一个Select语句.+ |$ x$ ^/ w' _6 w9 h3 L
1 表达式的值与子查询返回的单一值做比较
4 P" ]9 J4 b8 _0 C; X语法:
: o8 q& M2 O" v! e表达式 comparision [ANY|ALL|SOME](子查询)
: B0 g; s6 i, f0 S说明:* K& |! F: m' y, X$ }2 u! x+ r
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
# n( _8 J' ], `% C  o% j. L( m" Q例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品* s! o& t* W1 D4 f5 U
Select * FROM Products* @8 m* o- P# ]; v6 x% N
Where UnitPrice>ANY6 t, o. f3 ?7 F4 o* n
(Select UnitPrice FROM[Order Details] Where Discount>0.25)$ B4 Y1 h3 R5 e0 v8 G
2 检查表达式的值是否匹配子查询返回的一组值的某个值
8 e( I, ]4 B( Z语法:( f6 {! |- z  P
[NOT]IN(子查询)
6 u+ z6 z% Z5 n  P4 A- p例:返回库存价值大于等于1000的产品.
6 q3 [+ j$ u- ~8 `' g1 p& Y- \* [0 P- BSelect ProductName FROM Products
2 {3 R' r# W, W# r) C$ Z% YWhere ProductID IN
4 F' s5 W- r4 e, H' o: D(Select PrdoctID FROM [Order DEtails]: J' ]  |! B4 }  w0 C- f( G1 A+ {* e* U
Where UnitPrice*Quantity>= 1000)
, T- d4 l* k8 l( P& \6 M3检测子查询是否返回任何记录
6 P1 m& K9 P% p语法:
6 a- }+ @" _2 g2 C6 v1 r[NOT]EXISTS (子查询), T5 x4 c+ D/ {
例:用EXISTS检索英国的客户
: A- Y4 T: n+ tSelect ComPanyName,ContactName
6 b8 {3 X6 F/ S, A& P% P2 A/ }FROM orders0 F' A  [2 P8 f5 ~" E, Z& l
Where EXISTS
. ~8 E7 J0 w; @(Select *
: X, h) }; P* s: P( J5 f: k* qFROM Customers
! B% T1 Z% e7 l. K3 I9 Z# kWhere Country = ‘UK’ AND/ ~; u" |. W8 \* Z1 K
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-7-3 15:07 , Processed in 0.027002 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部