在Oracle数据库中,连接查询分为交叉连接、内连接、外链接3种类型。其中,交叉连接结果是所有其他连接结果的超集,而外连接结果又是内连接结果的超集。
- 交叉连接
交叉连接又称为笛卡尔积连接,是两个或多个 表之间的无条件连接。一个表中所有记录分别与其他表中所有记录进行记录。如果进行连接的表分别有n1,n2,n3...条记录,那么交叉连接的结果集中将有n1 x n2 x n3 x...条记录。例如,emp表中有14条记录,dept表中有4条记录,那么两个交叉连接后有56条记录,语句为
SQL> SELECT empno,ename,sal,dname,loc FROM emp,dept;
内连接
内连接是根据指定的连接条件进行连接查询,只有满足连接条件的数据才会出现在结果集中。
当执行两个表内连接查询时,首先在第一个表中查找到第一条记录,然后从头开始扫描第二个表,逐一查找满足连接条件的记录,找到后将其与第一个表中的第一个表中的第一条拼接形成结果集中的一个记录。当第二个表被扫描一遍后,再从第一个表中查询第二个记录,然后再从头扫描第二个表,逐一查找满足连接条件的记录,找到后将其与第一个表中的第二个记录拼形成结果集中的一个记录。重复执行,知道第一个表中的记录全部记录都处理完毕为止。
在Oracle数据库中,内连接的表示方式有两种。
- 标准SQL语句的连接方式
SELECT table1.column,table2.column[,...]
FROM table1 [INNER] JOIN table2 [JOIN] ON condition;
- Oracle 扩展的连接方式
SELECT table1.column,table2.column[,...]
FROM table1,table2[,...] WHERE condition;
根据连接条件不同,内连接又可以分为相等内连接、不相等内连接两类。如果是在同一个表或视图中进行连接查询,则称为自身连接。
(1)相等连接
相等连接是指使用等号(“=”)指定连接条件的连接查询。进行比较的不同表中列的名称可以不同,但类型必须是匹配的。如果连接的表中有相同名称的列,则需要在列名前加表名,以区分是哪个表中的列。例如,查询10号部门员工的员工号、员工名、工资、部门号和部门名,语句为
SQL>SELECT empno,ename,sal,emp.deptno,dname FROM emp JOIN dept
ON emp.deptno=10 AND emp.deptno=dept.deptno;
(2)不相等连接
如果连接条件中的运算符不是等号而是其他关系运算符,则称为不相等连接。例如,查询10号部门员工的工资等级,语句为
SQL> SELECT empno,ename,sal,grade FROM emp JOIN salgrade
ON sal>losal AND sal<hisal AND deptno=10;
或
SQL>SELECT empno,ename,sal,grade FROM emp,salgrade
WHERE sal>losal AND sal<hisal AND deptno=10;
(3)自身连接
自身连接是指在同一个表或视图中进行连接,相当于同一个表作为两个或多个表使用。例如,查询所有员工的员工号、员工名和该员工领导的员工名、员工号,语句为
SQL>SELECT work.empno,work.ename,manager.empno,manager.ename
FROM emp work JOIN emp manager ON work.mgr=manager.empno;
或
SQL>SELECT work.empno,work,ename,manager.empno,manager.ename
FROM emp work,emp manager WHERE work.mgr=manager.empno;