在 MySQL 中,内连接和外连接是用于组合来自两个或多个表的数据的常见方法。内连接只返回满足连接条件的记录,而外连接则返回一个表中的所有记录,并包括另一个表中匹配的记录。
外连接包括左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL OUTER JOIN)。在 MySQL 中没有直接的 FULL OUTER JOIN 支持,但可以通过联合 LEFT JOIN 和 RIGHT JOIN 来实现。
内连接
内连接返回两个表中匹配的记录。只有满足连接条件的记录才会出现在结果集中。 语法:
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
使用案例
经典的oracle 9i测试表(雇员信息表)
员工表(emp)中包含如下字段:
雇员编号(empno)。
- 雇员姓名(ename)。
- 雇员职位(job)。
- 雇员领导编号(mgr)。
- 雇佣时间(hiredate)。
- 工资月薪(sal)。
- 奖金(comm)。
- 部门编号(deptno)。
部门表(dept)中包含如下字段:
- 部门编号(deptno)。
- 部门名称(dname)。
- 部门所在地点(loc)。
- 显示SMITH的名字和部门名称
select ename,dname
from emp
inner join dept
on emp.deptno=dept.deptno and ename ='SMITH';
不使用内连接也可以做到。
select ename,dname
from emp, dept
where emp.deptno=dept.deptno and ename='SMITH';
外连接
外连接返回一个表中的所有记录,并包括另一个表中匹配的记录。
外连接分为左外连接和右外连接
左外连接
左外连接返回左表中的所有记录,以及右表中满足连接条件的记录。如果右表中没有匹配的记录,则结果集中右表的列为空值。
语法:
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
使用案例
- 返回所有雇员的信息以及他们所属部门的信息。如果雇员没有分配部门,则部门信息将显示为 NULL。
select emp.empno,emp.ename,emp.job,emp.sal,dept.dname,dept.loc
from emp
left join dept
on emp.deptno=dept.deptno;
右外连接(RIGHT JOIN)
右外连接返回右表中的所有记录,以及左表中满足连接条件的记录。如果左表中没有匹配的记录,则结果集中左表的列为空值。
语法:
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
使用案例
- 右外连接将返回
dept表中的所有记录,并包括emp表中与之匹配的记录。如果某个部门没有任何雇员(即emp表中没有匹配的记录),则雇员相关的列将显示为 NULL。
select emp.empno,emp.ename,emp.job,emp.sal,dept.dname,dept.loc
from emp
right join dept
on emp.deptno=dept.deptno;