Mysql中的自连接问题
作者:华妃 发布时间:2024-01-17 17:55:43
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
来源:https://blog.csdn.net/weixin_44792849/article/details/124781478


猜你喜欢
- 单表备份代码:<?php class Db { &n
- load的语 * OAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_
- 匿名管道管道是一个单向通道,有点类似共享内存缓存.管道有两端,包括输入端和输出端.对于一个进程的而言,它只能看到管道一端,即要么是输入端要么
- OpenCV+python3将视频分解成图片,供大家参考,具体内容如下我们在工作或学习时,偶尔需要将视频分解成图片,只取其中一段的图片就行了
- 建立cards_main文件:# _*_ coding:utf-8 _*_"""file: cards_mai
- range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生
- 1.设置Headers有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们
- 我就废话不多说了,大家还是直接看代码吧!from tensorflow.python.keras.models import Sequent
- 在用plt.imshow和cv2.imshow显示同一幅图时可能会出现颜色差别很大的现象。这是因为:opencv的接口使用BGR,而matp
- 背景在小站点上,直接用git来部署php代码相当方便,你的远程站点以及本地版本库都有一个版本控制,追踪问题或者回滚是很轻松的事情。因为在小公
- 在开始部分,请看官非常非常耐心地阅读下面几个枯燥的术语解释,本来这不符合本教程的风格,但是,请看官谅解,因为列位将来一定要阅读枯燥的东西的。
- 本文为大家分享了Python文本特征抽取与向量化的具体代码,供大家参考,具体内容如下假设我们刚看完诺兰的大片《星际穿越》,设想如何让机器来自
- 前言由于两个表同一字段类型不一样,甚至是编码类型不一样也会导致查询不走索引,速度会很慢。强转直接举例说明:A 表id是int 类型 &nbs
- 一、条件控制Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块,而计算机很多自动化任务,也是根据
- Django Form 实时从数据库中获取数据 ,具体内容如下所示:修改 models.py 添加class UserType(models
- 目录前言1. 效果图2. 原理3. 源码3.1 Numpy实现傅里叶变换3.2 OpenCV实现傅里叶变换3.3 HPF or LPF?参考
- 本文实例为大家分享了python实现图像识别的具体代码,供大家参考,具体内容如下#! /usr/bin/env python from PI
- 其实我这样做的本意是为了防止盗链!大家帮忙看一下通过代码能够根治盗链!只要不是HTTP_REFERER来源于(google.com goog
- 最近一直在“深山老林”中修炼“支付宝新版收银台”,经历了白板设计,视觉设计,前端开发,前后端联调各个阶段。点点滴滴……重点谈谈对交互设计的感
- 1433 SQL入侵恢复xp_cmdshell方法总结 sql server 2005下开启xp_cmdshell的办法 EXEC sp_c