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

[原创]SQL查询语句使用

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

一、简单查询 7 .xejz  
ze`qf%  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 hOe$h,E']  
qX]ej 2  
表或视图、以及搜索条件等。 _<jccQ  
Mvk#$:8e  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 %p};Di[V  
T_qh_L3  
SELECT nickname,email u73/#!(1=H  
V6b)  
FROM testtable Yt;@ @xe&  
mZ.E;X& ,*  
WHERE name='张三' t`0(5v  
^ |>)H  
(一)选择列表 wtQ(R4  
TZ:dY x  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 EU()Nnm2  
?D]T| =EZY  
量和全局变量)等构成。 #Y>d@  
u"zQh|  
1、选择所有列 {N0ky=u d  
cWa> rUsF  
例如,下面语句显示testtable表中所有列的数据: gC/-7/}  
=e]Wt/AQ  
SELECT * ]K%D$x{+\  
Ay\!ohIS3  
FROM testtable `pXC= []B2  
"Oy&6rrr  
2、选择部分列并指定它们的显示次序 l5_%Q+E_  
]GPUL>7  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 V__n9L /t  
wqp(E+&  
例如: yGPi9j{QXq  
+,}CuF  
SELECT nickname,email >V3pYRA   
4Jj O.H  
FROM testtable qzu%Pp6If  
}u'O<d~z?  
3、更改列标题 Uf-`g>  
DYCXzFAa  
在选择列表中,可重新指定列标题。定义格式为: 1H,hw  
3yIC@>&y(8  
列标题=列名 ,6a }l;lv  
d*<goBd  
列名 列标题 U_e e3KKA  
p%*! ]JRS  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 7 m!e\x8  
_Y,d|!B#L  
标题: evHKq}{  
2BIOA#@t  
SELECT 昵称=nickname,电子邮件=email veGRwir  
ZBfB4<M9xS  
FROM testtable 0)3*E)g{  
agW#"9]WM  
4、删除重复行 UkBr4{+aE  
atWAhN  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 g,cl|]/\d  
|CjE }5Op>  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 dKTUW<C  
^<O:`c6_  
5、限制返回的行数 *G0r4Ui$  
SwPc<Z?P  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 cX/ ["AM  
%j?<v@y  
表示一百分数,指定返回的行数等于总行数的百分之几。 18U CZ;)>  
)|@UY(VZ^  
例如: EJ3R{^  
tvG/oe .1'  
SELECT TOP 2 * ~2*8pb 4  
Sud5F4S  
FROM testtable y|@=j~}Zq  
Qf]ACN  
SELECT TOP 20 PERCENT * {CR'Z0  
x?|   
FROM testtable B]YY[i  
oLp:Z=  
(二)FROM子句 j/xL+Y(=  
e RjpR?!\  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, {?9s~{Dl  
,fwN_+5  
它们之间用逗号分隔。 DOm5azO!>  
-*EK-j  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 0oi =}lV  
(9J,Qs[;  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 O2Mo ~}  
@"#W\m8  
使用下面语句格式加以限定: vWwnC)5  
DN@T4!  
SELECT username,citytable.cityid {>c O&eiCt  
\5_7!.  
FROM usertable,citytable r='"X#CmV/  
+`x8[A)-  
WHERE usertable.cityid=citytable.cityid aMFUJrXo  
]64mSB  
在FROM子句中可用以下两种格式为表或视图指定别名: )vK %LmP  
XY8s\DK  
表名 as 别名 8v M}moper  
[2!K 6  
表名 别名 t "J"G@1)  
n@xDFa  
例如上面语句可用表的别名格式表示为: HhaUC?JtSK  
8_K22]c5  
SELECT username,b.cityid vb}; _/ #?  
Q- %Q7n'c  
FROM usertable a,citytable b V>j6Juh  
M ,8r{[2  
WHERE a.cityid=b.cityid DLkNL?a  
_Va!Ky =]  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 *Ri?mEv hF  
V$+xJ  m  
例如: fi%u]  
k|,pj^  
SELECT a.au_fname+a.au_lname F t%f"Z  
ZgLO[Bj  
FROM authors a,titleauthor ta A}sb 2P  
J56+eC(  
(SELECT title_id,title l/_3H\iM  
a8-2:8Su  
FROM titles -L6 rXQV@j  
"yCCei,hA?  
WHERE ytd_sales>10000 R5g -b2Lm  
y{,HpPp#o  
) AS t h8Q+fHDYv  
X]U,`oE)9  
WHERE a.au_id=ta.au_id Qg"hN  
hF s:9  
AND ta.title_id=t.title_id 01g=Cg  
>N@tInE  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 {UX?z?0T  
gV$j ]  
(三)使用WHERE子句设置查询条件 -$f~V\M  
7*^-3Tt83  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: P,k~! F^L  
"=@b>d6U+  
SELECT * n.ZLR=P4  
8i!AJF9IQ}  
FROM usertable l Q]&:%^\  
NeAkJG=<  
WHERE age>20 Y (x_bJ  
Rq )&v*=  
WHERE子句可包括各种条件运算符: gELku .  
K#rfQ0QK/!  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< Py$Q]s?\1  
0vuL(W8)  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… $}_N379&  
Oi AZA<  
NOT BETWEEN…AND… U`N|pPe:w  
!O6e,l  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) k!3X4;F!_  
/ts=DxCC;  
NOT IN (项1,项2……) 7zXFQ|TP  
,A`d!{]5  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE zI$^yk-vn  
qYR $5  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL #N^TqOr  
K]ob>wPf  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR  Ec IgX_\  
fZ1v|  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 *p:`F:  
<k?ofE1o  
2、列表运算符例:country IN ('Germany','China') A<P3X/i  
xFxl9oM."  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 o|Cq#JFG  
=sy>_   
varchar、text、ntext、datetime和smalldatetime等类型查询。 U"$Q$ OFs  
i)9}+M 5  
可使用以下通配字符: fHhm)T8KB  
F}3<q   
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 M2HO!btf  
ALvj)I`Al  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 bj23S&  
\Zc$X^}vN  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 KilgeN:  
AQ n>K{M  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 dp`xyBQ3  
8|^dM$  
例如: Ww5c9orXn  
6BM[RL?T  
限制以Publishing结尾,使用LIKE '%Publishing' [ []'U'  
0^'A^  
限制以A开头:LIKE '[A]%' MV +R$  
Dy6uWv,P  
限制以A开头外:LIKE '[^A]%' !Ic;;<  
=B4,H=7Spf  
4、空值判断符例WHERE age IS NULL :#D?b.=  
Vp8t8X1`  
5、逻辑运算符:优先级为NOT、AND、OR }s)MDq9  
)"k>}&'  
(四)查询结果排序 r /v'h@  
HT]W2^k  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ,XT#V\qne  
nk.Y#+1)  
ORDER BY {column_name [ASC|DESC]} [,…n] [Du@go1C  
GT\, @$r  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 3t<XbHF9  
i`[5%6\"&  
序。 +5J"G/f  
'J^ M`/  
例如: bwh7.lDAl  
kN3T/96  
SELECT * tP; &$y.8  
[ZwZGAP  
FROM usertable yM dEH-?/  
`$og]Dn;  
ORDER BY age desc,userid ASC zNSix!F  
iVq4&X_x  
另外,可以根据表达式进行排序。 @L^Fz$Sx  
.d< +-w2Mu  
  <viIpz2jh%  
u@|izRk  
二、联合查询 aE}1~`  
u\YH,  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联  V|=PaO  
B$~oZ'4v  
合查询。UNION的语法格式为: whb|N2  
~3}Gu^@  
select_statement g\MHv#v*k  
Pn@k)g  
UNION [ALL] selectstatement %bI(   
|8I #`  
[UNION [ALL] selectstatement][…n] z0J$9hEg89  
^NJ]~h{n$  
其中selectstatement为待联合的SELECT查询语句。 Zgp]s+%E  
[6x-c;H_4  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 0_yE74i  
F#=XJYG1  
行。 t~pA2?9@  
:xw2\:5~0  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 O v3W;jD  
9k\`3SE  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 =! v.VF\;  
;t47cUm6j  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 jvx9b([<sG  
J6x\_]1:*  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 216+ tX5Z  
8r[ZGUV  
型,系统将低精度的数据类型转换为高精度的数据类型。 4 -)'a} O  
T1zft#1~  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ,4y' (DA  
N;,?k.vU  
查询1 UNION (查询2 UNION 查询3) FFXDt"i2  
.0]4@'  
  wUzQ`h2  
"%~\kJ(G  
  v+-f pl&  
ps0wN%tA  
三、连接查询 f`<j(.{9F  
_3$@s{k-TI  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 gr %8 O-n  
I( BG%CO9  
数据库管理系统的一个标志。 51yI W*  
"sLdkd}dj  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 <4jQbY;  
y7SOz'd  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 a2W}Wb+  
h"VQFqQy  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 Tks;,C  
{9TWPB/>  
查询。 "cjZ6^Hum  
Mr'}IX5  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 Du3OmXMk  
BqZ^I eC$  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 #QJ  mAA  
N/)mw/?i  
SQL-92标准所定义的FROM子句的连接语法格式为: pTq,"}J!+  
GF~^-5  
FROM join_table join_type join_table *nNzhcuR  
Mq) n=M  
[ON (join_condition)] R_h(Z{d  
\C.%S +u  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 K#M h  
g!n1]- 1  
个表操作的连接又称做自连接。 q0WW^jwQ  
)gdv!  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 || ?B1  
Ab7hW(/  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 / uI/8>p(  
oR}ir  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 y8: 0VZox  
Okk[}G)  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) |)6(_7e9  
Pg[zRRf<  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 QiWv  
':# ?YQ}2  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 %sC,;^wla'  
bGRI^ [8#+  
数据行。 TRz~rW k  
UCYhaD@sP  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 z.1 6%@R  
/rp4m&!  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 `XYT:'   
RBx`<iBe  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ;a!o$y  
[rqe;00]  
运算符等构成。 qx 3.oU  
k/l@P  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 4,9AoK)yp  
=f@O~nGm  
连接。例如: tYIHsm\b  
#%VprcEK  
SELECT p1.pub_id,p2.pub_id,p1.pr_info T Uhp  
*pP"u::S  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 0kgK~\^,.O  
h7Jo _L7  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) Ary$,3X2  
nR/; uTTz  
(一)内连接 ,r5<v_  
r0G#BPgdR  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 d_J?i]AP|'  
iMx+y5O  
三种: B0=:A  
mDE{s",q/  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 9BI5qHEp  
L:YsAv  
表中的所有列,包括其中的重复列。 1 hZM))  
y:4Sw#M%(  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ;0E"4(S.q1  
j-gLX  
运算符包括>、>=、<=、<、!>、!<和<>。 ;TSnIC)c  
CkoPno  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 6uDA{[OH  
f<SSg* A;  
结果集合中所包括的列,并删除连接表中的重复列。 x+B~t4A  
w%S<N  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: 5K'EuI)  
7i{Rn K6*  
SELECT * rQ}4\PTi  
qIjC-#a=m  
FROM authors AS a INNER JOIN publishers AS p |L;'In  
:EgdV  
ON a.city=p.city CW\o>yh  
/p\Ymq  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): =@pm-rI|-  
xHsH .f_{  
SELECT a.*,p.pub_id,p.pub_name,p.country hD<z^j+  
?d+B]VYw  
FROM authors AS a INNER JOIN publishers AS p ;YZw{|gsh  
SJU93n"G/  
ON a.city=p.city n!Y.?mU6  
t{~"vD9Am  
(二)外连接 5YS`v#+  
vlIdi@V  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 ^'EEry  
:^%s oEi  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 EfDo%H^!j  
?; )(O2p  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 _Fl]zs<  
pE `Q4:<A  
如下面使用左外连接将论坛内容和作者信息连接起来: 6$PfX.Fh  
OD\x1,E)I  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b CyG@  
w**.8]A"N  
ON a.username=b.username s^C*uP;R  
`m2F.^qrr  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: DDAqgx  
$#R.+B  
SELECT a.*,b.* W\eB   
w2{k0MW  
FROM city as a FULL OUTER JOIN user as b @2$PU{dH  
czMLvPXRx  
ON a.username=b.username bSz6O/A/  
LV8,nTYvE  
(三)交叉连接 d,<ctd  
!LIWoa[ F.  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 asQ" |]m  
] {NY;|&I'  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ,6t0w|@-k  
aF'Ik XG d  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 g?=B{V  
}d.R=A9L  
于6*8=48行。 $,i:#KT`  
K:'pK1zy  
SELECT type,pub_name FC]? T  
*3"C"4S  
FROM titles CROSS JOIN publishers 9HTb  
xmiF!R  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八