92语法:
当要查询的数据来自于不同的表,需要实现 多表联查
–92语法 99语法
–内连接 :有where ,满足条件才显示,不满足不显示
–92语法 select 数据 from 表1,表2,表3…;
–笛卡尔积 对乘效果
select * from emp,dept;
–查询所有员工的信息,以及所在的部门信息
–数据: 员工信息 部门信息
–来源: emp dept
–等值连接
select empno,ename,emp.deptno,dname from emp,dept where emp.deptno = dept.deptno;
--注意:当使用同名字段时候,需要指明字段出处
select empno,ename,emp.deptno,dname from emp,dept where emp.ename = dept.dname;
–非等值连接
--查询员工信息以及每个员工的薪资等级
select empno,ename,sal,grade from emp,salgrade where sal between losal and hisal;
--2500这个薪资在几等级
select grade from salgrade where 2500 between losal and hisal;
–自连接 一张表,当多张表使用
--查询有上级的员工的员工信息,以及这个员工的上级信息
--数据: 员工信息 上级信息
--来源: 员工表emp e1 上级表 emp e2
select * from emp e1,emp e2 where e1.mgr = e2.empno;
–外连接
--左外连接|左连接 右外连接|右连接 :主表在逗号的左边叫做左连接,主表在逗号的右边叫做右连接
--主表: 主表中的数据无论是否满足连接条件都要显示
--查询所有员工信息,以及这个员工的上级信息
--员工表作为主表
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(+) and e1.deptno in(10,20) order by e1.empno desc; --左连接
–查询员工信息 e1,部门信息 d,薪资等级 s,上级信息 e2
select dname 部门名称, e1.ename 员工名称, grade 薪资等级, e2.ename 上级名称
from emp e1, dept d, salgrade s, emp e2
where e1.deptno = d.deptno
and e1.sal between losal and hisal
and e1.mgr = e2.empno;
99语法:
等值连接
--自然连接natural join 自动帮你找两个表之间的同名字段|主外键关系字段左连接 自动做等值连接
--员工的信息以及所在的部门信息
select empno,deptno from emp e natural join dept d;
--注意:如果使用同名字段,不能指明出处
–join…using(同名字段名) 指定使用哪一个同名字段作为等值连接条件
select empno,deptno from emp e join dept d using(deptno);
--注意:如果使用同名字段,不能指明出处
–非等值连接
-- A join B on 连接条件 join c on 连接条件 可以做等值连接 可以做非等值连接
select * from emp e join dept d on e.deptno = d.deptno where e.deptno=30;
--注意:如果使用同名字段,需要指明出处
--查询员工信息,薪资等级
select grade,count(empno)
from emp e
join salgrade s
on e.sal between losal and hisal
join dept d
on e.deptno = d.deptno
where e.deptno in(10,30) group by grade having grade != 1 order by grade;
--员工信息,上级信息
select * from emp e1 inner join emp e2 on e1.mgr=e2.empno;
–内连接 (inner) join
--外链接 left join左连接 right join右连接 全连接 full join 两边的表都作为主表
--主表 主表在join的左边,叫做左连接 left join 主表在join的右边,叫做左连接 right join ull join 两边的表都作为主表
select * from emp e1 left join emp e2 on e1.mgr=e2.empno;
select * from emp e1 right join emp e2 on e1.mgr=e2.empno;