日期:2014-05-16  浏览次数:20618 次

ORACLE 表连接总结
多表连接

使用一个连接从多个表中查询数据
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 =table2.column2;
:: 在WHERE 子句中写连接条件
:: 当多个表中有相同的列名时,将表名作为列名的前缀


注:为了连接 n 个表在一起,你最少需要 n-1 个连接条件。如果表中有一个连接主键,该规则可能不适用,其中可能有多行用来唯一地标识每一行。


等值连接
注:等值连接也被称为简单连接 (simple joins) 或内连接 (inner joins)

select ..
from ...
where employees.department_id=departments.department_id;



使用表别名
SELECT e.employee_id, e.last_name, e.department_id,d.department_id, .location_id
FROM employees e , departments d
WHERE e.department_id = d.department_id;

原则
:: 表别名最多可以有 30 个字符,但短一些更好。
:: 如果在 FROM 子句中表别名被用于指定的表,那么在整个 SELECT 语句中都要使用表别名。
:: 表别名应该是有意义的。
:: 表别名只对当前的 SELECT 语句有效。



非等值连接


select ..
from ..
where e.salary BETWEEN j.lowest_sal AND j.highest_sal


注:其它条件,例如 <= 和 >= 可以被使用,但 BETWEEN 是最简单的。在使用 BETWEEN 时先指定最低值后指定最高值。

解释 ::
BETWEEN…AND…实际上被Oeacle服务器转换为一对AND 条件(a >= 最小值)and(a<=最大值) ,

IN (…) 被 Oracle 服务器转换为一组 OR条件 (a= value1 OR a = value2 OR a = value3)。

所以用 BETWEEN … AND … 、IN(…) 并没有性能上的提高;好处是逻辑上简单。



外连接

用外连接返回不直接匹配的记录
如果一个行不满足连接条件,该行将不出现在查询结果中(等值连接)


外连接语法
:: 你可以用一个外连接查看那些不满足连接条件的行
:: 外连接运算符是加号(+)
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+)=table2.column;

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+)

  table2.column (+) 是外连接符号,它可以放在 WHERE 子句的条件的任一边,但不能两边都放。(跟着没有匹配行的表中列的名字放置外连接符号)。

SELECT e.last_name, e.department_id, d.department_name
FROM employees e,departments
WHERE e.department_id(+) = d.department_id ;

LAST_NAME DEPARTMENT_ID DEPARTMENT_NAME
Whalen 10 Administration
Hartstein 20 Marketing
110 Accounting


外连接约束
:: 外连接操作符只能出现在表达式一侧—缺少信息的一侧。它从一个表中返回那些在另一个表中没有直接匹配的行。
:: 包括一个外连接的条件不能用 IN 操作符或连接到另一个用 OR 操作符的条件。


自连接




用SQL 连接表: 1999 语法

用一个连接从多个表中查询数据

SELECT table1.column, table2.column
FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
  ON(table1.column_name= table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2
  ON (table1.column_name= table2.column_name)];


table1.column 表示要从其中返回数据的表和列
CROSS JOIN 从两个表中返回笛卡尔乘积。
NATURAL JOIN 基于相同的列名连接两个表
JOIN table
USING column_name 执行一个基于列名的等值连接
JOIN table ON
table1.column_name 执行一个基于在 ON 子句中的条件的等值连接
= table2.column_name
LEFT/RIGHT/FULL OUTER



创建交叉连接
:: CROSS JOIN子句导致两个表的交叉乘积
:: 该连接和两个表之间的笛卡尔乘积是一样的

Select last_name,department_name
From employees
CROSS JOIN departments;

等效于:
SELECT last_name, department_name
FROM employees, departments;


创建自然连接
:: NATURAL JOIN子句基于两个表之间有相同名字的所有列
:: 它从两个表中选择在所有的匹配列中有相等值的行
:: 如果有相同名字的列的数据类型不同,返回一个错误

注:连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,但数据类型不同,NATURAL JOIN 语法会引起错误。

这是在两个表中唯一名字相同的列。如果存在其它的公共列,连接会全部使用他们。/././


SQL> desc departments;
名称                                                  是否为空? 类型
----------------------------------------------------- -------- -----------------
DEPARTMENT_ID                &