99标准的多表连接查询 (内连接查询) 两个表的地位是相等的,查询的是两个表中“等值”列
语法: select ...from 表名1 [inner] join 表名2 on 连接条件 [where]
select empno,ename,job,sal,dname from emp e ,dept d
where e.deptno=d.deptno and dname='sales';
-- e.deptno=d.deptno 称为连接条件
-- dname='sales' 限定条件(筛选条件) 99年的时候 XXX 这样不好,将连条件与限定条件放在一起了,不容易区分
--所以99标准中,将连接条件与限定条件进行了区分,连接条件使用on,限定条件使用where
select empno,ename,job,sal,dname from emp e
inner join dept d on e.deptno=d.deptno
where dname='sales';
--三表连接
select stuname,clazzname,schoolname from student s
inner join clazz c on s.clazzid=c.clazzno
inner join school sc on c.place=sc.schoolid
where clazzname like '%java%'; --模糊查询 %代表的是任意个字符 _代表的是一个字符
外连接查询 :查询中的两个表有主次关系,可以查询一个表的所有数据
--查询所有员工的信息,包含没有部门的员工
--外连接
--查询的是所有的员工的信息,包含没有部门的员工
select empno,ename,job ,sal ,dname from emp e LEFT JOIN dept d on e.deptno=d.deptno;
select empno,ename,job ,sal ,dname from dept d right join emp e on e.deptno=d.deptno;
--查询所有部门的信息,包含没有员工的部门
select empno,ename,job ,sal,dname,loc from dept d left join emp e on e.deptno=d.deptno;
select empno,ename,job ,sal,dname,loc from emp e right join dept d on e.deptno=d.deptno;
--查询员工表的所有的信息和部门表的所有信息,包含没有部门的员工和没有员工的部门
(mysql不支持,oracle支持)
select empno,ename,job ,dname ,loc from emp e full outer join dept d
on e.deptno=d.deptno;
自连接查询 :一张表当作两张表来使用
--查询入职时间早于领导 的员工信息 92
select e.empno,e.ename,e.hiredate as 员工入职时间,m.ename as 领导姓名 ,m.hiredate as 领导的入职时间
from emp e ,emp m where e.mgr=m.empno and e.hiredate <m.hiredate;
-- 99
select e.empno,e.ename,e.hiredate as 员工入职时间,m.ename as 领导姓名 ,m.hiredate as 领导的入职时间
from emp e inner join emp m on e.mgr=m.empno
where e.hiredate <m.hiredate;