数据库:内联接,外联接,空值和联接
内联接: 左表的一行和右表的每一行进行比较, 如果左表的一行和右表的一行符合联接条件,则返回为结果集中的一行 ------ 等效于where条件
当联接表时,创建的联接类型影响出现在结果集内的行。可以创建下列联接类型:
仅显示两个联接表中的匹配行的联接。(这是查询设计器中的默认联接类型。)例如,可以联接 titles 表和 publishers 表以创建显示每个书名的出版商名称的结果集。在内联接中,结果集内不包含没有出版商信息的书名,也不包含没有书名的出版商。这类联接所得到的 SQL 可能象下面这样:
· SELECT title, pub_name · FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id注意 当创建内联接时,包含 NULL 的列不与任何值匹配,因此不包括在结果集内。空值不与其它的空值匹配。
sql语法: select __ from __ inner join __ on __
linQ语法: from __ in __ join __ in __ on __ select __
结果集:
外联接 (跟内联接的区别是,外联结至少返回左边或右表中的所有行)
1.左向外联接: 返回左表的所有行,如果左表的某行在右表没有匹配行,则右表返回空,并组合成结果集中的一行,如果有则联接成结果集中的一行
包括第一个命名表("左"表,出现在 JOIN 子句的最左边)中的所有行。不包括右表中的不匹配行。例如,下面的 SQL 语句说明 titles 表和 publishers 表之间的左向外联接包括所有的书名,甚至包括那些没有出版商信息的书名:
· SELECT titles.title_id, · titles.title, · publishers.pub_name · FROM titles LEFT OUTER JOIN publishers · ON titles.pub_id = publishers.pub_id 语法: select __ from __ left outer join __ on __
结果集:
2.右向外联接:返回右表的所有行,如果右表的某行在左表没有匹配行,则左表返回空,并组合成结果集中的一行,如果有则联接成结果集中的一行
包括第二个命名表("右"表,出现在 JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。例如,在 titles 和 publishers 表之间的右向外联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。所得到的 SQL 可能象下面这样:
· SELECT titles.title_id, · titles.title, · publishers.pub_name · FROM titles RIGHT OUTER JOIN publishers · ON titles.pub_id = publishers.pub_id
语法: select __ from __ right outer join __ on __
结果集:
3.完整外部联接:返回左表和右边的所有行;若不匹配,则一边有值,一边为空
包括所有联接表中的所有行,不论它们是否匹配。例如,titles 表和 publishers 表之间的完整外部联接显示所有书名和所有出版商,甚至包括那些在另一个表中没有匹配值的书名和出版商。
· SELECT titles.title_id, · titles.title, · publishers.pub_name · FROM titles FULL OUTER JOIN publishers · ON titles.pub_id = publishers.pub_id
语法: select __ from __ full outer join __ on __
结果集:
交叉联接:返回左表中的每一行,左表中的每一行与右表中的所有行组合,结果集的行数等于左表的行数乘右表的行数
在这类联接的结果集内,两个表中每两个可能成对的行占一行。例如,在通过作者 CROSS JOIN 出版商输出的结果集内,每个可能的作者/出版商组合占一行。所得到的 SQL 可能象下面这样:
· SELECT * FROM authors CROSS JOIN publishers
语法: select __ from __ cross join __ on __
结果集:
自联接:和自身进行联接 语法: select __ from __ inner join __ on __
多表联接:
语法: select __ from __ inner join __ on __ inner join __ on __
空值和联接
如果要联接的表的列中有空值,则这些空值互相不匹配。如果其中一个联接表的列中出现空值,只能通过外联接返回这些空值(除非 WHERE 子句不包括空值)。
下面的两个表中,每个表在要参与联接的列中均包含 NULL 值:
table1 table2 a b c d ------- ------ ------- ------ 1 one NULL two NULL three 4 four 4 join4将列 a中的值与列 c中的值进行比较的联接在包含 NULL 值的列上不能获得匹配结果:
SELECT * FROM table1 t1 JOIN table2 t2 ON t1.a = t2.c ORDER BY t1.a只返回列 a和 c值为 4 的一行:
a b c d ----------- ------ ----------- ------ 4 join4 4 four (1 row(s) affected)从基表返回的空值和从外联接返回的空值也很难区分。例如,下面的 SELECT 语句对这两个表进行左向外联接:
SELECT * FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.a = t2.c ORDER BY t1.a下面是结果集:
a b c d ----------- ------ ----------- ------ NULL three NULL NULL 1 one NULL NULL 4 join4 4 four (3 row(s) affected)结果并不能使数据中的 NULL 值和表示联接失败的 NULL 值容易区分。如果要联接的数据出现空值,最好用常规联接将这些空值从结果中省略。
参考:
http://www.cnblogs.com/cyberhedgehog/articles/1195523.html
http://www.cnblogs.com/zp89850/archive/2007/06/04/770983.html
转载于:https://www.cnblogs.com/WayneZeng/p/3352405.html
总结
以上是生活随笔为你收集整理的数据库:内联接,外联接,空值和联接的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: poj 2515 差分序列,排列组合
- 下一篇: SQLServer当数据导入平面文件