MySQL连接查询(多表连接查询:内连接,外连接,交叉连接详解)

6:多表连接查询

笛卡尔乘积:如果连接条件省略或无效则会出现
解决办法:添加上连接条件

连接查询的分类:

1.按年代分类:1)sql 92标准:仅仅支持内连接2)sql 99标准 **(推荐使用)** :支持内连接、外连接(左外 和 右外)、交叉连接
2.按功能分类:1)内连接:等值连接非等值连接自连接2)外连接:左外连接右外连接全外连接3)交叉连接

一、传统模式下的连接 :等值连接——非等值连接

1.等值连接的结果 = 多个表的交集
2.n表连接,至少需要n-1个连接条件
3.多个表不分主次,没有顺序要求
4.一般为表起别名,提高阅读性和性能

二、sql99语法:通过join关键字实现连接

含义:1999年推出的sql语法
支持:
等值连接、非等值连接 (内连接)
外连接
交叉连接语法:

select 字段,…
from 表1
【inner|left outer|right outer|cross】join 表2 on 连接条件
【inner|left outer|right outer|cross】join 表3 on 连接条件
【where 筛选条件】
【group by 分组字段】
【having 分组后的筛选条件】
【order by 排序的字段或表达式】

好处:语句上,连接条件和筛选条件实现了分离,简洁明了!

三、自连接

案例:查询员工名和直接上级的名称

sql99

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;

sql92

SELECT e.last_name,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;

一、等值连接
1)多表等值连接的结果实际上为多个表的交集部分
2)n张表进行连接,则至少需要 n-1 个连接条件
3)多表的顺序没有要求
4) 一般需要为表起别名,因为可能同一个字段名,会在多张查询的表中存在。即可以为表取别名,区分多个重名的字段。为表使用别名后,只能使用别名去"select"!
5) 等值连接可以搭配排序(order by)、分组(group by)、筛选(where/and/like)来使用

# sql 92
# 可以实现三表连接
# 查询员工名、部门名、和所在的城市
SELECT last_name,department_name,city
FROM employees e, departments d,locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id
AND city LIKE 's%'
ORDER BY department_name DESC;# 加分组条件
# 查询每个城市的部门个数
SELECT COUNT(*) 个数 , city
FROM departments d , locations l
WHERE d.location_id = l.location_id
GROUP BY city;
# sql 99# 1.等值连接
# 查询员工名、部门名
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;# 查询名字中包含e的员工名和工种名
SELECT last_name , job_title,j.job_id
FROM employees e
INNER JOIN jobs j
on e.job_id = j.job_id
WHERE e.last_name LIKE '%e%';# 查询部门个数>3的城市名和部门个数,(添加分组+筛选)
SELECT city,COUNT(*) 部门个数
FROM locations l
INNER JOIN departments d
ON l.location_id = d.location_id
GROUP BY city
HAVING 部门个数>3;# 查询部分的员工个数>3的部门名和员工个数,并按员工个数降序排序SELECT COUNT(*) 个数,department_name
FROM departments d
INNER JOIN employees e
ON e.department_id = d.department_id
GROUP BY department_name
HAVING COUNT(*) > 3
ORDER BY COUNT(*) DESC;# 查询员工名、部门名、工种名,并按部门名降序排列(三表连接)
SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN jobs j ON e.job_id = j.job_id
INNER JOIN departments d ON e.department_id = d.department_id
ORDER BY department_name DESC;
sql 99 特点:
1、也可添加排序、分组、筛选
2、inner 可以省略
3、 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
4、inner join连接 和sql92语法中的等值连接效果相同,都是查询多表的交集

二、非等值连接
表与表之间没有相同项(或有相同但是不能用),但是表之间某个或某些项直接存在着一定的关系。

比如说员工信息表,里面包含员工工资,另外一张工资等级表将工资进行等级划分,而员工的工资就可以根据工资等级表来划分为某个等级。
where 列名 BETWEEN … AND …

# sql 92
# 非等值连接
# 查询员工的工资和工资级别
SELECT salary , grade_level
FROM employees e, job_grades g
WHERE salary BETWEEN g.lowest_sal AND highest_sal
ORDER BY g.grade_level;
# AND g.grade_level = 'A';
# sql 99
# 非等值连接# 查询员工的工资级别
SELECT salary , grade_level
FROM employees e
INNER JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;# 查询每个工资级别的员工个数>20的个数,并按工资级别降序排列
SELECT salary , grade_level , COUNT(*)
FROM employees e
INNER JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal
GROUP BY grade_level
HAVING count(*) > 20
ORDER BY grade_level DESC;

三、自连接 :自己连接自己
自连接相当于等值连接,不同的是等值连接的项在不同的表单当中,而自连接的连接项在同一个表单中。单一表单中某项和另外一项存在着关联关系。

比如说员工信息表中,普通员工A的领导是B,而B本身也是员工,因此也包含着员工信息表中。所以A的manager_id就是B的employee_id

# sql 92
# 自连接
# 查询员工名 和 上级的名称
SELECT e.employee_id , e.last_name , m.employee_id , m.last_name
FROM employees e ,employees m
WHERE e.manager_id = m.employee_id;
# sql 99
# 自连接# 查询员工的名字、上级的名字
SELECT e.last_name , m.last_name
FROM employees e
INNER JOIN employees m
ON e.employee_id = m.manager_id;# 查询包含字符k的员工名字、上级的名字
SELECT e.last_name , m.last_name
FROM employees e
INNER JOIN employees m
ON e.employee_id = m.manager_id
WHERE e.last_name LIKE '%k%';

二、外连接

应用场景:用于查询一个表中有,但是另一个表中没有的记录。

特点:
1)外连接的查询结果为主表中的所有记录。如果从表中有和它匹配的(也就是连接条件成立),则显示匹配的值。如果从表中没有和它匹配的,则显示null。
外连接查询的结果 = 内连接查询的结果 + 主表中有而从表中没有的记录
2)左外连接,left join 左边的是主表
右外连接,right join 右边的是主表

# sql 99
# 外连接# 查询男朋友 不在男神表中的 女神名
USE girls;
SELECT * FROM boys;# 左外连接
SELECT b.name , bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE bo.id IS NULL;# 右外连接
SELECT b.name , bo.*
FROM boys bo
RIGHT OUTER JOIN beauty b
ON b.boyfriend_id = bo.id
WHERE bo.id IS NULL;  # 查询哪个部门没有员工
# 左外
USE myemployees
SELECT d.* , e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.department_id = e.department_id
WHERE e.employee_id IS NULL;# 右外
SELECT d.* , e.employee_id
FROM employees e
RIGHT OUTER JOIN departments d
ON d.department_id = e.department_id
WHERE e.employee_id IS NULL;

3)左外和右外交换两个表的顺序时,可以实现同样的效果
4) 全外连接 = 内连接的结果 + 表1中有但表2中没有的结果 + 表2中有但表1中没有的结果

# 全外
use girls
SELECT b.* ,BOTH.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.boyfirend_id = bo.id;

5)交叉连接(笛卡尔积)

# 交叉连接(笛卡尔积)
USE girls
SELECT b.* ,bo.*
FROM beauty b
CROSS JOIN boys bo;

常见连接类型总结:

二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)相关推荐

  1. 三、MySQL子查询学习笔记(标量子查询、列子查询、行子查询、表子查询 详解)

    三.MySQL子查询学习笔记 7:子查询 含义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询:在外面的查询语句,称为主查询或外查询 分类: 一 ...

  2. JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  3. ESL3.5 学习笔记(主成分回归,偏最小二乘回归步骤详解)

    3.5 运用派生输入方向的方法 这是一篇有关<统计学习基础>,原书名The Elements of Statistical Learning的学习笔记,该书学习难度较高,有很棒的学者将其翻 ...

  4. python的messagebox的用法_Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解...

    本文实例讲述了Python GUI编程学习笔记之tkinter中messagebox.filedialog控件用法.分享给大家供大家参考,具体如下: 相关内容: messagebox 介绍 使用 fi ...

  5. Apollo 5.5 源码学习笔记(五) | transform模块 | Apollo中的坐标系统详解

    本系列博客旨在记录自己在学习百度无人驾驶开源框架Apollo的心得和体会,欢迎大家阅读和点赞,并提出宝贵意见,大家相互学习,如需转载,请注明出处,谢谢! 文章目录 1.前言 2.车辆传感器布局 3.传 ...

  6. [转载] python学习笔记(三)- numpy基础:array及matrix详解

    参考链接: Python中的numpy.fv Numpy中的矩阵和数组 numpy包含两种基本的数据类型:数组(array)和矩阵(matrix).无论是数组,还是矩阵,都由同种元素组成. 下面是测试 ...

  7. 【Linux学习笔记】8. Linux查找命令:find和grep详解

    Linux查找命令 find查找文件 grep查找字符串 1. find命令 有多种使用方式: 根据文件名搜索 根据文件大小搜索 根据文件类型搜索 根据修改时间搜索 根据文件权限搜索 根据文件所有者搜 ...

  8. 前端学习笔记(11)之过渡属性(transition)详解

    有四个transition属性可以影响过渡效果 指定要执行过渡的属性 transition-property: 过渡效果持续的时间 transition-duration: 过渡的时序函数 trans ...

  9. (四)MySQL学习笔记——多表设计、多表查询、多表查询练习题

    文章目录 一.多表设计 1.一对一设计 2.一对多设计 3.多对多设计 二.多表查询 多表查询前的数据准备 1.内连接查询 2.外连接查询 3.子查询 4.自关联查询 三.多表查询练习 一.多表设计 ...

最新文章

  1. mysql实现pr曲线_ROC 曲线与 PR 曲线
  2. java映射文件是哪一种xml_java解析xml的几种方式哪种最好?
  3. 见贤思齐焉,见不贤而内自省也
  4. 谈判专家(东方化改题+懒得看标程)
  5. 博途v15做上位画面_1399元起!realme真我V15评测:当科技遇上国潮 越级还能这么玩...
  6. oracle大批量数据统计,加速Oracle大批量数据处理的2个好用方案
  7. php 创建目录_使用 Zephir 轻松构建 PHP 扩展
  8. 医学计算机语言s,B/S框架医学图像处理系统的算法接入方法研究
  9. FMEA手册第五版学习笔记(一)
  10. C语言为什么~0 == -1?
  11. 华为USG防火墙恢复密码步骤
  12. 关于Growth Hacker的笔记
  13. Git常用命令、及常见报错处理:You have not concluded your merge (MERGE_HEAD exists)
  14. TPM分析笔记(一) TPM历史
  15. 矩阵连乘问题(动态规划)
  16. 学计算机画素描吗,怎样在电脑上画素描?
  17. 唯品会服务器信息,唯品会商品详情信息接口
  18. Decompiled .class file下载sourse失败
  19. js 弹出子页面与关闭子页面刷新父页面的问题
  20. RHCE培训笔记之Vim的使用

热门文章

  1. 前端之同源策略 Jsonp 与 CORS
  2. 机器学习算法之 logistic、Softmax 回归
  3. mysql用supervisor管理_Supervisor使用详解
  4. np.random.seed(0)作用
  5. 石头剪刀布python编程_《python核心编程第二版》练习题——游戏:石头剪刀布
  6. php判断电脑浏览器模拟手机访问网页,在PC上测试移动端网站和模拟手机浏览器的5大方法...
  7. 链表(单链表、双链表、内核链表)
  8. centos7装单机hadoop2.7.3
  9. SQL Server2008附加数据库失败
  10. HDU-4089 Activation (概率DP求概率)