一、简单查询 sx9[#6~{Y
g2lv4Tiq-
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 a.<!>o<t:
'?|.#D#-c
表或视图、以及搜索条件等。 OUHd@up@n
Qe<c@i"
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 Tq6@
1j6p
HV3D$~g F
SELECT nickname,email wZ8LY;
`Q^Vm3h
FROM testtable k/xNqN(
BW)t2kR&
WHERE name='张三' zHj_q%A
KrECAc
(一)选择列表 @0:mP
}>Lz\.Z/+[
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 ku5g`ho
"%t !+E>nr
量和全局变量)等构成。 g.EKdvY"%H
1 pzd
1、选择所有列 9e1KH'
\AR3DDm
例如,下面语句显示testtable表中所有列的数据: 6dCqS
iu,Bmf^oD
SELECT * 6? (8KsaN
dZbG#4oO
FROM testtable )ULxB'Dm
hWu#}iN
2、选择部分列并指定它们的显示次序 ?@_,_gTQ
s&OwVQ<M
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 rNHV
|z%*}DPrpa
例如: w<4){.dA
"Zicac@N
SELECT nickname,email I."4u~[
u`X}AKC
FROM testtable U#_rcu
t#J
#DyY5
3、更改列标题 p&\x*~6u
[26([H
在选择列表中,可重新指定列标题。定义格式为: 785Y*.p
2|^bDg;W+u
列标题=列名 ].w$b)G
}oTac
列名 列标题 ~&IL>2-B
E~!FEl;
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 k@R)_,2HH
D#9W [6
标题: _^ @}LVv+E
0:Lm=9o
SELECT 昵称=nickname,电子邮件=email kjW`k?'s
IF*kLl?
FROM testtable hE/y"SP3
I-q@@!=
4、删除重复行 #P6;-d@a
{=d\t<p*n
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 58My6(5y
<BN)>NqM
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 dTP$7nfe
*o[*,1Pw
5、限制返回的行数 .~
W^P>t
p>p=nL K
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 iyhB;s5Rgw
ffyKAZ{]po
表示一百分数,指定返回的行数等于总行数的百分之几。 Xl%&hM
VuW&CnZ
例如: 'x10\Q65[
\bb,gRfP
SELECT TOP 2 * !$+J7\&7p
dDk<J;~jGJ
FROM testtable Lp/]iZ@
\G*vY#]
SELECT TOP 20 PERCENT * (sn|`k3I
7[V'3
FROM testtable Z)(C7,Xu
/T*]RO4%>]
(二)FROM子句 *Mqg_} 0Y
c>3W1"
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, }g _#.>D+
SR S~s
它们之间用逗号分隔。 T ~t%3G
6q8qq/h)
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 { l LUZM
U=%S6uL\bx
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 @*l}2W
Oox5${#^
使用下面语句格式加以限定: !/$BXUrd
5,qfr!hN,
SELECT username,citytable.cityid &e%y|{Y
Wm.SLr,o0
FROM usertable,citytable 4//Ww6W:
s 4}}MV3X
WHERE usertable.cityid=citytable.cityid I)O-i_}L&K
c Ew/F0
在FROM子句中可用以下两种格式为表或视图指定别名: ]0dp^%
Rm *"SG
表名 as 别名 `h
Y:F(
U]ouBG8/
表名 别名 +Mv0X%(N
`^afbW
例如上面语句可用表的别名格式表示为: J2H8r 'T
J(-#(kMyf
SELECT username,b.cityid $X-,6*
Fu m1w
FROM usertable a,citytable b ^ yu^Du
h_d!G+-]
WHERE a.cityid=b.cityid qx53,^2
Z!|nc.
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 /)y~%0
/{1 xpR
例如: mrd(\&EhA
R{6.O+j`
SELECT a.au_fname+a.au_lname T cSj`-
e[n T'e
FROM authors a,titleauthor ta JT<Ia
>1mCjP
(SELECT title_id,title o,Ew7~u
XUUS N
FROM titles Khw!+!(H
IEeh)aj[
WHERE ytd_sales>10000 Q:kpaMA1P
%r~TMU2"
) AS t G m<t2Csn
Ra_6}k
WHERE a.au_id=ta.au_id 0/(YH
o *I-~k
AND ta.title_id=t.title_id {q8V
R`>E_SY
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 [N#2uo
Cg21-G.
(三)使用WHERE子句设置查询条件 qdj,Qz9ly
9[6*FAFJPP
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: rxCuV
^X0<ZI
SELECT * yNY1g?E
0R*
FROM usertable jB?Tua$,s
2J|Yc^b6
WHERE age>20 uu=e~K
|n67!1
WHERE子句可包括各种条件运算符: AytHnp\H
6eK18*j%H
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< Yw+_( 2
9=
{n%F^ky+7
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… Ql\{^s+
K-_e' )22.
NOT BETWEEN…AND… RpS'Tz}
,1F3";`n[
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) O&\;BF5:R
aCFO]
NOT IN (项1,项2……) 0=(5C\w2
?exV:OKLb
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 1"~@UcJ
@oug^]a
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL k9WihejS
T6-e
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR YJXh|@LT
|' mgo
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 W)w@ju$Ko
c<-_Vh.:5
2、列表运算符例:country IN ('Germany','China') 0ltq~K
aLuxCobV
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 aeE9dV~
T3)/?f?|
varchar、text、ntext、datetime和smalldatetime等类型查询。 ^^)D!I"cA,
A^
t[PKM"
可使用以下通配字符: qV^,muyoG
i v&:X3iB
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Gv6EJV1i
],&WA?>G
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 hq$:62NYg
HRje4=:
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 e [3sWv
+:wOzTUN
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 i4v7x;m_p
[D?RL`ZF
例如: )iluu1,o
*V3 }L
Z
限制以Publishing结尾,使用LIKE '%Publishing' K
)1K ]
i@Q)`>4
限制以A开头:LIKE '[A]%' 4wMKl6mL
-&D~TL#
限制以A开头外:LIKE '[^A]%' "F}anPY
qS|bpC0x
4、空值判断符例WHERE age IS NULL :kflq
TQ.d|{B[
5、逻辑运算符:优先级为NOT、AND、OR Nx;U]O6A
?7/n s>}
(四)查询结果排序 ,H1j&]E!
W<u63P
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: $
;~G
P0DvZV8
ORDER BY {column_name [ASC|DESC]} [,…n] _)zSjFX9
HpuHJ#l
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 mn?<
Zz
M8:gHjwsx
序。 ^'*9,.ltd
70mQ{YNN
例如: S;a{wYF6v
\O^b|0zc
SELECT * I/_`/mQ
-?&wD["y
FROM usertable e
,k,L
}*hY#jo1
ORDER BY age desc,userid ASC @T|mHfQ8
{SbA(a?B
另外,可以根据表达式进行排序。 0^5SL/2
`\(Fax
7?qRY9Qu
[>oq~[e)?
二、联合查询 89U<9j
wz$1^ml
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 /^
hB6_'D
C5\bnk{
合查询。UNION的语法格式为: <hkg~4EKc
~:D}L
select_statement }>6=(!
kNMhMEez
UNION [ALL] selectstatement Se%FqI
@w[WG:-+
[UNION [ALL] selectstatement][…n] _hMMm6a|
KaZ*HPe(
其中selectstatement为待联合的SELECT查询语句。 O+@"l$;N
\3hhM}6)DM
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 [58xT>5`m
,[D,G
行。 ^g$k4
=oV8!d%]
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 iL)q':xz
c_)vWU
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 "gfy6m
j,8*Z~\5
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 WXp=>P[
Jb#*QJ=
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 |)}F}~&
PnJr
型,系统将低精度的数据类型转换为高精度的数据类型。 $C##S@
A5Qzj]{ba
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: |g}!
F-
zT6ng#
查询1 UNION (查询2 UNION 查询3) tV9BVsN
$Ud-aRlD
u 3wF)B{
EtWpB g
fJtJ2x i
xO`w|k
三、连接查询 {
KE[8n
o) `zb?
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 p^Kp= z
d7g/s'ZHt6
数据库管理系统的一个标志。 lNs 'jaD
\5BI!<
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 U{q6_z|c
aEW
Z*y
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 2[}^ zTtA
0cC5
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 {d.`0v9h
7]_UZ)u
查询。 Ua#*kTF
=#[_8)q
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 @]1E~
VjS %!P
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 JUok@6
`zAV#
SQL-92标准所定义的FROM子句的连接语法格式为: l!ltgj
y@ J\h8_
FROM join_table join_type join_table ?D/r1%Z
=iC5um:
[ON (join_condition)] [R)?93
Q*+@"tk<
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 E
j@M\
s1<_=sfnT
个表操作的连接又称做自连接。 y%Ui)UMnw]
B08q/qi
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 f&bY=$iff
UB@>i3
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 Jvw~b\
%L+/GtxK
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 'm# -)R!
j
wlmWO6
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) W1f]A#t<
wb2N$Ew=
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 *YZ'Uy?
41>Bm*if
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 1 b+B
HNxJ`x~Z~
数据行。
0|9(oP/:
ELeR5xT
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 <1.].A@b*
-N(y+~wN
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 { dhuvB
$74ZC
M
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 +?zyFb]Km
F'lG=c3N
运算符等构成。 zkYlIUD
g-U'{I5F
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 O?p.kf{b
Mc oHV]x
连接。例如: jb$sIZ%i
G1
%c<1Y
SELECT p1.pub_id,p2.pub_id,p1.pr_info cBb!7?6(
fz31di9$
FROM pub_info AS p1 INNER JOIN pub_info AS p2 8)&yjY
)I9AF,K
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) Y=sRVypJ
"\Jq2vM
(一)内连接 VV)PSo db
4JKB6~Y
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 Vj_(55WQ
g3 6oEz~|
三种: :T"!6;
T/p}Us
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 B++.tQ=X.
#s{>v$F
表中的所有列,包括其中的重复列。 &<R8'
8kXbyKX[b
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 cv eTrY}g
,WR$xi.j
运算符包括>、>=、<=、<、!>、!<和<>。 qEX2K^y'4"
St-:+=V_
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 5(q\x(N
ePa:_?(
结果集合中所包括的列,并删除连接表中的重复列。 CTp~bGIv!=
8)Z WR3)+W
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: -20o%t
p<Wb^BE
SELECT * xY(+[T!OF
^LaI{UDw%h
FROM authors AS a INNER JOIN publishers AS p iaQ[}'6!$
Z^`&