关联查询
从多张表中查询对应记录的信息
关联查询的重点在于这些表中的记录的对应关系,这个关系也称为连接条件
查看每个员工的名字以及其所在部门的名字
SELECT ename dname
FROM emp,dept
WHERE emp.deptno=dept.deptno;
使用别名
当两张表有同名字段时,SELECT子句中需明确指定该字段来自那张表。在关联查询中,表名也可以添加别名,这样可以简化SELECT语句的复杂度。
SELECT e.ename , d.dname,e.deptno
FROM emp e,dept d
WHERE e.deptno=d.deptno;
关联查询要添加连接条件,否则会产生笛卡尔集
笛卡尔集通常是一个无意义的结果集,它的记录数是所有参与查询的表的记录数乘积的结果。
要避免出现,数据量大时极易出现内存溢出等现象。
n张表关联查询要有至少n-1个连接条件。
查看在NEW YORK工作的员工
连接条件与过滤条件同时满足
SELECT e.ename,d.deptno
FROM emp e dept d
WHERE e.deptno=d.deptno
AND d.loc='NEW YORK';
查看工资高于3000的员工的名字,工资,部门名和所在地
SELECT e.name,e.sal,d.dname,d.loc
FROM emp e ,dept d
WHERE e.deptno=d.deptno
AND e.sal>3000;
内连接
内连接也是用来完成关联查询的
查看SALES部门的员工名字以及部门的名字
SELECT e.ename,d.dname
FROM emp e JOIN dept d
ON e.deptno=d.deptno
WHERE d.dname='SALES';
不满足连接条件的记录是不会在关联查询中查询出来的。
外连接
外连接除了会将满足条件的记录查询出来以外,还会将不满足条件的记录也查询出来。
外连接分为:
左外连接:
以JOIN左侧表作为驱动表(所有数据都被查询出来),那么当该表中的某条记录满足外连接条件时来自右侧表中的字段全部填NULL.
SELECT e.ename,d.dname
FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno;
等同于
SELECT e.ename,d.dname
FROM emp e JOIN dept d
ON e.deptno=d.deptno(+);
右外连接:
以JOIN右侧表作为驱动表(所有数据都被查询出来),那么当该表中的某条记录满足外连接条件时来自右侧表中的字段全部填NULL.
SELECT e.ename,d.dname
FROM emp e
RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;
等同于
SELECT e.ename,d.dname
FROM emp e JOIN dept d
ON e.deptno(+)=d.deptno;
全外连接:哪边不足哪边添NULL
SELECT e.ename,d.dname
FROM emp e
FULL OUTER JOIN dept d
ON e.deptno=d.deptno;
自连接
即当前表的一条记录可以对象当前表自己的多条记录。
自连接是为了解决同类型数据但又存在上下级关系的树状结构数据时使用
查看每个员工以及其领导的名字
SELECT e.ename,m.ename
FROM emp e,emp m
WHERE e.mgr=m.empno;
查看SMITH的上司在哪个城市工作?
SELECT e.ename,m.ename,m.deptno,d.loc
FROM emp e,emp m,dept d
WHERE e.mgr=m.empno
AND m.deptno=d.deptno
AND e.ename='SMITH';
使用JOIN
SELECT e.ename,m.ename,m.deptno,d.loc
FROM emp e JOIN emp m
ON e.mgr=m.empno
JOIN dept d
ON m.deptno=d.deptno
WHERE e.ename='SMITH';