17/12/5多表连接
join on 语句
select * from emp
join dept on emp.deptno = dept.deptno
1.on将连接条件和其他检索条件分割开,其它检索条件写在WHERE字句。
2.提高代码的可读性。
外连接
-右外连接:以右边的表为主,右表内容全部保留。
select emp.ename, dept.deptno
from emp right join dept on emp.deptno = dept.deptno
-左外连接同理。
-全外连接(full join): 左右两个表都为主,两表内容全部显示出来。
自身连接
列:查询所有员工的上级。
select worker.ename|'的上级是'| manager.ename
from emp worker
join emp manager on woker.mgr = manager.empno
扩展:多表连接可以在2个表或者多个表之间进行。
练习:
1.使用ON子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点。
SELECT EMP.ENAME, DEPT.DNAME, DEPT.LOC, SALGRADE.GRADE
FROM EMP
join DEPT on EMP.DEPTNO = DEPT.DEPTNO
join SALGRADE on EMP.sal BETWEEN losal AND hisal
WHERE DEPT.LOC in ('CHICAGO')
2.使用左连接,查询每个员工的姓名,经理姓名,没有经理的KING也要显示出来。
select woker.ename, manager.ename
from emp woker
left join emp manager on woker.mgr = manager.empno
3.使用右连接,查询每个员工的姓名,经理姓名,没有经理的KING也要显示出来。
同理(略)
4.显示员工SMITH的姓名,部门名称,直接上级名称。
SELECT WOKER.ename, DEPT.DNAME, manager.ename
FROM emp woker
join dept ON woker.deptno = dept.deptno
join emp manager ON woker.mgr = manager.empno
WHERE woker.ename in ('SMITH')
5.显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4.
SELECT EMP.ENAME, DEPT.DNAME, EMP.SAL, SALGRADE.GRADE
FROM EMP
join SALGRADE ON EMP.SAL BETWEEN LOSAL and HISAL
join DEPT ON DEPT.deptno = EMP.deptno
WHERE SALGRADE.GRADE > 4
6.显示员工KING和FORD管理的员工姓名及其经理姓名。
SELECT emp.ENAME, MANAGER.ENAME, woker.ename
FROM EMP
LEFT JOIN EMP manager ON MANAGER.empno = EMP.mgr
LEFT JOIN EMP woker ON woker.mgr = EMP.empno
WHERE EMP.ENAME in ('KING', 'FORD')
7.显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加工作时间比经理早。
select woker.ename, woker.hiredate, manager.ename, manager.hiredate
from emp woker
join emp manager on woker.mgr = manager.empno
where woker.hiredate < manager.hiredate