ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL-sql99-自连接、左(右)外连接、全外连接、交叉连接

2022-05-23 13:32:13  阅读:221  来源: 互联网

标签:JOIN name bo 全外 id sql99 department 连接 SELECT


自连接

查询员工的名字、上级的名字

#自连接
#查询员工的名字、上级的名字
SELECT e.`last_name`,m.`last_name`
FROM `employees` e
INNER JOIN `employees` m
ON e.`manager_id`=m.`employee_id`;

image

还可以继续加筛选条件

查询姓名中包含字符k的员工的名字、上级的名字

#查询姓名中包含字符k的员工的名字、上级的名字
SELECT e.`last_name`,m.`last_name`
FROM `employees` e
INNER JOIN `employees` m
ON e.`manager_id`=m.`employee_id`
WHERE e.`last_name` LIKE '%k%';

image

外连接

image

image

引入:查询男朋友不在男神表的女神名

SELECT b.`name`,bo.*
FROM `beauty` b
LEFT OUTER JOIN `boys` bo
ON b.`boyfriend_id`=bo.`id`

image

所有信息都查出来了

加上筛选条件

# 引入:查询男朋友不在男神表的女神名
SELECT b.`name`,bo.*
FROM `beauty` b
LEFT OUTER JOIN `boys` bo
ON b.`boyfriend_id`=bo.`id`
WHERE bo.`id` IS NOT NULL;

image

选择bo.id 作为筛选条件 是因为

image

主键不为空

若 把id=3的userCP=NULL

UPDATE boys SET userCP=NULL WHERE id=3;

image

则本身这个字段就为空 不能作为筛选条件 所以一般选择主键

上面的代码为左外连接

要实现右外连接 见下图

SELECT b.`name`,bo.*
FROM `boys` bo
RIGHT OUTER JOIN `beauty` b 
ON b.`boyfriend_id`=bo.`id`
WHERE bo.`id` IS NOT NULL;

image

案例:哪个部门没有员工

部门是主表

#左外
SELECT d.*,e.`department_id`
FROM `departments` d
LEFT OUTER JOIN `employees` e
ON d.`department_id`=e.`department_id`
WHERE e.`department_id` IS NULL;

#右外

SELECT d.*,e.`department_id`
FROM `employees` e
RIGHT OUTER JOIN `departments` d
ON d.`department_id`=e.`department_id`
WHERE e.`department_id` IS NULL;

image

全外连接

image

image

交叉连接

SELECT b.* ,bo.*
FROM `beauty` b
CROSS JOIN `boys` bo;

image

展现的是笛卡尔乘积

总结连接查询

image

image

image

案例讲解

案例:查询编号>3的女神的男朋友信息,如果有则列出详细,如果没有,用NULL填充

#左外
SELECT b.`id`,b.`name`,bo.*
FROM `beauty` b
LEFT OUTER JOIN `boys` bo
ON b.`boyfriend_id`=bo.`id`
WHERE b.id>3;

image

案例:查询哪个城市没有部门

#左外
SELECT l.`city`,d.`department_name`
FROM `locations` l
LEFT OUTER JOIN `departments` d
ON l.`location_id`=d.`location_id`
WHERE d.`department_id` IS NULL;

image

案例:查询部门名为SAL或IT的员工信息

这里因为有可能出现 部门名为SAL或IT的 但是没有员工的部门存在 所以最好用外连接

#左外
SELECT d.`department_name`,e.*
FROM `departments` d
LEFT OUTER JOIN `employees` e
ON d.`department_id`=e.`department_id`
WHERE d.`department_name`='SAL' OR d.`department_name`='IT';

image

或者

#左外
SELECT d.`department_name`,e.*
FROM `departments` d
LEFT OUTER JOIN `employees` e
ON d.`department_id`=e.`department_id`
WHERE d.`department_name`IN('SAL','IT');

image

同样的效果

标签:JOIN,name,bo,全外,id,sql99,department,连接,SELECT
来源: https://www.cnblogs.com/jgg54335/p/14961105.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有