表连接
当想要查询的数据,来自于不同的表中,需要使用表连接查询
92语法
--92语法: select 数据 from 表,表,数据来源...
--连接条件: 条件92语法中就直接写在where中
--注意: 如果在表连接时候,出现了多表中相同的字段的使用,一定要指明这个同名字段的出处
--笛卡尔积
select * from emp,dept;
--等值连接
--查询每个员工的员工信息和所在部门的信息
--数据: 员工名称.部门民称
--来源: 员工表 部门表
--条件: 这个员工.以及这个员工所在的部门
select empno, ename, dept.deptno, dname from emp, dept where emp.deptno = dept.deptno;
--查询20部门的员工信息和部门信息
select empno, ename, d.deptno, dname from emp e, dept d where e.deptno = d.deptno and e.deptno=20;
--非等值连接
--查询员工的信息,以及薪资等级信息
select * from emp e, salgrade s where sal between losal and hisal and deptno in(10, 30);
--查询员工的信息,以及所在的部门信息,以及工资等级
select * from emp e, dept d, salgrade s where e.deptno = d.deptno and e.sal between losal and hisal;
--查询所有有上级的员工,员工的信息以及经理人信息
--员工的经理人标号是经理人表中的员工编号 e1员工表 e2经理人表
select * from emp e1, emp e2 where e1.mgr = e2.empno;
--外链接
--左外链接 右外链接
--主表: 主表中的数据无论是否满足条件都会显示
--表示谁是主表: 在表连接的条件上,主表对面的添加一个(+)
--emp e1, emp e主表在左边就是左连接,主表在逗号就叫右连接
--查询所有的员工(有没有上级都要),员工的信息以及经理人信息
--e1员工表为主表
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 e2, emp e1 where e1.mgr(+) = e2.empno;
--内连接和外链接
--内连接:等值,非等值
--外链接:主表
99语法
--笛卡尔积 cross join
select * from emp cross join dept;
--查询30部门的员工信息以及部门信息
--先连接后过滤
select * from emp, dept where emp.deptno=dept.deptno and emp.deptno=30;
--30部门的员工信息
select * from emp where deptno=30;
--30部门的部门信息
select * from dept where deptno=30;
--先过滤后连接
select *
from (select * from emp where deptno = 30)
cross join (select * from dept where deptno = 30);
--等值连接
--自然连接 natural join
--自动为我们把同名字段|主外键关系字段做等值连接
--同名字段不能使用限定词
select ename,deptno,dname from emp natural join dept;
--join..using(制定等值连接字段名)
--同名字段不能使用限定词
select ename,deptno,dname from emp inner join dept using(deptno);
--等值|非等值连接
--表1 join 表2 on 连接条件
select e.deptno from emp e inner join dept d on e.deptno=d.deptno;
--30部门薪资>1500的员工信息,部门信息,薪资等级信息
select *
from emp
join dept
on emp.deptno = dept.deptno
join salgrade
on emp.sal between losal and hisal
where emp.deptno = 30
and sal > 1500;
--查询所有存在上级的员工的信息,上级经理人信息
select * from emp e1 join emp e2 on e1.mgr = e2.empno;
--内连接 (inner) join
--外连接
--左连接 left join .. on
--有链接 right join .. on
--查询所有员工的信息,上级经理人信息
select * from emp e1 ,emp e2 where e1.mgr = e2.empno(+);
select * from emp e1 right join emp e2 on e1.mgr = e2.empno;
--全连接 两张表都作为主表存在
select * from emp e1 full join emp e2 on e1.mgr = e2.empno;