自身连接
-- 查询每个员工 的姓名和直接上级姓名?
-- SELECT e.emp_name,m.emp_name
-- from emp e,emp m
-- where e.mgr = m.emp_no
外连接
按照某一张表作为主表(最终数据都会保留)
-- outer join
-- 左外连接 left join 选定一张左边的表为主表,主表信息
-- 需要全部显示
-- 右外连接 right join
问题:
-- 查询所有的员工姓名及其管理者的姓名,
-- 包括没有管理者的员工信息
-- 确定主表 员工表
-- SELECT e.emp_name,m.emp_name
-- from emp m right JOIN emp e
-- on e.mgr = m.emp_no
-- 查询所有雇员姓名,部门编号,部门名称,
-- 包括没有部门的员工也要显示出来
SELECT e.emp_name,e.deptno,d.dept_name
from emp e LEFT JOIN dept d
on d.deptno = e.DEPTNO;
练习4(6章 多表连接查询)
1.创建一个员工表和部门表的交叉连接。
use mydatabase;
SELECT * from emp
CROSS join dept;
2.使用自然连接,natural join
显示入职日期在80年5月1日之后
的员工姓名,部门名称,入职日期
SELECT emp_name,dept_name,hiredate
from emp NATURAL join dept
-- emp.deptno = dept.deptno
where hiredate > "1980-5-1"
3.使用USING子句,显示工作在CHICAGO
的员工姓名,部门名称,工作地点
SELECT emp_name,dept_name,dept_loc
from emp join dept USING(deptno) -- 条件
where dept_loc = "CHICAGO"
USING(deptno) <---> emp.deptno = dept.deptno
4.使用ON子句,显示工作在CHICAGO
的员工姓名,部门名称,工作地点,薪资等级
SELECT emp_name,dept_name,dept_loc,grade
from emp join dept join salgrade
-- 条件
on emp.deptno = dept.deptno
and emp.sal BETWEEN losal and hisal
and dept_loc = "CHICAGO"
SELECT emp_name,dept_name,dept_loc,grade
from emp join dept
-- 条件
on emp.deptno = dept.deptno
join salgrade
on emp.sal BETWEEN losal and hisal
where dept_loc = "CHICAGO"
5.使用左连接,查询每个员工
的姓名,经理姓名,没有经理的King也要显示出来。
SELECT e.emp_name ename,m.emp_name mname
from emp e left JOIN emp m
on m.emp_no = e.mgr
6.使用右连接,查询每个员工的姓名,经理姓名,
没有经理的King也要显示出来。
SELECT e.emp_name ename,m.emp_name mname
from emp m right JOIN emp e
on m.emp_no = e.mgr
课后作业(6章 多表连接查询)
1.显示员工SMITH的姓名,部门名称,直接上级名称
SELECT e.emp_name,d.dept_name,m.emp_name
from emp e,emp m,dept d
where
e.emp_name = "SMITH"
and
e.mgr = m.emp_no
and
e.DEPTNO = d.deptno
2.显示员工姓名,部门名称,工资,工资级别,
要求工资级别大于4级。
select emp_name,dept_name,sal,grade
from emp JOIN dept
on emp.dept_no = dept.dept_no
join salgrade
ON emp.sal BETWEEN LOSAL and HISAL
where GRADE > 4;
3.显示员工KING和FORD管理的员工姓名及其经理姓名。
SELECT w.ENAME,m1.ENAME,m2.ENAME
FROM emp w LEFT JOIN emp m1
ON w.MGR = m1.EMPNO
LEFT JOIN emp m2
ON m1.MGR = m2.EMPNO
WHERE m1.ENAME in ("KING","FORD");
4.显示员工姓名,
参加工作时间,经理名,
参加工作时间,要求参加时间比经理早
SELECT e.emp_name empname,e.hiredate date1,
d.emp_name boss,d.hiredate date2
from emp e,emp d
where e.HIREDATE < d.hiredate
and e.mgr = d.emp_no