MySQL学习-多表查询(一)

183 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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
email
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’的员工所在城市,我们需要先分三步查询一下。

  1. 先查询姓名为‘bing’的员工的部门id。
SELECT name, department_id
FROM employees
WHERE name = 'bing'

查到员工的部门id是1。

  1. 再查询部门id为1的位置id
SELECT location_id
FROM departments
WHERE department_id = 1

查到员工的位置id是1。

  1. 最后查询位置id为1的城市名字。
SELECT city
FROM locations
WHERE location_id = 1

查到员工的城市是北京。

经过这三步,我们就找到了员工名字是‘bing’工作所在的城市是北京。

虽然我们查询到了结果,但是我们是通过三步完成的,经过了三次查询交互。如果我们使用多表查询的话,一步就可以完成查询出结果。

所以我们需要使用多表查询得到结果。

思考: 上面查询的结果需要三步,我们为什么不把三张表的数据放在一起查询呢,这样一步就可以查出结果了。这是因为:

  • 三张表的数据放在一起,数据量会很大。
  • 可能有些员工没有部门,那部门的这些字段就都是空,造成了字段的冗余,浪费了空间。
  • 查询时,需要把一些数据加载在内存中,如果字段多的话,会造成IO的次数多,进而造成查询效率差。
  • 多表的话,方便并发查询。

今天先学习到这里,明天继续。