一、简单查询 (!efaj
dK8dC1@,X;
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 k}qCkm27
sk:B;.z
表或视图、以及搜索条件等。 4hfq7kq7(
O~?d;.b
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 %h,&N D
P0sAq7"
SELECT nickname,email @A`j Wao
c/j+aj0.v
FROM testtable 6kAGOjO
@w(|d<5l:L
WHERE name='张三' 1*6xFn
z6,E}Y
(一)选择列表 H?ug-7k/
'.gi@Sr5
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 $-jj%kS
DvLwX1(l
量和全局变量)等构成。 qu'D"0
bI(8Um6m
1、选择所有列 XWNo)#_3
2AMb-&po&f
例如,下面语句显示testtable表中所有列的数据: k!bJ&} Q(b
35x]'
SELECT * n0EW
U,1
1_;{1O+B
FROM testtable *(5T?p[7
~4twI*f
2、选择部分列并指定它们的显示次序 C9""sVs
G;[O~N3n.
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ~6O~Fth
9KJ}Ai
例如: !g)rp`?
,)TnIByM
SELECT nickname,email h qhX
2 J3/Eu
FROM testtable ][#|5UK8L
.RAyi>\e
3、更改列标题 (J%>{?"ij
6hcK%0z
在选择列表中,可重新指定列标题。定义格式为: Ro `Xs.X
=1VZcLNt
列标题=列名 ,&fZo9J9
i\DU<lD5VN
列名 列标题 jaavh6h)
\!w |
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 zuFPG{^\#
=FiO{Aw`N
标题: ^j10
f$B
>pJ#b=
SELECT 昵称=nickname,电子邮件=email ;kR=vv
~v:IgS
FROM testtable ufw[Ei$I:
-okq=9
4、删除重复行 F!4V!VWA}
\}Iq-Je
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Y7I\<JG<
0V^I.S/q
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 Dbq/t^
2|WM?V&
5、限制返回的行数 X8R:9q_
59"tHb6 E
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 7|_2@4-W6
3-1a+7fD
表示一百分数,指定返回的行数等于总行数的百分之几。 !;d>}iE
rO{?.#~
例如: JR&yaOws
&"27U
SELECT TOP 2 * A;&YPHB
/EegP@[
FROM testtable _Y}cK|3
)~ &gBX
SELECT TOP 20 PERCENT * ab.B?bx
\j BA4?(S
FROM testtable fgC@(dvfk
:qj;f];|
(二)FROM子句 YTTij|(
G-R83Orl
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, Ai^0{kF6
JL{fW>5y|
它们之间用逗号分隔。 <r>Sj/w<D
WiQVZ{
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 o1*P|.`
Aho*E9VW
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 \DBEs02
L<B)BEE.
使用下面语句格式加以限定: ^Pu:&:ki
$d4&H/u^
SELECT username,citytable.cityid ,`k6@4
/(u? k%Q
FROM usertable,citytable =K|#5p`
]l +<-
WHERE usertable.cityid=citytable.cityid N^PkSf[)h5
@$;8k }
在FROM子句中可用以下两种格式为表或视图指定别名: CF\wR;6k
;_|4c7
表名 as 别名 jt9- v-
U}k@%m,
表名 别名 oR,zr
5ug|crX
例如上面语句可用表的别名格式表示为: ;volBfv
}; M@JMu,
SELECT username,b.cityid rwio>4=
$/@
L
FROM usertable a,citytable b ZJF+./vN
`g)
WHERE a.cityid=b.cityid B*Om\I
H Vhd#Q;
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 UugR
BSB&zp
例如: qbCU&G|)
G`Z<a
SELECT a.au_fname+a.au_lname PlK3;
N`3^:EJL8
FROM authors a,titleauthor ta mO(Y>|mm
;(;~yB|NZ5
(SELECT title_id,title TA:uB[Ji
KhX)maQ
FROM titles fE&s 6w&
Dv`"3
WHERE ytd_sales>10000 }aI>dHL
~gOZ\jm}
) AS t HY?#r]Ryt
ocMTTVo
WHERE a.au_id=ta.au_id v0=v1G*rvJ
KK4e'[Wf
AND ta.title_id=t.title_id (!J;g|58
7 b(
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 YjJ^SU`*
?9!9lSH6%
(三)使用WHERE子句设置查询条件 H+]h+K9\7
3/uvw>$
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: , /jHhKW
5JK'2J&
SELECT * ?z6K/'?
ja/wI'J<
FROM usertable a#[gNT~[
BafNFPc
WHERE age>20 }|N88PN
"!7Hu7
WHERE子句可包括各种条件运算符: V"2 G
"L1LL
iS
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ?TIi0;h
55UPd#E'
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… K :+q9;g
#w \x-i|
NOT BETWEEN…AND… >9i>A:
7ncR2-{g
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) }LQV2 hKTG
&)JoB
NOT IN (项1,项2……) vWrTB
?EPHq,
E
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE m\/) m]wR
0R`>F">
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL yV(9@lj3;
-"a(<JC^NI
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR +ZiYl[_|
"^ BA5
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 m_Z(osoE#W
u^c/1H:6
2、列表运算符例:country IN ('Germany','China') Kb;Pd!Q
wgolgof
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 x
_d
gd#?rc*f<3
varchar、text、ntext、datetime和smalldatetime等类型查询。 M8 \/[R\
B]}gfVO
可使用以下通配字符: a}|<*!4zUQ
!g}@xwWax
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 |O'*CCrCL
F9r/
M"5
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 F$|:'#KN
;mz#$"(
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 8fBhX,1
#f_'&m
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 .d$Q5Qae
'@w'(}3!3R
例如: |8[!`T*s
2J$vX(
限制以Publishing结尾,使用LIKE '%Publishing' BhbfPQ
*=v%($~PK6
限制以A开头:LIKE '[A]%' w^ofH-R/
Z)=S>06X Q
限制以A开头外:LIKE '[^A]%' ePI N<F;I
ydY 7 :D
4、空值判断符例WHERE age IS NULL a.JjbFL
|22vNt_
5、逻辑运算符:优先级为NOT、AND、OR V
EsM
tl7:L>
(四)查询结果排序 9n_RkW5g
h05FR[</
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: =ud~
>+.GBf<E
ORDER BY {column_name [ASC|DESC]} [,…n] Uam%u
UWS 91GN@
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 m-;8O /
}Y!s:w#
序。 ?MmQ'1N
)p> p3b g
例如: q@XJ,e1A
w'$>E4\
SELECT * (vzYgU,
~&F|g2:
FROM usertable h"Wpb}FT
*<SXzJ(
ORDER BY age desc,userid ASC <|X+T,
5M #',(X
另外,可以根据表达式进行排序。 w2/3[VZ}l
)K$xu (/K
hu"-dT;4]
1|ddG010
二、联合查询 ot!m=s
.V0fbHYTJ
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 G?\eO&QG{"
n@"<NKzh
合查询。UNION的语法格式为: mvt-+K?U
y:$qX*+9e
select_statement 9,\AAISi
i;]# @n|
UNION [ALL] selectstatement !Icznou\
DKem;_6OQ
[UNION [ALL] selectstatement][…n] jTV4iX
J.U%W}Hx
其中selectstatement为待联合的SELECT查询语句。 aUc#,t;Qd
"-MB U
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 a|4D6yUw|
n&|N=zh
行。 DcM/p8da
eLXL5&}`fh
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 oTXIs4+G
;~[}B v
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 1tiOf~)
w\N\J^5,Q
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 SK@ p0:
}2m>S6""A
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 TqV^\C?
dBovcc
型,系统将低精度的数据类型转换为高精度的数据类型。 7^M$u\a)U
V:P]Ved
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: |S@
#8M^;4N>[
查询1 UNION (查询2 UNION 查询3) }|[0FP]v
hy%5LV<(
#Hu##x|
0YfmAF$/ B
;1nXJ{jKw
Y9vi&G?Jl
三、连接查询 gae=+@z
5T( cy
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 ZPq.|6&
gV\Y>y4v
数据库管理系统的一个标志。 ZfVY:U:o>
Ik5V?
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 ohJDu{V
c{?SFwgd
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 es%py~m)
}''0N1,/
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 B^GMncZO
^*B@=
查询。 X !0 7QKs
|F<iu2\
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 mSZg;7DE3*
<u0}&/
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 KECW~e`
di9OQ*6a7
SQL-92标准所定义的FROM子句的连接语法格式为: >JY\h1+ H
\b!E"I_^
FROM join_table join_type join_table 3#]II j`\
qIQ
61><
[ON (join_condition)] VQG$$McJ
VSV]6$~H
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 YPY,gR
]$^HGmP
个表操作的连接又称做自连接。 ME]89 T&
hm0A%Js
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 L,nb<
=Bm|9A1
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 !io1~GpKS
;C:|m7|
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 a'Zw^g
Wc!]X.|9*
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) HyKA+7}
.q4$)8[Pg
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 9Hb|$/FD
afD {w*[8
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 p>3QW3<
?K2}<H-
数据行。 cTRtMk%^
QUvSeNSp
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 g"Ueo'd*
c$BH`" <*
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 K`<HZK
Pi9?l>
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 wpi$-i`
P6ktA-Hv>
运算符等构成。 f5un7,m
}YM\IPsPu
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 e<a*@
P,
.7 LQ l?
连接。例如: d]^m^
'wMvO{}$
SELECT p1.pub_id,p2.pub_id,p1.pr_info $o\z4_I
L+
XAbL)
FROM pub_info AS p1 INNER JOIN pub_info AS p2 AL,7rYZG$
&HAu;u@
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) d8+@K&z|
~jHuJ`]DF
(一)内连接 N81M9#,["~
I^u~r.
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 Kr1Y3[iNv
`#8k Jt
三种: l Ib
d9F
=&9c5"V&
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 |pG0 .p4
BOcD?rrZ0
表中的所有列,包括其中的重复列。 -KfK~P3PF
R4JfH
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ElDeXLr'
j&Xx{ 4v
运算符包括>、>=、<=、<、!>、!<和<>。 U:3OE97
33D2^Sf6"
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 =mPe
wx'
%eIaH!x:
结果集合中所包括的列,并删除连接表中的重复列。 wF% RM$
rKFnivGT
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: $M!iQ"bb
w4}Q6_0v
SELECT * $U9]v5
q+*\'H>
FROM authors AS a INNER JOIN publishers AS p P6La)U`VA
xfI0P0+
ON a.city=p.city yE,qLiH
,c?(
|tF
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): $ xHtI]T
^E8qI8s
SELECT a.*,p.pub_id,p.pub_name,p.country q165S
OgC,oj,!/
FROM authors AS a INNER JOIN publishers AS p (EosLn
h0
Rf>)#hn%
ON a.city=p.city ^ +@OiL>&i
La'6k
(二)外连接 ~OR^
!vpXXI4
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 Cj`~ntMN
!QbuOvw
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 ]d7A|)q
i$6rnS&C
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 (s&]V49
OPj NmdeS
如下面使用左外连接将论坛内容和作者信息连接起来: DmPsE6G}
pOn &D
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b hxM{}}.E
b)e;Q5Z(.
ON a.username=b.username _kMHF
]adgOlM
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ry=8Oq&[~
L*,h=#x(
SELECT a.*,b.* H&p:
/^k%sG@?
FROM city as a FULL OUTER JOIN user as b A/UO cl+N
dhnX\/
ON a.username=b.username Y~{<Hs
%g@\SR.
(三)交叉连接 DC1.f(cdR
I%Yq86
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 u%yYLpaKf
qGMU>J.;c
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 6k>5+ -&_
^--R#$X
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 cb0rkmO
Ay 4P_>^
于6*8=48行。 !m9hL>5vR
/!?Tv8TPp
SELECT type,pub_name ;|?_C8
@{_X@Wv4iV
FROM titles CROSS JOIN publishers 4;AQ12<[1
O< /b]<[
ORDER BY type