引出
完成上面的需求
其实我们只能写出
SELECT dname,ename,job
FROM emp,dept
WHERE emp.detno=dept.deptno
ORDER BY dname
因为我们要根据匹配条件筛选,这样就把那些没有人的部门其实已经筛选掉了
后半部分的显示出那些没有员工的部门做不到,40号部门就没有员工
那么怎么操作呢?-外连接可以解决
我们的dept表
简单介绍
外连接分为左外连接和右外连接,计算没有匹配也能显示左表或右表
举例说明吧
-- stu表
CREATE TABLE stu(
id INT,
`name` VARCHAR(32));
INSERT INTO stu VALUES (1,'jack'),(2,'tom'),(3,'kitty'),(4,'nono')
SELECT * FROM stu
-- exam表
CREATE TABLE exam (
id INT,
grade INT)
INSERT INTO exam VALUES (1,56),(2,76),(11,8)
SELECT * FROM exam
-- 使用左连接,显示所有人成绩,没有成绩也要显示姓名id
-- 没学外连接前实现不了
SELECT stu.id,`name`,grade
FROM stu,exam
WHERE stu.id=exam.id
-- 使用左外连接
SELECT stu.id,`name`,grade
FROM stu LEFT JOIN exam
ON stu.id=exam.id
-- 就是把两表间的 ,换成LEFT JOIN,然后WHERE换成ON
-- 使用右外连接(显示所有成绩,没有名字匹配,名字栏显示空)
SELECT stu.`id`,`name`,grade
FROM stu RIGHT JOIN exam
ON stu.id=exam.id
左连接效果
右连接效果
练习
-- 1.左外连接实现
SELECT emp.deptno,dname,job,ename
FROM dept LEFT JOIN emp
ON dept.deptno=emp.deptno
ORDER BY deptno
-- 2.右外连接实现
SELECT emp.`deptno`,dname,job,ename
FROM emp RIGHT JOIN dept
ON dept.`deptno`=emp.`deptno`
ORDER BY deptno
==易错:1.WHERE 没有换成ON 2.LEFT JOIN是左表全显示,RIGHT是右表全显 ==
其实下图这种就叫内连接,内连接还是比较多用的,按照场景使用-当然最多使用还是 FROM WHERE