4.2.2 等值连接
在笛卡尔积的基础上取条件列相同的值
查询员工信息和部门信息
查询员工姓名,部门名称
--查询每一个员工的信息以及所在部门的信息
--查询的数据:员工信息,部门信息
--数据来源:emp,dept
--链接条件:emp.deptno=dept.deptno
select * from emp e,dept d where e.deptno=d.deptno;
--查询出每一个有员工存在的部门的信息和部门的人数
--查询数据:部门信息,对应的部门的人数
--数据来源:dept,emp 经过计算
--链接条件:dept.deptno=人数对应的.deptno
--查询出有员工的部门的员工人数
select count(*),deptno from emp group by deptno;
select * from dept d, (select count(*),deptno from emp group by deptno) c where d.deptno=c.deptno;
4.2.3非等值连接
!=,>,<,<>,between and
查询员工姓名,工资及等级
--查询数据:ename,sal,hiredate,grade
--数据来源:emp,salgrade
--链接条件:emp.sal between losal and hisal
--查询员工表
select * from emp;
select * from salgrade;
select ename,sal,hiredate, grade
from emp e,salgrade s
where e.sal between losal and hisal;
4.2.4外连接
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
外连接可以是左向外连接,右向外连接或完整外部连接。
左向外连接的结果集包括LEFT OUTER 子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表均为空值。
右向外连接是左向外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
看‘+’,带‘+’的表为从表,对立面的表为主表。
找出所有员工的姓名以及他上级的名称
找出所有上级的名称以及其手下员工的名称
找出所有部门的员工数及部门名称
找出所有员工的部门名称及员工数
--查询每一个部门的信息和部门人数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(这是一个内连接) 注意:这个部门里面没有员工的时候不显示,
select * from dept;
select count(*),deptno from emp group by deptno;
select * from dept d,( select count(*),deptno from emp group by deptno;
)c where d.deptno=c.deptno;
~~~~~~~~~~~~~~~~~~·~~~~~~~~~~
(这是一个外连接)
注意:这个部门里面没有员工的时候是会占位显示为null
不用区分哪个是左连接还是哪个是右连接只需要知道主表既可
--外连接 主表 (只要在主表中出现的记录,就必须出现在结果中)
注:不是主表的后面有’(+)’ 代表只是主表的附属品
--查看每一个部门的信息,对应的员工数
--查询的数据:部门信息,部门人数
--数据来源:dept d,(select count(*),deptno from emp group by deptno)c
--连接条件 d.deptno=c.deptno(+)
select *
from dept d,( select count(*),deptno from emp group by deptno)c
where d.deptno =c.deptno(+);
处理为null的时候 ,当为null 显示为0
select d.deptno,dname, loc ,nvl(cc,0)from dept d,
(select count(*),deptno from emp group by deptno)c
where d.deptno=c.deptno(+);
--列出每一个有上级的员工的信息和上级信息
--列出所有的员工信息以及其上级的信息
--查询数据:员工信息,上级的信息
--数据来源:emp e,emp m
--连接条件:e.mgr=m.empno(+)
select * from emp e,emp m where e.mgr =m.empno(+);
4.2.5 自连接
特殊的等值连接 (来自于同一张表)
找出存在上级的员工姓名
--查询出每一个员工(有上级存在的员工)自己的信息,以及上级的信息
--查询的数据:员工信息,上级信息
--数据来源:emp e, emp m
--连接条件: e.mgr=m.empno
select * from emp e,emp m where e.mgr =m.empno;