多表查询
在讲解多表查询前,本人先来提出这么一个问题:
现给出一张表employee和一张表project
那么,若是我们采用如下sql语句,会得到什么结果:
SELECT works_on.*,project.* FROM works_on,project;
首先,本人来展示下表employee和表project的内容:

那么,现在本人来展示下运行结果:
上面这种不加条件的简单多表查询,就是本人在《数据结构与算法》专栏提到过的笛卡尔积
(即:将两张表的各列进行“两两相乘”所得的结果)
那么,现在本人来介绍下我们常用的多表查询的手段:
常用的多表查询的手段:
- 内连接
- 外连接
- 子查询
那么,本人首先来介绍下 内连接:
内连接:
格式:
- 格式1:显式的内连接
select a.* ,b.* from a inner join b on ab的连接条件(inner可以不写)
- 格式2:隐式的内连接
select a.* ,b.* from a,b where ab的连接条件
作用:
只显示满足 ab的连接条件的笛卡尔积
那么,现在本人就来展示下内连接:
-- 隐式内连接
SELECT works_on.emp_no,works_on.job,project.* FROM works_on,project WHERE works_on.`project_no`=project.`project_no`;
或
-- 显示内连接1
SELECT works_on.emp_no,works_on.job,project.* FROM works_on INNER JOIN project ON works_on.`project_no`=project.`project_no`;
或
-- 显示内连接2
SELECT works_on.emp_no,works_on.job,project.* FROM works_on JOIN project ON works_on.`project_no`=project.`project_no`;
现在本人来展示下运行结果:
外连接:
格式:
- 左外连接:
select a.,b. from a left [outer] join b on 连接条件;
(outer 可以不写)作用:
先展示join左边的(a)表的所有数据,
根据条件关联查询 join右边的表(b),
符合条件的则展示出来,不符合以null值展示
- 右外连接:
select a.* ,b.* from b right [outer] join a on 连接条件;
(outer 可以不写)作用:
先展示jion右边的(a)表的所有数据,
根据条件关联查询join左边的表(b),
符合条件的则展示出来,不符合以null值展示
那么,现在本人来展示下外连接:
-- 左连接
SELECT works_on.emp_no,works_on.job,project.* FROM works_on LEFT OUTER JOIN project ON works_on.`project_no`=project.`project_no`;
运行结果为:
或
-- 右连接
SELECT works_on.emp_no,works_on.job,project.* FROM works_on RIGHT OUTER JOIN project ON works_on.`project_no`=project.`project_no`;
运行结果为:
子查询:
格式:
将一个查询的结果当作另一个查询的基表
SELECT a.* FROM a WHERE 字段名 IN(b的一个查询结果)
功能:
一个查询依赖另一个查询
那么,现在本人来展示下子查询:
SELECT * FROM works_on WHERE project_no IN(SELECT project_no FROM project WHERE budget>100000);
那么,现在本人来展示下运行结果:

学习了子查询的相关知识点,本人现在来讲解一个由子查询衍生出来的查询方法 —— 自查询:
自连接查询(自查询):
实现手段:
通过表的别名,
给一张表起两个别名,
将它视为两张表,来进行查询
那么,现在本人来展示下 自查询:
假设我有一张emp表,用于存储员工的信息
(员工编号empno、上司编号mgr、员工自身其他信息)
那么,我们就可以假设有两张表:
一张员工表、一张上司表
如果员工的 上司编号mgr=上司的 员工编号empno
就表示另外一个员工是这个员工的上司
SELECT e1.`empno`,e1.mgr,e1.ename,e2.ename,e2.`empno` FROM emp e1,emp e2 WHERE e1.`mgr`=e2.`empno`;
总而言之,我们在多表查询的过程中,
巧妙运用中间表以及别名的机制,
在面对多种多表查询的需求时,就比较容易解决了
那么,本篇博文的知识点在这里就讲解完毕了。
(请观看本人博文 —— 《数据库 —— 专栏总集篇》)