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

[原创]SQL查询语句使用

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

一、简单查询 Og1\6Q  
a@&qdp  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 &&52ji<3  
Sin)]zG~0  
表或视图、以及搜索条件等。 r}e(MT:R'  
m <z?6VC  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 lH`c&LL-=!  
>T*BEikC  
SELECT nickname,email PPrvVGP   
RA!m,"RM  
FROM testtable 5wh(Qdib  
FZ<6kk4  
WHERE name='张三' k~:(.)Nr  
)'g4Ty  
(一)选择列表 2?Ryk`2i)  
tj0 0xYY  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 1I'}Uh*  
|}e"6e%  
量和全局变量)等构成。 YqXN|&  
n#WOIweInf  
1、选择所有列 `|"o\Bg<  
jqj}j2 9  
例如,下面语句显示testtable表中所有列的数据: *gGw/jA/  
il{x?#Wrb  
SELECT * 5>CeFy  
s nxwe  
FROM testtable GmJ \3]{PZ  
rk&oKd_&i  
2、选择部分列并指定它们的显示次序 tRc 3<>  
imwn)]LR  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 bT9:9LP  
&1=,?s]&  
例如: ]5`A8-Q@  
oz:J.<j24Z  
SELECT nickname,email ujX\^c  
wod{C!  
FROM testtable &.z-itiV  
t VX|e2Y  
3、更改列标题 jL4"FTcE]3  
QJkiu8r  
在选择列表中,可重新指定列标题。定义格式为: a04S&ezj  
p((.(fx  
列标题=列名 s%> u[-9U  
]>sMu]biH  
列名 列标题 F3Vvqt*2  
?W?n l:F  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 MfLus40;n  
(lYC2i_b#  
标题: _Bn8i(  
/n,a0U/  
SELECT 昵称=nickname,电子邮件=email QiRx2Z*\  
JL:B4 f%}B  
FROM testtable FEa%wS{  
/dX,]OFm  
4、删除重复行 hiR+cPSF  
b_~KtMO  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 &|zV Wl  
J(XK%e[8  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ]Qx-f* D6  
-M[BC~!0;  
5、限制返回的行数 =`gFwH<   
F 'HYWH0?  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 <sGioMr  
W$" >\A0%  
表示一百分数,指定返回的行数等于总行数的百分之几。 L#IY6t  
)GC[xo4bg  
例如: A#79$[>w  
.N#grk)C  
SELECT TOP 2 * uk.x1*0x  
3URrK[%x`  
FROM testtable  _8z  
a9nXh6  
SELECT TOP 20 PERCENT * VN@ZYSs  
_j_c&  
FROM testtable k1FG$1.  
+n8,=}  
(二)FROM子句 iF+50d  
jRjQDK_"ka  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, E|B1h!!\c  
MS%h`Ypo  
它们之间用逗号分隔。 SY2((!n._  
kca  Y  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 FCYZ9L5uF  
|:`gjl_Nf  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 v|>'m#Ln2  
v[?eL0Z  
使用下面语句格式加以限定: ;|K(6)  
W}oAgUd  
SELECT username,citytable.cityid X_I.f6v{  
s0'Xihsw6  
FROM usertable,citytable zhde1JE  
&$NVEmW-J  
WHERE usertable.cityid=citytable.cityid a,p7l$kK  
af7\2 g3*  
在FROM子句中可用以下两种格式为表或视图指定别名: }EHmVPe  
uwb>q"M  
表名 as 别名 UBy:W^\g  
i+.bR.WO  
表名 别名 P}Ule|&LK  
%OsV(7  
例如上面语句可用表的别名格式表示为: 6~Xe$fP(  
"PPn^{bYm  
SELECT username,b.cityid )kNyl@m  
l. i&.;f  
FROM usertable a,citytable b ag$UNV  
LaiUf_W#X  
WHERE a.cityid=b.cityid Fop "m/  
7":0CU% %  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 :j,e0#+sA  
^k?Ig.m  
例如: Ow]c,F}^  
Lv ,Ls  
SELECT a.au_fname+a.au_lname Tp/+{|~  
enT.9|vm/  
FROM authors a,titleauthor ta ;HaG-c</  
jW+L0RkX  
(SELECT title_id,title H\<C@OkJS}  
G%K<YyAP  
FROM titles N8l(m5Kk,k  
"-TIao#  
WHERE ytd_sales>10000 /z+}xRS  
`795 K8  
) AS t %k3a34P@  
U(=cGA.$  
WHERE a.au_id=ta.au_id R3$e q )  
`W[oLQ  
AND ta.title_id=t.title_id Y&5h_3K;<  
G}\E{VvWh  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 c;bp[ Y3R  
N|h}'p  
(三)使用WHERE子句设置查询条件 vf(\?Js ,  
o^},L?  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: "ND 7,rQ  
E-i rB/0  
SELECT * G?d28p',.  
mOyBSOad4  
FROM usertable }45&s9m=  
}o? @  
WHERE age>20 8<6;X7<-  
e p;_'  
WHERE子句可包括各种条件运算符: P$D1kcCw  
Z %MP:@z  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 6kKIDEX  
!UlG! 820  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… SVaC)O(  
,y?0Iwf  
NOT BETWEEN…AND… !K1[o'o#  
#f~#38_  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 6546"sU  
}} l04kN_  
NOT IN (项1,项2……) 3m?3I2k  
i%0Ml:Y  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 'zZN]P  
qI"@ PI!s  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL zrG&p Z  
Je+z\eT!5<  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR C jsy1gA  
+=^10D  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 RpR;1ktF>  
izow=}  
2、列表运算符例:country IN ('Germany','China')  &jf:7y  
NS;,(v{*N  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 \:\rkc9LI  
gz-}nCSi  
varchar、text、ntext、datetime和smalldatetime等类型查询。 a}+|2k_  
zVYX#- nv  
可使用以下通配字符: c Q|nL  
sV'(y>PP%  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Lt.a@\J'_  
^c!"*L0E  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 [F/>pL5U$  
Je[wGF:%:$  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 _JiB=<Fkr  
P|_>M SO1'  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 <l(LQmM;  
{xp/1? Mo*  
例如: e-ILUzT  
lzN\~5a}  
限制以Publishing结尾,使用LIKE '%Publishing' 1j "/}0fx  
x-+Hy\^@|  
限制以A开头:LIKE '[A]%' ?k]^?7GN  
)Y+n4UL3NK  
限制以A开头外:LIKE '[^A]%' &aqF ||v%)  
Q-_&5/G  
4、空值判断符例WHERE age IS NULL >&7K|$y.J  
r1yz ?Y_P  
5、逻辑运算符:优先级为NOT、AND、OR /mX/ "~  
KyK%2:  
(四)查询结果排序 |T atRB3>  
H[UV]qO,  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: 1WRQjT=o  
V)72]p  
ORDER BY {column_name [ASC|DESC]} [,…n] Va"Q1 *"  
u+a" '*  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 J wL}|o6  
]*|+06  
序。 I{U7BZy  
oOlqlv  
例如: V}o`9R@tx}  
(-viP  
SELECT * &#^^UT(nj  
DJvmwFx  
FROM usertable mD<- <]SYp  
^<49NUB>  
ORDER BY age desc,userid ASC Jw3VWc ]]  
Ybo:2e  
另外,可以根据表达式进行排序。 /N .xh  
],#Xa.r  
  S-l<+O1fy  
d$qivct  
二、联合查询 A?i ~*#wE  
Z;Q2tT /F  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 p5`iq~e9  
R8LJC]6Bh  
合查询。UNION的语法格式为: OSreS5bg  
pURtk-Fr2  
select_statement .8Eh[yiln  
qF'lh  
UNION [ALL] selectstatement KUJCkwQ  
3-x ;_  
[UNION [ALL] selectstatement][…n] uH*moVw@5  
)!z4LE  
其中selectstatement为待联合的SELECT查询语句。 >NLG"[\  
x*>@knP<-  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 : EA-L  
s krdL.5  
行。 |"]#jx*8KC  
~mBY_[_s=  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 X$r5KJU  
|L9p.q  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 \ -n&z;`  
|P_voht  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 aH/8&.JLi  
8*zORz  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 q@i>)nC R  
wjtFZGx&  
型,系统将低精度的数据类型转换为高精度的数据类型。 M!i["($_  
%-?k [DL6  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: P5Bva  
-HwqR Y s  
查询1 UNION (查询2 UNION 查询3) H 0( .p'eN  
c T21  
  N)X 3pWC8  
(usFT_  
  PGd?c#v#  
E]w2 {%  
三、连接查询 lvOM1I  
@[LM8 @:  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 -M6#,Ji  
_ <Ip0?N  
数据库管理系统的一个标志。 "]T1DG"  
^*G UcQ$  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 b.q/? Yx  
c( _R xLJ  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 5X PoQ^  
g es-nG-  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 &8;Fi2}(L  
3mQ3mV:  
查询。 -G[TlH06  
&E]<KbVx  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 AvVPPEryal  
RD6>\9  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 sF Ph?  
w1EB>!<;tj  
SQL-92标准所定义的FROM子句的连接语法格式为: i"0*)$ h W  
FKtG  
FROM join_table join_type join_table /hur6yI8  
W K(GR\@  
[ON (join_condition)] %!7A" >ai  
hzk4SOT(  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 lDL(,ZZS`  
N(e>]ui  
个表操作的连接又称做自连接。 SB|Cr:wM  
ol1J1Zg  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 |hS^eK_  
tl 9`  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 HHerL%/   
%J+ w9Z  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 ?AVnv(_  
l1.eAs5U  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) Rzyaicj^c  
]|N"jr?7H  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 nf-6[dg  
2uT@jfj:r  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 BI<(]`FP;s  
^?: Az  
数据行。 qYPgn _  
P_P~c~o  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 tiy#b8  
i!G<sfL  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 /uPMzl  
VVEJE$  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 v5I5tzt*%H  
|fb*<o eT  
运算符等构成。 R2qz>kyyB  
_dc,}C  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 mC$ te  
RDeI l&  
连接。例如: kaRjv   
MH]?:]K9V  
SELECT p1.pub_id,p2.pub_id,p1.pr_info Sq5}v]k@&  
P@<K&S+f  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 Oiw!d6"Ovq  
,!^g8zO  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 3W[Ps?G  
<899r \  
(一)内连接 "/x/]Qx2  
PkOtg[Z  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 z-|d/#h  
V.!z9AQ  
三种: D7v.Xq|  
vX*kvEG  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 >qdRqy)DC  
R?] S<Z  
表中的所有列,包括其中的重复列。 #b1/2=PA  
$cGV)[KWp@  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 cMfnc.P\K  
d 8z9_C-  
运算符包括>、>=、<=、<、!>、!<和<>。 ]2z Gb5s"  
 rjHW  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 'fIG$tr9X  
%Gjjl*`E  
结果集合中所包括的列,并删除连接表中的重复列。 ,27=i>>  
\qbEC.-K  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: VjSA& R  
=V^8RlBi  
SELECT * >;X^+JH!)  
<h~_7Dn  
FROM authors AS a INNER JOIN publishers AS p AH ]L C6-  
.a|ROjd!  
ON a.city=p.city Wp=:|J   
jE$]Z(Ab  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): oX-h7;SD  
Z15b'^)?9  
SELECT a.*,p.pub_id,p.pub_name,p.country t<qXXQ&5  
U&6f:IV  
FROM authors AS a INNER JOIN publishers AS p WtbOm  
SA6.g2pFz  
ON a.city=p.city R(A"6a8*  
/7b$C]@k  
(二)外连接 _MGhG{p7t  
4!<[5+.  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 ?E7.x%n7X5  
jF%l\$)/  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 K-7i4 ~  
Y.8mgy>   
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 9,Ug  
QLyBP!X-  
如下面使用左外连接将论坛内容和作者信息连接起来: b%I2ig  
tJ9`Ys  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b a.g:yWL\  
_qhYG1t  
ON a.username=b.username T8J[B( )L  
i9y&<^<W  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ^1+&)6s7V  
}5Pzen  
SELECT a.*,b.* Amvl/bO  
2aO.t  
FROM city as a FULL OUTER JOIN user as b =Qw`F0t  
/bv4/P  
ON a.username=b.username *.Ceb%W7C  
m-!Uy$yM  
(三)交叉连接 [?Q$b5j/M  
38eeRo  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ~m.@{Do0p  
~!W{C_*N  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 / L/hR4  
xA2 "i2k9  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 ;-X5#  
!5K9L(gqb  
于6*8=48行。 <Xr {1M D  
{z/Y~rf  
SELECT type,pub_name k),.  
lZ9rB^!  
FROM titles CROSS JOIN publishers $Y5m"wySZ  
Grw|8xN0t  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八