[MySQL] 多表查询(四)

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

7.7 右下图

可以通过左中图与右中图进行并集操作实现。

# 右下图
# 左中图
SELECT e.employee_id, d.department_id
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_id IS NULL
UNION ALL
# 右中图
SELECT e.employee_id, d.department_id
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.department_id
WHERE e.employee_id IS NULL ;

8 自然连接

自然连接会自动查询两张连接表中所有字段名相同的字段,然后根据所有字段名相同的字段进行等值连接。可以把自然连接理解为多个字段的等值连接。

SQL99 在 SQL92 的基础上提供了 NATURAL JOIN 用来表示自然连接。

在 employees 表中和 departments 表中具有两个字段名相同的字段:

基于 employees 表和 departments 表进行自然连接查询:

# 自然连接查询
SELECT 
       e.employee_id, 
       e.department_id, 
       d.department_id, 
       e.manager_id, 
       d.manager_id
FROM employees e
NATURAL JOIN departments d;

等价于:

SELECT
       e.employee_id,
       e.department_id,
       d.department_id,
       e.manager_id,
       d.manager_id
FROM employees e
JOIN departments d
ON e.department_id = d.department_id AND
   e.manager_id = d.manager_id;

9 USING 连接

进行连接的时候,SQL99 还支持使用 USING 指定数据表里的 同名字段 进行等值连接。但是只能配合JOIN一起使用

使用 USING 指定数据表里的同名字段后,会自动在两个表中查找指定的字段,根据指定的字段进行等值连接。

SELECT e.employee_id, d.department_id
FROM employees e
JOIN departments d
USING (department_id);

等价于:

SELECT e.employee_id, d.department_id
FROM employees e
JOIN departments d
ON e.department_id = d.department_id;

10 补充

在使用 JOIN 进行连接查询时,可以将连接条件一起写在连接的后面,如下:

SELECT last_name,job_title,department_name 
FROM employees 
INNER JOIN departments 
INNER JOIN jobs 
ON employees.department_id = departments.department_id AND 
   employees.job_id = jobs.job_id;

建议:

一个连接后面跟着对应的连接条件,即一个 JOIN 后面跟着对应的 ON。

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

11 多表查询练习

【题目】

# 1.显示所有员工的姓名,部门号和部门名称。 
# 2.查询90号部门员工的job_id和90号部门的location_id 
# 3.选择所有有奖金的员工的 last_name , department_name , location_id , city 
# 4.选择city在Toronto工作的员工的 last_name , job_id , department_id , department_name 
# 5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’ 
# 6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式 
# employees Emp# manager Mgr# 
# kochhar 101 king 100 
# 7.查询哪些部门没有员工 
# 8. 查询哪个城市没有部门 
# 9. 查询部门名为 Sales 或 IT 的员工信息

【解答】

1.显示所有员工的姓名,部门号和部门名称。

# 1.显示所有员工的姓名,部门号和部门名称。
SELECT e.last_name, d.department_id, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id;

2.查询90号部门员工的job_id和90号部门的location_id

# 2.查询90号部门员工的job_id和90号部门的location_id
SELECT e.job_id, d.location_id
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_id = 90;

SELECT e.job_id, d.location_id
FROM employees e, departments d
WHERE e.department_id = d.department_id AND
      d.department_id = 90;

3.选择所有有奖金的员工的 last_name , department_name , location_id

# 3.选择所有有奖金的员工的 last_name , department_name , location_id , city
SELECT e.last_name, d.department_name, l.location_id, l.city
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
LEFT JOIN locations l
ON d.location_id = l.location_id
WHERE e.commission_pct IS NOT NULL ;

4.选择city在Toronto工作的员工的 last_name , job_id , department_id

# 4.选择city在Toronto工作的员工的 last_name , job_id , department_id , department_name
SELECT e.last_name, e.job_id, d.department_id, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
JOIN locations l
ON d.location_id = l.location_id
WHERE city = 'Toronto';

SELECT e.last_name,
       e.job_id,
       d.department_id,
       d.department_name
FROM employees e,
     departments d,
     locations l
WHERE e.department_id = d.department_id AND
      d.location_id = l.location_id AND
      l.city = 'Toronto';

5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’

# 5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’
SELECT d.department_name,
       l.city,
       e.last_name,
       e.job_id,
       e.salary
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
JOIN locations l
ON d.location_id = l.location_id
WHERE department_name = 'Executive';

SELECT d.department_name,
       l.city,
       e.last_name,
       e.job_id,
       e.salary
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id AND
      d.location_id = l.location_id AND
      department_name = 'Executive';

6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式

employees Emp# manager Mgr#
kochhar 101 king 100
# 6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式
# employees Emp# manager Mgr#
# kochhar 101 king 100
SELECT e.last_name "employees",
       e.employee_id "Emp#",
       m.last_name "manager",
       m.employee_id "Mgr#"
FROM employees e
LEFT JOIN employees m
ON e.manager_id = m.employee_id;

7.查询哪些部门没有员工

# 7.查询哪些部门没有员工
SELECT d.department_id
FROM departments d
LEFT JOIN employees e
ON d.department_id = e.department_id
WHERE e.employee_id IS NULL;

  1. 查询哪个城市没有部门
# 8. 查询哪个城市没有部门
SELECT l.city, l.location_id
FROM locations l
LEFT JOIN departments d
ON l.location_id = d.location_id
WHERE d.department_id IS NULL ;

  1. 查询部门名为 Sales 或 IT 的员工信息
# 9. 查询部门名为 Sales 或 IT 的员工信息
SELECT e.employee_id,
       e.last_name,
       d.department_id,
       d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name IN ('Sales', 'IT');

SELECT e.employee_id,
       e.last_name,
       d.department_id,
       d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id AND
      d.department_name IN ('Sales', 'IT');


相关实践学习
基于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
|
17天前
|
SQL 关系型数据库 MySQL
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
17 1
|
17天前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(2)-内连接、外连接
MySQL数据库——多表查询(2)-内连接、外连接
16 1
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】MySQL之多表查询
【MySQL进阶之路 | 基础篇】MySQL之多表查询
|
17天前
|
SQL 存储 关系型数据库
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)二
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)二
23 0
|
17天前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(1)-多表关系(一对多、多对对多、一对一)、多表查询概述(概念、笛卡尔积、分类)
MySQL数据库——多表查询(1)-多表关系(一对多、多对对多、一对一)、多表查询概述(概念、笛卡尔积、分类)
21 0