MySQL学习-多表查询(八)

153 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

前言

上篇我们学习完了多表查询。有兴趣的小伙伴可以阅读(# MySQL学习-多表查询(七))。
下面做一些MySQL中的多表查询练习,巩固一下知识点。

练习一

查询所有员工的姓名,部门号和部门名称。

分析: 查询的是所有的员工,所以是外连接。另外需要补足员工表中的数据,使用左外连接。

SELECT e.name, d.department_id, d.department_name
FROM employees e LEFT JOIN departments d
ON e.'department_id' = d.'department_id'

练习二

查询90号部门员工的姓名,job_id和location_id。

分析: 查询的是90号部门的员工,所以这里需要使用WHERE语句。

SELECT e.name, d.job_id, d.location_id
FROM employees e JOIN departments d
ON e.'department_id' = d.'department_id'
WHERE d.'department_id' = 90

练习三

查询所有有奖金的员工的姓名,部门名称,location_id和城市。

分析: 查询的结果多了城市,所以需要3张表连接,需要用到两个JOIN。另外查询的是有奖金的,需要使用WHERE语句。

SELECT e.name, d.department_name, d.location_id, l.city
FROM employees e JOIN departments d
ON e.'department_id' = d.'department_id'
JOIN locations l
ON d.'location_id' = l.'location_id'
WHERE e.'commission_id' IS NOT NULL

上面语句可以查出来结果,但是要时刻注意这里查询的是所有的。需要使用两个外连接。

SELECT e.name, d.department_name, d.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_id' IS NOT NULL

这样就可以查出所有的结果了。

练习四

查询城市是shanghai的员工的姓名,部门号码,部门名称。

分析: 查询的条件多了城市,所以需要3张表连接,需要用到两个JOIN。另外查询的是城市名为shanghai的员工,需要使用WHERE语句。

SELECT e.name, d.department_name, d.department_id
FROM employees e JOIN departments d
ON e.'department_id' = d.'department_id'
JOIN locations l
ON d.'location_id' = l.'location_id'
WHERE l.'city' = 'shanghai'

练习五

查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门名称为’研发部‘。

分析: 查询的结果多了部门地址,所以需要3张表连接,需要用到两个JOIN。员工部门名称是’研发部‘,需要使用WHERE语句。

SELECT e.name, d.department_name, l.street_address, 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 d.‘department_name’ = '研发部'

分析: 这里主要查询部门表,有可能在多个城市都有这个部门,所以这里最好使用部门表当主表,并且使用左外连接的方式进行查询。如下所示:

SELECT e.name, d.department_name, l.street_address, e.job_id, e.salary
FROM departments d LEFT JOIN employees e
ON e.'department_id' = d.'department_id'
LEFT JOIN locations l
ON d.'location_id' = l.'location_id'
WHERE d.‘department_name’ = '研发部'

练习六

查询哪些部门没有员工。

分析: 查询部门,部门当主表,使用左外连接,并且没有员工,使用WHERE语句判断部门id为空。

SELECT d.department_id
FROM departments d LEFT JOIN employees e
ON e.'department_id' = d.'department_id'
WHERE e.‘department_id’ IS NULL

练习七

查询哪个城市没有部门。

分析: 查询城市,位置表当主表,使用左外连接,并且没有部门,使用WHERE语句判断位置id为空。

SELECT l.city, l.location_id
FROM locations l LEFT JOIN departments d
ON d.'location_id' = l.'location_id'
WHERE d.'location_id' IS NULL

练习八

查询部门名为研发部或生产部的员工信息。

分析: 查询部门名为研发部或生产部,使用WHERE语句IN判断。

SELECT e.name, d.department_name
FROM employees e LEFT JOIN departments d
ON e.'department_id' = d.'department_id'
WHERE d.'department_name' IN ('研发部', '生产部')

今天做了一些多表查询的练习,多表查询就完全学完了。明天继续学习其他MySQL的知识。