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

[原创]SQL查询语句使用

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

一、简单查询 l|P"^;*zq  
1)ue-(o5  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 uE-(^u  
4ax{Chn  
表或视图、以及搜索条件等。 /eF@a!  
S /hx\TzC  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 /Z:j:l  
sdFHr4  
SELECT nickname,email KGz Nj%  
C= ~c`V5>r  
FROM testtable f[@96p ?a[  
v"USD<   
WHERE name='张三' )9]a  
".?4`@7F\  
(一)选择列表 [C'bfX5HB5  
n|(lPbD  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 wPlM= .Hq?  
jm}CrqU  
量和全局变量)等构成。 Y{YbKKM  
2HE@!*z9H  
1、选择所有列 Pe`(9&iT.  
C8U3+ s  
例如,下面语句显示testtable表中所有列的数据: sg2;"E@  
i}-uK,^  
SELECT * d54iZ`  
@(t3<g  
FROM testtable =+zDE0Qs  
uzYB`H<  
2、选择部分列并指定它们的显示次序 VmS_(bM  
|7qt/z  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 &N~Eu-@b  
Q_5 l.M/9]  
例如: Qs6<(zaqkt  
,2@o`R.27  
SELECT nickname,email 3_(_yEKx  
.WSyL  
FROM testtable qE[S>/R"  
3JnpI,By  
3、更改列标题 l2D*b93  
bJ ~H  
在选择列表中,可重新指定列标题。定义格式为: Y t(D  
9]4Q@%  
列标题=列名 sPH 2KwEv  
lSxb:$g  
列名 列标题 Br1R++]  
{)[o*+9  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 pSs*Z6c)@  
r/YJ,2!  
标题: ij" ~]I  
acd[rjeT  
SELECT 昵称=nickname,电子邮件=email A;oHji#*  
ci0A!wWD  
FROM testtable Q]ersA8 V>  
|Y9>kXMl  
4、删除重复行 F.9}jd{  
hZ&KE78?  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 @@65t'3S  
+7_qg i7:  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 broLC5hbQU  
){^J8]b7#  
5、限制返回的行数 cD!,ZL  
8=8 hbdy;  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 lx)^wAO4  
@X==[gQ  
表示一百分数,指定返回的行数等于总行数的百分之几。 Q:}]-lJg  
MpV<E0CmE  
例如: 0SQ!lr  
~ao:9 ynY  
SELECT TOP 2 * YQBLbtn6(  
>3 o4 U2  
FROM testtable 6(n0{A  
djd/QAfSC  
SELECT TOP 20 PERCENT * PDNl]?  
VYk:c`E  
FROM testtable fvu{(Tb  
]Q^)9uE\D  
(二)FROM子句 Cf% qap#  
7=^{~5#  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, U3(+8}Q  
ohx[_}xN  
它们之间用逗号分隔。 / *0t_  
n]%- 2`}(  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ) .~ "  
mZ)>^.N6  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 }EK{UM9y  
K~W(ZmB  
使用下面语句格式加以限定: X/5m}-6d]  
c~ss^[qx|  
SELECT username,citytable.cityid i]8O?Ab>?  
zakhJ  
FROM usertable,citytable dlu*s(O"  
?qh-#,O9B  
WHERE usertable.cityid=citytable.cityid "{q#)N  
,9&cIUH  
在FROM子句中可用以下两种格式为表或视图指定别名: !_fDL6a-  
?UnQ?F(+G<  
表名 as 别名 Jf YgZ\#  
rH@Rh}#yp  
表名 别名 \8vP"Kr  
a4Q@sn;]  
例如上面语句可用表的别名格式表示为: O1c%XwMn^  
!fOPYgAGKn  
SELECT username,b.cityid VotC YJ  
DiFLat]X  
FROM usertable a,citytable b 9+ 'i(q z  
Lqgrt]L_"  
WHERE a.cityid=b.cityid -TUJ"ep]QJ  
!KHgHKEW^  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 uibmQ|AQ  
XKp&GE@Y  
例如: MAh1tYs4D  
I)rnF  
SELECT a.au_fname+a.au_lname qng ~,m  
a5*r1,  
FROM authors a,titleauthor ta ImXYI7PL  
4f LRl-)  
(SELECT title_id,title \xYVnjG,  
hD6BP  
FROM titles d NACE*g;q  
^<I(  
WHERE ytd_sales>10000 >pq~ &)^u  
@16GF!.  
) AS t p9v:T1 ?  
7=-Yxt  
WHERE a.au_id=ta.au_id d$!Q6ux;  
g=Xf&}&=x  
AND ta.title_id=t.title_id ?sN{U\  
DDE-$)lf>  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 4 m:h&^`N  
X[BP0:`t  
(三)使用WHERE子句设置查询条件 kR=sr/{  
!%>RHh[  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: {_9O4 + &  
$1f2'_`8~  
SELECT * BgQEd@cN  
g'.OzD  
FROM usertable ;1k& }v&  
rA~f68h|  
WHERE age>20 Z?)g'n  
BJ|l  
WHERE子句可包括各种条件运算符: fU>l:BzJ K  
&@iOB #H  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< nFnM9 pdMK  
ON2o^-%=  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… H|% J"  
IeYYG^V<A  
NOT BETWEEN…AND… g~hMOI?KK^  
omE- c  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) =AIts[!qd  
v[dU UR f  
NOT IN (项1,项2……) dq 93P%X24  
]?^V xB7L  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 4]o+)d.`(  
Y'U1=w~E  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL W!{RJWe  
D<WnPLA$g  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR Xa`Q;J"h  
5kGniG?T#  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 tZ_'>7)  
ale'-V)5  
2、列表运算符例:country IN ('Germany','China') gd;!1GNi]  
#Oka7.yz  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 8(1*,CJQg  
sfF~k-  
varchar、text、ntext、datetime和smalldatetime等类型查询。 $1yy;IyR  
G6p gG+w  
可使用以下通配字符: e=i X]%^  
'1mk;%  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 O= S[ n  
VLXA6+  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ddQ+EY@!  
k]m ~DVS  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 P$E iD+5#z  
L FWp}#%  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 lV\iYX2#  
1K Vit{  
例如: yqN`R\d  
E)-;sFz  
限制以Publishing结尾,使用LIKE '%Publishing' 7zu\tCWb  
P< OH{l  
限制以A开头:LIKE '[A]%' ,,Qg"C  
2!#g\"  
限制以A开头外:LIKE '[^A]%' #^}H)>jWy  
'z|Da&d P  
4、空值判断符例WHERE age IS NULL UoxlEec  
nxZz{&  
5、逻辑运算符:优先级为NOT、AND、OR Z^kE]Ir#EV  
A8-[EBkK  
(四)查询结果排序 6KddHyFz  
Ci`o;KVj  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: f@i#Znkf*?  
n0KpKH<&  
ORDER BY {column_name [ASC|DESC]} [,…n] ,L& yKS@  
Xb"i/gfxt  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 eoiz]L  
p/Pus;*s  
序。 aC1z.?!U  
(L(7)WbH  
例如: Z9vMz3^N  
-06G.;W\^  
SELECT * Bsa;,  
TiD#t+g  
FROM usertable ~4 fE`-O  
mG[jR*JW  
ORDER BY age desc,userid ASC 6 byeO&d  
i-|N6J  
另外,可以根据表达式进行排序。 7 yE\,  
z~t0l  
  VeQGdyhY  
\5a.JfF  
二、联合查询 Mt.Cj;h@^[  
/43l}6I  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 wV )\M]@  
G_+/ e]P  
合查询。UNION的语法格式为: u+8"W[ZULq  
M'%4BOpI6`  
select_statement  }u8(7  
uWJJ\  
UNION [ALL] selectstatement [/a AH<9b  
Sr \y1nt  
[UNION [ALL] selectstatement][…n] ;"M6}5dQ4  
~vXbh(MX  
其中selectstatement为待联合的SELECT查询语句。 k A3K   
t oGiG|L  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 t4oD> =,92  
rl}<&aPH  
行。 KKC%!Xy  
F!z ^0+H(  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 8:0/Cj  
h *R@ d  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 r^5%0_F]  
bTJ<8q  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 p8'$@:M\  
qur2t8gnxq  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 -riX=K>$  
f#z:ILG=  
型,系统将低精度的数据类型转换为高精度的数据类型。 ~dS15E4-Pp  
e@P(+.Ke  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ~cc }yDe  
Y"lEMY  
查询1 UNION (查询2 UNION 查询3) Ph yIea  
35l%iaj]G5  
  BL&AZv/T  
]W;6gmV  
  `df!-\#  
3CD#OCz7&  
三、连接查询 ),yar9C  
dFBFXy  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 x$q}lJv_  
W5Jw^,iPd  
数据库管理系统的一个标志。 #1-WiweO  
 x+cL(R  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 uH*6@aYPo  
j""ZFh04  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 $ 64up!  
*Z#OfB4}  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 /0}Z>i K  
x=cucZ  
查询。 6J>AU  
4'z)J1M  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 pVc+}Wzh  
Qs\a&Q=0H  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 U)G.Bst  
e*Wk;D&  
SQL-92标准所定义的FROM子句的连接语法格式为: qb[hKp5K6  
-6+7&.A+  
FROM join_table join_type join_table ah*{NR)  
~B|m"qY{i  
[ON (join_condition)] 1_t+lJI9j  
OjhX:{"59  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 t+a.,$U  
^i|R6oO_5  
个表操作的连接又称做自连接。 MsXw 8D  
nYSe0w  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 [2-n*a(q  
*k7BE_&*0Z  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 kqCsEtm]  
Bf*>q*%B{  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 lWYp  
F q~uuQ  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) o MJ `_  
eyK xnBz  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 Go{,< gm  
fJlNxdVr  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 n5=U.r  
A1/@KC"&{G  
数据行。 :&wb+tV  
xnMcxys~  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 y@!M<#SEzG  
2{?]W/&fS  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ;j%I1k%A  
T3fQ #p  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 (ODwdN7;  
7_\F$bp`  
运算符等构成。 P7F"#R0QB  
d/R!x{$-f  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 I(^0/]'  
d1/WUKmbZ  
连接。例如: }. &ellNQ  
 U${W3Ra  
SELECT p1.pub_id,p2.pub_id,p1.pr_info hnFpC1TO  
d%|l)JF*5  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 v82wnP-~7  
=sk[I0W  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) To(I<W|{  
:\|A.# U  
(一)内连接 7(1`,Y  
Kkp dcc  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 U,P>P+\@  
o,WjM[e  
三种: l(NQk> w  
hY.i`sp*/  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 3q'AgiW  
d~~kJKK  
表中的所有列,包括其中的重复列。 e4` L8  
3A`Gx#  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 YTyrX  
At\(/Z y  
运算符包括>、>=、<=、<、!>、!<和<>。 1<G+KC[F  
x.-d)]a!  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 ?Ujg.xo\  
gl+d0<R zw  
结果集合中所包括的列,并删除连接表中的重复列。 ZjmQ  
/-p!|T}w  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: K#+?oFo:  
{|u"I@M*O  
SELECT * @#4-4.6I<x  
2yK">xYY@  
FROM authors AS a INNER JOIN publishers AS p d#v@NuO6 h  
CIIjZ)T  
ON a.city=p.city T`!R ki%~  
VVDN3  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): @F 5Af/  
tQ{/9bN?P  
SELECT a.*,p.pub_id,p.pub_name,p.country ;+wB!/k,  
W#bYz{s.  
FROM authors AS a INNER JOIN publishers AS p '|4+< #  
{[2o  
ON a.city=p.city WrGA7&!+  
Qel)%|dOn  
(二)外连接 i"G'#n~e  
?z1v_Jh  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 Oin9lg-jR  
(j'\h/  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 R `tJ7MB  
3Cj)upc  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 I&+.IK_  
w&?XsO@0W  
如下面使用左外连接将论坛内容和作者信息连接起来: nW)+-Wxq  
/i"hViCrlG  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b &q>8D'  
6=;:[  
ON a.username=b.username $/M-@3wro  
x{:U$[_  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: _uO$=4Sd  
AU\=n,K7  
SELECT a.*,b.* *Y(59J2  
Y]([K.I=  
FROM city as a FULL OUTER JOIN user as b 1w=.vj<d8  
NVb}uH*i  
ON a.username=b.username Y2DL%'K^  
8b?nr;@  
(三)交叉连接 x/O;8^b  
SxY z)aF~  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 i]c{(gd`  
W p)!G  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 'o IE:#b  
zufphS|  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 y5sH7`2+5  
tLOGj?/r  
于6*8=48行。  Gk~aTO  
r)|~Rs!y,  
SELECT type,pub_name W+i^tmj  
9}6_B|  
FROM titles CROSS JOIN publishers mEJ7e#  
]pvHsiI:  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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