查询所有用户的信息及所在部门信息
查询的数据: 用户信息 部门信息
来源: 用户表 emp 部门表 dept
多个表中才能拿到我们想要的数据==连表查询
92语法 99语法
笛卡尔积
- select empno,emp.deptno from emp,dept;
使用的字段,是多个表中存在的,指定字段的来源
别名
- select empno,d.deptno from emp e,dept d;
等值连接 可以是相同名字的字段,也可以是非相同名字的字段,但是要保证两个字段的类型相同
- select * from emp,dept where emp.deptno=dept.deptno;
- select * from emp,dept where emp.ename=dept.dname; --没有满足条件的数据
查询30部门 用户的信息及所在部门信息
- select * from emp,dept where emp.deptno=dept.deptno and
emp.deptno=30;
非等值连接
薪资2500的等级信息
- select * from salgrade where 2500 between losal and hisal;
查询所有员工的信息及工资等级信息
- select * from emp e,salgrade s where e.sal between s.losal and
s.hisal;
查询用户的用户信息,部门信息及薪资等级信息
- select * from emp e, dept d, salgrade s where e.deptno = d.deptno
and sal between s.losal and s.hisal;
查询所有有上级的员工的信息及上级信息 假设e1是员工表 e2是上级表
select * from emp e1,emp e2 where e1.mgr=e2.empno;
查询所有员工的信息及上级信息 假设e1是员工表 e2是上级表
需求:想要期中的某张表中所有的数据全部展示,无论是否满足等值连接条件 --外链接
外链接:确认主表(主表中的内容会全部展示) +对面的表为主表,+所在的表为从表
左外连接 主表在,的左边叫做左连接
右连接 主表在,的右边叫做右连接
自连接 特殊的连接,自己连接自己 也可以自外链接
- select * from emp e2,emp e1 where e1.mgr=e2.empno(+); --右连接
- select * from emp e1,emp e2 where e1.mgr=e2.empno(+); --左连接
- select * from emp e1,emp e2 where e1.mgr=e2.empno; --自连接
找出所有有员工的部门名称以及员工数
- select deptno,count(1) from emp group by deptno; select dname, c
from dept d, (select deptno, count(1) c from emp group by deptno) e
where d.deptno = e.deptno;
找出 所有部门的员工数 及部门名称
- select dname, nvl(c,0) from dept d, (select deptno, count(1) c from
emp group by deptno) e where d.deptno = e.deptno(+); --左链接
99语法
实现笛卡尔积效果
92写法
- select * from emp ,dept;
99写法 交叉连接 cross join
- select * from emp cross join dept;
等值连接
自然连接 natural join 内部自动查找同名字段|主外键关系 自动实现等值连
不能指定限定词
- select deptno from emp natural join dept;
using 连接 指定字段等值连接
- select * from emp join dept using(deptno);
非等值连接|等值连接 join …on… (Inner join内连接)
- select * from emp join dept on emp.deptno = dept.deptno;
查询工资答应1500的用户的信息和薪资等级
- select * from emp e join salgrade s on e.sal between s.losal and
s.hisal where sal>1500;
查询10和30部门的员工的名称,部门名称,薪资,薪资等级,上级名称
select e.ename, d.dname, e.deptno, e.sal, s.grade, m.ename
from emp e
join emp m
on e.mgr = m.empno
join salgrade s
on e.sal between s.losal and s.hisal
join dept d
on e.deptno = d.deptno
where deptno in (10, 30);
外连接
左外连接 left join … on…
- select * from emp e1 left join emp e2 on e1.mgr = e2.empno;
右外连接 right join … on…
- select * from emp e2 right join emp e1 on e1.mgr = e2.empno;