- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
|
Access如何筛选重复数据以及Select语句的完整语法
2 {( V/ L/ R9 z: [8 Q7 J+ }8 c5 V7 {* z- i4 u( Q. n( x9 Q
select distinct 字段 from 表名
* T1 l( X- c( ?0 W8 o) Z& s! Qdistinct会筛选出不同的记录,也就是说相同内容的那个字段只会取一条。) m) B8 X+ P$ s2 i
一.Select语句的完整语法为:
: n* }! g/ Z# V0 e- u/ oSelect[ALL|DISTINCT|DISTINCTROW|TOP]
7 ]5 N8 ?( ^) Y4 t# r- ~2 F0 j{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
6 V/ p9 o/ u! n8 t1 l8 P) \FROM tablee xpression[,…][IN externaldatabase]( C) m, Z! t" B" J! E
[Where…]7 ?/ t+ Y' H1 n- C* J
[GROUP BY…]0 k5 p) V0 j% e. ?( Q
[HAVING…]
8 d/ X/ o5 p/ n8 l) k[ORDER BY…]- `( X/ j! i! B: ^. O
[WITH OWNERACCESS OPTION]
( A0 s4 H7 K$ H' m9 D4 e说明:2 U2 c9 W' t1 [9 L
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。* o' ^: r9 t3 W6 K5 f, D! q( j3 U2 R4 h
1 FROM子句# ~; ~0 e' o! X j% @
FROM 子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
! O( D! j% j0 ]( d例:下列SQL语句返回所有有定单的客户:4 |" v2 P( q W% B: ]$ B
Select orderID,Customer.customerID
5 A# H: }# i4 Y& aFROM orders Customers
' [) @ a( u% ?) C' qWhere orders.CustomerID=Customers.CustomeersID+ _; V: Y- E: N: u( x ~3 e
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
9 B5 ^$ F8 R6 e, C" Q(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。# R8 |5 K) a' E! N/ B, p
例:Select ALL FirstName,LastName
% @0 F8 `/ q8 i+ [ X# i3 M0 kFROM Employees; ?/ Q% e. ]" r9 |0 u M+ d% K7 H
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
( i# C% |) C, K: B/ k' e(3) DISTINCTROW 如果有重复的记录,只返回一个
+ p% A+ a% }. r& Y) O! F9 l(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
* ?# r/ e6 c: n! }* o; I/ E8 S例:返回5%定货额最大的定单1 G% k% ^. m$ y" [( K% a& \# s
Select TOP 5 PERCENT*2 @' F; _9 E4 J5 N
FROM [ order Details]! A( l) l# f$ {0 G, \# r; l- T) G
orDER BY UnitPrice*Quantity*(1-Discount) DESC
1 q) J; i8 K: `& z3 用 AS 子句为字段取别名) C$ W; O& Z- v' s" K
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。5 D9 q& g: G8 E$ M2 x
例:返回FirstName字段取别名为NickName" P, X4 L; O4 s+ ?1 Q; \
Select FirstName AS NickName ,LastName ,City
6 F5 {. v7 U( t* JFROM Employees3 m$ \9 G P- S) q/ a+ y- H
例:返回新的一列显示库存价值
% G7 n9 f- Y9 F& X' W, w2 DSelect ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
# |$ l3 n9 ~, pFROM Products6 R* `3 X& ~# Z6 W. T2 K' Y
二 .Where 子句指定查询条件
' m& t2 a7 b# Y) _9 X# y, e! e1 比较运算符
2 F9 b7 m8 A2 g8 w比较运算符 含义0 ] J ^: o0 o8 x# a2 I- |
= 等于! [8 c& r9 B! m" ^
> 大于
8 u4 e; W: H4 j& ^< 小于& q6 n1 F0 I' T7 s
>= 大于等于
2 i- l' C; Q! v2 m; j3 n<= 小于等于4 C& J: Z# j4 ?1 S% ~
<> 不等于& M' ~/ S8 t5 [8 v3 _( U2 g
!> 不大于
7 p( [/ C2 p/ _: P!< 不小于& j" k }& o0 X+ U t$ {% B: i
例:返回96年1月的定单% Y% Y! d& L l9 g3 j0 A
Select orderID, CustomerID, orderDate7 g8 F) e; p/ [4 J
FROM orders2 ]/ t! U5 I, j+ H" {
Where orderDate>#1/1/96# AND orderDate<#1/30/96#
5 b1 f! }) }2 c1 y0 Z注意:
2 R% f7 g. |/ E; d4 t& @Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
" z, k% U6 S# M0 \) o* Q0 _! i例:8 n# X# w w0 b+ a, ]1 s$ h
Where orderDate>#96-1-1#
" e, I& }0 }: o6 Q1 K% F3 X也可以表示为:
- a3 B% T f9 f# a- L, ~+ VWhere orderDate>Datevalue(‘1/1/96’). g0 d* E6 C" {4 u* e
使用 NOT 表达式求反。
/ B3 I. ~) X: c例:查看96年1月1日以后的定单
9 a# R; C' O- L% o5 e0 d6 v" kWhere Not orderDate<=#1/1/96#
; u% _$ `! K9 \) q! h. S' @6 u2 范围(BETWEEN 和 NOT BETWEEN). S; A* d8 _9 t! O
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
, v0 i/ `/ I0 w/ G4 ~例:返回96年1月到96年2月的定单。
' { S, y; W3 `2 l$ L6 qWhere orderDate Between #1/1/96# And #2/1/96#7 a- X+ T& {' x2 j) s
3 列表(IN ,NOT IN)0 M7 ~+ L, q( L3 {7 x$ c2 j
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。" M( ~ G3 D$ Z+ h; j
例:要找出住在 London、Paris或Berlin的所有客户- u# q' _0 M8 Z& A3 [% N0 \
Select CustomerID, CompanyName, ContactName, City
9 w9 N! B) i3 D+ [FROM Customers
6 v$ ^1 G5 t; gWhere City In(‘London’,’ Paris’,’ Berlin’)' \2 N9 [, M( R
4 模式匹配(LIKE), K+ j ]" j; U: @) W( _' y
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
" R/ d5 X' c' O3 I# LLIKE运算符里使用的通配符
9 {% S# S" M! L" T, w1 Q通配符 含义) A4 V# M9 H6 ?0 f6 e
? 任何一个单一的字符
& b+ z8 l8 n1 H4 ~& D* 任意长度的字符4 l% |7 S6 K: K F
# 0~9之间的单一数字" q( P' ~7 m8 p
[字符列表] 在字符列表里的任一值# J% q$ g, @: |" `9 B, K" C
[!字符列表] 不在字符列表里的任一值
) u6 e0 ?) d2 v' M- 指定字符范围,两边的值分别为其上下限
$ c, C+ J- V6 ^$ r. j1 M例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
( @6 Y y6 n' m: Q" q) \1 q. oSelect CustomerID ,CompanyName,City,Phone& G$ h; P, Y- P2 P2 l% ]# J7 c- J( z# R* T. G
FROM Customers9 o4 {4 T% M; `7 q
Where Phone Like ‘(171)555-####’) E; Y7 h+ _# V( Q$ {& n+ h
LIKE运算符的一些样式及含义7 Q$ P m5 `9 }: e* s
样式 含义 不符合
0 x% k6 [0 W$ l( SLIKE ‘A*’ A后跟任意长度的字符 Bc,c255) t @" d0 p2 X! ]1 S3 y
# LIKE’5’ 5*5 5559 m( J1 A4 Q- o9 I8 W) G
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5 X+ x* Z3 v7 l: _2 x6 ]! j
LIKE’5##5’ 5235,5005 5kd5,5346
* Q T* C: C" @8 o+ KLIKE’
6 H9 p n& M' g4 F- a3 l[a-z]’ a-z间的任意一个字符 5,%
( B; c( C' U' h) YLIKE’[!0-9]’ 非0-9间的任意一个字符 0,1 a: {6 Q1 g1 a/ c0 e2 @6 p3 f
LIKE’[[]’ 1,*$ O/ a- N! w) C1 B6 _
三 .用ORDER BY子句排序结果9 q( {, }9 B, J. l
orDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。' M! A, ?8 \% W/ N/ `! H
orDER子句中定义了多个字段,则按照字段的先后顺序排序。* N( t) x2 \+ N" }/ N2 ?
例:% u7 D0 W3 P- `2 V( W" e* ~) \
Select ProductName,UnitPrice, UnitInStock
, z1 g/ v+ n' h& t4 j" n* [9 lFROM Products
7 E% s( f) d* s* T4 oorDER BY UnitInStock DESC , UnitPrice DESC, ProductName; E& S9 m& [& a0 V X( W
orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
. m! e% a3 Z2 I$ S" p例:下面的语句产生与上列相同的效果。 y* ^1 p6 ]$ U& t. N& ] t2 v
Select ProductName,UnitPrice, UnitInStock- A8 e" T* v- w0 y6 _# M
FROM Products
! d( n$ m: ^+ |1 O! morDER BY 1 DESC , 2 DESC,3
8 n3 F% C2 @) _四 .运用连接关系实现多表查询
" U1 J7 p" y) p" e2 k例:找出同一个城市中供应商和客户的名字% t# S$ b O6 O% _
Select Customers.CompanyName, Suppliers.ComPany.Name4 |5 k) {9 s/ X
FROM Customers, Suppliers7 e7 ?3 H# e/ t T' X6 _$ O
Where Customers.City=Suppliers.City
t/ r* ~& A7 d例:找出产品库存量大于同一种产品的定单的数量的产品和定单
- q6 ~0 G% O( Y2 j A- x4 Q1 wSelect ProductName,OrderID, UnitInStock, Quantity
# ]4 D& E+ A" Z) ~3 V) `1 eFROM Products, [Order Deails]
& Y* S1 d+ i+ b7 a. M+ `' Y- Q- EWhere Product.productID=[Order Details].ProductID F; H- E8 g: H x# q4 e
AND UnitsInStock>Quantity
1 E5 r+ W8 F+ V$ D. M另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN$ R0 T$ K/ v5 T& F% x% O
语法:; z+ L, p( O) ^. a. P! v
FROM table1 INNER JOIN table23 i- L% F, Q- ~
ON table1.field1 comparision table2.field2' d. l7 v6 _6 y; a, V6 B# ? N
其中comparision 就是前面Where子句用到的比较运算符。
; _9 m" i$ u) P/ a6 U! Y( n1 O7 wSelect FirstName,lastName,OrderID,CustomerID,OrderDate
' p3 l& z) o: p1 c& w2 jFROM Employees
( Z2 J* ~$ U9 ]* ?6 r5 N- BINNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID
3 e0 @4 |. D z/ u" x注意:
/ k; m4 I; m2 X2 j# T0 aINNER JOIN不能连接Memo OLE Object Single Double 数据类型字段。$ [8 s5 ^' J8 ?) r2 e
在一个JOIN语句中连接多个ON子句
# E; s; j7 @5 O* f语法:
4 ~: I% t V9 Z. j3 o- r4 bSelect fields
T0 {" Q$ Q8 _+ [7 X3 }FROM table1 INNER JOIN table2, w) H% Z* t) g2 ~
ON table1.field1 compopr table2.field1 AND
3 L; p, q" z! B' Y9 KON table1.field2 compopr table2.field2 or8 p; M1 n: ?7 m
ON table1.field3 compopr table2.field38 i! x' | R H+ x$ V# Z
也可以' l& W* V3 ^2 s0 N; y
Select fields9 f3 \% ?/ d, C! g" n
FROM table1 INNER JOIN5 i5 U8 |9 Q G* K1 x8 g' g( k/ q
(table2 INNER JOIN [( ]table3
6 ~4 T; D' q3 N[INNER JOER] [( ]tablex[INNER JOIN]8 ^! [5 P9 z5 G6 d' r) j
ON table1.field1 compopr table2.field1% S& Y0 t! W8 D) V
ON table1.field2 compopr table2.field2% c- z. L8 ]4 Z) w: ?* k
ON table1.field3 compopr table2.field3/ p' T# Z* A( f/ @- e
外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所有记录。
4 r- K! f4 o4 b& z6 W2 M5 D4 S# ~FROM table [LEFT|RIGHT]JOIN table2) X& O, y# p3 s8 ?" c
ON table1.field1comparision table.field2/ r& x8 G( y7 ^* K4 A/ P
用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据9 T3 E* ^# M: Z* ~- ^; N9 T$ ]
例:不管有没有定货量,返回所有商品
0 N0 v# g. S7 q$ [. |$ aSelect ProductName ,OrderID
0 x) `- r: I) ]: R5 L- TFROM Products
+ c! m* G1 R! n3 Q- r# @LEFT JOIN orders ON Products.PrductsID=Orders.ProductID0 g8 T( a4 k' [! J$ B/ M
右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。' f( J7 q" H' y+ l# n6 |7 B0 ^
例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客户,也要返回客户信息。
! N" c0 S4 ]" ~. b. X空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。3 }4 {, ]( J d9 f5 A
Select *
2 F/ m! a# @9 g/ sFROM talbe18 F% G Z7 u, `) w6 l
LEFT JOIN table2 ON table1.a=table2.c5 u; B I: o; ?1 A6 k0 e/ Y
1 连接查询中使用Iif函数实现以0值显示空值
* |% l5 N& }7 E+ L6 T, ^Iif表达式: Iif(IsNull(Amount,0,Amout)7 s9 N) z$ y9 S+ e& C
例:无论定货大于或小于¥50,都要返回一个标志。$ `. P" X9 H2 U/ t* ^
Iif([Amount]>50,?Big order?,?Small order?), f( s! v4 \2 ~7 n+ M
五. 分组和总结查询结果
& N! C A& d. w$ T& W9 _: ?在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
! C# W7 K" H% c% SGROUP BY 子句的语法
. E! {' n, N$ ~5 T2 Y @8 cSelect fidldlist
4 U8 P# u. i( C& BFROM table% i5 S0 t+ E6 l2 o2 Z( u
Where criteria/ X4 ] G! f( i6 j) p0 e5 i% d
[GROUP BY groupfieldlist [HAVING groupcriteria]]4 F& G& j) {: M& F8 w; s* R p8 Q
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
5 U1 Y: F9 d1 qGROUP BY字段中的Null值以备分组但是不能被省略。2 | n% P3 m6 Z3 }8 B. e
在任何SQL合计函数中不计算Null值。. n; l. w6 P& L: p& J$ A
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。8 d M) D b! w
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
# |8 f: o, b% w% z8 z8 V( }Select Title ,Count(Title) as Total
! ?4 q" S# \' P4 ?FROM Employees
0 @" X Y9 I) N/ f0 |3 QWhere Region = ‘WA’( [+ s2 K; M @0 k8 ]: ]* @
GROUP BY Title& H- C: y" O! X" f0 D
HAVING Count(Title)>11 K1 o# R( G8 o* K9 X7 l6 m* ]
JET SQL 中的聚积函数
3 ~- ]/ }0 a3 P, b聚集函数 意义- o: c$ y* q: q; X
SUM ( ) 求和
" L; F- g6 }" Z/ a2 Q8 h, SAVG ( ) 平均值' ]4 L4 y! v% m% h1 }* c
COUNT ( ) 表达式中记录的数目
8 f- n& e% I KCOUNT (* ) 计算记录的数目
9 M* K; ^5 A) O* L; LMAX 最大值2 e9 V/ x( U. Z5 V6 y
MIN 最小值7 `' y- ]( ]4 Y3 f: E
VAR 方差& Z4 \& V1 Q% x! G! ]
STDEV 标准误差, X3 [4 V4 [# N2 l+ u& x+ K. ~
FIRST 第一个值% o, n. }2 Y1 T
LAST 最后一个值
: k" x+ ]/ u3 B# C/ @六. 用Parameters声明创建参数查询2 r9 L, Q N& Y) p
Parameters声明的语法:% A* U5 ~6 [8 f+ m9 ~
PARAMETERS name datatype[,name datatype[, …]]4 `& i5 j/ ~( ]" w! U
其中name 是参数的标志符,可以通过标志符引用参数.# C( d# X) k' p
Datatype说明参数的数据类型.& e1 b, q- M8 W9 _/ e& U
使用时要把PARAMETERS 声明置于任何其他语句之前.9 ?3 c( s0 a- V7 F. P1 x% x
例:
% h5 r' x3 t0 ?$ S9 \7 }) L# zPARAMETERS[Low price] Currency,[Beginning date]datatime% X4 @: b8 z- d( Z
Select orderID ,OrderAmount' h- u% V9 o$ {# I) }; j. h
FROM orders' ~" k; M5 `% `- {# R
Where orderAMount>[low price], S6 ? a8 n( M7 I
AND orderDate>=[Beginning date]
8 v! d3 T- ]( I8 i& q. `七. 功能查询- x0 h) X2 G' @$ O/ b6 y/ |* {: U
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.1 l7 {6 R1 F" [+ @8 K
1 更新查询
/ E* E) O. Q0 i% JUpdate子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.& B5 Z1 Z( ]7 ~" \5 a" j# g9 _! R
更新查询语法:
6 W8 Y' k/ @# o3 y: vUpdate 表名1 W, h+ f5 F% T( p2 K' n3 W3 w
SET 新值0 Y y' y: P4 D+ B5 c- z( \8 M: b4 e; W
Where 准则
- e1 T- i9 j2 t% x9 \例:英国客户的定货量增加5%,货运量增加3%8 h% L$ [' C; S& v( b$ c
Update OEDERS
2 A/ v9 B* O! Y2 C* |' D9 \SET orderAmount = orderAmount *1.1" M) d' }+ s' m/ r2 D# `4 U3 H
Freight = Freight*1.03/ n" k# }/ [; ]* _
Where ShipCountry = ‘UK’) S* u6 Z9 |- z% l! K
2 删除查询
/ t* F* g4 k" j7 \* D. oDelete子句可以使用户删除大量的过时的或冗于的数据.
4 x- @" F X2 S) s4 g$ @注:删除查询的对象是整个记录.$ X% v& v+ ~0 n; U* i. \$ S
Delete子句的语法:
4 N0 D+ y' @1 TDelete [表名.*]. }" }1 z/ N/ A7 F
FROM 来源表
6 x% I$ U- t6 F3 w$ D. u$ wWhere 准则/ e4 H+ K, _3 @7 H, k9 p7 d
例: 要删除所有94年前的定单: S. E6 _9 n, f( u8 E, s
Delete *' `0 n" s% Y' K8 c% k+ B. w
FROM orders% g; C: T, U R/ U
Where orderData<#94-1-1#
M# [/ M1 w0 Q* H: i3 }- Z3 追加查询
: ^0 [$ s/ y* j1 `Insert子句可以将一个或一组记录追加到一个或多个表的尾部." y6 k- y' Q' I2 z( U$ x
INTO 子句指定接受新记录的表
" {+ F- b" U6 tvalueS 关键字指定新记录所包含的数据值.: M4 J% ]- C+ T* a7 t
Insert 子句的语法:4 H+ ?: z3 o: }6 {: f7 O) p/ Y
INSETR INTO 目的表或查询(字段1,字段2,…)
8 W8 [- n7 F& |valueS(数值1,数值2,…)3 t# m' a c: ~% y
例:增加一个客户
) B% |# \& ~* S9 YInsert INTO Employees(FirstName,LastName,title)
" w5 ~$ [; U8 j6 L! a. QvalueS(‘Harry’,’Washington’,’Trainee’)
& h( [, I; l; X3 j2 G; Y4 生成表查询- @. ?2 ` q9 u
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.
/ z& w/ y* x/ @0 vSelect INTO子句用来创建生成表查询语法:3 R. B. l }, x1 ]/ X: k
Select 字段1,字段2,…8 L. A( k6 n* v
INTO 新表[IN 外部数据库]; ~: y& A5 K$ T
FROM 来源数据库
" k2 J- u I1 h) B% PWhere 准则+ e b. P; ^8 j% H4 `, F4 k
例:为定单制作一个存档备份
% s) J1 a; ^- V; w& l) E* c6 sSelect *, p3 E1 h/ I! M" A" }
INTO ordersArchive- u! L- k( q" Y
FROM orders8 z9 I5 s) R* O! [ t h' f
八. 联合查询
/ p2 b" A7 G, n' lUNION运算可以把多个查询的结果合并到一个结果集里显示.1 l: {+ h8 S; v9 \
UNION运算的一般语法:; j# C4 k% v* v
[表]查询1 UNION [ALL]查询2 UNION …* i9 I& V$ P& e3 F9 R
例:返回巴西所有供给商和客户的名字和城市 Z* y" E. v1 y* [) U7 J- I
Select CompanyName,City
' Z% q: E( a9 X- ?# g/ [9 |FROM Suppliers/ T5 x& f, K( |& b1 y8 R( f& ^$ V' s
Where Country = ‘Brazil’/ F* m0 Q: Y# q' H9 `
UNION
3 V% s( k5 [: E, O! \! y' g$ sSelect CompanyName,City
4 Q( e" U; ^7 B0 v" GFROM Customers, v9 v# ^' w- D/ G- f
Where Country = ‘Brazil’
8 n& g# y) u1 l& p3 t8 G K/ d. \注:
( G9 l( r1 m M缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项
$ q" p8 I7 V: u* f nUNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.- R# r o2 z" T8 [
每一个查询参数中可以使用GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER BY子句.
! P: u e3 i, M& ]) t# ~8 }! U九. 交叉查询5 }" i9 Q( U7 L, J& z
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.+ |, {+ u0 q3 d& j! T# r
Microsoft Jet SQL 用TRANSFROM语句创建交叉表查询语法:$ v% I( J+ [* l
TRANSFORM aggfunction
9 \0 M/ c0 J# oSelect 语句
5 o8 A/ }; Z( C+ X: z9 e0 `GROUP BY 子句
; M% y3 L9 v3 f; }PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
- O' ?: g7 n2 o1 q! Y4 ]8 RAggfounction指SQL聚积函数,
1 Q5 m, a" ^* nSelect语句选择作为标题的的字段,$ j$ w5 M+ t) f- d) e
GROUP BY 分组5 A5 h2 |% a* v" H9 r
说明:
+ G" z1 C, t' c9 H5 {Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.! `& U) D+ E x6 U
value代表创建列标题的固定值.
7 k. B5 J' q8 d例:显示在1996年里每一季度每一位员工所接的定单的数目: W7 e6 x4 s2 E/ {' \
TRANSFORM Count(OrderID)
: k! |6 ^2 Y" b9 nSelect FirstName&’’&LastName AS FullName7 R4 T/ p+ U) z- M* ^
FROM Employees INNER JOIN orders; Z& c% R4 I' Q
ON Employees.EmployeeID = orders.EmployeeID
- i/ `/ S2 {& FWhere DatePart(“yyyy”,OrderDate)= ‘1996’
" R: P4 {" Z: o4 LGROUP BY FirstName&’’&LastName
7 d/ _0 K h6 z9 [1 ?$ `orDER BY FirstName&’’&LastName8 @) N4 h z0 A) j- _
POVOT DatePart(“q”,OrderDate)&’季度’, W) q" [5 ?: D7 J4 Q
十 .子查询
& F+ J' o o+ `8 J2 K P子查询可以理解为 套查询.子查询是一个Select语句.6 J. f2 h; b8 X3 Z1 W W4 {" D
1 表达式的值与子查询返回的单一值做比较
6 l- w# t, M* P1 ?语法:
* X0 ~9 C! Y. F表达式 comparision [ANY|ALL|SOME](子查询)
% p6 F: S! D L D: O说明:+ c1 Y9 g" p* \4 n% p
ANY 和SOME谓词是同义词,与比较运算符(=,<,>,<>,<=,>=)一起使用.返回一个布尔值True或 False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回 True值(既Where子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生 True结果,才回返回True值.
& Z) h! e- B8 ~: u1 n! @% f! ]& ^- C例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品7 x1 Z! E$ J: R! i$ I2 S
Select * FROM Products
' O: e# N. }1 P# yWhere UnitPrice>ANY4 r& }0 I6 D. c k; f) D* z7 _
(Select UnitPrice FROM[Order Details] Where Discount>0.25)
" K, g7 f( P9 o" G& [; g2 检查表达式的值是否匹配子查询返回的一组值的某个值
, p3 Y# I, p/ k1 k% M语法:
( [% v5 Y5 i7 ?6 N( v# b[NOT]IN(子查询)
+ u, n) |6 ]2 L5 c; g) l; Q例:返回库存价值大于等于1000的产品.& K7 Y% z9 k: j0 A3 V4 `1 g z
Select ProductName FROM Products
$ U! p6 S7 B! q8 d% [1 }0 dWhere ProductID IN
U6 [, s3 U" y& h& o# @(Select PrdoctID FROM [Order DEtails]
`' h$ o- c6 q5 h) ZWhere UnitPrice*Quantity>= 1000)8 u- q) b$ A% Y$ b
3检测子查询是否返回任何记录, ~6 |" `# ]& A! S
语法:
- }9 L; v9 ]: c5 r; L0 l- n$ Q[NOT]EXISTS (子查询)5 g" J h# f% k* I3 o5 [
例:用EXISTS检索英国的客户
: `* u; W, p' P |Select ComPanyName,ContactName
" `7 p! H5 k2 ^& y7 {6 ^FROM orders
- e6 j0 _3 |+ U2 v @Where EXISTS; i% ?0 h1 f' g
(Select *
" T, ?- f# G" f* W: j8 BFROM Customers# G9 h! s' i0 x
Where Country = ‘UK’ AND
0 S: h6 K1 Y0 V! }7 u! D' gCustomers.CustomerID= orders.CustomerID) |
|