数据库:内联接,外联接,空值和联接
内联接: 左表的一行和右表的每一行进行比较, 如果左表的一行和右表的一行符合联接条件,则返回为结果集中的一行 ------ 等效于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
数据库:内联接,外联接,空值和联接相关推荐
- Oracle 表连接方式(内连接/外连接/自连接) 详解
Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左 ...
- Oracle数据库:oracle外连接left/right/full outer join on,oracle扩展的左右外连接展示符号(+)
Oracle数据库:oracle外连接left/right/full outer join on,oracle扩展的左右外连接展示符号(+) 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大 ...
- 智能家电市场群雄割据 “内冷外热”的现实何时能改变?
智能家电市场群雄割据 "内冷外热"的现实何时能改变? 早上醒来,窗帘自动打开,电视为你播报今天天气,客厅里咖啡机也自动开启早餐模式,阵阵咖啡香味飘来,让你精神为之一振--这幅智能家 ...
- mysql数据库内置函数大全_MySQL数据库——内置函数
MySQL数据库--内置函数 建表并插入数据 create table student( id char(36) primary key, name varchar(8) not null, age ...
- 数据库中主外键概念详细介绍
关于数据库的主外键设置问题 一.主外键概念 主键 1.主键 简单而言,能够唯一的表示表中的每一行数据,这样的列属性称为表的主键,使用表主键可以保证实体的完整性,可对表内数据进行修改.删除时使用 ...
- 局部变量写在循环内还是外_循环内的局部变量和性能
局部变量写在循环内还是外 总览 有时会出现一个问题,即分配一个新的局部变量需要多少工作. 我的感觉一直是,代码已优化到成本为静态的程度,即一次执行,而不是每次运行都执行一次. 最近, Ishwor G ...
- sqlserver有外键无法创建触发器_数据库不使用外键的 9 个理由
点击上方蓝色字体,选择"置顶公众号" 优质文章,第一时间送达 作者 | bang,Piotr Kononow 链接 | www.jdon.com/49188 Piotr Konon ...
- mysql数据库约束详解_MySQL数据库中的外键约束详解
使用MySQL开发过数据库驱动的小型web应用程序的人都知道,对关系数据库的表进行创建.检索.更新和删除等操作都是些比较简单的过程.理论上,只要掌握了最常见的SQL语句的用法,并熟悉您选择使用的服务器 ...
- “内”忧“外”患,3 万台 Mac 有危险!
整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 去年苹果发布的自研 M1 芯片可谓是赚足了眼球,搭载该芯片的 Mac 电脑也成为了许多人争相购买的产品之一.不过彼时刚刚诞生的 M1 M ...
最新文章
- 设置Squid Cache_mem大小
- 解决chrome浏览器us-yahoo.com搜索劫持
- CodeForces - 1213E Two Small Strings(暴力+构造)
- C#编写的windows程序随系统启动
- Sql SUBSTR函数
- Android单选中listview中的一项
- 吴恩达神经网络和深度学习-学习笔记-27-多任务学习
- Hibernate 关于配置Mapping不成功 Unknow Entity
- 第50篇-企查查请求头参数分析【2022-09-29】
- 一个描述二氧化硅的两体势能BKS
- wcf教程-传递数据过大怎么配置?读取 XML 数据时,超出最大字符串内容长度配额 (8192)
- ​华为回应出售手机业务传闻:假消息;微软将ChatGPT整合到更多工具中:不用写代码就能开发应用;苹果更新Mac产品线|极客头条...
- 网站优化与seo的方法(seo的优化基础)
- 用智能ABC关闭程序
- Berkeley DB(BDB)介绍
- 祝女生节快乐的c语言,女生节祝福语:3月7日女生节到了,祝福送给娇滴滴的你...
- Oracle查询当前时间的前1个小时的数据
- 爆炸分享!7个常用的平面设计工具软件都在这!
- 发那科系统整套梯形图设计 FANUC全套PMC设计 发那科标 准PLC 完美解决方案
- Java PriorityQueue(优先级队列/二叉堆)的使用及题目应用