SQL Server数据库培训——多表联接查询

上一篇 / 下一篇  2011-03-31 14:31:27 / 个人分类:数据库

1.            多表联接查询

1.1         交叉联接(cross join

交叉联接就是取两张表的笛卡儿积,如果一个表有m行数据,另一个表有n含行数据,交叉联接就返回m*n行数据。

w|ff"o1s0

在查询的from子句中,可以给表分配一个别名,当两个表的列名有重复的时候,可以用别名区分,如果未分配别名的话,则需要用表的完整名称做前缀。51Testing软件测试网&\~;k cK'\q%D0i^

强烈要求都使用ANSI SQL-92语法。

f:a1fH ];s,O)j0

ANSI SQL-92语法51Testing软件测试网7o1fe#JL6x:|.Zt W

selectl.lower_letter,u.upper_letterfromTest_Lower lcross joinTest_Upper uorder byl.lower_letter51Testing软件测试网$~M jWM K|

ANSI SQL-89语法51Testing软件测试网7je8dBJds2T4wt

selectl.lower_letter,u.upper_letterfromTest_Lower l, Test_Upper uorder byl.lower_letter51Testing软件测试网/c3Y%v&P3r E

 51Testing软件测试网 q(t_)Uk ny

1.1.1            自交叉联接

对一个表的多个实例进行联接就是自联接,所有的基本联接类型都支持自联接。51Testing软件测试网{["\*_y+j+`4b

selectl1.lower_letteraslower_letter1,l2.lower_letteraslower_letter2fromTest_Lower l1cross joinTest_Lower l2order byl1.lower_letter51Testing软件测试网 nWdH#k"J1oqUYs A$l\

1.2         内联接(inner join

内联接就是在交叉的结果集上按指定的条件进行过滤。51Testing软件测试网 ~`.i KG2\"f$?X8k

内联接使用inner join,也可以去掉inner51Testing软件测试网%Djg l(L"ZA {1W3yV [

ANSI SQL-92语法

9f!T"x"vo5b8k0

selectl.lower_id,u.upper_first_id,l.lower_letter,u.upper_letterfromTest_Lower linner joinTest_Upper uonl.lower_id=u.upper_first_id51Testing软件测试网 C~%a-u_1k M;Q[$Z

selectl.lower_id,u.upper_first_id,l.lower_letter,u.upper_letterfromTest_Lower ljoinTest_Upper uonl.lower_id=u.upper_first_id51Testing软件测试网4QSe8Zq L4h

ANSI SQL-89语法

Hc6xd:x!Nt(g0

selectl.lower_id,u.upper_first_id,l.lower_letter,u.upper_letterfromTest_Lower l, Test_Upper uwherel.lower_id=u.upper_first_id

XI?1E"|'J0

 

6W\Z$i_$]0

组合联接就是多条件的内联接

`8m9f8dG0

selectl.lower_id,u.upper_first_id,u.upper_second_id,l.lower_letter,u.upper_letterfromTest_Lower linner joinTest_Upper uonl.lower_id=u.upper_first_idandl.lower_id=u.upper_second_id

:r)A5j8wchh9V1L0

 51Testing软件测试网A_Op(`IJ

只包含等号的联接叫等值联接,如果包含等号之外的运算符则叫不等联接。

!y"k#f`W+X"y+y0

selectl1.lower_idaslower_id1,l2.lower_idaslower_id2fromTest_Lower l1inner joinTest_Lower l2onl1.lower_id<l2.lower_idorder byl1.lower_id

}W'VU)M:G;CJ0

 51Testing软件测试网/P#G;V.r*P"fw:}

多表联结:

-x,W*zPj0foP@O7Z0

一个联接运算符只能对两个表操作,但是一个查询可以有多个联接,当有多个表联结时,表运算符在逻辑上是按从左到右的顺序进行的,即把前一个联接的结果作为后一个联接的左边输入。(对比和组合联接的不同)51Testing软件测试网q/p.` ~9F&j/P.^#g q#[

selectl.lower_id,u1.upper_first_id,u2.upper_second_id,l.lower_letter,u1.upper_letterasupper_letter1,u2.upper_letterasupper_letter251Testing软件测试网b l(nT3E(N

fromTest_Lower linner joinTest_Upper u1onl.lower_id=u1.upper_first_id

'sO.B,lrj0

inner joinTest_Upper u2onl.lower_id=u2.upper_second_id

E/s`&P d0

1.3         外联结(outer join)

外联接是在ANSI SQL-92中才引入的,外联接就是在内联接的基础上把外部行添加进结果集。51Testing软件测试网S"z1_.D#L"@0S@

leftouter join是左边的表作为保留表,right out join是右边的表作为保留表,full outer join是两张表都作为保留表。外联接就是把在保留表中存在的,但是内联接结果集中不存在的记录,添加到结果集,对于非保留表的列,使用NULL填充。51Testing软件测试网%P2U!W%a-N,~F

selectl.lower_letter,u.upper_letterfromTest_Lower lrightouter joinTest_Upper uonchar(ascii(l.lower_letter)-32)=u.upper_letterorder byu.upper_letter51Testing软件测试网#x th5P+n

 

t$GGFvj0

外联接的结果集使用where条件过滤,如果只保留添加的外部行,按非保留表中的某非空列为NULL值判断

Nwd%akksz0

selectl.lower_letter,u.upper_letterfromTest_Lower lrightouter joinTest_Upper uonchar(ascii(l.lower_letter)-32)=u.upper_letterwherel.lower_letteris null order byu.upper_letter51Testing软件测试网vgl A-EL

 51Testing软件测试网so @:{;z_-a#Hh

需要注意的是,对于外联接,如果where过滤条件中有使用非保留表的字段作为条件进行IS NULL或者IS NOT NULL之外的判断的话,会导致外联接的外部结果集都被过滤,结果可能在预期之外。51Testing软件测试网'TW {V l$q6JgW

selectl.lower_letter,u.upper_letterfromTest_Lower lrightouter joinTest_Upper uonchar(ascii(l.lower_letter)-32)=u.upper_letterwherel.lower_letter=’a’order byu.upper_letter

l'CSQ,^0

 

~Lcg#D!U {#VIl;jH0

高级用法?

~%s*_w5lZ g9z0

select((u.upper_first_id-1)*m.max_id+u.upper_second_id)asid,u.upper_letter,l.lower_letterfromTest_Upper ucross join(selectmax(upper_first_id)asmax_idfromTest_Upper) mleftouter joinTest_Lower lonchar(ascii(l.lower_letter)-32)=u.upper_letter51Testing软件测试网x?V Gy

 

\9Y%^K"u[0

多表外联接51Testing软件测试网0G'W{/H(YLm$uR~

selectl.lower_id,u1.upper_first_id,u2.upper_second_idfromTest_Lower lleftouter joinTest_Upper u1onl.lower_id=u1.upper_first_idleftouter joinTest_Upper u2onl.lower_id=u2.upper_second_id51Testing软件测试网 ^pqQ(SvE0U{

 51Testing软件测试网Y@G]X2x6Q#jt

外联接中使用count函数,count(*)会包含所有外部行的数据,如果想过滤掉外部行数据,则使用count(<column>),使用非保留表中的列。51Testing软件测试网 @+U+y h_,Kvy

selectu.upper_first_id,count(*)ascoufromTest_Lower lrightouter joinTest_Upper uonchar(ascii(l.lower_letter)-32)=u.upper_lettergroup byu.upper_first_id51Testing软件测试网3Q_.?:V8tp

 51Testing软件测试网;mZT l-G ~4EL

selectu.upper_first_id,count(l.lower_letter)ascoufromTest_Lower lrightouter joinTest_Upper uonchar(ascii(l.lower_letter)-32)=u.upper_lettergroup byu.upper_first_id51Testing软件测试网$gl'b8fg7N

3Z*DJ,e*m s/S$Q5F0

0dl \ z%b&z5nJ1wa0 51Testing软件测试网5]$DnD7e P!N`

51Testing软件测试网[%_ g.z!B)Wa,W%P


TAG:

 

评分:0

我来说两句

Open Toolbar