今天和大家学习一下MySQL的多表查询,主要是讲解内连接,外连接,子查询,好啦,废话不多说直接开始咯。


一、多表查询--内连接

我们先建两张表,分别是部门表 dept 、员工表 emp ,其中员工表里面的字段dept_id是部门表的主键字段。



现在我们有如下的需求:

查询所有的员工信息和对应的部分信息

SELECT * from emp e inner join dept d on e.dept_id = d.id;

执行结果如下所示:


上面这种方式是显式内连接,还要一种叫隐式内连接,但是这种一般不怎么用,具体的写法是这样的:

SELECT * from emp e,dept d where e.dept_id = d.id;


同样也可以查询出结果。

最后总结一下内连接:

1. 从哪些表中查询数据

2. 条件是什么

3. 查询哪些字段

4.显式内连接:语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件

5.隐式内连接:使用where条件消除无用数据


二、多表查询--外连接

外连接查询,其实分为 左外连接 和 右外连接 。

1、左外连接

语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;查询的是左表所有数据以及其交集部分。我们来举例说明一下,还是两张表 员工表emp,部分表 dept ,其中员工表里面的字段dept_id是部门表的主键字段。

现在来了一名新的员工,但是他还没有分配部门。


需求:查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称

如果我们还是按照之前的内连接查询方法,看看查询结果是什么样的?


我们发现少了一条信息,就是新加入的员工信息,所以这个时候,就不能再使用内连接了,而是需要使用左外连接

SELECT * from emp e left join dept d on e.dept_id = d.id;


2、右外连接

语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;查询的是右表所有数据以及其交集部分。现在我们使用右外连接查询一下这两张表

SELECT * from emp e right join dept d on e.dept_id = d.id;


发现少了一条数据,因为右外连接,查询的是右表所有数据以及其交集部分。


三、子查询

概念:查询中嵌套查询,称嵌套查询为子查询。

子查询学习之前的开胃小菜:

还是上面的两张表 员工表emp,部分表 dept ,其中员工表里面的字段dept_id是部门表的主键字段。两张表是相互关联的。


需求是:查询出最高工资的员工信息

SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);


我们来看一下子查询一共有几种情况:

1. 子查询的结果是单行单列的(上面的例子就是单行单列的):

子查询可以作为条件,可以使用运算符去判断。一般运算符包括: > >= < <= =查询员工工资小于平均工资的人SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);2. 子查询的结果是多行单列的:

子查询可以作为条件,使用运算符in来判断查询'财务部'和'市场部'所有的员工信息SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');


3. 子查询的结果是多行多列的:

* 子查询可以作为一张虚拟表参与查询

-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息

SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2
WHERE t1.id = t2.dept_id;


-- 普通内连接

SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` > '2011-11-11'


我们看到一样可以达到上面的效果。


好啦,今天就和大家分享到这里,你学会了吗?byebye