多表查询
如果查询的数据来源不只一张表,叫做多表查询,多表查询又叫做连接查询,多表查询会产生笛卡尔积,数据量大的时候尽量避免使用。
笛卡尔积指的是两个集合之间的直积,两张表的笛卡尔积结果集的数量等于两张表结果集的乘积数量,会产生不存在的结果,因此要使用过滤条件去除笛卡尔积。
多表查询格式
SELECT *
FROM 数据来源,数据来源
WHERE 过滤条件
ORDER BY 排序字段 ASC|DESC;
消除两张数据表的笛卡尔积
SELECT * FROM emp,dept WHERE emp.dpetno=dept.deptno;
以上的方式只是在显示时通过过滤手段消除了笛卡尔积,但查询过程仍然查询了56条数据,多表查询的性能消耗很大。
连接查询
连接查询就是多张数据表连接查询数据,之前的多表查询就是连接查询的一种,连接查询又分为内连接查询和外连接查询:
内连接查询:只有满足条件的数据才会被显示
外连接查询:可以控制不满足条件的数据是否显示
内连接查询
内连接查询的两种实现方式
1.直接在FROM子句跟上多张数据表,在WHERE子句消除笛卡尔积
查询雇员的编号,姓名,岗位,薪资,部门名,部门位置,部门编号
SELECT empno,ename,job,sal,dname,loc,d.dname
FROM emp,dept d WHERE emp.dept=d.dept;
2.使用INNER JOIN 进行表连接,在ON子句后消除笛卡尔积
查询出雇员的编号、姓名、职位、部门名称、部门位置、薪资等级
SELECT empno,ename,job,dname,loc,grade
FROM emp INNER JOIN dept ON emp.deptno=dept.deptno
INNER JOIN salgrade ON sal BETWEEN losal AND hisal;
自然连接查询
自然连接自动对两个表重名列进行内连接,使用自然连接要注意两个表的重名列不能超过1个
SELECT * FROM emp NATURAL JOIN dept;
外连接查询
外连接查询又分为左外连接查询、右外连接查询、全外连接查询。
左外连接查询:左表不满足条件的数据显示
右外连接查询:右表不满足条件的数据显示
全外连接查询:左右两表不满足条件的数据都显示
先在emp表添加一条数据
INSERT INTO emp(empno,ename,job,sal) VALUES(1001,'BILL','清洁工',3000);
左外连接查询
SELECT * FROM emp LEFT OUTER JOIN dept ON emp.deptno=dept.deptno;
右外连接查询
SELECT * FROM emp RIGHT OUTER JOIN dept ON emp.deptno=dept.deptno;
全外连接查询
SELECT * FROM emp FULL OUTER JOIN dept ON emp.deptno=dept.deptno;
Oracle特有外连接查询实现方式
可用(+)实现外连接查询
左外连接在右边添加(+),右外连接在左表添加(+)
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno(+);
SELECT * FROM emp,dept WHERE emp.deptno(+)=dept.deptno;