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日

相关文章

  • Redis 的查询很快的原因解析及Redis 如何保证查询的高效

    Redis 具有查询快的特点是由于以下几个方面的原因: 1.基于内存的数据存储方式 Redis 是基于内存的数据库,所以具有非常快速的读写速度。Redis 能够达到如此高的性能指的是,通过数据缓存在内存中,可以大幅减少了 I/O 操作,从而提升了数据的访问速度。 与传统的关系型数据库相比,传统数据库对数据的存储是通过将数据写入磁盘中,因为 I/O 操作非常耗…

    database 2023年5月22日
    00
  • Linux编译升级php的详细方法

    接下来我将为您详细讲解“Linux编译升级php的详细方法”的完整攻略。 步骤一:下载php源码 首先,在终端中使用wget或curl命令下载php源代码包。例如,我们可以下载PHP 7.4的源码: curl -o php.tar.gz https://www.php.net/distributions/php-7.4.24.tar.gz 步骤二:解压源码 …

    database 2023年5月22日
    00
  • linux top命令详解

    Linux top命令详解 简介 top 命令是 Linux 下用于实时监视系统的命令。它能动态地实时显示进程的资源占用情况,包括 CPU 占用率、内存使用、进程、线程等信息。 语法 top 命令的语法格式如下: top [-] [d delay] [-n iterations] [-b] [-c] [-u username] [p pid] 参数说明:- …

    database 2023年5月22日
    00
  • 浅谈MySQL如何优雅的做大表删除

    我会根据以下大纲给出”浅谈MySQL如何优雅的做大表删除”的完整攻略。 I. 优化删除操作的SQL语句- 使用DELETE语句时避免使用WHERE子句匹配整个表- 分批删除,使用LIMIT和ORDER BY子句定位需要的行- 考虑对相关表建立索引以提高删除操作速度 II. 使用TRUNCATE操作删除表数据- TRUNCATE比DELETE更快,因为它不记录…

    database 2023年5月19日
    00
  • redis反序列化报错如何解决

    这篇文章主要介绍“redis反序列化报错如何解决”,在日常操作中,相信很多人在redis反序列化报错如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis反序列化报错如何解决”的疑惑有所帮助!接下来,请跟着小编一起来学习吧! redis反序列化报错原因分析 问题:Cannot deserialize,无法反序列化 分…

    Redis 2023年4月10日
    00
  • redis问题:redis-server.exe双击闪退 win10系统

         遇到这种情况 一、打开dos命令窗,进入到 redis 文件目录下,在i命令窗口中输入:redis-server.exe redis.windows.conf 若出现 [113352] 25 Mar 21:54:30.394 # QForkMasterInit: system error caught. error code=0x000005af,…

    Redis 2023年4月13日
    00
  • 解决mysql时区问题以及SSL问题

    看了下网上的教程,觉得都太麻烦啦,这里推荐个简单的! 解决时区问题   只需要加上serverTimezone=UTC即可,如下: spring.datasource.url=jdbc:mysql://127.0.0.1:3306/wallet?serverTimezone=UTC&characterEncoding=utf-8 解决SSL问题   …

    MySQL 2023年4月13日
    00
  • MySQL中如何增加字段SQL语句

    在MySQL中增加字段的SQL语句可以通过ALTER TABLE命令来实现。具体步骤如下: 打开MySQL命令行,连接到对应的数据库 mysql -u username -p password USE database_name; 使用ALTER TABLE命令增加字段,语法如下: ALTER TABLE `table_name` ADD COLUMN `c…

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