消除笛卡尔积,必须有关联字段;
SELECT *
FROM emp,dept
WHERE emp.deptno=dept.deptno;
都习惯与将关联字段设置为同名;
任何时候多表查询都必须存在有关联关系,没有关联关系是没有多表查询的;
强烈建议用别名;
SELECT e.*,d.dname
FROM emp e ,dept d
WHERE e.deptno=d.deptno;
案例1:要求查询出每个雇员的编号、姓名、职位、基本工资、部门名称、部门位置
SELECT e.empno,e.ename,e.job,e.sal,d.dept,d.loc
FROM emp e ,dept d
WHERE e.deptno=d.deptno;
案例2:要求查询出每个雇员的编号、姓名、职位、基本工资、工资等级
SELECT e.empno,e.ename,e.job,e.sal,s.grade
FROM emp e ,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
案例3:要求查询出每个雇员的编号、姓名、职位、基本工资、部门名称、工资等级
SELECT e.empno,e.ename,e.job,e.sal,d.dept,s.grade
FROM emp e ,dept d,salgrade s
WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal;
以上用的where字句都是使用了内连接;内连接中不满足条件的不出现;
外连接:左外连接、右外连接、全外连接;如果考虑数据不全的时候就使用外连接;
左外连接
SELECT e.empno,e.ename,e.job,e.sal,d.dept,d.loc
FROM emp e ,dept d
WHERE e.deptno=d.deptno(+);--左表不满足条件的出现了;
右外连接
SELECT e.empno,e.ename,e.job,e.sal,d.dept,d.loc
FROM emp e ,dept d
WHERE e.deptno(+)=d.deptno;--右表不满足条件的出现了;
SQL:1999语法
左外连接:SELECT * FROM emp e LEFT OUTER JOIN dept d ON (e.deptno=d.deptno);
SELECT * FROM emp e RIGHT OUTER JOIN dept d ON (e.deptno=d.deptno);
SELECT * FROM emp e FULL OUTER JOIN dept d ON (e.deptno=d.deptno);
集合查询
UNION:取消重复元素,将所有集合合并,如果要重复数据用UNION ALL
UNION ALL:
SELECT * FROM EMP
UNION ALL
SELECT * FROM EMP WHERE DEPTNO=10;
INTERSECTT:交集
MINUS:差集