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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法: x; X( i( C5 u# \+ t1 A" p3 [" A9 J

$ r0 M: E& B. A7 Yselect distinct 字段 from 表名
* z8 I3 z6 N* [7 \1 ]: Ydistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。8 e  C0 @  M7 ^# v
一.Select语句的完整语法为:
7 q1 i/ e& ~8 w, @! C5 N. E5 \: GSelect[ALL|DISTINCT|DISTINCTROW|TOP]
5 i. g. S2 E7 w, M; ]" M& B0 }{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
2 h, {& I7 r& @/ D$ B6 d. sFROM tablee xpression[,…][IN externaldatabase]
! |% H3 A! c6 r8 _! j& o1 E[Where…]
( U8 ^$ m( G6 i" L[GROUP BY…]
- j; Y( n- ]- N+ ]& g[HAVING…]0 |. N3 V; g8 q9 y
[ORDER BY…]
4 Q' Y2 R, x; \[WITH OWNERACCESS OPTION]( t; A2 S/ ?5 o% u/ x$ U
说明:" L2 o6 g# Z& G$ ]( ]! k0 B1 H$ ]& J
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。$ m$ i  \8 m: [: c
1 FROM子句6 ^4 t' J3 W2 ^0 I4 v
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
, [  y) k/ {! D2 Y2 c例:下列SQL语句返回所有有定单的客户:3 f( w4 i" x# _. x$ i0 \; {5 p3 B. r
Select orderID,Customer.customerID- U* z) b3 }9 M' y3 {& R
FROM orders Customers
) S+ w" w+ z4 u; ]Where orders.CustomerID=Customers.CustomeersID( `( Y% M' H; l7 W/ m' z! _
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
  q+ C. ^; f/ h: @; \1 W6 |(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
' Q5 p& y& Y9 g0 K- G6 e例:Select ALL FirstName,LastName
7 E) g' E5 ]( Z0 hFROM Employees* f! {+ V( p0 ~3 }( ^% A2 ?
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。( c9 Z4 t6 R4 b0 C8 P9 J0 W
(3) DISTINCTROW 如果有重复的记录,只返回一个
4 c8 N4 E2 g. Q, b8 I& z& c1 S$ [/ q. q(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
9 |( M& w0 m% ^1 U4 K% T0 f例:返回5%定货额最大的定单. e; L# L* j; w* \2 H; x
Select TOP 5 PERCENT*  D, M- F0 H( g! g: F$ D; ?
FROM [ order Details]9 R6 S3 E$ R7 p* V) T
orDER BY UnitPrice*Quantity*(1-Discount) DESC
  Z* P9 H  U( d3 用 AS 子句为字段取别名
; i) R/ j: O2 [9 g. B; }* B- O. r如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。( \$ b/ f' L2 A: O. \, I) e/ x
例:返回FirstName字段取别名为NickName
  |3 ?9 k" _4 j. \4 F- |4 E" @1 xSelect FirstName AS NickName ,LastName ,City
( c+ [2 C( `5 RFROM Employees& `) q  S; F& K2 I0 v
例:返回新的一列显示库存价值
3 D2 ]! |% S8 X& Y/ YSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
* }* e. p( _* }. u4 _5 X* w# \8 SFROM Products: u* a& ~7 {) {1 {" ?3 G
二 .Where 子句指定查询条件
! M% s, A9 g; z2 q1 比较运算符
5 X7 t" M* v; f比较运算符 含义, H+ |& l5 `5 P( o
= 等于5 n3 L/ Z0 h2 m/ b' }
> 大于
9 d/ C( B, y( E< 小于9 |# l9 i6 m4 a8 e7 u4 M
>= 大于等于
$ r$ {$ @7 E4 \' d& I8 {3 ?/ {<= 小于等于
9 a0 r( d! s- f) Y; n3 O<> 不等于
& `" ^, \: i* ^! e0 b!> 不大于! ]8 ^% F# x9 G0 q8 k# q6 E
!< 不小于
' q9 y3 |( {) Y* h+ s( \例:返回96年1月的定单
: U9 w0 G4 o# {) FSelect orderID, CustomerID, orderDate
/ Q" C) ~2 X4 O. f. |6 ^FROM orders
- X/ ^4 ?' a' `" e) vWhere orderDate>#1/1/96# AND orderDate<#1/30/96#
& P7 w+ N$ a! x$ J注意:
: t! d9 [7 E% ^9 @9 fMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。: W( {3 z+ |2 [( m
例:- o( ]7 \6 |0 f1 F9 t2 u9 x
Where orderDate>#96-1-1#
2 \  F0 w+ Q5 ~! G也可以表示为:
* |( s; Q% J$ r/ Q7 wWhere orderDate>Datevalue(‘1/1/96’)5 [2 B, D' `2 C) E6 I/ r; A
使用 NOT 表达式求反。6 ?: W9 G$ G! o' c1 [# n* \, v1 k
例:查看96年1月1日以后的定单+ v: V( K7 R, g! X0 |* C
Where Not orderDate<=#1/1/96#
. r+ F* a$ B4 e6 }2 范围(BETWEEN 和 NOT BETWEEN): Z6 M' o  u' e6 J6 o
BETWEEN …AND…运算符指定了要搜索的一个闭区间。4 ]7 E5 v) t$ N+ F$ @, e
例:返回96年1月到96年2月的定单。
: W0 H) F7 a6 p9 nWhere orderDate Between #1/1/96# And #2/1/96#
7 w7 T+ J7 O9 o7 Z# Y0 u, c3 列表(IN ,NOT IN). w+ j7 M) b: V7 Q; J/ A6 A/ J) v
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。5 g( k" i1 L  A  L8 j8 x' {4 t* O9 ~
例:要找出住在 London、Paris或Berlin的所有客户
1 b4 }0 R. o6 O! I8 t0 jSelect CustomerID, CompanyName, ContactName, City
# B& v3 h: D  o4 Z2 p2 m1 mFROM Customers
* b# v/ o. W4 B; |, pWhere City In(‘London’,’ Paris’,’ Berlin’)! h1 [9 @- W0 O' A; ?% X3 v
4 模式匹配(LIKE)
- J. `# |! J: ULIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
/ c& k) [- B' K. eLIKE运算符里使用的通配符
" ?& o, l) U8 T3 O通配符 含义
7 t) L* }5 U# m; c1 L/ ^' Z1 f4 @? 任何一个单一的字符
: b: {" J% U. d0 f! w; e" b* 任意长度的字符% o+ i$ u3 I1 }. `7 D9 a+ X8 D! U
# 0~9之间的单一数字
2 b' Z) J5 }1 _: h% T& `& F[字符列表] 在字符列表里的任一值0 O+ s# V3 [* H4 G
[!字符列表] 不在字符列表里的任一值; [4 V& N! T1 H
- 指定字符范围,两边的值分别为其上下限
/ n2 m6 ~/ r% Z5 E1 g8 k例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
& M& q# e3 E% X; I0 [( `Select CustomerID ,CompanyName,City,Phone. T; D2 C( C* p6 e6 s4 O$ [
FROM Customers  c# C  _0 \$ Y
Where Phone Like ‘(171)555-####’
% l+ V/ B6 N9 b' Z& n  z% i' zLIKE运算符的一些样式及含义
- X$ A3 a( _& a. y; A9 {5 Y样式 含义 不符合
0 \- H" }9 U, E9 ~2 [LIKE ‘A*’ A后跟任意长度的字符 Bc,c255! Q; N; N9 J; t4 U3 z: J0 c+ S3 Y# ~
# LIKE’5’ 5*5 555
5 l3 W; c  v4 g5 x0 t5 hLIKE’5?5’ 5与5之间有任意一个字符 55,5wer5- V& L; [; O7 Q' e- E1 x" Q$ _& l& ?
LIKE’5##5’ 5235,5005 5kd5,5346$ ^6 _# U6 J' E3 H( _* o
LIKE’
  u2 x6 D  O& O7 R[a-z]’ a-z间的任意一个字符 5,%
# E# G, `0 N# C2 C5 WLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
' Z3 l! F; v- T7 Q/ X. WLIKE’[[]’ 1,*4 u- R5 c) b8 Y  N
三 .用ORDER BY子句排序结果% v+ y: |! F; Y7 H& L" U" l
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
( I9 i/ J. I' `2 K' vorDER子句中定义了多个字段,则按照字段的先后顺序排序。7 p' K" @% D) W" k0 P0 H
例:) o1 m  R2 H8 S: Z
Select ProductName,UnitPrice, UnitInStock
* N8 u' c5 M1 H4 c- ^2 o0 d$ {, sFROM Products) y5 W3 K2 J+ ~$ C8 ~- |
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
3 ~* H( ?* D9 P0 @; @# VorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
0 F$ M9 L6 L4 x4 s" E9 E) x& b1 v例:下面的语句产生与上列相同的效果。
' [3 K+ e  E: \. w0 i$ c; Z# ^/ wSelect ProductName,UnitPrice, UnitInStock
; ]- K: G0 F* F/ o$ p% A$ J6 R! y- b% ~FROM Products! i2 @- T2 p, |+ D/ }
orDER BY 1 DESC , 2 DESC,37 W/ n0 P  g4 H4 ]  v
四 .运用连接关系实现多表查询7 _% J$ j) }  ]! k& r2 B9 K
例:找出同一个城市中供应商和客户的名字
" r+ G( k9 y* ]Select Customers.CompanyName, Suppliers.ComPany.Name
% h  e. K' y# N' F" u# NFROM Customers, Suppliers
' R! Y" m+ z1 [( u$ h1 oWhere Customers.City=Suppliers.City
3 G1 k1 C. `9 O9 [6 M( ?5 H" X例:找出产品库存量大于同一种产品的定单的数量的产品和定单' u: k% P: W- }. W: |% J
Select ProductName,OrderID, UnitInStock, Quantity
0 Q* e* H" H- X: U, ?# p# A# i" zFROM Products, [Order Deails]% r) F/ T/ K. X' Z: `  y3 X2 u- K
Where Product.productID=[Order Details].ProductID
& d4 F: O3 y  j4 @" A/ Y( KAND UnitsInStock>Quantity
' ]0 h/ C9 V1 X" N5 ?- ^8 s" D6 q, n另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN# ^0 q% |+ C8 R8 J3 u7 k
语法:
* f) n' d8 L, O& y6 rFROM table1 INNER JOIN table2
3 A' V# u" \% q# r) N# {, pON table1.field1 comparision table2.field2
4 E0 F3 k" W) s  y* v4 A! Z) j其中comparision 就是前面Where子句用到的比较运算符。: Y4 {9 }0 j" l1 q& m6 Z
Select FirstName,lastName,OrderID,CustomerID,OrderDate6 L3 t0 V% S' C3 J# d, P% ~$ x
FROM Employees; m, j* Q0 j9 r4 V+ L
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
0 g! ?  K( {: z7 v5 ~' x注意:
* X( @5 n2 p6 h+ ]5 W6 xINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。3 k  u' q7 e0 J9 p2 z' ~
在一个JOIN语句中连接多个ON子句4 y5 ]: J0 h: J+ `2 F
语法:+ \- ~# o5 D" r4 B, a
Select fields: W" B; y4 U$ e6 B. J" v4 Q5 [
FROM table1 INNER JOIN table24 `8 C  D- R7 x* o" L
ON table1.field1 compopr table2.field1 AND+ t+ d) [4 Z  Y
ON table1.field2 compopr table2.field2 or
0 R0 k" e; ~( ~0 uON table1.field3 compopr table2.field3
  d7 y6 X% ~- n& `0 O& x也可以
9 s' \$ _2 M1 ySelect fields
# d: g1 Q3 ^; V1 C. f) Y: @+ PFROM table1 INNER JOIN% L' U4 U) A$ i) M* ?
(table2 INNER JOIN [( ]table3
5 p, \5 ^" i  W* T7 T: I! u, s[INNER JOER] [( ]tablex[INNER JOIN]4 m) V0 E9 g% u& B
ON table1.field1 compopr table2.field1* G) L' m# t( p: h# K" [! P4 n* u& A
ON table1.field2 compopr table2.field2
1 ~+ |6 d. L( G" J1 l& aON table1.field3 compopr table2.field3
2 K$ u  Z0 l* J* X外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。2 Q9 o! u/ @+ {
FROM table [LEFT|RIGHT]JOIN table2
8 {& `1 T6 W! K4 d+ k& [" tON table1.field1comparision table.field2& F5 x7 Q+ [) m
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据+ a# A$ P: _0 d7 c' Z6 @
例:不管有没有定货量,返回所有商品
& l4 c. m: O8 b3 X% v( D6 x/ s* ?Select ProductName ,OrderID
$ N5 H- t0 A2 ~  kFROM Products
8 G; d# G  [  V: P2 @6 N0 JLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
" ^; Q: |/ O8 R0 j! ^右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。0 ?  S- N7 {! P$ o# A) @! }
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。$ _, I! n2 ?" H) a- E1 d
空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。  }! _% f: e9 D% r
Select *: g  W  }$ t" y' S
FROM talbe1
$ f, H# T7 n5 J) ZLEFT JOIN table2 ON table1.a=table2.c
) B6 P- L3 m# ]- n- j3 x1 连接查询中使用Iif函数实现以0值显示空值  M" S9 z, S! a+ O9 r( L
Iif表达式: Iif(IsNull(Amount,0,Amout)
$ @* O7 F- m' H* ^( k. X; q例:无论定货大于或小于¥50,都要返回一个标志。1 b( d* K, J) D* [& f
Iif([Amount]>50,?Big order?,?Small order?)
# G, k4 x; P' S  c3 q五. 分组和总结查询结果
" U# E8 r- `3 q* j) l4 ~/ A1 [在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
( {7 w5 y5 V0 d+ v% s+ }) _GROUP BY 子句的语法
5 B9 M- w/ k2 z" }8 j5 A! MSelect fidldlist1 W7 B, p5 U9 A9 L
FROM table
8 ^6 Y4 O( ?$ pWhere criteria0 h1 ^2 g! Z" x8 @
[GROUP BY groupfieldlist [HAVING groupcriteria]]7 ^! t( ?% J3 @$ Z3 T- q2 {: \
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。+ D6 n3 C3 ]& I# a3 L. r
GROUP BY字段中的Null值以备分组但是不能被省略。* L1 y6 B  E% U+ ^
在任何SQL合计函数中不计算Null值。
/ d/ C3 p& _3 I7 X5 }- X/ DGROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。, D2 a4 k7 T& O2 I  J
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。* D& M* D7 R) O$ [" N+ M
Select Title ,Count(Title) as Total) z) x* l  c% `7 d8 n1 W
FROM Employees" f2 }' f( J  ^# H% q
Where Region = ‘WA’# a0 u/ F# E. |( Q4 F( ]5 r! z
GROUP BY Title9 ~! r, e# H2 ~- a3 F/ C6 `. T
HAVING Count(Title)>1
0 }7 y4 v  Y' mJET SQL 中的聚积函数
. y! e; R$ Z; s# \聚集函数 意义# ^, A/ @1 a4 j3 }  I8 J
SUM ( ) 求和
: i, b9 `# F  Q, cAVG ( ) 平均值
% s5 H4 W- _3 u6 oCOUNT ( ) 表达式中记录的数目
' e0 {3 w% B% z8 E5 o4 eCOUNT (* ) 计算记录的数目
7 S6 c2 ?4 y; H) V3 ^MAX 最大值
. }) u2 B, `8 b& e; `MIN 最小值
' G3 F0 g% R; W9 }! p& }% GVAR 方差: U- E3 r* Q% i- C+ l/ Q) z6 U+ o9 c
STDEV 标准误差
. n0 W7 `% C) T6 TFIRST 第一个值
" w" o8 _. [7 T; f) Z5 X% eLAST 最后一个值. D( }. x! u' Y2 f8 b- m
六. 用Parameters声明创建参数查询
$ ^) ]& N. R6 p: {* C) wParameters声明的语法:
4 G# {  N% x/ Z5 z: rPARAMETERS name datatype[,name datatype[, …]]
) ]! o& P# G9 V/ _# M% Q5 }其中name 是参数的标志符,可以通过标志符引用参数.! i- f; V5 h, ?3 e2 s  w
Datatype说明参数的数据类型.
, p% W5 O8 V* h使用时要把PARAMETERS 声明置于任何其他语句之前.7 A5 y3 k* O( W( p+ B& t
例:
& I) w1 |+ |: x) F$ q, JPARAMETERS[Low price] Currency,[Beginning date]datatime
; F! C( h6 J" y+ U  Q" k% _, fSelect orderID ,OrderAmount
; R: ]9 J# @! y* E" K. ]; s$ hFROM orders
3 D8 w8 L/ a* J$ Z5 U7 d8 b1 I" YWhere orderAMount>[low price]
( X1 {" `! @1 o5 A7 A2 N3 fAND orderDate>=[Beginning date]
* }6 j% P& Q, V! o- x5 x七. 功能查询
$ y: A" b$ q( s: d4 K所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.( Y3 l' X# D4 ^* w9 q6 P9 \
1 更新查询
3 e2 T# i7 ?7 c; r( q  ZUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.. Y8 C; _3 _6 q* _4 p
更新查询语法:. M( ]" y' H" `% J
Update 表名5 L1 v8 a4 J9 u" D9 ~
SET 新值  x$ n; U; K$ I. b  v6 K
Where 准则" k  e5 [  W% \" ]' P' F7 L$ C
例:英国客户的定货量增加5%,货运量增加3%
' y: S% C; E. {! L8 @. i  K! {Update OEDERS
' @8 Q, o# w1 _) `3 j/ W! \SET orderAmount = orderAmount *1.10 ?4 J0 @8 T$ ^' E, H9 C' `
Freight = Freight*1.03
* K: D3 v5 N* U3 C; s3 _Where ShipCountry = ‘UK’
# N% L. l) S5 j5 e0 a- h5 \2 删除查询- |  [) M- d4 S( a
Delete子句可以使用户删除大量的过时的或冗于的数据.
: \! y# n4 f. g; M3 b$ z注:删除查询的对象是整个记录.5 [% F+ X+ r  ^8 F, S$ y* B
Delete子句的语法:
- n& D8 V' B) ?, `) Q+ {! rDelete [表名.*]
; `6 f( i, v# LFROM 来源表
8 f3 ]/ M# z8 J1 _5 cWhere 准则
8 L" f0 ]5 @. I7 t- t例: 要删除所有94年前的定单. C2 \! u1 R- q& }" p: e0 |6 j
Delete *
8 V! U0 t# L0 p) \FROM orders, _" o6 N! h2 q  p' q$ J; V% g6 r% }
Where orderData<#94-1-1#
, R1 w' e4 W5 H+ C3 追加查询) g* A7 n. f* m8 k" T9 j: G. _" H! l
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.
$ U" s7 w  H2 sINTO 子句指定接受新记录的表
1 a" l% y- u: Z6 j/ ^9 QvalueS 关键字指定新记录所包含的数据值.& Z5 |) {% P# F5 G
Insert 子句的语法:
$ v. ?2 ?' @% Z" `1 S. jINSETR INTO 目的表或查询(字段1,字段2,…); E: M) s& y5 Y, @
valueS(数值1,数值2,…)
3 }  {, v, }4 ~( A1 ]8 ~/ y. D% x例:增加一个客户% @7 _5 Z% _0 i  D, s# h
Insert INTO Employees(FirstName,LastName,title)
8 Q7 T/ W9 N, M; XvalueS(‘Harry’,’Washington’,’Trainee’)7 A& V- T6 W" A
4 生成表查询
# B4 j0 g- l: J$ L5 A1 W可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
6 U, D- ]4 x3 \6 cSelect INTO子句用来创建生成表查询语法:) W2 \4 g% {+ S7 Y  i
Select 字段1,字段2,…. A' x( B3 z2 O+ e- H
INTO 新表[IN 外部数据库]9 l! F2 @0 R+ f- E% s* \
FROM 来源数据库" H1 c% A) z) K! ?' G
Where 准则
3 n/ Y9 F: t+ V例:为定单制作一个存档备份
5 h: T2 ~  p! X, v- _0 X! e" h. x2 HSelect *
' K( e2 D2 g9 z$ B$ t* e: l4 G! GINTO ordersArchive
5 M- u) o/ x) z8 `' J# O/ iFROM orders
6 }9 t" I1 e; y5 W八. 联合查询
2 z( {6 E" J) rUNION运算可以把多个查询的结果合并到一个结果集里显示.
' a: B$ O& n) _- \6 qUNION运算的一般语法:
6 u) U/ [% U  E# [( j[表]查询1 UNION [ALL]查询2 UNION …
' @+ ^$ b- Y" S7 N8 _# g. ^, u$ X例:返回巴西所有供给商和客户的名字和城市
6 |4 A- z! A1 P: F& qSelect CompanyName,City
9 P8 n8 h; M; W; YFROM Suppliers# {/ z9 l1 F4 g3 `
Where Country = ‘Brazil’
/ ~2 S  g6 y( ~' P" v: h# AUNION5 q+ Y- n/ s+ i2 r
Select CompanyName,City3 Q8 R% C9 T: p8 ~
FROM Customers
8 H2 r; N, t$ Z- K3 M4 LWhere Country = ‘Brazil’
3 L; f' ]" H, [0 _5 A  b注:6 M) I; O/ ^- B/ d9 T# h( o8 J" {
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
" ^2 t! C) J+ gUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.% A( @3 a' B3 V# N& R: Y( i3 [
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.4 K( B8 A9 G  M; E
九. 交叉查询4 Y/ q; L5 O9 W3 q. g8 G
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.! w0 i8 |1 Z) X: v7 D- g" b% M# d
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:" Y' E; u. n8 g% b# e. J8 z" ~: {
TRANSFORM aggfunction
6 L/ ?' h4 ^5 @' R6 U/ jSelect 语句8 I6 m5 _$ Q* X) i
GROUP BY 子句
# x* v" D  G8 p6 H9 L; APIVOT pivotfield[IN(value1 [,value2[,…]]) ]- L, r. O! f, E2 Q6 \( Z
Aggfounction指SQL聚积函数,- W  A6 X8 y& J  W$ B
Select语句选择作为标题的的字段,
- @3 t' D6 a. x0 H8 e- f7 d/ Z( _GROUP BY 分组
1 L/ S% _! n+ ?; B7 s. `+ `2 f- D说明:: z  Z" @2 U0 N1 {( T, |
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.# M. D, ^7 H2 l$ K3 [; e& `
value代表创建列标题的固定值.
9 [4 d3 D0 l6 Z+ l* D& J, P* a# C* Y例:显示在1996年里每一季度每一位员工所接的定单的数目:9 t1 {% m% |: |. Q% j
TRANSFORM Count(OrderID)
3 w$ G/ q; k$ n$ `Select FirstName&’’&LastName AS FullName
3 B2 _. k$ Y" M& fFROM Employees INNER JOIN orders
3 A; j9 C" |- H2 v! C  [ON Employees.EmployeeID = orders.EmployeeID$ `" \2 d, C8 r
Where DatePart(“yyyy”,OrderDate)= ‘1996’, Y0 H5 U( j$ x+ p
GROUP BY FirstName&’’&LastName& g9 G2 P* e# F$ y9 H8 e; o7 I
orDER BY FirstName&’’&LastName5 Q( u! {* P# ]5 {7 [5 |) `
POVOT DatePart(“q”,OrderDate)&’季度’
1 Q6 K- ?% [1 j1 S5 T  G十 .子查询
8 Z! T* e! o) Z' @% i. D3 l$ z" b3 a1 q子查询可以理解为 套查询.子查询是一个Select语句.
3 j7 S# e7 l5 r2 h( }, [) _( ?1 表达式的值与子查询返回的单一值做比较
+ O: K, d5 N6 c% E+ D' @; |0 c3 M语法:
  [$ W2 G# j  @2 K& f$ h6 o  S8 A表达式 comparision [ANY|ALL|SOME](子查询)" `7 z9 ?% D- j5 Z9 F- a4 X* S
说明:" @6 Q4 F+ T: D
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
9 x+ Z& Q6 e5 \$ ^3 y6 N例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
" a+ C* l- ]3 [3 r) ~6 ]& w  E. zSelect * FROM Products& o7 U2 z- C% }4 ]+ ~
Where UnitPrice>ANY
( h0 }! f+ I8 X% R$ D8 z(Select UnitPrice FROM[Order Details] Where Discount>0.25)& U- e9 P5 W' h1 X
2 检查表达式的值是否匹配子查询返回的一组值的某个值
: C  P4 s3 k+ C语法:; a1 s) G0 E: B! S
[NOT]IN(子查询)  l7 b/ H: Z+ z6 @+ p0 P- y
例:返回库存价值大于等于1000的产品.$ h/ j% @1 z  v7 ]0 F8 g1 F# L
Select ProductName FROM Products
7 N! M! _2 R$ }' g) D0 `0 hWhere ProductID IN' j' l  Q; g7 ?6 A# \
(Select PrdoctID FROM [Order DEtails]2 R$ r+ x' @$ _# X' O( a
Where UnitPrice*Quantity>= 1000)
# N  z( n8 E, V& |! _3检测子查询是否返回任何记录
! \3 y$ S  v7 j% E1 W3 b语法:
" B5 w# K' W- c4 S; ~# a6 h  F[NOT]EXISTS (子查询)
7 \2 H# @( P8 }8 L: Y  @例:用EXISTS检索英国的客户
! g0 \7 ^2 R3 X4 e$ B; ?Select ComPanyName,ContactName& U' M# }3 P& G! _8 m- Q2 Z" D
FROM orders
. Y% U7 |% ]4 u' i! U4 Q- f% x# F) zWhere EXISTS
9 C" y. `5 @3 f$ {(Select *
9 P0 a7 x0 u( \' w4 H$ }FROM Customers
! b6 ]" ~/ Y* D( a! F4 a* {! i" r+ TWhere Country = ‘UK’ AND
5 b+ V3 x! U8 J% R& OCustomers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2024-11-25 09:32 , Processed in 0.027001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部