Mysql中的自连接问题

 更新时间:2023年05月31日 15:17:57   作者:华妃  
这篇文章主要介绍了Mysql中的自连接问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mysql自连接

1、在日常对数据库的操作中,我们很熟悉使用INNER JOIN,LEFT JOIN 把一个表和另外一个表连接起来,潜意识里会认为只有两个表才可以连接,有一个特殊情况,需要将表自身连接,这被称为自连接。

2、想将表中行与同一表中的其他行组合时,可以使用自连接。要执行自联接操作必须使用表别名来帮助MySQL在单个查询中区分左表与同一张表的右表。

DEMO

1、比如组织机构的树形的,数据会有上下级区分,当需要展示组织机构的父级机构名称时,我们可以使用自连接。

2、表结构如图所示:

3、sql

select a.id, a.party_org_name, a.parent_id,b.party_org_name as parent_name FROM sinosoft_party_org a left join sinosoft_party_org b on a.parent_id=b.id

MySQL自连接和内连接和外连接_左外连接+右外连接

自连接:将一张表看作两张表

练习:查询员工id,员工姓名及其管理者的id和姓名

select emp.employee_id,
       emp.last_name,
       mgr.employee_id,
       mgr.last_name
from employees emp,employees mgr
where emp.manager_id = mgr.employee_id;

内连接

只是把左表和右表满足连接条件的数据查出来,其它的数据都没有要!!!

select employee_id,department_name
from employees e join departments d
on e.`department_id`=d.`department_id`

外连接

JOIN … ON

左外连接 left join…on

左外连接,左表和右表满足条件的数据,和左表中不满足条件的数据!!!

练习:查询所有员工的last_name,department_name信息

select last_name,department_name 
from employees e left join departments d
on e.`department_id`=d.`department_id`;

右外连接 right join … on

右外连接,右表和左表满足条件的数据,和右表中不满足条件的数据!!!

练习:查询所有员工的last_name,department_name信息

select last_name,department_name 
from departments d right join employees e
on e.`department_id`=d.`department_id`;

七种 SQL JOINS 的实现

UNION的使用

合并查询结果

  • 利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。
  • 合并时,两个表对应的列数和数据类型必须相同,并且相互对应。
  • 各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

UNION操作符

UNION 操作符返回两个查询的结果集的并集,去除重复记录。

UNION ALL操作符

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

注意:执行UNION ALL语句时所需要的资源比UNION语句少。

如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。

1、内连接(两表只要满足条件的)

SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;

2、左外连接(左和右满足条件的,和左中不满足条件的)

SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;

3、右外连接(右和左满足条件的,和右中不满足条件的)

SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;

4、在左外连接的基础上,右表取null值(满足条件的肯定不是null,我们不取)

SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL

5、在右外连接的基础上,我们取左表的null值

SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL

6、右外连接取左表null值,和左外连接合并UNION ALL

SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL #没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;

7、

SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Linux环境下mysql5.7.13安装教程

    Linux环境下mysql5.7.13安装教程

    这篇文章主要为大家详细介绍了Linux环境下mysql5.7.13安装教程,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • MySQL表的碎片整理和空间回收的方法

    MySQL表的碎片整理和空间回收的方法

    本文主要介绍了MySQL表的碎片整理和空间回收的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • MySQL中的REPLACE INTO语法详解

    MySQL中的REPLACE INTO语法详解

    REPLACEINTO是MySQL中的一种特殊语句,用于在插入数据时检测是否存在冲突,如果目标表中已存在与新插入行的主键(PRIMARYKEY)或唯一键(UNIQUEKEY)冲突的记录,则会删除旧记录并插入新记录
    2025-02-02
  • MySQL索引详细解析

    MySQL索引详细解析

    索引是有双面性的,合理的建立索引可以提高数据库的效率。但是如果没有合理的构建索引和使用索引,可能会导致索引失效或者影响数据库性能,这篇文章主要介绍了MySql索引原理与操作
    2022-10-10
  • MySQL数据库优化推荐的编译安装参数小结

    MySQL数据库优化推荐的编译安装参数小结

    这篇文章主要介绍了MySQL数据库优化推荐的编译安装参数小结,需要的朋友可以参考下
    2015-04-04
  • mysql如何设置不区分大小写

    mysql如何设置不区分大小写

    在本篇文章里小编给大家整理了关于mysql设置不区分大小写的方法,需要的朋友们跟着学习下。
    2020-06-06
  • mysql远程登录出错的解决方法

    mysql远程登录出错的解决方法

    mysql远程登录出错的情况,先比很多朋友都有遇到过吧,下面有个不错的解决方法,大家可以参考下
    2014-01-01
  • MySQL校对规则(COLLATION)的具体使用

    MySQL校对规则(COLLATION)的具体使用

    本文主要介绍了MySQL校对规则(COLLATION)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Mysql 过滤和排序查询结果的操作代码

    Mysql 过滤和排序查询结果的操作代码

    过滤和排序查询结果在数据库中是非常常见和重要的操作,这篇文章主要介绍了Mysql 过滤和排序查询结果的操作代码,需要的朋友可以参考下
    2024-04-04
  • Linux安装MySQL教程(二进制分发版)

    Linux安装MySQL教程(二进制分发版)

    这篇文章主要为大家详细介绍了Linux安装MySQL教程,二进制分发版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02

最新评论