MySQL 关联查询(内连接、外连接)
关联查询:查询的目标是两张表或两张表以上。
MySQL 中文文档 | MySQL 中文网 (mysqlzh.com)
SQL92语法
SQL语言在1992年推出的一套标准语法(关联查询中没有新的关键字)
SQL99语法
SQL语言在1999年推出的一套新的标准语法(最新的sql语言版本,关联查询中添加了一系列新的关键字:inner join;on;)
Sql92 语法和 Sql99 语法的区别:99 语法可以做到表的连接和查询条件分离,特别是多个表进行连接的时候,会比 sql92更清晰。
内连接
相当于查询A表、B表交集部分数据
- 隐式内连接:
SELECT 字段列表 FROM 表1,表2 WHERE 条件...;
- 显式内连接:
SELECT 字段列表 FROM 表1 [INNER] JION 表2 ON 连接条件...;
案例
-- 内连接演示 -- 1.查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现) -- 表结构:emp,dept -- 连接条件:emp.dept_id = dept.id select emp.name, dept.name from emp,dept where emp.dept_id = dept.id; select e.name, d.name from emp e,dept d where e.dept_id = d.id; #给表起别名 -- 2.查询每一个员工的姓名,及关联的部门的名称(显式内连接实现) select emp.name, dept.name from emp inner join dept on emp.dept_id = dept.id; select e.name, d.name from emp e inner join dept d on e.dept_id = d.id; select e.name, d.name from emp e join dept d on e.dept_id = d.id;
外连接
- 左外连接:查询左表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件...;
- 右外连接:查询右表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;
左连接以左面的表为准和右边的表比较,和左表相等的不相等都会显示出来,右表符合条件的显示,不符合条件的不显示。右连接恰恰相反。
案例
-- 外连接演示 -- 1.查询emp表的所有数据,和对应的部门信息(左外连接) -- 表结构:emp,dept -- 连接条件:emp.dept_id = dept.id select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id; select e.*, d.name from emp e left join dept d on e.dept_id = d.id; -- 2.查询dept表的所有数据,和对应的员工信息(右外连接) select d.*,e.* from emp e right join dept d on d.id = e.dept_id; select d.*,e.* from dept d left join emp e on d.id = e.dept_id;
自连接
SELECT 字段列表 FROM 表A 别名A1 JOIN 表A 别名A2 ON 条件...;
案例
-- 自连接查询 -- 1.查询员工及其所属领导的名字 select e1.name, e2.name from emp e1 , emp e2 where e1.managerid = e2.id; -- 2.查询所有员工 emp 及其领导的名字 emp,如果员工没有领导,也需要查询出来 select e1.name, e2.name from emp e1 left join emp e2 on e1.managerid = e2.id;