MySQL自连接查询的深入分析

一般的连接查询使用两张不同的表,指定连接条件,然后进行查询。自连接查询格式和普通的连接查询书写格式完全相同,只不过我们需要把一张表想象成两张表使用。
自连接查询是自己和自己连接,分别给一张表取两个不同的别名,然后附上连接条件。格式如下:

select 字段列表
from table_name alias1 join table_name alias2
on alias1.fieldname1=alias2.fieldname2
......;

一、根据emp(员工)表,查询每个员工的领导,员工表的结构如下:

create table emp(e_id int primary key,e_name char(20) not null default '',phone char(20) not null default '',leader int default null
);insert into emp values(1,'张鹏辉','13603735588',2),(2,'王大强','13603736666',2),
(3,'刘莉莉','13603732222',2),(4,'王安全','13603733377',2),
(5,'王江涛','13603733366',5),(6,'刘大江','13603736644',5),
(7,'刘鹏','13603738866',8),(8,'王大鹏','13603732635',8),
(9,'王俊红','13603734468',8),(10,'王海军','13603735525',8);

因为员工的领导也是员工,因此我们可以将emp表想象成两张表,一张为employee,一张为leader。employee表和leader表通过别名来指定,然后利用employee表的字段leader和leader表的字段e_id建立连接即可查询到每个员工的领导。代码及查询结果如下:

mysql> select employee.e_id as 员工编号,employee.e_name as 员工姓名,-> employee.phone,leader.e_name as 领导-> from emp employee inner join emp leader-> on employee.leader=leader.e_id;
+--------------+--------------+-------------+-----------+
| 员工编号     | 员工姓名     | phone       | 领导      |
+--------------+--------------+-------------+-----------+
|            1 | 张鹏辉       | 13603735588 | 王大强    |
|            2 | 王大强       | 13603736666 | 王大强    |
|            3 | 刘莉莉       | 13603732222 | 王大强    |
|            4 | 王安全       | 13603733377 | 王大强    |
|            5 | 王江涛       | 13603733366 | 王江涛    |
|            6 | 刘大江       | 13603736644 | 王江涛    |
|            7 | 刘鹏         | 13603738866 | 王大鹏    |
|            8 | 王大鹏       | 13603732635 | 王大鹏    |
|            9 | 王俊红       | 13603734468 | 王大鹏    |
|           10 | 王海军       | 13603735525 | 王大鹏    |
+--------------+--------------+-------------+-----------+
10 rows in set (0.00 sec)

二、area表的结构如下:

create table area(area_id int primary key,area_name char(50) not null default '',parent_id int not null default 0
);insert into area values(1,'河南省',0),(2,'湖北省',0),(3,'河北省',0),
(101,'郑州市',1),(102,'新乡市',1),(10101,'金水区',101),
(10102,'中牟县',101),(10103,'巩义市',101),(10104,'新郑市',101),
(10201,'红旗区',102),(10202,'牧野区',102),(10203,'辉县市',102),
(10204,'原阳县',102),(10205,'修武县',102),(10206,'获嘉县',102),
(201,'武汉市',2),(202,'宜昌市',2),(20101,'汉阳区',201),(20102,'武昌区',201),
(20103,'青山区',201),(20104,'洪山区',201),(20201,'当阳市',202),(20202,'枝江市',202);

根据area表查询某个地区所属的地区,查询命令及查询结果如下:

mysql> select area.*,superior_area.area_name as superior_area->      from area left join area superior_area->      on area.parent_id=superior_area.area_id;
+---------+-----------+-----------+---------------+
| area_id | area_name | parent_id | superior_area |
+---------+-----------+-----------+---------------+
|       1 | 河南省    |         0 | NULL          |
|       2 | 湖北省    |         0 | NULL          |
|       3 | 河北省    |         0 | NULL          |
|     101 | 郑州市    |         1 | 河南省        |
|     102 | 新乡市    |         1 | 河南省        |
|     201 | 武汉市    |         2 | 湖北省        |
|     202 | 宜昌市    |         2 | 湖北省        |
|   10101 | 金水区    |       101 | 郑州市        |
|   10102 | 中牟县    |       101 | 郑州市        |
|   10103 | 巩义市    |       101 | 郑州市        |
|   10104 | 新郑市    |       101 | 郑州市        |
|   10201 | 红旗区    |       102 | 新乡市        |
|   10202 | 牧野区    |       102 | 新乡市        |
|   10203 | 辉县市    |       102 | 新乡市        |
|   10204 | 原阳县    |       102 | 新乡市        |
|   10205 | 修武县    |       102 | 新乡市        |
|   10206 | 获嘉县    |       102 | 新乡市        |
|   20101 | 汉阳区    |       201 | 武汉市        |
|   20102 | 武昌区    |       201 | 武汉市        |
|   20103 | 青山区    |       201 | 武汉市        |
|   20104 | 洪山区    |       201 | 武汉市        |
|   20201 | 当阳市    |       202 | 宜昌市        |
|   20202 | 枝江市    |       202 | 宜昌市        |
+---------+-----------+-----------+---------------+
23 rows in set (0.00 sec)

根据area表查询某个地区所包含的其他地区,查询命令如下:

mysql> select area.area_id,area.area_name,-> subordinate_area.area_id as subordinate_area_id,-> subordinate_area.area_name as subordinate_area_name-> from area subordinate_area right join area-> on subordinate_area.parent_id=area.area_id;
+---------+-----------+---------------------+-----------------------+
| area_id | area_name | subordinate_area_id | subordinate_area_name |
+---------+-----------+---------------------+-----------------------+
|       1 | 河南省    |                 101 | 郑州市                |
|       1 | 河南省    |                 102 | 新乡市                |
|       2 | 湖北省    |                 201 | 武汉市                |
|       2 | 湖北省    |                 202 | 宜昌市                |
|     101 | 郑州市    |               10101 | 金水区                |
|     101 | 郑州市    |               10102 | 中牟县                |
|     101 | 郑州市    |               10103 | 巩义市                |
|     101 | 郑州市    |               10104 | 新郑市                |
|     102 | 新乡市    |               10201 | 红旗区                |
|     102 | 新乡市    |               10202 | 牧野区                |
|     102 | 新乡市    |               10203 | 辉县市                |
|     102 | 新乡市    |               10204 | 原阳县                |
|     102 | 新乡市    |               10205 | 修武县                |
|     102 | 新乡市    |               10206 | 获嘉县                |
|     201 | 武汉市    |               20101 | 汉阳区                |
|     201 | 武汉市    |               20102 | 武昌区                |
|     201 | 武汉市    |               20103 | 青山区                |
|     201 | 武汉市    |               20104 | 洪山区                |
|     202 | 宜昌市    |               20201 | 当阳市                |
|     202 | 宜昌市    |               20202 | 枝江市                |
|       3 | 河北省    |                NULL | NULL                  |
|   10101 | 金水区    |                NULL | NULL                  |
|   10102 | 中牟县    |                NULL | NULL                  |
|   10103 | 巩义市    |                NULL | NULL                  |
|   10104 | 新郑市    |                NULL | NULL                  |
|   10201 | 红旗区    |                NULL | NULL                  |
|   10202 | 牧野区    |                NULL | NULL                  |
|   10203 | 辉县市    |                NULL | NULL                  |
|   10204 | 原阳县    |                NULL | NULL                  |
|   10205 | 修武县    |                NULL | NULL                  |
|   10206 | 获嘉县    |                NULL | NULL                  |
|   20101 | 汉阳区    |                NULL | NULL                  |
|   20102 | 武昌区    |                NULL | NULL                  |
|   20103 | 青山区    |                NULL | NULL                  |
|   20104 | 洪山区    |                NULL | NULL                  |
|   20201 | 当阳市    |                NULL | NULL                  |
|   20202 | 枝江市    |                NULL | NULL                  |
+---------+-----------+---------------------+-----------------------+
37 rows in set (0.00 sec)

还可以利用分组(Group by)改变显示方式,代码如下:

mysql> select area.area_id,area.area_name,-> group_concat(subordinate_area.area_name) as subordinate_area_name-> from area subordinate_area right join area-> on subordinate_area.parent_id=area.area_id-> group by area.area_id;
+---------+-----------+-------------------------------------------------------------+
| area_id | area_name | subordinate_area_name                                       |
+---------+-----------+-------------------------------------------------------------+
|       1 | 河南省    | 郑州市,新乡市                                               |
|       2 | 湖北省    | 宜昌市,武汉市                                               |
|       3 | 河北省    | NULL                                                        |
|     101 | 郑州市    | 新郑市,金水区,中牟县,巩义市                                 |
|     102 | 新乡市    | 修武县,红旗区,获嘉县,牧野区,辉县市,原阳县                   |
|     201 | 武汉市    | 青山区,洪山区,汉阳区,武昌区                                 |
|     202 | 宜昌市    | 当阳市,枝江市                                               |
|   10101 | 金水区    | NULL                                                        |
|   10102 | 中牟县    | NULL                                                        |
|   10103 | 巩义市    | NULL                                                        |
|   10104 | 新郑市    | NULL                                                        |
|   10201 | 红旗区    | NULL                                                        |
|   10202 | 牧野区    | NULL                                                        |
|   10203 | 辉县市    | NULL                                                        |
|   10204 | 原阳县    | NULL                                                        |
|   10205 | 修武县    | NULL                                                        |
|   10206 | 获嘉县    | NULL                                                        |
|   20101 | 汉阳区    | NULL                                                        |
|   20102 | 武昌区    | NULL                                                        |
|   20103 | 青山区    | NULL                                                        |
|   20104 | 洪山区    | NULL                                                        |
|   20201 | 当阳市    | NULL                                                        |
|   20202 | 枝江市    | NULL                                                        |
+---------+-----------+-------------------------------------------------------------+
23 rows in set (0.00 sec)

MySQL自连接查询的深入分析相关推荐

  1. mysql 自关联的子孙查询,Mysql自连接查询实例详解

    本文实例讲述了Mysql自连接查询.分享给大家供大家参考,具体如下: 自连接查询 假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类.例如数码产品这个类 ...

  2. Mysql自连接查询

    自连接查询 假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类.例如数码产品这个类别下面有笔记本,台式机,智能手机等:笔记本,台式机,智能手机又可以按照 ...

  3. mysql自连接查询去重_MySQL命令汇总

    数据库相关操作: 1.数据库级别: CURD show databases; create database db1 default charset=utf8; use db1; select dat ...

  4. Mysql的学习4____数据的单标查询,连接查询,自连接查询,子查询

    DQL(Data Query Language):数据库查询语言 1.进行简单的单表查询,复杂的多表查询,嵌套查询: /* SELECT [ALL | DISTINCT] {* | table.* | ...

  5. MySQL连接查询之内连接、左连接、右连接、自连接

    目录 一.内连接 1. 连接查询的介绍 2. 内连接查询 二.左连接 1. 左连接查询 三.右连接 1. 右连接查询 四.自连接 1. 自连接查询 一.内连接 1. 连接查询的介绍 连接查询可以实现多 ...

  6. MySQL讲义第27讲——select 查询之自连接查询

    MySQL讲义第27讲--select 查询之自连接查询 文章目录 MySQL讲义第27讲--select 查询之自连接查询 一.数据准备 二.对自连接的理解 三.把以上的查询用自连接表示 顾名思义, ...

  7. MySQL数据库自连接查询inner join ... on

    1. 自连接查询 左表和右表是同一个表,根据连接查询条件查询两个表中的数据. 区域表效果图 例1:查询省的名称为"山西省"的所有城市 创建areas表: create table ...

  8. mysql中的自连接查询

    一.什么是自连接 自连接查询,顾名思义,就是自己和自己比较. 例如:分数表中,科目1有学生考试不及格,不及格的学生补考了,这个的话,同一个学生,同一个科目出现了2笔成绩,如果查询出成绩高的那一笔记录的 ...

  9. MySQL—03—MySQL的查询

    一. MySQL的查询 1.  MySQL 的基本查询 1.1MySQL 的列选择 SELECT * | 投影列 FROM 表名 示例 查询 departments 表中的所有数据 select * ...

最新文章

  1. ubuntu 18.04 添加快快捷方式
  2. 盘点:最值得托付终身的星座
  3. oracle存储过程+游标处理select数据
  4. 用 AI 培养孩子学习兴趣,讯飞新一代智能学习机正式发布!
  5. 安装mysql后环境变量_环境变量配置2 安装mysql
  6. void什么意思python_转换Python对象到C void类型
  7. zookeeper入门学习《一》
  8. eclipse中jsp文档无语法着色,安装Eclipse Java Web Developer Tools插件
  9. [渝粤教育] 西安工业大学 数字电子技术基础 参考 资料
  10. linux虚拟键盘onboard设置,求助,安装屏幕虚拟键盘onboard出错。
  11. PyTorch 使用 TensorBoard 中的 writer.add_scalar 与 writer.add_scalars 的区别
  12. ESD试验与设备介绍
  13. 基于随机效应贝叶斯神经网络(RE-BNN)的多区域出行模式选择分析
  14. 关于mysql的时区(下):如何设置mysql的时区
  15. vmware esx简介
  16. [知乎]关于WindowsXPx64SP2系统的说明
  17. 【万人千题】结对编程排位赛(第一期) 第二周 排名公布,冠军成功卫冕,啊这……
  18. 数学建模动态规划的小案例之R代码实现——生产计划问题
  19. lougu3906 Geodetic
  20. 世界上第一台模拟电子计算机,研发世界第一台电脑的核心人物,被美国隐藏35年,只因他是个华人...

热门文章

  1. 宗教信仰和推荐系统解决同一问题
  2. linux硬盘对拷慢,解决NTFS拷贝文件远比磁盘物理读取速度慢的问题
  3. Python第019讲课后测试题:函数-我的地盘听我的
  4. 检测字符串中是否有汉字
  5. 遇到不认识的字怎么键盘输入
  6. 浏览器自动旋转图片的问题(Exif的oritetion原因)
  7. HTML+CSS实现从右向左展开的过渡动画
  8. 八大排序(Java完整版)
  9. 如何识别低位放量出逃与放量建仓
  10. Ubuntu桌面操作系统综合贴