社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 3742阅读
  • 0回复

[原创]SQL查询语句使用

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

一、简单查询 CgEeO,N]j  
.>CqZN,^  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 T(ponLh  
`33h4G  
表或视图、以及搜索条件等。 %o^'(L@z  
6pr}A  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 OaU$ [Z'8  
&?zJ|7rh@|  
SELECT nickname,email @iWIgL  
Q#:,s8TW[  
FROM testtable To=1B`@-  
v]_{oj_(-  
WHERE name='张三' +=O8t0y n  
rl4daV&,U  
(一)选择列表 kw=+"U   
A:NsDEt  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 7cvbYP\<lv  
=( Gv_  
量和全局变量)等构成。 kFuaLEJi  
gI\J sN  
1、选择所有列 3+n&Ya1  
\B2=E  
例如,下面语句显示testtable表中所有列的数据: d@] 0 =Ax  
PX]A1Kt?  
SELECT * z KJ6j]m  
&a48DCZ  
FROM testtable rBgLj,/`U/  
o @&#*3<_e  
2、选择部分列并指定它们的显示次序 /i^b;?/1  
)5yZSdA  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 tQ=U22&7  
Gi;e Drgj~  
例如: }Qg9l|  
B8w 0DJ  
SELECT nickname,email $:mCyP<y  
}.` ycLW'  
FROM testtable . 1?AU 6\  
WOgbz&S?J  
3、更改列标题 v\\Z[,dK  
9LCV"xgX  
在选择列表中,可重新指定列标题。定义格式为: 6aMqU?-  
U_M> Q_r(  
列标题=列名 $C^94$W  
v?d~H`L  
列名 列标题 JNX7]j\  
"v ^Q !  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 8 kd  
(h`||48d  
标题: gX6'!}G8]  
m_(+-G  
SELECT 昵称=nickname,电子邮件=email WW==  
=xa`)#4(  
FROM testtable :X2B+}6_&  
c&F"tLl  
4、删除重复行 >@y5R^B`  
>`s2s@Mx  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 A")B<BK  
jOEb1  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 !:e}d+F  
+J+]P\:  
5、限制返回的行数 X}Fc0Oo  
:ykQ[d`:|  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 +s_@964  
r 97 VX>  
表示一百分数,指定返回的行数等于总行数的百分之几。 O]lWaiR`  
Q[8L='E  
例如: n*bbmG1  
KvktC|~?  
SELECT TOP 2 * GH^i,88  
E!3W_:Bs  
FROM testtable c%i/ '<Afr  
]km8M^P  
SELECT TOP 20 PERCENT * N}\$i&Vi  
gD&%$&q  
FROM testtable 1 ht4LRFi  
nm\n\j~  
(二)FROM子句 >JC.qjA  
3- LO  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 37 M7bB0  
^qV*W1|0  
它们之间用逗号分隔。 w*Kw#m'U  
cWh Aj>?_Q  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 $K;4=zN>t:  
IVEvu3  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 `db++Z'C  
oPre$YT}h  
使用下面语句格式加以限定: $@Hw DRP  
p?8> 9  
SELECT username,citytable.cityid : <m0 GG  
8]2S'm xE  
FROM usertable,citytable jC; XY!d6  
^$rt|]  
WHERE usertable.cityid=citytable.cityid V^?+|8_(  
183'1Z$KA  
在FROM子句中可用以下两种格式为表或视图指定别名: @@!t$dD  
)"j_ NlO  
表名 as 别名 TKj9s'/  
% J+'7'g  
表名 别名 ^R K[-tVV  
3H4p$\; C  
例如上面语句可用表的别名格式表示为: +J.^JXyp0  
5l{_E:.1  
SELECT username,b.cityid 51&wH  
1v,4[;{  
FROM usertable a,citytable b b4,yLVi<T  
tEf-BV;\y  
WHERE a.cityid=b.cityid 2R|2yAh  
0/-[k  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 R,6?1Z:J  
EeL~`$f  
例如: !~>u\h  
qK(? \ t$  
SELECT a.au_fname+a.au_lname S }fIZ1  
6=|Q>[K  
FROM authors a,titleauthor ta @8V8gV? zm  
Z>Sv[Ec  
(SELECT title_id,title 2+y4Gd 7  
RZDZ3W(;h  
FROM titles %T1(3T{Li  
> `z^AB   
WHERE ytd_sales>10000 Lqwc:%Y:_  
g($y4~#  
) AS t N2q'$o  
~-'nEATE  
WHERE a.au_id=ta.au_id aD%")eP%&  
OP``g/x)  
AND ta.title_id=t.title_id +F+jC9j(<  
]sbu9O ^"f  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 CX\# |Q8q  
l_QpPo!a  
(三)使用WHERE子句设置查询条件 qmJFXnf  
3}Uae#oy  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: .X YSO  
U4^dDj  
SELECT * *i)GoQoB  
[ub,&j^  
FROM usertable $+V{2k4X,  
8 rnr>Ee@  
WHERE age>20 /AW6XyMD _  
D|_}~T>;&  
WHERE子句可包括各种条件运算符: 4[rD|  
+O9l@X$l=  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ZLo3 0*  
_mFb+8C  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… e|]g ?!  
iTxn  
NOT BETWEEN…AND… Fda<cS]  
jS| (g##4  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 6n;ewl}  
P'Rr5Xa  
NOT IN (项1,项2……) $mp7IZE|  
M!mTNIj8~  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE {s_0[>  
sHh2>f@x$  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL WET $H,  
r\_aux^z  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR l,sYYU+iY  
'Y>!xm   
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 }1Wo#b+  
%xWmzdn  
2、列表运算符例:country IN ('Germany','China') vWzNsWPK"{  
~5]AXi'e~  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 ?MO'WB9+JR  
"eGS~-DVK  
varchar、text、ntext、datetime和smalldatetime等类型查询。 x"U/M ?l  
c( gUH  
可使用以下通配字符: 9-pd{Z~l  
rPr#V1}1a  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 G{ F>=z"(l  
!A!zG)Ue<  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 {zmo7~=  
;#f_e;  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 ( |O;Ci  
,gD30Pylz  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 'KyT]OObS  
v-OGY[|97  
例如: Wpj.G  
b*.)m  
限制以Publishing结尾,使用LIKE '%Publishing' 2Uu,Vv  
d5sG t#   
限制以A开头:LIKE '[A]%' ~oSLWA9  
EA?:GtH  
限制以A开头外:LIKE '[^A]%' Fd|:7NRA<  
yHT}rRS8  
4、空值判断符例WHERE age IS NULL ?;uzx7@F  
y]cx}9~  
5、逻辑运算符:优先级为NOT、AND、OR Oi l>bv8  
gU+BRTZ&x  
(四)查询结果排序 Hk3HzN 3  
"@`M>)*o  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: eb.`Q+Gb  
qxd{c8  
ORDER BY {column_name [ASC|DESC]} [,…n] & +%CC  
]l+2Ca:-[j  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 tDIzn`$ z  
,{zvGZ|  
序。 +R#*eo;o7  
|Zkcs]8M!  
例如: `.[hOQ7  
$o]suF;3  
SELECT * MZL~IX  
!j7b7<wR  
FROM usertable j:{<    
;'p0"\SV  
ORDER BY age desc,userid ASC Lg9ktRKK  
#gsAwna3  
另外,可以根据表达式进行排序。 _);1dcnR  
|fRajuA;  
  5]'iSrp  
:Z1_;`>CT  
二、联合查询 %tQIKjsVaY  
2hU4g e?6  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 sU+~#K$ b  
O7rm(  
合查询。UNION的语法格式为: K8e>sU.  
.l#Pmd!  
select_statement ixfkMM ,W  
qD`')=  
UNION [ALL] selectstatement Z.YsxbH3  
i37W^9 R  
[UNION [ALL] selectstatement][…n] Zvr(c|Q  
p8F|]6Z  
其中selectstatement为待联合的SELECT查询语句。 z!RA=]3h  
Txp~&a03  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 &dOV0y_  
Kz^aW  
行。 P#Eqe O  
b[BSUdCB  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 yChC&kX Z+  
-,XS2[  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 ",~3&wx  
>8>.o[Q&  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 ! '2'db  
#2cH.`ty  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 !$_mWz  
)03.6 Pvs  
型,系统将低精度的数据类型转换为高精度的数据类型。 B /Dj2  
!)LR41>?  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: %t<Y6*g  
]FFU,me2  
查询1 UNION (查询2 UNION 查询3) YW/<. 0rI  
P *%bG 4  
  e=2;z  
^//N-?Fx  
  6j` waK  
T-<^mX[}  
三、连接查询 `w~ 9/sty  
?B h}  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 4|Y0 $(6o  
9Ft)VX  
数据库管理系统的一个标志。 R[_7ab]A  
<(^-o4Cl  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 z Gz5|u  
^[ id8  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 .Hgiru&  
wx57dm+  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 E6@+w.VVO  
]k,fEn(  
查询。 KDn`XCnk,  
@${!C\([1  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 c)Y I3G$  
;dB=/U>3U  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 u6%56 %^f  
wI`uAZ="  
SQL-92标准所定义的FROM子句的连接语法格式为: !Noabt  
H M76%9!  
FROM join_table join_type join_table yLY2_p- X  
b LxV  
[ON (join_condition)] 1F$a My?  
KUly"B  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 H=wmN0s{<  
!(o)*S  
个表操作的连接又称做自连接。 >i=O =w  
@V<tg"(c  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 IWMqmCbv  
63k8j[$  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 Q2tGe~H  
5E.cJ{   
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 : ;d&m  
 w[VWk  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) NIYAcLa@n8  
Ii4 Byyfx  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 73]%^kx=  
6*]Kow?  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 u`("x5sa  
Xbap' /t  
数据行。 bu$5gGWVf  
 _@d.wfM  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 qkR.{?x  
^@tn+'.  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 KH@M & >=^  
xXHz)w  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 3[8'pQ!&  
(-~tb-  
运算符等构成。 Y$'fds4P  
WM>9sJf  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 lffw7T~  
;GvyL>|-~  
连接。例如: mX"z$  
H]}- U8}sp  
SELECT p1.pub_id,p2.pub_id,p1.pr_info E8?Q>%_  
E=7" };  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 8LiRZ"  
5M*ZZ+YX  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) Kj'm<]u  
SIbQs8h]  
(一)内连接 o 'yR^`  
YF."D%?  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 .4?M.Z4[  
|e+I5  
三种: ;2bG-v'4vO  
. vYGJ8(P  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 O9g{XhMv>f  
FUHa"$Bg  
表中的所有列,包括其中的重复列。 %PyU3  
;r`[6[AG  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 )B8[w  
]C]tLJ!M  
运算符包括>、>=、<=、<、!>、!<和<>。 "\> <UJ  
TmO\!`  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 `~*qjA  
3>?ip;  
结果集合中所包括的列,并删除连接表中的重复列。 F,4Q  
<Z#u_:5@  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: I80.|KIv  
c) 1m4SB@  
SELECT * a eP4%h  
sRY: 7>eg  
FROM authors AS a INNER JOIN publishers AS p rWa7"<`p  
EmY8AN(*  
ON a.city=p.city "I_3!Yu  
x}F.<`  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): !Ng^k>*h  
9}3W0F;  
SELECT a.*,p.pub_id,p.pub_name,p.country @NX^__ sa  
|nocz]yU$  
FROM authors AS a INNER JOIN publishers AS p 8/=[mYn`-  
@*_#zU#g  
ON a.city=p.city )[zyvU. J3  
ZwG+rTW  
(二)外连接 > %d]"]  
ZZlR:D  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 yP[GU| >(  
R2M,VK?Wx  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 PqvwM2}4  
a9D 5qj  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 +Cau/sPXL  
t7-sCC0  
如下面使用左外连接将论坛内容和作者信息连接起来: eIg2m <9u  
~ |!q>z  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b TTqOAo[-Z  
i*2z7MY  
ON a.username=b.username $ar:5kif  
n1$##=wK]  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: FRfMtxvU  
9Z#37)  
SELECT a.*,b.* o AQ92~b  
$SXF>n{}  
FROM city as a FULL OUTER JOIN user as b iUl{_vb  
gqe z-  
ON a.username=b.username crvWAsm  
Y!Z@1V`  
(三)交叉连接 J-X5n 3I&  
O4-UVxv}  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 -"a])- j  
wmoOp;C  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 \,(tP:o  
h` n>6I  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 AM Rj N;  
29Gej Lg |  
于6*8=48行。 m"v` E7G  
,lN!XP{M6w  
SELECT type,pub_name r#{lpF,3Ib  
4NEk#n  
FROM titles CROSS JOIN publishers *|`'L  
+)7NWR\  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

描述
快速回复

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八