Oracle连接查询
连接查询
定义:将多个表以某个或某列为条件进行连接操作而检索出关联数据的过程称为连接查询。
分类:内关联、外关联(全外关联、左外关联、右外关联)、交叉关联;内关联和左外关联是工作中最常用的两种关联方式。
交叉关联:表与表之间直接进行关联,不加筛选条件
作用:会产生笛卡尔积,即两个或多个表查询结果集的乘积。
--语法结构:SELECT 字段名 FROM 表1 CROSS JOIN 表2;
SELECT *
FROM EMP E
CROSS JOIN DEPT D;
--多表关联
SELECT *
FROM EMP E,DEPT D;
内关联:满足筛选条件的数据才显示(显示的是两个表匹配的数据)
--语法结构:SELECT 字段名 FROM 表1 [INNER] JOIN 表2 ON 筛选条件;
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
D.DEPTNO,
D.DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
--多表关联
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
D.DEPTNO,
D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO;
--在内关联后加AND与WHERE条件是没有区别
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
E.SAL,
D.DEPTNO,
D.DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
AND E.SAL > 2000;
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
E.SAL,
D.DEPTNO,
D.DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE E.SAL > 2000;
全外关联:不分主表和从表,有的数据就显示,没有的数据就用NULL来代替(两个表的数据不管有没有匹配上,都显示)
--语法结构:SELECT 字段名 FROM 表1 FULL [OUTER] JOIN 表2 ON 筛选条件;
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
D.DEPTNO,
D.DNAME
FROM EMP E
FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
左外关联:分主表和从表,主表的显示字段都会有数据,从表的显示字段如果匹配上就有数据,没有匹配上就用NULL代替
--语法结构:SELECT 字段名 FROM 主表 LEFT [OUTER] JOIN 从表 ON 筛选条件;
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
D.DEPTNO,
D.DNAME
FROM EMP E
LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
--多表关联:在左外关联中,筛选条件后面加了(+)的是从表
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
D.DEPTNO,
D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO(+);
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
D.DEPTNO,
D.DNAME
FROM DEPT D
LEFT JOIN EMP E
ON E.DEPTNO(+) = D.DEPTNO;
--注意:在左外关联后加AND条件与WHERE条件是有区别的
左外关联加AND条件,只返回符合关联条件的从表数据
SELECT E.EMPNO, E.ENAME, E.DEPTNO, E.SAL, D.DEPTNO, D.DNAME
FROM EMP E
LEFT JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO AND E.SAL > 2000);
左外关联加WHERE条件,即对查询结果集进行过滤
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
E.SAL,
D.DEPTNO,
D.DNAME
FROM EMP E
LEFT JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO)
WHERE E.SAL > 2000;
右外关联:分主表和从表,主表的显示字段都会有数据,从表的显示字段如果匹配上就有数据,没有匹配上就用null代替
--语法结构:SELECT 字段名 FROM 从表 RIGHT [OUTER] JOIN 主表 ON 筛选条件;
SELECT E.EMPNO,
E.ENAME,
E.DEPTNO,
D.DEPTNO,
D.DNAME
FROM EMP E
RIGHT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;