为什么要使用多表查询
我们要明白为什么使用多表查询,那么我么首先要知道什么是多表查询?
多表查询: 也称之为关联查询,指的是两个或者更多的表一起完成查询操作
这里我们通过一个例子来理解什么是多表查询(这里例子中我们只是理清多表查询的思路,我们是分为了一步一步写,我们在实际的编程中不会这样去写,因为这样进行多表查询的效率太低了,我们在MySQL中有比这种方式快得多的多表查询方式)
eg: 我们有员工表,部门表,位置表,那么我们如果要查询员工表中名为 ‘Abel’ 的人在哪个城市工作,我们要怎么办?
第一步: 首先我们要在员工表中通过员工的姓名为’Abel’来查询员工的部门id
SELECT department_id
FROM employees
WHERE last_name = 'Abel';
- 这里我们就是对员工表(employees)中名为’Abel’的员工的部门编号(department_id)进行了查询,假如这个时候我们查询的结果显示’Abel’的部门编号为80
第二步: 这个时候我们要通过刚刚查出的’Abel’的部门编号再去部门表中查询Abel员工的城市位置编号(Location_id)
SELECT Location_id
FROM departments
WHERE department_id = 80;
- 这个时候我们就是对部门表中部门编号为80号的部门的城市位置编号进行了一个查询,这个时候假如查询出的结果为250
第三步: 最后这里我们就要使用刚刚查出的’Abel’所在的80号部门的所在的城市位置编号来在城市位置表中查询对应编号的城市名
SELECT city
FROM locations
WHERE location_id = 2500;
- 这里我们就通过为250的城市位置编号查出了对应的城市名称, 假如这个时候这个城市叫做: Oxford
那么上面我们通过三个SELECT 语句在我们的三个表中一次查询,从而查询到了我们的名为’Abel’的员工的工作城市,那么这里就是我们所说的多表查询吗?
其实不是的,这种查询方式我们确实也是在多个表中查询了,但是我们的实际编程中绝对不会使用这种查询方式,因为这里通过三个SELECT语句来查询的效率实在是太慢了,相当于我们在实际编程中web端向后端发送一次请求,我们后端查询一次,所以我们需要三次请求才能查询到我们的结果,这样的效率太低了,我们真正的多表查询是通过一次交互就可以在多个表中查询出我们想要的结果的,也就是我们的真正的多表查询是通过一个查询语句(SELECT语句)来实现的,我们一个SELECT完成多表查询才是真正的多表查询
然后这里我们再来分析一个问题: 为什么要使用多表查询,我们可不可以将多表查询中的多个表合并成一个表?
首先我们这里说明: 是可以的,我们可以将多表查询中的多个表合并成为一个表,但是我们并不会这样做,这里我们有四个原因
原因一: 我们如果以前面的问题为例,将员工表,部门表,和我们的城市位置表三个表合并到一起,那么我们原本的员工表可能一共有20个字段,但是这时候三个表合并到一起之后我们假如合并的表中有40个字段,这个时候我们如果是通过员工名查询员工的编号,我们之前就直接在员工表中查询就可以了,但是这个时候三个表合成一个表之后我们的三个表中如果查询的话,这个时候就会有很多字段是’冗余字段’,并且我们可能有很多员工可能刚刚来公司,这个时候这些员工可能是没有登记部门信息的,那么这个时候就会有很多的员工后面的部门相关的字段都为null,这也就会导致数据很冗余
原因二: 我们要查询数据表中的数据,我们就要将数据表加载到内存中,而我们三表合一之前,如果我们的员工表中有20个字段我们需要20次IO来读取数据,但是我们三表合一之后我们的这个大表这个时候可能就有了40个字段,那么原来是时候如果我们是要从员工表中来查询一个数据,这个时候我们可能需要I/O的次数是20次,那么我们三表合一之后我们原本在员工表中就可以查找的数据我们要来大表中来查询,这个时候我们可能需要I/O的次数是40此,并且我们的I/O是和我们的硬盘进行交互,我们通过I/O和硬盘交互是很慢的,也就是很影响效率的
原因三: 我们的表中的数据越多,我们的表就越难去维护
原因四: 我们三表合一之前我们如果一个人去查询员工表的时候,这个时候就会有其他的人去查询部门表和城市位置表,这个时候的效率就会比较高,但是如果是我们三表合一之后,这个时候如果有一个人在查询我们的大表之后我们的大表可能就会被锁住,这个时候其他的人就不可以对大表进行查询了,这样也就是很影响效率
|