Oracle第五章笔记
发布时间
阅读量:
阅读量
第五章 多表连接
- 什么是连接?
- 通过一定的条件, 是表发生关联
使用一条sql语句, 查询员工姓名, 部门名称, 共工作地
select ename, dname, loc
from emp, dept
where emp.deptno = dept.deptno;n
2. 可以起别名, 标识关键字, 使用别名
--注意: 为表起别名时, 不能使用as 关键字
select ename, dname, loc
from emp e, dept d
where e.deptno=d.deptno;
3. 笛卡尔积 在进行表连接时, 没有指定连接条件
-- 如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,
--其中往往包含了很多错误的数据,所以这种查询方式并不常用
select * from emp, dept;
代码解释
内连接
内连接查询操作列出与连接条件匹配的数据行,
结果集中不包括一个表与另一个表不匹配的行。
代码解释
1. 等值连接
查询10号部门的员工姓名, 部门名称, 工作地点
select e.ename, d.dname, d.loc
from emp e, dept d
where e.deptno = d.deptno and e.deptno = 10;
1.写一个查询, 显示所有员工姓名, 部门编号, 部门名称
select e.ename, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno;
2.写一个查询, 显示所有工作地点在CHICAGO并且奖金不为空的员工姓名, 工作地点, 奖金
select e.ename, d.loc, e.comm
from emp e, dept d
where e.deptno = d.deptno
and d.loc = 'CHICAGO'
and e.comm is not null;
3.写一个查询, 显示所有姓名中含A字符的员工工作姓名,工作地点
1).select e.ename, d.loc
from emp e, dept d
where e.deptno = d.deptno
and e.ename like '%A%';
2).select e.ename, d.loc
from emp e, dept d
where e.deptno = d.deptno
and instr(e.ename, 'A') > 0;
代码解释
2. 非等值连接
查询所有员工的员工姓名, 工资, 和工资等级
select e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal >= s. losal and e.sal <= s.hisal;
2.查询每个员工编号, 姓名, 工资, 工资等级, 所在工作城市, 按照工资等级进行升序排序
select e.empno, e.ename, e.sal, s.grade, d.loc
from emp e, salgrade s, dept d
where e.sal >= s.losal and e.sal <= s.hisal and e.deptno = d.deptno
order by s.grade;
代码解释
自身连接 (也叫自连接)
查询所有员工的编号, 姓名, 上级领导的编号, 上级领导的姓名
select e.empno, e.ename,e. mgr,m.ename mgrname
from emp e, emp m
where e.mgr = m.empno;
2.查询所有工作在new york和chicago 的员工姓名, 员工编号, 以及他们的经理姓名, 经理编号, 添加没有经理的员工King, 并按照员工编号排序。
select e.empno, e.ename, e.mgr, m.ename
from emp e, emp m, dept ds
where e.mgr = m.empno(+)
and e.deptno = d.deptno
and (d.loc = 'NEW YORK' or loc = 'CHICAGO')
order by e.empno
代码解释
外连接(两种实现方式)
第一种(+)
-- 左外连接和右外连接不能同时使用
-- 注意: 该种连接方式, 只适用oracle数据库, 不适用其他关系型数据库。
-- 确定数据(没有通过连接条件匹配上的数据) 来源于哪张表, 那么, 这张表作为主表
-- 在连接条件中, 在主表的对端添加(+)
代码解释
查询员工姓名, 部门名称, 部门编号 , 没有员工的部门也要查询出来
select e.ename, d.dname, deptno
from emp e, dept d
where e.deptno (+)= d.deptno
order by d. deptno;
2.查询所有员工的姓名, 部门名称, 部门编号, 要求没有分配部门的员工也要查询
select e.ename, d.dname, d.deptno
from emp e, dept d
where e.deptno = d.deptno(+);
代码解释
第二种自然连接(join)
-- using 子句
select * from emp e join dept d using(deptno)
-- join on
1. 查询所有员工的姓名, 部门名称, 部门编号,
要求没有分配部门的员工也要查询(左外连接)
select e.ename, d.dname, d.deptno
from emp e left join dept d on e.deptno=d.deptno
2. 查询所有工作在new york和chicago 的员工姓名, 员工编号,
以及他们的经理姓名, 经理编号, 添加没有经理的员工King, 并按照员工编号排序。
select e.ename,e.empno, e.mgr, m.ename
from emp e left join emp m on e.mgr = m.empno
join dept d on e.deptno = d.deptno
where d.loc = 'NEW YORK' or d.loc = 'CHIGAGO'
order by e.empno
传统语法:
select e.ename, d.loc, e.empno,e.mgr, m.name
from emp e, emp m, deptno
where m.empno(+) = e.mgr and e.deptno = d.deptno
and (d.loc = 'CHICAGO' or d.loc = 'NEW YORK')
order by e.empno;
--两种连接语法的区别:
--传统语法中,连接条件和过滤条件都定义在了where子句中, 这样会造成where子句混乱。
--sql99语法,连接条件定义在了join on子句中, 更加清晰。
3.查询所有员工编号, 姓名, 部门名称,包括没有部门的员工也要显示出来
select e.ename, d.dname, d.deptno
from emp e full join dept d on e.deptno = d.deptno
代码解释
课后作业
--5.1 显示员工SMITH的姓名, 部门名称, 直接上级名称
select e.ename, d.dname, m.ename
from emp e join dept d on e.deptno=d.deptno join emp m on e.mgr=m.empno
where e.ename='SMITH'
--5.2 显示员工姓名,部门名称,工资, 工资级别, 要求工资级别大于4级
select e.ename, d.dname, e.sal, s.grade
from emp e join dept d on e.deptno=d.deptno
join salgrade s on e.sal>=s.losal and e.sal<=s.hisal
where s.grade > 4;
--5.3 显示员工KING 和 FORD管理的员工姓名以及其经理名称
select e.ename empname, m.ename mgrname
from emp e join emp m on e.mgr = m.empno
where m.ename in ('KING', 'FORD')
--5.4 显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早
select e.ename, e.hiredate,m.ename, m.hiredate
from emp e join emp m on e.mgr = m.empno
where e.hiredate < m.hiredate
代码解释
全部评论 (0)
还没有任何评论哟~
