一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情。
前言
上篇我们学习完了分页的知识,并针对排序和分页做了一些练习,巩固了一下知识点。有兴趣的小伙伴可以阅读(# MySQL学习-分页)。
下面开始学习MySQL中的多表查询。
目前学习的查询语句
SELECT ...
FROM ...
WHERE ...AND / OR / NOT...
ORDER BY ...(ASC/DESC),...
LIMIT ...,...
使用以上语句可以完成一些基本的查询功能。
使用多表查询的原因
- 数据表中数据量大
- 数据查询的优化
- 如果表之间有关联关系的话,也需要多表查询
基于以上几点,我们需要多表查询,什么是多表查询呢?
多表查询
多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。
前提条件
这些一起查询的表之间是有关系的(一对一、一对多),他们之间一定是有关联字段的,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。
学习多表查询前,需要先熟悉几张表的结构。
表结构
前面学习过,查看表结构的语句DESC。
这里先熟悉3张表结构:员工表,部门表,位置表。
DESC employees;
DESC departments;
DESC locations;
employees表中字段有:
| employee_id |
|---|
| name |
| salary |
| commission_pct |
| manager_id |
| department_id |
departments表中字段有:
| department_id |
|---|
| department_name |
| manager_id |
| location_id |
locations表中字段有:
| location_id |
|---|
| street_address |
| city |
| state_province |
| country_id |
熟悉了表结构,我们进行一些查询。
示例一
查询员工名为‘bing’的人在哪个城市工作
分析: 城市字段在locations表中,locations表和departments表有关联,关联字段是location_id。而departments表和employees表是有关联的,关联字段是department_id。因此要想查询到员工名字是‘bing’的员工所在城市,我们需要先分三步查询一下。
- 先查询姓名为‘bing’的员工的部门id。
SELECT name, department_id
FROM employees
WHERE name = 'bing'
查到员工的部门id是1。
- 再查询部门id为1的位置id
SELECT location_id
FROM departments
WHERE department_id = 1
查到员工的位置id是1。
- 最后查询位置id为1的城市名字。
SELECT city
FROM locations
WHERE location_id = 1
查到员工的城市是北京。
经过这三步,我们就找到了员工名字是‘bing’工作所在的城市是北京。
虽然我们查询到了结果,但是我们是通过三步完成的,经过了三次查询交互。如果我们使用多表查询的话,一步就可以完成查询出结果。
所以我们需要使用多表查询得到结果。
思考: 上面查询的结果需要三步,我们为什么不把三张表的数据放在一起查询呢,这样一步就可以查出结果了。这是因为:
- 三张表的数据放在一起,数据量会很大。
- 可能有些员工没有部门,那部门的这些字段就都是空,造成了字段的冗余,浪费了空间。
- 查询时,需要把一些数据加载在内存中,如果字段多的话,会造成IO的次数多,进而造成查询效率差。
- 多表的话,方便并发查询。
今天先学习到这里,明天继续。