Mysql 内连接、外连接、全连接和交叉连接

2022-11-20 13:17:27

为了演示方便,提前准备了两张表department和employees,其中的字段和数据如图所示:

departmentemployees



连接分为:内连接、外连接、交叉连接
一、内连接( 最常用 )

    定义:仅将两个表中满足连接条件的行组合起来作为结果集。

    关键词:INNER JOIN

select * from employees e inner join department d
on e.employee_id = d.department_id  where e.employee_id = "1";

等价于
select * from employees e,department d
where e.employee_id = d.department_id and e.employee_id = "1";

查询出来的结果如图所示:


二、外连接
1、左(外)连接
        定义:在内连接的基础上,还包含左表中所有不符合条件的数据行,并在其中的右表列填写NULL

只有在两个表中匹配的行才能在结果集中出现 。有一下三种情况:

   a. 对于table1中的每一条记录对应的记录如果在table2中也恰好存在而且刚好只有一条,那么就会在
        返回的结果中形成一条新的记录。
    b. 对于table1中的每一条记录对应的记录如果在table2中也恰好存在而且有N条,那么就会在返回的结果中形成 N条新的记录。
    c. 对于table1中的每一条记录对应的记录如果在table2中不存在,那么就会在返回的结果中形成一条
条新的记录,且该记录的右边全部NULL。

 关键字:LEFT JOIN

注意:
当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到 join子句时,SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句 中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:

条件在join子句:

select  *  from employees e
left outer join department d
on  e.employee_id = d.department_id
        and  e.employee_id = "2"
    (其中outer可以省略)

查询出来的结果如图所示:



条件在where子句:

select  *  from employees e
left outer join department d
on  e.employee_id = d.department_id
        where e.employee_id = "2"

查询出来的结果如图所示:


相当于只把满足条件的结果集查询出来

2、右(外)连接
定义:
在内连接的基础上,还包含右表中所有不符合条件的数据行,并在其中的左表列填写NULL
        关键字:RIGHT JOIN

3、完全连接

定义:在内连接的基础上,还包含两个表中所有不符合条件的数据行,并在其中的左表、和右表列填写NULL
关键字:FULL JOIN

内联接显示的是两列数据匹配下的相关数据,外联接分为左外联接右外联接和全联接,mysql中不支持全联接,所以以左外联接为例来讨论区别,左外联接(以左表为主)是只在join前面是这张表不管是否两张有无满足的匹配信息,这张表的内容都要全部显示,而后面的那张表只显示匹配的信息。右外联接则刚好相反。



  • 作者:天空灬之城
  • 原文链接:https://blog.csdn.net/u013215018/article/details/52808979
    更新时间:2022-11-20 13:17:27