文档章节

MySQL外连接

秋风醉了
 秋风醉了
发布于 2015/03/11 17:31
字数 903
阅读 97
收藏 2

MySQL外连接

参见MySQL内连接:http://my.oschina.net/xinxingegeya/blog/385220

外连接并不要求连接的两表的每一条记录在对方表中都一条匹配的记录. 连接表保留所有记录——甚至这条记录没有匹配的记录也要保留。

外连接可依据连接表保留左表,右表或全部表的行而进一步分为左外连接, 右外连接和全连接。

(在这种情况下left<左> 和 right<右> 表示 JOIN 关键字的两边.)

在标准的 SQL 语言中, 外连接没有隐式的连接符号。


左外连接

左外连接(left outer join),亦简称为左连接(left join),若 A 和 B 两表进行左外连接,那么结果表中将包含"左表"(即表 A)的所有记录, 即使那些记录在"右表" B 没有符合连接条件的匹配。这意味着即使 ON 语句在 B 中的匹配项是0条,连接操作还是会返回一条记录,只不过这条记录中来自于 B 的每一列的值都为 NULL。这意味着左外连接会返回左表的所有记录和右表中匹配记录的组合(如果右表中无匹配记录, 来自于右表的所有列的值设为 NULL)。如果左表的一行在右表中存在多个匹配行。那么左表的行会复制和右表匹配行一样的数量, 并进行组合生成连接结果。

如下示例,

select * from course c left join student_course sc on c.cid = sc.cid;

这是嵌套循环关联的结果,如何用伪代码来解释这个结果集呢?如下伪代码,请见:http://my.oschina.net/xinxingegeya/blog/342402#OSC_h1_2

mysql> select tb1.col1,tb2.col2
    -> from tb1 left outer join tb2 using col3
    -> where tb1.col1 in (5,6);
outer_iter = iterator over tb1 where col1 in (5,6)
outer_row  = outer_iter.next
while outer_row
    inner_iter = iterator over tb2 where col3 = outer_row.col3
    inner_row  = inner_iter.next
    if inner_row 
        while inner_row
            output [outer_row.col1, inner_row.col2]
            inner_row = inner_iter.next
        end
    else 
        output [outer_row.col1,NULL]
    end
    outer_row = outer_row.next
end

在左连接中,当右表即B表没有匹配的行时,执行else操作,打印出左表和NULL,即output [outer_row.col1,NULL]


右外连接

右外连接,亦简称右连接,它与左外连接完全类似,只不过是作连接的表的顺序相反而已。如果 A 表右连接 B 表, 那么"右表" B 中的每一行在连接表中至少会出现一次。如果 B 表的记录在"左表" A中未找到匹配行,连接表中来源于 A 的列的值设为 NULL。

右连接操作返回右表的所有行和这些行在左表中匹配的行(没有匹配的, 来源于左表的列值设为 NULL)。

如下示例,

select * from course c right join student_course sc on c.cid = sc.cid;

实际上显式的右连接很少使用,因为它总是可以被替换成左连接--换换表的位置就可以了,另外,右连接相对于左连接并没有什么额外的功能。

如下把上面的换成左连接,

select * from student_course sc left join course c on c.cid = sc.cid;

都会得到如下的结果集,


全连接

全连接是左右外连接的并集。连接表包含被连接的表的所有记录,如果缺少匹配的记录,即以 NULL 填充。

MySQL不支持全连接。

一些数据库系统(如 MySQL)并不直接支持全连接,但它们可以通过左右外连接的并集(参: union)来模拟实现。

select * from course c left join student_course sc on c.cid = sc.cid
union 
select * from course c right join student_course sc on c.cid = sc.cid 
where c.cid is not null;


======================================END======================================


© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 246
博文 543
码字总数 412294
作品 0
朝阳
程序员
私信 提问
内网配置nat123端口映射,外网连接内网MYSQL数据库

转自NAT123官网: http://www.nat123.com/Pages837.jsp 内网配置nat123端口映射,外网连接内网MYSQL数据库 使用nat123,实现外网直接连接访问内网mysql数据库。 1.明确内网连接mysql数据库地址...

NEWSANP
2014/04/25
0
2
PHP面试之复杂MySQL语句的编写

真题 有A(id,sex, par, cl, c2)、B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求写出一条SQL语句,将B中age>50的记录的c1,c2更新到A表中统一记录中的c1,c2字段中。 MySQL的关联update操...

openoter
2018/04/20
0
0
MySQL max_connections变量讲解

MySQL的max_connections参数用来设置最大连接(用户)数。超过这个值,系统就会拒绝接下来的连接请求,报错提示:“too many connections”。对于被拒绝连接的请求来说,从业务角度就是数据库...

灯下草虫鸣_
01/02
0
0
使用Entity Framework访问MySQL数据库

发表在我的博客:http://starlight36.com/post/querying-mysql-with-ef 简介 Entity Framework (EF,ADO.NET Entity Framework)是微软官方提供的.NET平台的ORM框架。相比于LINQ TO SQL,EF框...

烫烫烫烫烫烫
2013/08/17
0
3
C程序里通过SSL连接mysql失败

因跨机房访问数据库,需要通过外网访问mysql数据库,安全考虑连接时需要进行SSL加密。问题如下: 通过命令行ssl外网连接数据库成功: [xxxx@EM-F4W9B92]# mysql -u xxx -P 3310 -h xxxxx -p ...

yizhiniu
2016/07/29
270
5

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部