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

[原创]SQL查询语句使用

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

一、简单查询 %1$,Vs<RH  
J6aef ^>  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 3kMf!VL  
cpJ|w3x B  
表或视图、以及搜索条件等。 7x4PaX(  
t1y4 7fX6  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 J S_]FsxD  
#?9;uy<j.q  
SELECT nickname,email *ppffz  
\)?HJ  
FROM testtable "!%l/_p?  
nQ,HMXj  
WHERE name='张三' hFl^\$Re  
9j9TPyC/2  
(一)选择列表 MFAH%Z$  
n#OB%@]<V  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 J6FV]Gpv  
?m? ::RH  
量和全局变量)等构成。 [mGLcg6Fw  
M1iS(x  
1、选择所有列 )f<z% :I+Z  
m-"w0Rl1T  
例如,下面语句显示testtable表中所有列的数据: 3x'|]Ns  
"5wa91*  
SELECT * X*@dj_,  
xx%j.zDI]  
FROM testtable r #cGop]  
_8_R 1s  
2、选择部分列并指定它们的显示次序 p sMvq@>  
*6DB0X_-}  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 g~A`N=r;h  
-:y,N 9^  
例如: P! #[mio  
+s DV~\Vu  
SELECT nickname,email T <ET )D7  
&AbNWtCV+G  
FROM testtable -0x #  
\Et3|Iv  
3、更改列标题 oHn Ky[1  
=.]4;z  
在选择列表中,可重新指定列标题。定义格式为: SmSH2m-  
y ~!Zg}o  
列标题=列名 'Xq| Kf (  
o]M5b;1  
列名 列标题  DwE[D]7o  
8i#2d1O  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 !58@pLJw  
!\.pq  2  
标题: ^N{h3b8  
*]/zc1Q4M  
SELECT 昵称=nickname,电子邮件=email wHMX=N1/  
CD ( :jM?  
FROM testtable Doyx[zZ  
"8jf81V*  
4、删除重复行 U7}yi$WT  
ieCEo|b  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 qL3;}R  
{dMsz   
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ~^fZx5  
l$pm_%@2]  
5、限制返回的行数 G[I"8iS,  
zFff`]^`  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 P'[3Fqe  
EC!02S  
表示一百分数,指定返回的行数等于总行数的百分之几。 Mc_YPR:C  
9u}Hmb  
例如: s/ qYa])  
tq6!`L}3  
SELECT TOP 2 * _ y8Wn}19f  
o 5uph=Q{  
FROM testtable peuZ&yK+"  
Ep3N&Imp  
SELECT TOP 20 PERCENT * $OkBg0  
9oR@U W1  
FROM testtable ;1O_M9  
`1{ZqRFQ  
(二)FROM子句 MSqVlj  
q"sed]  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, =O_4|7Zl  
`l){!rg8IC  
它们之间用逗号分隔。 KD7dye  
]uJ"?k=  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 {|_M # w~&  
 zC@o  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 ipgC RHE  
j8{i#;s!"  
使用下面语句格式加以限定: qqr?!vem6  
f:|1_j  
SELECT username,citytable.cityid 6J6BF%  
.A{tQ1&_  
FROM usertable,citytable QIvVcfM^  
{Y=WW7:Qx  
WHERE usertable.cityid=citytable.cityid ~{B7 k:  
K;Uvb(m{&  
在FROM子句中可用以下两种格式为表或视图指定别名: |5~#&v_  
j9 4=hJVKi  
表名 as 别名 ;jvBF4Lb>  
l2rd9 -T  
表名 别名 J0\Fhe0'  
uHvp;]/0\  
例如上面语句可用表的别名格式表示为: lC("y' ::  
a85$K$b>  
SELECT username,b.cityid xU>WEm2  
a#y;dK  
FROM usertable a,citytable b l%puHZ)t  
5Y'qaIFR  
WHERE a.cityid=b.cityid bvr^zH,C  
{V$|3m>:*  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 D4-ifsP  
JG!mc7  
例如: `maKN\;  
,+vy,<e&  
SELECT a.au_fname+a.au_lname R_ ,UMt  
2U\u4N O{  
FROM authors a,titleauthor ta [OV"}<V  
mPN@{.(j  
(SELECT title_id,title Agg<tM{yB  
H*&f:mfq  
FROM titles )3Iz (Ql  
K>r,(zgVc  
WHERE ytd_sales>10000 &(G\[RWp\  
gk[aM~p  
) AS t 3kIN~/<R+7  
Ym{tR,g7  
WHERE a.au_id=ta.au_id ?U5{Wa85D  
)oDHeU<&  
AND ta.title_id=t.title_id z Rl3KjET  
'}JhzKNj  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 lhz{1P]s  
qL&[K>2z  
(三)使用WHERE子句设置查询条件 }Jve cRtg1  
W*4-.*U8a  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: ox>^>wR*  
M7a.8-!1  
SELECT * m!4ndO;0vh  
fc%xS7&  
FROM usertable uK#4(eY=W  
dTC7Fm  
WHERE age>20 EXwo,?I  
" 4K(jXq|  
WHERE子句可包括各种条件运算符: $L>@Ed<  
>#;.n(y  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ?WUA`/[z  
c74.< @w  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… `d +Da=L  
YTX,cj#D^&  
NOT BETWEEN…AND… kg~mgMR+w  
L9 \1+rq  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) FLCexlv^  
,j}6? Q  
NOT IN (项1,项2……) *_{j=sd  
[vK ^Um  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE |zNX=mAV  
 u\x}8pn  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL P*Uwg&Qz)  
OwUhdiG  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 5\sd3<:+  
+L| ?~p`V  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 /y#f3r+*2  
[f-?y mmT  
2、列表运算符例:country IN ('Germany','China') mpEK (p  
Sh~dwxp*"  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 }6}l7x  
E7 Ul;d  
varchar、text、ntext、datetime和smalldatetime等类型查询。 '&R2U_  
@=Uh',F  
可使用以下通配字符: i2A81>68<  
A*R^n}sh  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 | y# Jx  
*74MWF@IY  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 }wjw:M  
Mzw<{*:r  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 cAqLE\h  
vq0Tk bzs  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 2dcV"lY  
 E`0?  
例如: UA0Bzoky;  
9y8&9<#  
限制以Publishing结尾,使用LIKE '%Publishing' ]z;I _-  
Yty/3T3)e  
限制以A开头:LIKE '[A]%' Mj?`j_X  
/-qNh >v4  
限制以A开头外:LIKE '[^A]%' :&rt)/I  
k&q;JyUi  
4、空值判断符例WHERE age IS NULL <QAFL uey  
V-2(?auZd  
5、逻辑运算符:优先级为NOT、AND、OR v0+BkfU+p  
4qh?,^Dq  
(四)查询结果排序 \0I_<  
,RI Gc US  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: Y>T-af49  
8f 4b&ah  
ORDER BY {column_name [ASC|DESC]} [,…n] 4Zddw0|2  
LTCb@L{^i  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 #s( BuVU  
T_ <@..C  
序。 S9D<8j^  
#PW9:_BE  
例如: oUr66a/[U  
9@:2wR |  
SELECT * Jk11fn;\>  
kGS;s B  
FROM usertable qu@~g cE  
rjAn@!|:+  
ORDER BY age desc,userid ASC r:'.nhe  
t?&|8SId  
另外,可以根据表达式进行排序。 I)6+6pm  
9dLV96  
  KVaiugQ   
[z\$?VJspQ  
二、联合查询 2'\H\|  
zOIDU  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 ^4hO  
1~`fVg  
合查询。UNION的语法格式为: HTS0s\R$  
uc\Kg1{  
select_statement \<>ih)J@tt  
7wqK>Y1a  
UNION [ALL] selectstatement [`[|l  
#&k5 d:  
[UNION [ALL] selectstatement][…n] JPUW6e07o  
1Z2HUzqh.  
其中selectstatement为待联合的SELECT查询语句。 t+ G#{n  
A#<?4&  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 V>LwqS~`  
.},'~NM]  
行。 yNo0ubY  
gp?uHKsM  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 6OIte -c  
eA?RK.e  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 I)[DTCJ~  
aCj&O:]=  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 :#ik. D  
^|>PA:%  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 n\D&!y[]F  
P=Jo+4O  
型,系统将低精度的数据类型转换为高精度的数据类型。 ~<5!?6Yt  
"| g>'wM*  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: @%uUiP0  
@ioJ] $o7  
查询1 UNION (查询2 UNION 查询3) E_wCN&`[  
[ /b2=>  
  j0aXyLNX  
y9GoPC`z  
  ]^7@}Ce_  
^|(LAjet  
三、连接查询 5d^sA;c  
5m 4P\y^a  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 MrFQ5:=  
Y =I'czg  
数据库管理系统的一个标志。  A,<E\  
iy!=6  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 n'LrQU  
Uz8ff  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 #A/  
Rsk4L0  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 $GcqBg-Hi  
HM1Fz\Sf  
查询。 q`7PhA  
:\c ^*K(9  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ie95rZp  
p27~>xQ  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 P|E| $)m  
 8q!]y6  
SQL-92标准所定义的FROM子句的连接语法格式为: 1(R}tRR7R  
f~R(D0@  
FROM join_table join_type join_table /-'}q=M  
#p&qUw  
[ON (join_condition)] 1n8/r}q'H  
[ l??A3G  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 9;u@q%;!k  
?e4YGOe.  
个表操作的连接又称做自连接。 -@2iaQ(5a2  
ltSU fI  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 k]|~>9eY]  
+@f26O7$*  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 lfgq=8d  
/Cr%{'Pzk  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 xLajso1g69  
o:'MpKm  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) GL}]y -f  
ec;o\erPG  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 }R2u@%n{  
J]'zIOQ  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 ^uc=f2=>,  
{}n^cq  
数据行。 iWkWR"ys y  
h,N?Ab'S  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 i1d'nxk6  
EME|k{W  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ;JT-kw6l5K  
`$ 9x1dx  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 a58H9w"u)  
qInR1r<  
运算符等构成。 9W5lSX#^;  
*N<]Xy @  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 V f&zL Sgr  
"HIRTE;&  
连接。例如: sl l\g  
Z5n1@a __  
SELECT p1.pub_id,p2.pub_id,p1.pr_info %[TR^Th6  
:3Ox~o  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 |HQW0  
M|h3Wt~7  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ;$|nrwhy  
\gaw6S>n}  
(一)内连接 Wn2NMXK  
Bsvr?|L\  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 IEi^kJflU  
uGGt\.$]s  
三种: C}Cs8eUn  
=UQ3HQD  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 Rhs/3O8k  
7n<{tM  
表中的所有列,包括其中的重复列。 {JT&w6Jz  
FW4<5~'  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 _V6ukd"B~  
b8UO,fY q  
运算符包括>、>=、<=、<、!>、!<和<>。 qyTU8Wp  
03Ycf'W  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 (L&d!$,Dv  
[z{1*Xc  
结果集合中所包括的列,并删除连接表中的重复列。 g! |kp?  
=dKtV.L  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: _B<X`L =  
rb.N~  
SELECT * n_A3#d<9  
vk^xT  
FROM authors AS a INNER JOIN publishers AS p H1 ./x6Hr  
S=5o < 1  
ON a.city=p.city 8nV+e~-w  
"!^"[mX4  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): CA~-rv  
Q1 97mN+0  
SELECT a.*,p.pub_id,p.pub_name,p.country 73;GW4,  
CD~.z7,LC  
FROM authors AS a INNER JOIN publishers AS p >kVz49j  
&h/X ku&0  
ON a.city=p.city a`>B Ly5o  
U5de@Y  
(二)外连接 DvvK^+-~  
ZFL~;_r  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 )y$(AJx$  
#"~<HG}bR/  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 y<Ot)fa$  
F]&*o w  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 +mn[5Y}:  
4tBYR9|  
如下面使用左外连接将论坛内容和作者信息连接起来: H.MI5O(Q  
8d'0N  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b W'TZ%K) I  
f-Z/t fC  
ON a.username=b.username 26h21Z16q  
b ]KBgZ  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: R\[e!g*I  
XSLFPTDEc  
SELECT a.*,b.* rey!{3U  
 b>ySv  
FROM city as a FULL OUTER JOIN user as b %.|@]!C  
Km$\:Xo  
ON a.username=b.username 9%9#_?RW  
bk[!8- b/a  
(三)交叉连接 R6->t #n,  
zO6oT1I  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 i/Zd8+.n$  
-iZ`Y?  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 wibNQ`4k  
j3Y['xDv  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 [ 4)F f  
=I_'.b  
于6*8=48行。 w}L[u r;I_  
S f# R0SA  
SELECT type,pub_name 9->if/r,o  
"w<#^d_6  
FROM titles CROSS JOIN publishers R:qW;n%AF  
ZN0P:==  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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