SQL:1999连接
SQL:1999连接在语法上和传统的ORACLE连接有着很大的不同。SQL:1999连接的类型在FROM语句中指明。ORACLE 9I支持的SQL:1999连接包括:
l CROSS连接
l NATURAL连接
l OUTER连接
l LEFT OUTER连接
l RIGHT OUTER连接
l FULL OUTER连接
以下的几个小节将详细介绍这些新的连接方式。
2.3.1.1 CROSS连接
CROSS连接是一种对两个表的交叉乘积。是对两个表的卡笛尔乘积。下面的例子:
SELECT last_name, department_name
FROM employees
CROSS JOIN departments;
这个语句等同于:
SELECT last_name, department_name
FROM employees, departments;
2.2.1.2 NATURAL连接
NATURAL连接的条件是两个表中名称相同的字段都有相同的值。如果两个表中相同名称的字段的类不同,那么会发生错误。如果有select *,那么在结果集中,相同的字段只出现一次。
在NATURAL连接中,选取的字段前面不需要用别名限定。比如:
SELECT employee_id, last_name, department_id
FROM employees
NATURAL JOIN departments;
等同于下面的语句:
SELECT employee_id, last_name, departments.department_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;
如果并不是所有的名称相同的字段都需要进行’=’连接,那么就不能使用NATURAL连接,而可以使用USING语句,比如
SELECT employee_id, last_name, job_history.department_id
FROM employees
JOIN job_history
USING (employee_id);
这个语句等同于:
SELECT employees.employee_id, last_name, job_history.department_id
FROM employees, job_history
WHERE employees.employee_id=job_history.employee_id;
要注意的是NATURAL和USING是不兼容的,不能同时使用。如果连接字段的字段名不同,那么可以使用ON语句来代替USING,比如:
SELECT employees.employee_id, last_name, job_history.department_id
FROM employees
JOIN job_history
ON (employees.employee_id=job_history.employee_id);
2.2.1.3 OUTER JOIN(外连接)
两个表连接的时候,只返回符合条件的记录的连接方式称为内连接(INNER JOIN),档连接的时候返回内连接结果和不符合条件的部分记录称为外连接,外连接分为左连接和右连接和全连接。返回左面表的不符合条件的记录称为左连接(LEFT OUTER JOIN),反之称为右连接(RIGHT OUTER JOIN),返回两个表的不符合条件的记录的连接称为全连接(FULL OUT JOIN)。在9i之前,也支持外连接,可以使用’(+)’来指明外连接。
1、左外连接LEFT OUTER JOIN
以下是一个左外连接的例子:
SELECT employee_id, department_name
FROM departments d
LEFT OUTER JOIN employees e
ON (e.department_id= d.department_id);
这个语句等同于:
SELECT employee_id, department_name
FROM departments d, employees e
WHERE e.department_id(+) = d.department_id;
2、右外连接RIGHT OUTER JOIN
以下是一个右外连接的例子:
SELECT cust_last_name, order_id,order_date
FROM orders o
RIGHT OUTER JOIN customers c
ON (o.customer_id = c.customer_id);
该语句等同于:
SELECT cust_last_name, order_id, order_date
FROM orders o, customers c
WHERE c.customer_id = o.customer_id(+);
3、全外连接FULL OUTER JOIN
这种连接方式是以前版本的ORACLE所不支持的。 以下的例子:
SELECT l.city, c.country_name
FROM locations l
FULL OUTER JOIN countries c
ON (l.country_id = c.country_id);
等同于:
SELECT l.city, c.country_name
FROM locations l, countries c
WHERE l.country_id = c.country_id(+)
UNION
SELECT l.city, c.country_name
FROM locations l, countries c
WHERE l.country_id(+) = c.country_id;