数据库day04-外连接

自身连接
-- 查询每个员工    的姓名和直接上级姓名?
-- 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

你可能感兴趣的:(数据库day04-外连接)