尚硅谷之MySQL基础

右外连接(RIGHT JOIN)

B

B-A∩B

恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

返回右表中在左表没有匹配行的记录

#查询所有部门信息以及该部门员工信息

SELECT did,dname,eid,ename

FROM t_employee RIGHT OUTER JOIN t_department

ON t_department.did = t_employee.dept_id;

#查询部门信息,仅保留没有员工的部门信息

SELECT did,dname,eid,ename

FROM t_employee RIGHT OUTER JOIN t_department

ON t_department.did = t_employee.dept_id

WHERE t_employee.dept_id IS NULL;

#“从表外键列”是NULL

#查询所有员工信息,以及员工的部门信息

SELECT eid,ename,did,dname

FROM t_department RIGHT OUTER JOIN t_employee

ON t_employee.dept_id = t_department.did ;

#查询员工信息,仅保留没有分配部门的员工

SELECT eid,ename,did,dname

FROM t_department RIGHT OUTER JOIN t_employee

ON t_employee.dept_id = t_department.did

WHERE t_employee.dept_id IS NULL;

#“从表外键列”是NULL

外连接(FULL JOIN)

mysql不支持FULL JOIN,但是可以用 left join union right join代替

 A∪B

 A∪B - A∩B

#查询所有部门信息和员工信息

SELECT did,dname,eid,ename

FROM t_department LEFT OUTER JOIN t_employee

ON t_department.did = t_employee.dept_id

UNION

SELECT did,dname,eid,ename

FROM t_department RIGHT OUTER JOIN t_employee

ON t_department.did = t_employee.dept_id;

#查询所有没有员工的部门和没有分配部门的员工

SELECT did,dname,eid,ename

FROM t_department LEFT OUTER JOIN t_employee

ON t_department.did = t_employee.dept_id

WHERE t_employee.dept_id IS NULL

UNION

SELECT did,dname,eid,ename

FROM t_employee LEFT OUTER JOIN t_department

ON t_department.did = t_employee.dept_id

WHERE t_employee.dept_id IS NULL;

自连接

当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询

#自连接

#查询员工姓名以及领导姓名,仅显示有领导的员工

SELECT emp.ename,mgr.ename

FROM t_employee AS emp, t_employee AS mgr

WHERE emp.mid = mgr.eid;

#查询员工姓名以及领导姓名,仅显示有领导的员工

SELECT emp.ename,mgr.ename

FROM t_employee AS emp INNER JOIN t_employee AS mgr

ON emp.mid = mgr.eid;

#查询所有员工姓名及其领导姓名

SELECT emp.ename,mgr.ename

FROM t_employee AS emp LEFT JOIN t_employee AS mgr

ON emp.mid = mgr.eid;