Mysql自连接查询实例详解

Mysql自连接查询是关于一个表自己与自己进行连接查询的方法。这种查询在复杂的数据结构中非常有用,它可以让我们找到相对于自己某些列存在相似性的记录,构造示例如下:

准备工作

示例中我们使用的是employees这张表,表中存放的是雇员的信息,包括雇员编号、名字、性别、工资、职位、上司等。

CREATE TABLE employees (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM('M','F')   NOT NULL, 
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
 );

表中也存在上司-下属之间的关系,也就是同一张表中有父子级别关系,可以使用emp_no来描述两者之间的关系。

自连接查询示例

示例1:查询下属与上司的所有信息

我们可以通过自连接查询,查询一个上司及其下属的所有信息。例如查询员工编号为10001的上司及其下属的全部信息代码如下:

SELECT e1.emp_no, e1.first_name, e1.last_name, e2.emp_no, e2.first_name, e2.last_name
FROM employees AS e1, employees AS e2
WHERE e1.emp_no = e2.emp_no OR e1.emp_no = e2.emp_no;

查询结果如下表所示:

e1.emp_no e1.first_name e1.last_name e2.emp_no e2.first_name e2.last_name
4 Margaret Peacock 4 Margaret Peacock
4 Margaret Peacock 78 James Kramer
4 Margaret Peacock 119 Yoshinari DasSarma
4 Margaret Peacock 146 Berhard Lenart
4 Margaret Peacock 199 Vishv Chen
4 Margaret Peacock 218 Themistoklis Raman
5 Wolfgang Schlereth 5 Wolfgang Schlereth
5 Wolfgang Schlereth 62 Parviz Lortz
5 Wolfgang Schlereth 81 Xiaohua Lu
5 Wolfgang Schlereth 103 Shawna Frumkin
5 Wolfgang Schlereth 112 Wenbo Yen
5 Wolfgang Schlereth 117 Jussi Kivivuori
5 Wolfgang Schlereth 142 Hee Karvonen
5 Wolfgang Schlereth 168 Bangqing Kleiser
5 Wolfgang Schlereth 198 Gerard Barzin
5 Wolfgang Schlereth 242 Mariano Erde

上述查询的限制条件是e1.emp_no = e2.emp_no OR e1.emp_no = e2.emp_no,表示自身与自身的查询结果。使用 WHERE e1.emp_no = 10001,表示要查询的员工编号为10001和他的下属,最终的查询结果即为10001这个雇员及其下属所有信息的集合。

示例2:查询有相同上司的雇员信息

查询有相同上司的雇员信息,可以使用自身表连接的方法,具体查询代码如下所示:

SELECT e1.emp_no, e1.first_name, e1.last_name, e2.emp_no, e2.first_name, e2.last_name 
FROM employees AS e1, employees AS e2 
WHERE e1.emp_no != e2.emp_no AND e1.emp_no = e2.emp_no;

查询结果如下表所示:

e1.emp_no e1.first_name e1.last_name e2.emp_no e2.first_name e2.last_name
1 Georgi Facello 12 Patricio Bridgland
2 Bezalel Simmel 17 Cristinel Bouloucos
2 Bezalel Simmel 18 Kazuhide Peha
2 Bezalel Simmel 23 Bojan Zallocco
2 Bezalel Simmel 26 Yongqiao Berztiss
3 Parto Bamford 18 Kazuhide Peha
3 Parto Bamford 21 Ramzi Erde
3 Parto Bamford 24 Sumant Peac
3 Parto Bamford 25 Shailendra Mishra

在以上的查询中,使用了WHERE e1.emp_no != e2.emp_no,表示查询一个员工编号不等于另一个员工编号的结果。使用WHERE e1.emp_no = e2.emp_no,表示查询拥有相同上司人数大于等于两个人的结果。最后的查询结果为拥有相同上司(下属)的员工信息集合。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql自连接查询实例详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Mysql导入导出时遇到的问题解决

    Mysql导入导出时遇到的问题解决攻略如下: 问题一:mysqldump导出数据后的sql文件无法导入 通常,使用mysqldump命令导出数据时,会生成一个后缀名为.sql的文件,这个文件可以用于导入数据,但是导入时有时可能会遇到下面的错误: ERROR 1064 (42000): You have an error in your SQL syntax;…

    database 2023年5月22日
    00
  • MySQL的事务特性概念梳理总结

    MySQL的事务特性概念梳理总结 MySQL是一种SQL关系型数据库管理系统,支持ACID事务特性。ACID是指:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。在MySQL中,对于事务的处理涉及到以下几个主要概念: 1. 数据库事务 数据库事务是指一组数据库操作组成的一个逻辑工作…

    database 2023年5月22日
    00
  • Redis持久化RDB和AOF优缺点是什么,怎么实现的?我应该用哪一个?

      原文http://www.ymq.io/2018/03/24/redis/   Redis是一种高级key-value数据库。数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。 Redis为了保证效…

    Redis 2023年4月11日
    00
  • Node.js数据库操作之连接MySQL数据库(一)

    下面是“Node.js数据库操作之连接MySQL数据库(一)”的完整攻略: 连接MySQL数据库 安装MySQL 首先需要下载并安装MySQL,可以从官网或镜像站点中下载。安装完成后,需要设置root用户的密码。 安装mysql模块 接下来需要安装npm的mysql模块,可以使用npm命令进行安装: $ npm install mysql 连接MySQL c…

    database 2023年5月18日
    00
  • SQL 删除指定记录

    当需要删除数据库中的某些数据时,我们可以使用SQL语句完成这个操作。下面我们将详细讲解SQL删除指定记录的完整攻略,并提供两个实例。 标准语法 SQL删除指定记录的标准语法格式如下: DELETE FROM table_name WHERE some_column = some_value; 其中,table_name为要删除数据的表格名称;some_col…

    database 2023年3月27日
    00
  • win2003安装sqlserver 2000提示无法验证产品密钥的解决方法

    问题描述: 在安装SQL Server 2000时,出现提示:无法验证产品密钥,导致无法继续安装。 解决方法: 步骤一:编辑注册表 在开始菜单中,选择“运行”,输入“regedit”打开注册表编辑器。 在左侧的窗格中,依次展开以下路径: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\80…

    database 2023年5月21日
    00
  • asp.net下SQLite(轻量级最佳数据库) 原理分析和开发应用

    ASP.NET下SQLite(轻量级最佳数据库)原理分析和开发应用攻略 什么是SQLite? SQLite是一种轻型数据库,在过去几年中已经变得非常受欢迎。SQLite旨在尽可能简单,因此无需为其添加任何配置或管理。该数据库被编写为自包含、独立的库,因此不需要额外的服务器进程或系统级配置。 SQLite的优势 SQLite是基于文件的数据库,这也是它非常流行…

    database 2023年5月22日
    00
  • SQL 串联多列的值

    SQL串联多列的值可以使用字符串拼接函数实现,常见的字符串拼接函数有CONCAT和CONCAT_WS两种。 CONCAT函数 CONCAT函数用于拼接两个或多个字符串,语法如下: CONCAT(str1, str2, …) 其中,str1、str2等表示要拼接的字符串,可以是常量、字段或者表达式,返回值为拼接后的字符串。 例如,现有一个表orders,其…

    database 2023年3月27日
    00
合作推广
合作推广
分享本页
返回顶部