一、简单查询 Og1\6Q
a@&qdp
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 &&52ji<3
Sin)]zG~0
表或视图、以及搜索条件等。 r}e(MT:R'
m<z?6VC
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 lH`c&LL-=!
>T*BEikC
SELECT nickname,email PPrvVGP
RA!m,"RM
FROM testtable 5wh(Qdib
FZ<6 kk4
WHERE name='张三' k~:(.)Nr
)'g4Ty
(一)选择列表 2?Ryk`2i)
tj00xYY
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 1I'}Uh*
|}e"6e%
量和全局变量)等构成。 YqXN|&
n#WOIweInf
1、选择所有列 `|"o\Bg<
jqj}j2
9
例如,下面语句显示testtable表中所有列的数据: *gGw/jA/
il{x?#Wrb
SELECT * 5>CeFy
s nxwe
FROM testtable GmJ
\3]{PZ
rk&oKd_&i
2、选择部分列并指定它们的显示次序 tRc3<>
imwn)]L R
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 bT9:9LP
&1=,?s]&
例如: ]5`A8-Q@
oz:J.<j24Z
SELECT nickname,email ujX\^c
wod{C !
FROM testtable &.z-itiV
tVX|e2Y
3、更改列标题 jL4"FTcE]3
QJkiu8r
在选择列表中,可重新指定列标题。定义格式为: a04S&ezj
p((. (fx
列标题=列名 s%>u[-9U
]>sMu]biH
列名 列标题 F3Vvqt*2
?W?n l:F
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 MfLus40;n
(lYC2i_b#
标题: _Bn8i(
/n,a0U/
SELECT 昵称=nickname,电子邮件=email QiRx2Z*\
JL:B4f%}B
FROM testtable FEa%wS{
/dX,]OFm
4、删除重复行 hiR+cPSF
b_~KtMO
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 &|zV Wl
J(XK%e[8
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ]Qx-f*
D6
-M[BC~!0;
5、限制返回的行数 =`gFwH<
F
'HYWH0?
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 <sGioMr
W$" >\A0%
表示一百分数,指定返回的行数等于总行数的百分之几。 L#IY6t
)GC[xo4bg
例如: A#79$[>w
.N#grk)C
SELECT TOP 2 * uk.x1*0x
3URrK[%x`
FROM testtable _8z
a9nXh6
SELECT TOP 20 PERCENT * VN@ZYSs
_j_c&
FROM testtable k1FG$1.
+n 8,=}
(二)FROM子句 iF+50d
jRjQDK_"ka
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, E|B1h!!\c
MS%h`Ypo
它们之间用逗号分隔。 SY2((!n._
kca Y
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 FCYZ9L5uF
|:`gjl_Nf
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 v|>'m#Ln2
v[?eL0Z
使用下面语句格式加以限定: ;|K(6)
W}oAgUd
SELECT username,citytable.cityid X_I.f6v{
s0'Xih sw6
FROM usertable,citytable zhde1JE
&$NVEmW-J
WHERE usertable.cityid=citytable.cityid a,p7l$kK
af7\2g3*
在FROM子句中可用以下两种格式为表或视图指定别名: }EHmVPe
uwb>q"M
表名 as 别名 UBy:W^\g
i+.b R.WO
表名 别名 P}Ul e|&LK
%OsV(7
例如上面语句可用表的别名格式表示为: 6~Xe$fP(
"PPn^{bYm
SELECT username,b.cityid )kNyl@m
l.i&.;f
FROM usertable a,citytable b ag$UNV
LaiUf_W #X
WHERE a.cityid=b.cityid Fop"m/
7":0CU%%
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 :j,e0#+sA
^k?Ig.m
例如: Ow]c,F}^
Lv
,Ls
SELECT a.au_fname+a.au_lname Tp/+{|~
enT.9|vm/
FROM authors a,titleauthor ta ;HaG-c</
jW+L0RkX
(SELECT title_id,title H\<C@OkJS}
G%K<YyAP
FROM titles N8l(m5Kk,k
"-TIao#
WHERE ytd_sales>10000 /z+}xRS
`795K8
) AS t %k3a34P@
U(=cGA.$
WHERE a.au_id=ta.au_id R3$eq
)
`W[oLQ
AND ta.title_id=t.title_id Y&5h_3K;<
G}\E{VvWh
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 c;bp[Y3R
N|h}'p
(三)使用WHERE子句设置查询条件 vf(\?Js,
o^},L?
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: "ND 7,rQ
E-irB/0
SELECT * G?d28p',.
mOyBSOad4
FROM usertable }45&s9m=
}o?@
WHERE age>20 8<6;X7<-
e p;_'
WHERE子句可包括各种条件运算符: P$D1kcCw
Z%MP:@z
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 6kKIDEX
!UlG!820
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… SVaC)O(
,y?0Iwf
NOT BETWEEN…AND… !K1[o'o#
#f~#38_
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 6546"sU
}}l04kN_
NOT IN (项1,项2……) 3m?3I2k
i%0Ml:Y
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 'zZN]P
qI"@ PI!s
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL zrG&p Z
Je+z\eT!5<
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR Cjsy1gA
+=^10D
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 RpR;1ktF>
izow=}
2、列表运算符例:country IN ('Germany','China') &jf :7y
NS;,(v{*N
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 \:\rkc9LI
gz-}nCSi
varchar、text、ntext、datetime和smalldatetime等类型查询。 a}+|2k_
zVYX#- nv
可使用以下通配字符: c
Q|nL
sV'(y>PP%
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Lt.a@\J'_
^c!"*L0E
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 [F/>pL5U$
Je[wGF:%:$
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 _JiB=<Fkr
P|_>M SO1'
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 <l(LQmM;
{xp/1?Mo*
例如: e-ILUzT
lzN\~5a}
限制以Publishing结尾,使用LIKE '%Publishing' 1j
"/}0fx
x-+Hy\^@|
限制以A开头:LIKE '[A]%' ?k]^?7GN
)Y+n4UL3NK
限制以A开头外:LIKE '[^A]%' &aqF||v%)
Q-_&5/G
4、空值判断符例WHERE age IS NULL >&7K|$y.J
r1yz ?Y_P
5、逻辑运算符:优先级为NOT、AND、OR /mX/
"~
KyK%2:
(四)查询结果排序 |TatRB3>
H[UV]qO,
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: 1WRQjT=o
V)72]p
ORDER BY {column_name [ASC|DESC]} [,…n] Va"Q1 *"
u+a"
'*
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 JwL}|o6
]*|+06
序。 I{U7BZy
oOlqlv
例如: V}o`9R@tx}
(-viP
SELECT * ^^UT(nj
DJvmwFx
FROM usertable mD<- <]SYp
^<49NUB>
ORDER BY age desc,userid ASC Jw3VWc
]]
Ybo:2e
另外,可以根据表达式进行排序。 /N.xh
],#Xa.r
S-l<+O1fy
d$qivct
二、联合查询 A?i
~*#wE
Z;Q2tT/F
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 p5`iq~e9
R8LJC]6Bh
合查询。UNION的语法格式为: OSreS5bg
pURtk-Fr2
select_statement .8Eh[yiln
qF'lh
UNION [ALL] selectstatement KUJCkwQ
3-x ;_
[UNION [ALL] selectstatement][…n] uH*moVw@5
)!z4LE
其中selectstatement为待联合的SELECT查询语句。 >NLG"[\
x*>@knP<-
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 : EA-L
skr dL.5
行。 |"]#jx*8KC
~mBY_[_s=
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 X$r5KJU
|L9p. q
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 \
-n&z;`
|P_voht
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 aH/8&.JLi
8*zORz
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 q@i>)nC R
wjtFZGx&
型,系统将低精度的数据类型转换为高精度的数据类型。 M!i["($_
%-?k [DL6
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: P5Bva
-HwqR Ys
查询1 UNION (查询2 UNION 查询3) H0(.p'eN
cT21
N)X3pWC8
(usFT_
PGd?c#v#
E]w2
{%
三、连接查询 lvOM1I
@[LM8 @:
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 -M6#,Ji
_<Ip0?N
数据库管理系统的一个标志。 "]T1DG"
^*G
UcQ$
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 b.q/?
Yx
c( _R
xLJ
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 5X PoQ^
g
es-nG-
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 &8;Fi2}(L
3mQ3mV:
查询。 -G[TlH06
&E]<KbVx
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 AvVPPEryal
RD6>\9
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 sFPh?
w1EB>!<;tj
SQL-92标准所定义的FROM子句的连接语法格式为: i"0*)$
hW
FKtG
FROM join_table join_type join_table /hur6yI8
W K(GR\@
[ON (join_condition)] %!7A" >ai
hzk4SOT(
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 lDL(,ZZS`
N(e>]ui
个表操作的连接又称做自连接。 SB|Cr:wM
ol1J1Zg
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 |hS^eK_
tl
9`
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 HHerL%/
%J+ w9Z
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 ?AVnv(_
l1.eAs5U
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) Rzyaicj^c
]|N"jr?7H
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 nf-6[dg
2uT@jfj:r
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 BI<(]`FP;s
^?:
Az
数据行。 qYPgn_
P_P~c~o
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 tiy#b8
i!G<sfL
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 /uPMzl
VVEJE$
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 v5I5tzt*%H
|fb*<o eT
运算符等构成。 R2qz>kyyB
_dc,}C
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 mC$ te
RDeI l&
连接。例如: kaRjv
MH]?:]K9V
SELECT p1.pub_id,p2.pub_id,p1.pr_info Sq5}v]k@&
P@<K&S+f
FROM pub_info AS p1 INNER JOIN pub_info AS p2 Oiw!d6"Ovq
,!^g8zO
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 3W[Ps?G
<899r \
(一)内连接 "/x/]Qx2
PkOtg[Z
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 z-|d/#h
V.!z9AQ
三种: D7v.Xq|
vX*kvEG
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 >qdRqy)DC
R?] S<Z
表中的所有列,包括其中的重复列。 #b1/2=PA
$cGV)[KWp@
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 cMfnc.P\K
d 8z9_C-
运算符包括>、>=、<=、<、!>、!<和<>。 ]2z
Gb5s"
rjH W
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 'fIG$tr9X
%G jjl*`E
结果集合中所包括的列,并删除连接表中的重复列。 ,27=i>>
\qbEC.-K
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: VjSA&R
=V^8RlBi
SELECT * >;X^+JH!)
<h~_7Dn
FROM authors AS a INNER JOIN publishers AS p AH
]L C6-
.a|ROjd!
ON a.city=p.city Wp=:|J
jE$]Z(Ab
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): oX-h7;SD
Z15b'^)?9
SELECT a.*,p.pub_id,p.pub_name,p.country t<qXXQ&5
U&6f:IV
FROM authors AS a INNER JOIN publishers AS p WtbOm
SA6.g2pFz
ON a.city=p.city R(A"6a8*
/7b$C]@k
(二)外连接 _MGhG{p7t
4!<