[MySQL] 多表查询(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: [MySQL] 多表查询(二)

5.2 自连接 vs 非自连接

5.2.1 自连接

一张表,自己与自己进行连接。用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询。

自连接的例子:

查询员工id,员工姓名及其管理者的id和姓名

# 查询员工id,员工姓名及其管理者的id和姓名
SELECT e.employee_id, e.last_name, m.employee_id
FROM employees e, employees m
WHERE e.manager_id = m.employee_id

5.2.2 非自连接

一张表与另一张表进行连接查询。

非自连接的例子:

查询员工的工资等级:

SELECT employees.last_name, employees.salary, job_grades.grade_level
FROM employees, job_grades
WHERE employees.salary BETWEEN job_grades.lowest_sal AND job_grades.highest_sal;

5.3 内连接

内连接:合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行,即内连接的查询结果集中都是两张表中能够相互匹配的记录根据连接条件组成的结果,不存在一个表中有的记录而另一张表中没有与之相匹配的记录组成的结果。

查询员工编号及其所在的部门:

SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id` = d.department_id;

不包含没有部门的员工

SQL92语法实现内连接:见上,略

SQL99语法中使用 JOIN …ON 的方式实现多表的查询。

SQL99语法实现内连接:

两张表:

SELECT last_name, department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.department_id;

三张表:

SELECT last_name, department_name, city
FROM employees
INNER JOIN departments 
ON employees.department_id = departments.department_id
INNER JOIN locations 
ON departments.location_id = locations.location_id;

5.4 外连接

外连接:合并具有同一列的两个以上的表的行, 结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表 或 右表中不匹配的行

外连接的分类:

  • 左外连接
    两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的行,这种连接称为左外连接。
  • 右外连接
    两个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足条件的行,这种连接称为右外连接。
  • 满外连接
    左外连接与右外连接的并集

5.4.1 使用(+)实现外连接

SQL92语法实现外连接:使用 + ---------- MySQL不支持SQL92语法中外连接的写法!

查询所有的员工的last_name,department_name信息 :

需要使用左外连接

使用SQL92:(MySQL不支持)

SELECT employee_id,department_name
FROM employees e,departments d
# 需要完全保留的表 对应的另一张表 使用(+)
# 相当于使用(+)对于数据的少的表使用 Null 进行补全
WHERE e.`department_id` = d.department_id(+);

5.4.1 SQL99外连接

SQL99语法中使用 JOIN …ON 的方式实现多表的查询。这种方式也能解决外连接的问题。MySQL是支持此种方式的。

LEFT JOIN 和 RIGHT JOIN 只存在于 SQL99 及以后的标准中,在 SQL92 中不存在,只能用 (+) 表示。

使用SQL99实现外连接:

查询所有的员工的last_name, department_name信息

5.4.2 左外连接

SELECT last_name, department_name
FROM employees e
LEFT OUTER JOIN departments d
ON e.department_id=d.department_id;
# outer 可以省略
SELECT last_name, department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id=d.department_id;

5.4.3 右外连接

SELECT last_name, department_name
FROM employees e 
RIGHT JOIN departments d 
ON d.department_id = e.department_id;

5.4.4 满外连接

  • 满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。
  • SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。
  • 需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT JOIN 代替。

mysql不支持FULL OUTER JOIN:

SELECT last_name, department_name
FROM employees e 
FULL OUTER JOIN departments d 
ON d.department_id = e.department_id;


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 存储 关系型数据库
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
|
1月前
|
关系型数据库 MySQL
3. Mysql 如何实现多表查询
MySQL多表查询主要包括内连接和外连接。内连接有隐式和显式:隐式是通过`From 表A, 表B where 连接条件`,显式是`From 表A inner join 表B on 连接条件`。外连接包括左外连接(`left join`)、右外连接(`right join`)和全外连接(较少使用)。此外,还有交叉连接(`cross join`),但也较少使用。
25 0
|
6天前
|
关系型数据库 MySQL 数据库
MySQL数据库基础第四篇(多表查询与事务)
MySQL数据库基础第四篇(多表查询与事务)
|
17天前
|
SQL 关系型数据库 MySQL
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
24 5
|
17天前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(4)-实例练习、多表查询总结
MySQL数据库——多表查询(4)-实例练习、多表查询总结
18 1
|
18天前
|
SQL 关系型数据库 MySQL
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
17 1
|
18天前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(2)-内连接、外连接
MySQL数据库——多表查询(2)-内连接、外连接
16 1
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】MySQL之多表查询
【MySQL进阶之路 | 基础篇】MySQL之多表查询
|
17天前
|
SQL 存储 关系型数据库
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)二
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)二
23 0
|
18天前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(1)-多表关系(一对多、多对对多、一对一)、多表查询概述(概念、笛卡尔积、分类)
MySQL数据库——多表查询(1)-多表关系(一对多、多对对多、一对一)、多表查询概述(概念、笛卡尔积、分类)
21 0