当我们对一个按照范式设计的数据库进行数据查询时,我们势必会需要面对查询的数据分布在不同但是有关联的数据表中的情况。倘若多次查询不同表单热后进行数据过滤势必会增加后端代码量且影响处理速度,此时我们就需要用到多表查询。
当我们直接使用SELECT * FROM 表名1,表名2
去查询数据时,我们获得的结果是两张数据表的笛卡尔积。这样的方法显然无法表现表与表之间数据的联系。所以需要使用以下三类多表查询的方式:
- 内连接查询
内连接查询又分为隐式内连接和显示内连接,其实现功能相同只是代码写法上的区分。- 隐式内连接查询:
其语法与一般的select语句用法无二,案例如下
SELECT t1.name, --员工表姓名字段 t1.gender, --员工表性别字段 t2.name --部门表部门名称字段 FROM emp t1, --员工表 dep t2 --部门表 WHERE t1.`dep_id` = t2.`id`;
- 显式内连接查询:
语法:SELECT 字段列表 FROM 表名1 [INNER] JOIN 表名2 ON 条件;
SELECT t1.name, --员工表姓名字段 t1.gender, --员工表性别字段 t2.name --部门表部门名称字段 FROM emp t1, --员工表 JOIN dep t2 --部门表 ON t1.`dep_id` = t2.`id`;
- 隐式内连接查询:
- 外连接查询
外连接查询分为左外连接和右外连接。- 左外连接:查询左表所有数据以及两表交集部分
语法:SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
- 右外连接:查询右表所有数据及两表交集部分
语法:SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
- 左外连接:查询左表所有数据以及两表交集部分
- 子查询
子查询又称嵌套查询,其实际做法为将一个select语句的返回结果作为一部分嵌套入新的select语句中进行查询。
根据返回结果的不同类型我们将其用法做三个分类:- 返回结果为单行单列
此时我们将返回结果作为WHERE
条件语句的一部分,通过比较运算符与目标值做比对 - 返回结果为多行单列
此时我们将返回结果作为WHERE
条件语句的一部分,通过关键字IN
与目标值做比对 - 返回结果为多行多列
此时我们将返回值作为一张虚拟新表来进行查询操作
- 返回结果为单行单列