一、简单查询 n-g#nEc:
{#~A `crO
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 Zv2]X-
G5%k.IRz
表或视图、以及搜索条件等。 _0BQnzC=
2}XxRJ0
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 c/^l2CJ0
4
|bu= T
SELECT nickname,email Y9I|s{~
h^v#?3.@
FROM testtable Ii#+JY0k
l$[,V:N
WHERE name='张三' 1]9l
SE!E7
-oTdi0P
(一)选择列表 p2U6B
"[-W(=
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 n0G@BE1Y=
4V;-*:
量和全局变量)等构成。 U{qwhz(
~k%XW$cV
1、选择所有列 [kTckZv
nch#DE82
例如,下面语句显示testtable表中所有列的数据: Khl0 ~
1/,~0N9
SELECT * L)8%*X
U_hzSf
FROM testtable J\>/J%
nBLb1T
2、选择部分列并指定它们的显示次序
AQ0zsy
=J"c'Z>.
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 aK_k'4YTm
}u1h6rd `
例如: 'Fc$?$c\
byTHSRt
SELECT nickname,email tt
CC]
Q
r&ys?@+G
FROM testtable VoQhzp6&
C4GkFD
3、更改列标题 _[Sh`4`r
:Gzp
(@<@e
在选择列表中,可重新指定列标题。定义格式为: kkW }:dBl
^x$1Nf
列标题=列名 ,B /b>i
8Q"1I7U
列名 列标题 acgx')!c
dWu;F^
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 Lxv6\3I+
{;m|\652B
标题: of
GoaH*h
3[m2F O,Z
SELECT 昵称=nickname,电子邮件=email =GW[UnO
m=Gb<)Y
FROM testtable lIZ&'
z
Jl6lZd(Np
4、删除重复行 dt>9mF q
\.+:yV<$
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 ;)SWwhQ
Bj"fUI!dK
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 m.\JO
DF=Rd#
5、限制返回的行数 ZD7qw*3+
~3&hvm[IQ
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 dPxJ`8
xZM4CR9]*C
表示一百分数,指定返回的行数等于总行数的百分之几。 #_|O93HN'
g_!xD;0
例如: )]LP8
J&
5iI(A'R[7
SELECT TOP 2 * j,SZJ{ebXg
yqtaQ0F~
FROM testtable a8G<x<
UI'fzlB
SELECT TOP 20 PERCENT * Ino]::ZJ/
'1fyBU
FROM testtable @,}tY ?>a
M ac?HI
(二)FROM子句 \zwm:@lG
s,pg4nst56
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, U_.}V
m8G/;V[x
它们之间用逗号分隔。 fU\;\
a, )/D_{1
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ksJ 1:_
ImD&~^-_<
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 'NCx <0*
VR%*8=
使用下面语句格式加以限定: ,rF!o_7
G:wO1f6
SELECT username,citytable.cityid 3OY(L`
&}|`h8JA]K
FROM usertable,citytable @?;)x&<8?3
JoZzX{eu"
WHERE usertable.cityid=citytable.cityid H0yM`7[y
e
'F:LMX
在FROM子句中可用以下两种格式为表或视图指定别名: sY?wQ:
rx@i.+
表名 as 别名 !,rF(pz
D~|q^Ms,%
表名 别名 5*Qzw[[=
Y7 K2@257
例如上面语句可用表的别名格式表示为: k7L4~W
R~|(]#com
SELECT username,b.cityid ${}9/(x/^
2- (}=N
FROM usertable a,citytable b B@*!>R
:#{0yno)H
WHERE a.cityid=b.cityid Iz;^D!
Q`Q"p
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 `*`ZgTV
_34%St!lg
例如: @v!#_%J
{x[C\vZsi]
SELECT a.au_fname+a.au_lname 4x?I,cAN
~2yhZ
FROM authors a,titleauthor ta Fu\#:+5\
-V[!qI
(SELECT title_id,title fY #Y n
J4z&J SY
FROM titles ~V?\@R:g
}<w9Jfr"X
WHERE ytd_sales>10000 %qqeL
tB4yj_ZF
) AS t }w2Et
D0MW~Y6{
WHERE a.au_id=ta.au_id 3H4T*&9;n
>IA1 \?(
AND ta.title_id=t.title_id @+)T"5_Y[
]1|7V|N6
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 \q24E3zS&
tK'9%yA\
(三)使用WHERE子句设置查询条件 gQ%mVJB{(
8DbP$Wwi
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: o]&P0 b
5Z"N2D)."
SELECT * Y%@;\
L `=*Pwcj
FROM usertable Tu,nX'q]m
T!pZj_ h=
WHERE age>20 'aEN(Mdz1e
\_i22/Et
WHERE子句可包括各种条件运算符: BO6XY90(
e 0Z2B2
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< D~`RLPMk
D$rn?@&g
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… /^I!)|At
%|f@WxNrU
NOT BETWEEN…AND… /[Rp~YzW
n!lE|if
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) [9Tnp]q
"T<7j.P?
NOT IN (项1,项2……) 5LU7}v~/
sqjDh
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE h uR ^l
N+H[Y4c?F&
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL *A")A.R
9;`hJ!r
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR XaoVv2=G~
8,VEuBZ
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 =)N6R
/ T_v8{D
2、列表运算符例:country IN ('Germany','China') O`N,aYo
EaH/Gg3
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 [D?d~pB
/rK/l
varchar、text、ntext、datetime和smalldatetime等类型查询。 g0s4ZI+T
CDr0QM4k:.
可使用以下通配字符: LcNI$g;}Yf
R?N+./{
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Nd@/U
c
02(Ob
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 c|(Q[=
$YJi]:3&
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 wsc=6/#u
AUfcf*
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 [;'$y:L=g
!ZCxi
例如: Z[,,(M
h=n\c6Q
限制以Publishing结尾,使用LIKE '%Publishing' -7J~^m2x
o$7UWKW8
限制以A开头:LIKE '[A]%' *TCV}=V G
<KStlfX
限制以A开头外:LIKE '[^A]%' d`j<Bbf-
r?pFc3~N
4、空值判断符例WHERE age IS NULL Z-" NLwt[
iuM ,aF
5、逻辑运算符:优先级为NOT、AND、OR rsw=a_S
x8wsx
F
(四)查询结果排序 w^7[4u4
X76rme
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: _6]CT0
-&)
ORDER BY {column_name [ASC|DESC]} [,…n] ,zJ:a>v
*xKy^f
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 }?O>.W,/
B2WPbox
序。 Z]5xy_La
%/!f^PIwX
例如: !RjC0,
,Hp7`I>/
SELECT * r CUs
}We-sZ/w7r
FROM usertable 3-[+g}kak?
r $ YEq5
ORDER BY age desc,userid ASC )2u_[Jc=
UjyrmQf
另外,可以根据表达式进行排序。 9PaV*S(\TR
, 0?_?
GO
^$rqyWZYp
<u?\%iJ"
二、联合查询 6\y?+H1
'I>geW?{QK
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 1p<*11
li#ep?5h^
合查询。UNION的语法格式为: gnf4H
V~
6J cXhlB`
select_statement wX!0KxR/Z
SWT)M1O2
UNION [ALL] selectstatement \vpX6!T
f>Tn#OW
[UNION [ALL] selectstatement][…n] muhu`
k`C
>]Dn,*R
其中selectstatement为待联合的SELECT查询语句。 BXytAz3
/NuO>kQa
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 k?
,/om1
U_UN& /f
行。 Ksk[sf?J&
F9r|EU#;
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 'S9jMyZrZ
!?K#f?x<?
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 !|mzu1S
6;M{suG|
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 _~2o
f%q ?
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 (SA^>r
1DH P5q
型,系统将低精度的数据类型转换为高精度的数据类型。 o}52Qio
c68,,rJO]i
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: i\#?M "
X3~@U7DU
查询1 UNION (查询2 UNION 查询3) Oz<#s{Z
"DX2Mu=
/38XaKc{6
:*t5?
mKUm*m#<