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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-10 10:28:12 |只看该作者 |倒序浏览
Access如何筛选重复数据以及Select语句的完整语法# s4 [$ s; A# x8 L

/ Q, b! C# U7 v. |select distinct 字段 from 表名# w8 _( ~( B4 w* A$ w" U' X
distinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。
3 X7 }! E1 H. c! M一.Select语句的完整语法为:) z( B' ~" z+ C0 L
Select[ALL|DISTINCT|DISTINCTROW|TOP], J+ X; M8 m: \: {) l% W. d: P: [% q
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
4 K! f5 _7 K7 j1 {9 u' ?$ M: m3 X0 PFROM tablee xpression[,…][IN externaldatabase]; p& ?9 k; C+ m; M) n7 T* |/ W
[Where…]
. ^6 @9 X7 k' e[GROUP BY…]3 ]4 j$ z& _1 j+ D
[HAVING…], p2 r+ H& c) p& t& L) `/ S# Y9 S
[ORDER BY…]
& s+ E" o3 x7 O# M/ F- S' H[WITH OWNERACCESS OPTION]0 D8 J6 v5 a9 ]% _2 ~( r
说明:  `0 m: V. [1 w4 G
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。+ O9 q1 ^* K! u0 p' @) X8 |& I& A
1 FROM子句
; N% p7 G& u1 OFROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
. w) V, N7 o; P  K* E例:下列SQL语句返回所有有定单的客户:( U7 P! S2 h/ N1 t  z2 }1 S6 k5 e* r" u
Select orderID,Customer.customerID( f/ z/ K% H5 |/ _
FROM orders Customers# h+ Q7 t7 c" @% a1 h
Where orders.CustomerID=Customers.CustomeersID
" y! k8 Q6 M( D) y. M9 b6 a1 F2 ALL、DISTINCT、DISTINCTROW、TOP谓词
) k! a8 f$ e* o! z3 s. P(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。% R% `8 p5 O& s* @; r1 p
例:Select ALL FirstName,LastName
7 o( l) a" h- V* {) X  NFROM Employees
5 l. e2 D, p0 l' n% A, w(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。, \" R2 V" _9 F2 q. m+ ~
(3) DISTINCTROW 如果有重复的记录,只返回一个8 J! E- j9 V0 K8 ]
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)" [5 Z1 R8 b1 s5 h
例:返回5%定货额最大的定单
8 y) ^# _5 w+ l( |0 N% ^& c0 @7 ESelect TOP 5 PERCENT*3 U: z+ ~. E. L! ?/ }% f0 ~( f. L
FROM [ order Details]7 Q1 [! E, S5 Y" C# g) h* c$ ^
orDER BY UnitPrice*Quantity*(1-Discount) DESC
9 E) d& W: Y/ K: E2 ?! E5 k3 用 AS 子句为字段取别名* F1 v- f/ w/ h% O: W4 l6 l4 V3 p0 L+ X, a+ D
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
& n8 s6 Y. S3 L8 X* b& O+ W$ i例:返回FirstName字段取别名为NickName
1 T& g0 q/ G) u7 n8 ]$ |; b* X$ xSelect FirstName AS NickName ,LastName ,City: w, _; A2 B6 f6 Z
FROM Employees& i! V  B+ _+ k6 v$ P/ ^
例:返回新的一列显示库存价值
5 C/ u- A* a) }) V5 |Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock% J$ C; C5 S- ]6 {
FROM Products/ d; t1 f) p; H0 S# y
二 .Where 子句指定查询条件' q8 O5 b* W- I" ]3 K  S! i, D
1 比较运算符
; c4 ?0 ~( ?* X4 x4 F. t比较运算符 含义9 m/ K# \$ p, r, s0 `( q2 A
= 等于
/ T. X8 Y# y% Z; R> 大于
/ O- p; k6 d" O9 k4 z/ p% Z< 小于( Y9 `9 V# i6 X
>= 大于等于6 D( M  V: j- t2 @
<= 小于等于7 G8 R# e0 A: W# Y6 `2 R' I; @
<> 不等于
. x3 c- n6 E4 I& M- f! X!> 不大于
) F' O# X0 u2 ?: k  P. A!< 不小于
9 x$ E1 v$ x$ n5 t( F$ s例:返回96年1月的定单
' L5 }. U. }7 bSelect orderID, CustomerID, orderDate2 T; H9 D3 `3 l  r& d* x% A
FROM orders
/ y' A4 S, n1 O; kWhere orderDate>#1/1/96# AND orderDate<#1/30/96#1 t; U- h) @7 v( e7 P# G. b" [* A
注意:
* y' u  t' y  E, S9 ]$ i7 mMcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
1 T! y  Y) d+ r3 P/ r$ ?8 K! I" u例:& |0 L7 C0 l7 Q
Where orderDate>#96-1-1#$ W3 T$ j4 M5 [7 d( A/ |
也可以表示为:
8 K' b& k% ~6 }1 e- f% m6 lWhere orderDate>Datevalue(‘1/1/96’)3 y" v7 k* R6 k) b/ L9 e9 s
使用 NOT 表达式求反。1 V! G1 {: L/ p. H" ^0 ~
例:查看96年1月1日以后的定单
6 @9 L: x/ a& D& {Where Not orderDate<=#1/1/96#+ T, J+ x( }7 ?3 m/ C) j
2 范围(BETWEEN 和 NOT BETWEEN). ~6 F* ?% q6 n. W2 ?' `3 a
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
. a6 e# I' [3 r5 V* M5 X例:返回96年1月到96年2月的定单。7 s* Y( H2 x9 u6 u* D/ U7 R  F
Where orderDate Between #1/1/96# And #2/1/96#+ |  o0 a- I/ g+ D# R
3 列表(IN ,NOT IN)) l& _) {3 h7 x, J
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。# @: B. W# f- I) G
例:要找出住在 London、Paris或Berlin的所有客户2 W0 b- D4 Z) M; ]( c$ L3 K
Select CustomerID, CompanyName, ContactName, City
- S8 }, r$ v4 GFROM Customers
' A8 {* E$ Z' S) Q  T- {Where City In(‘London’,’ Paris’,’ Berlin’)
  q- d9 {7 h  [# C" L' _; s, U4 模式匹配(LIKE): n6 C) R( C$ T: s9 Q& b, L8 I+ O
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
4 |, C9 j/ A2 g( S, YLIKE运算符里使用的通配符
. E) T* r6 z6 V, Q+ m5 D通配符 含义1 g0 o2 e  d7 v  s0 O: h3 k6 R
? 任何一个单一的字符  N5 o  d+ n" i& n# C: @' L9 ~
* 任意长度的字符1 l% C' A) h1 W" i
# 0~9之间的单一数字( ^$ d7 D) M" o! p' z2 y/ V
[字符列表] 在字符列表里的任一值4 R: k5 Z$ Y  }& _2 c2 k' E9 i
[!字符列表] 不在字符列表里的任一值
  f' S5 @( Y8 y  I1 H- 指定字符范围,两边的值分别为其上下限1 S% e, n% p( ~& n  i+ y+ a
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户5 W6 q, i1 O  ?' G+ {! Y0 \' _
Select CustomerID ,CompanyName,City,Phone
. U7 W1 u+ d5 C2 g9 `8 X3 IFROM Customers) `* k# M: y+ s3 l  x
Where Phone Like ‘(171)555-####’
# Z3 d8 u4 c8 L4 K0 i9 W9 pLIKE运算符的一些样式及含义' K/ _, t: Q5 J" i6 l
样式 含义 不符合; J6 b" E+ x. U* K$ [2 g
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
" d  o, O+ b. }$ n# LIKE’5’ 5*5 5555 t/ D- x+ d+ y3 {0 X& U$ t3 }
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
+ c9 e' ?/ K8 mLIKE’5##5’ 5235,5005 5kd5,5346
! S8 L% k) j. s- Y* NLIKE’* _% \( F3 s  Z  O  E. @
[a-z]’ a-z间的任意一个字符 5,%% l6 L! Q* G8 b2 X& F) K9 u6 ~7 ^
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1" s; F- s3 {3 W0 Z) s
LIKE’[[]’ 1,*
8 N, J1 K! C8 q三 .用ORDER BY子句排序结果
0 ~1 t( ~' p1 N  J8 s* A: F6 {orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
) a" P( T; \( ?) Z2 q: X0 TorDER子句中定义了多个字段,则按照字段的先后顺序排序。
4 x, S+ U5 X# k, v) C5 @8 ?# y% u例:
) ]1 t! {' A8 D% N/ V4 n9 \2 B0 SSelect ProductName,UnitPrice, UnitInStock
& g" i5 e0 F3 E9 B. H" z" SFROM Products. Q# T1 @: r+ v& m
orDER BY UnitInStock DESC , UnitPrice DESC, ProductName
" G7 w2 v% a$ x0 |( I# VorDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
* J, n: E% c2 C例:下面的语句产生与上列相同的效果。
7 B3 F4 x4 @% K( k/ I+ O( \* MSelect ProductName,UnitPrice, UnitInStock
  [9 r9 v" m9 ?1 g( WFROM Products' P3 J% _1 y$ K- s
orDER BY 1 DESC , 2 DESC,3- J& q. P# D1 ]  @8 c! c0 m9 Z
四 .运用连接关系实现多表查询# N6 L9 c$ X$ _. W1 |
例:找出同一个城市中供应商和客户的名字7 V; f, K: \3 R" |( n4 A2 _
Select Customers.CompanyName, Suppliers.ComPany.Name
4 k# f( c1 X. Y# aFROM Customers, Suppliers! h0 X8 q% t% t, K, S
Where Customers.City=Suppliers.City
: X% p0 V! s) Q" w( e- e* p5 P例:找出产品库存量大于同一种产品的定单的数量的产品和定单; m' V: E& U  u4 [& x" O
Select ProductName,OrderID, UnitInStock, Quantity
" Z/ t* ?# O! I$ fFROM Products, [Order Deails], C3 D7 ^$ [: T  L: g! L
Where Product.productID=[Order Details].ProductID7 I7 U1 k8 p# I: `& _+ [4 g! n
AND UnitsInStock>Quantity* Y! z* @* W2 P3 P/ E
另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN9 q9 E) h; A+ X0 H
语法:8 ]3 K9 A% J6 V' o1 X5 Q, _/ p
FROM table1 INNER JOIN table2
8 Y8 j0 e) n7 V9 K' S) T* MON table1.field1 comparision table2.field2
3 n0 d; r; ~; N. P其中comparision 就是前面Where子句用到的比较运算符。6 T9 N. H) c6 r2 P0 d' q+ v( ]; O, s
Select FirstName,lastName,OrderID,CustomerID,OrderDate; P7 w! A1 v+ D4 u! s
FROM Employees5 X) W' j$ A* P# l5 j# ]& ?( A, Q
INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID" x+ g4 @, Q) h5 K7 a; T( B
注意:
4 G7 @& T# E$ \+ X+ w2 |INNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。
! H; }. L1 b( y在一个JOIN语句中连接多个ON子句
, x. X; J6 Z: n  G1 x语法:
2 E" Z1 I( ?) f) d, v5 KSelect fields( }& \! T+ Z7 ^9 u: Q; u) t
FROM table1 INNER JOIN table2
/ P# ~9 ]8 o; L% G! c& aON table1.field1 compopr table2.field1 AND7 n/ D5 j) G& y% \4 Z
ON table1.field2 compopr table2.field2 or
. X7 p! h$ ~$ |. z: }* o! ^" fON table1.field3 compopr table2.field3
" R3 P9 q! P' J也可以5 \2 i6 X2 _) U
Select fields
8 P& _4 z# _+ s* j( b$ \3 R/ cFROM table1 INNER JOIN
4 E) Q9 ^: i4 z6 ], c0 J$ r% L/ M(table2 INNER JOIN [( ]table3
/ r' R* D2 @' D& [9 D' ?[INNER JOER] [( ]tablex[INNER JOIN]7 j; ?6 n' V  [* K# L5 X1 I
ON table1.field1 compopr table2.field1
* i! D, R$ ]& O! rON table1.field2 compopr table2.field2
9 R+ U5 w" A( W! rON table1.field3 compopr table2.field3/ ?- E" {6 p; M
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
$ {1 d" ^. b% T5 G; \% MFROM table [LEFT|RIGHT]JOIN table2" x2 c6 x8 A! a2 W4 N
ON table1.field1comparision table.field2
3 J  M# u/ \- N1 d用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据
/ N$ w- U) l! o& R5 G例:不管有没有定货量,返回所有商品
! N0 v$ c3 J5 z: z+ {Select ProductName ,OrderID
, p" w3 ?7 N5 c& g' F" kFROM Products
" n& L4 T  j1 j  FLEFT JOIN orders ON Products.PrductsID=Orders.ProductID
3 ]; y7 O6 O4 f% Z: y右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。+ ~6 ~8 h" T! p. V
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
% Q2 H' y) n5 m0 u+ f空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。
$ M0 d# U* \" l# ?2 BSelect *% h6 {6 }4 y" h0 S5 U5 ^* A
FROM talbe12 q/ P$ n! i: }
LEFT JOIN table2 ON table1.a=table2.c. p* I5 A: Y0 B( n) z6 c! i
1 连接查询中使用Iif函数实现以0值显示空值
5 @4 i( ]8 `+ q2 ^Iif表达式: Iif(IsNull(Amount,0,Amout)
9 N3 s; b( N. [# [0 }- V例:无论定货大于或小于¥50,都要返回一个标志。' o% }8 u% l2 A3 p! u4 T7 p
Iif([Amount]>50,?Big order?,?Small order?)
# U/ Q5 S* i  y8 v% P五. 分组和总结查询结果9 I! Y0 }1 @1 N; A% E8 I9 `
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。/ k7 _! l& k- H" m! Q
GROUP BY 子句的语法) K  W' R" ^  G: o0 N
Select fidldlist
2 G. n4 ^$ V' l* hFROM table
! q; E- U, x' W8 Y$ q: FWhere criteria
8 X  T2 l9 L: I' i; U" _0 m1 b; c[GROUP BY groupfieldlist [HAVING groupcriteria]]$ j: w# O* d: y7 O1 B. ^* b
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。4 [' K- x5 M* Q7 W
GROUP BY字段中的Null值以备分组但是不能被省略。
, a8 ?2 m8 R$ y3 k0 t7 a8 s在任何SQL合计函数中不计算Null值。$ J7 D6 A- u+ N$ ?- Z
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。5 K' \/ |7 m8 t/ P
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
3 ~* ]4 ?9 N0 nSelect Title ,Count(Title) as Total
4 I' O# |! U. WFROM Employees* U3 w' H) v# U5 d
Where Region = ‘WA’
1 I' }& C; ^" f2 |5 i) }, R+ y' ]GROUP BY Title) Y) Y' m* R. A! F1 E! a
HAVING Count(Title)>1) s: p& A" ~5 m. B
JET SQL 中的聚积函数
6 `7 U, B+ N* n: w' Y* K聚集函数 意义
. n0 c) s7 {2 `+ n3 ^1 m9 j+ ^) ~$ {SUM ( ) 求和
4 I5 f( o7 U- x' RAVG ( ) 平均值
8 O; N" i) T* H6 \2 lCOUNT ( ) 表达式中记录的数目" I- D2 }5 M* a; z; y8 a$ g/ L
COUNT (* ) 计算记录的数目/ D1 ~' F& J2 m. f
MAX 最大值
! M/ o" q. a5 i( M* o; L4 ~MIN 最小值" \% Q0 q4 y# b
VAR 方差
  c  I/ K) t) E$ U6 J* L5 D! `STDEV 标准误差5 U; h* O* q1 ^
FIRST 第一个值
9 T% C$ k) J1 d$ s% E$ nLAST 最后一个值
0 a: |+ O) }0 A. E六. 用Parameters声明创建参数查询; Z7 o* K& |; }7 G% K3 Y2 G
Parameters声明的语法:3 r+ `: K. v6 y- v
PARAMETERS name datatype[,name datatype[, …]]5 ^( y6 y6 L$ ^4 g& u) `0 D& A
其中name 是参数的标志符,可以通过标志符引用参数.
3 |. N& R7 t% _6 x) LDatatype说明参数的数据类型.9 K$ H: o! E9 ~/ r' x- ?( F
使用时要把PARAMETERS 声明置于任何其他语句之前./ T9 m0 n; c& C, B9 a
例:
2 G  }3 O  Q" r8 @PARAMETERS[Low price] Currency,[Beginning date]datatime
. N% B. I) t5 U9 ?3 VSelect orderID ,OrderAmount
% P8 G" B: z& l: p; BFROM orders
. a+ i* W( w, ^* qWhere orderAMount>[low price]
. m$ J8 ?4 f4 h+ CAND orderDate>=[Beginning date]% Q" c) I: k8 r* }1 |. F
七. 功能查询$ W+ |7 ]9 Z" m9 u; d
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.+ e( K+ [6 ~( s) u
1 更新查询" {4 k& U9 j; B' p& p/ p5 I
Update子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值., I1 p1 f5 C$ |, ^
更新查询语法:/ ^5 j. P8 |/ G1 M$ X* S
Update 表名
; a; k8 }# p# k5 k; vSET 新值
% W2 f6 {+ K3 |Where 准则
  q# Q" {5 R) i/ @2 q& ~例:英国客户的定货量增加5%,货运量增加3%
8 e% M6 r% ~6 V( ~) p8 P0 zUpdate OEDERS4 ?6 `1 `' L; M3 _0 o; V
SET orderAmount = orderAmount *1.1
8 S, k0 K# y0 IFreight = Freight*1.031 @  ~+ }+ }* C
Where ShipCountry = ‘UK’2 _& e# W& p" f* R" e
2 删除查询6 \% U- S0 S5 N% \
Delete子句可以使用户删除大量的过时的或冗于的数据.' ?0 V+ V3 F* q) j' D( N/ s
注:删除查询的对象是整个记录.3 Y7 }0 X. E1 n8 C# y5 m+ s
Delete子句的语法:
% n  a. I) m' b) N$ xDelete [表名.*]4 Q9 c% E$ W$ U9 e& D
FROM 来源表  t8 _' U* ~" m3 K% [1 t' H) u
Where 准则" ~0 M8 [' O, ]/ j5 W5 a
例: 要删除所有94年前的定单! }$ B% `7 `: ]( b) S
Delete *
2 j! ]$ R% z2 h8 M$ h6 `* C7 AFROM orders9 x' P' e4 ]' R+ d9 e
Where orderData<#94-1-1#( E' r8 f) X/ Y7 Y6 A! K( v7 u: Y
3 追加查询0 j% p; c+ V5 w0 b  I
Insert子句可以将一个或一组记录追加到一个或多个表的尾部.; R' i1 z/ O) `  f0 H/ I
INTO 子句指定接受新记录的表1 o7 I9 ~) C" i9 U( `, k% ^
valueS 关键字指定新记录所包含的数据值.' T& H: A5 o' m. t4 L9 {, C
Insert 子句的语法:
5 j0 X. Q9 M( e% A3 Q$ w4 S4 oINSETR INTO 目的表或查询(字段1,字段2,…)% }: h+ K& e# _6 h! O/ A, W
valueS(数值1,数值2,…)9 k# e& |( p) h
例:增加一个客户
# N2 T( D- C& t8 z9 Y. gInsert INTO Employees(FirstName,LastName,title)* K7 Y2 q) W$ V# r+ K
valueS(‘Harry’,’Washington’,’Trainee’)+ @9 c  |9 d1 W. U
4 生成表查询
: d* j  o; A- x可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
- N/ U* ~1 v& m/ I1 pSelect INTO子句用来创建生成表查询语法:
, u+ f8 V, K0 h$ a4 i. X# q6 N' ?Select 字段1,字段2,…  w; t8 Z4 E# v, [0 Z+ X1 d2 n
INTO 新表[IN 外部数据库]
" J$ x& l5 e. \FROM 来源数据库& H, U7 k1 P/ u, L5 {* r# q
Where 准则  F4 `0 K6 i) M/ u5 n
例:为定单制作一个存档备份( R7 e( I9 q9 w0 U
Select *
" |8 Q# ]# Y/ e: y3 TINTO ordersArchive
' j. D) J" v& T8 W' {# @FROM orders
: W- \; U4 C/ [  I0 I八. 联合查询
1 ~6 C' W" Q& w8 N. h8 EUNION运算可以把多个查询的结果合并到一个结果集里显示.
3 m; V) V! E( Z& k/ DUNION运算的一般语法:
& O6 t: _# |) t' x' l[表]查询1 UNION [ALL]查询2 UNION …8 {( y( I; D( r. y; v
例:返回巴西所有供给商和客户的名字和城市" b! c* i0 V2 H8 `& K" l
Select CompanyName,City9 P# F7 v3 o" Z* @
FROM Suppliers
" z# K( T* Q. l  e4 ^  p; }Where Country = ‘Brazil’
( ^: B/ Y" H  d$ aUNION3 p/ y7 P! a, V: [8 ?' t6 p5 r0 t
Select CompanyName,City7 G5 V, y* |- O( ]
FROM Customers
4 j8 s8 z8 N& p/ T) qWhere Country = ‘Brazil’
4 ?" x( m  H$ {7 v1 r注:2 i1 O+ K, X+ u  `- e2 T6 b! ^
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
9 q8 s& S7 \' S& XUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.
) ?! m: i. I5 @6 z  k6 t" i5 D: ~每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
5 Z9 S. J; J* q/ N4 N九. 交叉查询1 h0 _, t! W2 j& T
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.
( C  h% o8 R* \! O  QMicrosoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:
: s, h, E; b, ]/ G) N2 W1 D5 n0 n; CTRANSFORM aggfunction
6 x' i* p6 [( G5 W1 R5 h$ QSelect 语句) `6 @8 Z3 ^% I; `7 y, w
GROUP BY 子句
3 K- P8 A, S0 _- IPIVOT pivotfield[IN(value1 [,value2[,…]]) ]
, m4 a3 h/ t' V* F+ `3 |Aggfounction指SQL聚积函数,( A  r, M8 \2 R( k- x  a7 Q1 B
Select语句选择作为标题的的字段,# ]) A1 T# w8 {5 Q7 G5 O
GROUP BY 分组
8 }) }9 {8 d9 [" f0 q6 f& u说明:8 D" y/ I$ G5 {: j& K
Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.
2 o, b! @1 m/ F+ }+ g- j/ N0 Jvalue代表创建列标题的固定值.
$ W) n) n: M- g& Y0 J+ ]2 f例:显示在1996年里每一季度每一位员工所接的定单的数目:+ Y0 Q" V" r3 z- m/ Z  }
TRANSFORM Count(OrderID)! H0 a2 e; C  `: {, Q& }/ h
Select FirstName&’’&LastName AS FullName/ A; W2 Z9 S( V! O' Q) b
FROM Employees INNER JOIN orders
. f# I  v/ m! t2 DON Employees.EmployeeID = orders.EmployeeID
' A9 m6 ]0 L) ~+ R/ r+ G7 |Where DatePart(“yyyy”,OrderDate)= ‘1996’5 t# I" F7 c& O: r6 o
GROUP BY FirstName&’’&LastName' Q; G( U. w1 h. u& k- z+ {
orDER BY FirstName&’’&LastName
( I1 T( i( ^+ MPOVOT DatePart(“q”,OrderDate)&’季度’) O: h% I. D$ ^- A: x5 t
十 .子查询
8 V( h+ @9 K4 i" V% I5 Y子查询可以理解为 套查询.子查询是一个Select语句., Z1 {1 Y+ w) N/ z! N# X! ]) G
1 表达式的值与子查询返回的单一值做比较
0 W, I( }# B  N+ a9 p+ M- C5 X语法:8 W; H$ y1 H0 l* b( U9 Y
表达式 comparision [ANY|ALL|SOME](子查询)
- v1 l0 ^6 m8 X) R说明:
# L& F- T4 S! Z5 DANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
6 N# U0 T! E0 a) e例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品
$ V( P! \& F( o! I2 K6 w" E; L/ U0 gSelect * FROM Products& P- D  k/ N+ M) b
Where UnitPrice>ANY3 R5 |$ y0 J" D0 Y7 H
(Select UnitPrice FROM[Order Details] Where Discount>0.25)# {6 Y4 O0 }: L! u
2 检查表达式的值是否匹配子查询返回的一组值的某个值
& ^+ Z+ J/ f. N2 H, W* z& q. I语法:
- I7 c0 \8 g* n# z+ l[NOT]IN(子查询)
" T* N: o3 W0 m8 U4 }% ^+ M例:返回库存价值大于等于1000的产品.' u6 E. N# ^+ M
Select ProductName FROM Products2 J/ {7 i* ^: a; s. H" U3 n
Where ProductID IN
  _% E) p0 i3 J6 L# d9 y(Select PrdoctID FROM [Order DEtails]6 @$ j& i/ b5 p
Where UnitPrice*Quantity>= 1000)$ k- |+ {& S' d" o& b
3检测子查询是否返回任何记录
8 I( p7 n$ E: {& }$ @语法:/ A8 j7 f! K7 P! ~+ t
[NOT]EXISTS (子查询)
5 n1 `6 Y+ r6 h- N! Q9 d9 t( v例:用EXISTS检索英国的客户
- C1 E: U% z: L, C' D0 J0 b# FSelect ComPanyName,ContactName; S- {6 n4 h* ?1 B4 C" Q
FROM orders
- N  L5 a5 }) j0 u" q* m! fWhere EXISTS3 s( ]9 B, y6 Q) X& r5 v5 J4 q
(Select *
; V. w4 }6 L: f, X% x+ w% J9 a0 wFROM Customers4 r2 o& r0 H4 j( t
Where Country = ‘UK’ AND; R# c6 F0 ?% ~4 [& N+ Z
Customers.CustomerID= orders.CustomerID)
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2024-5-10 06:24 , Processed in 0.015600 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部