Oracle DB使用连接显示多个表中的数据(四)
oyees e JOIN departments d USING (department_id) WHERE department_id = 50;
FIRST_NAME DEPARTMENT_NAME MANAGER_ID
-------------------- ------------------------------ ----------
Donald Shipping 121
Douglas Shipping 121
...
45 rows selected.
使用ON子句创建联接
自然联接的基本联接条件是对具有相同名称的所有列进行等值联接。
使用ON子句可指定任意条件或指定要联接的列。
联接条件独立于其它搜索条件。
使用ON子句可使代码易于理解。
使用ON子句可指定联接条件。这样,便可以在WHERE子句中指定独立于任何搜索条件或过滤条件的联接条件。
使用ON子句检索记录
hr@TEST0924> SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id
2 FROM employees e JOIN departments d ON (e.department_id = d.department_id);
EMPLOYEE_ID LAST_NAME DEPARTMENT_ID DEPARTMENT_ID LOCATION_ID
----------- ------------------------- ------------- ------------- -----------
200 Whalen 10 10 1700
201 Hartstein 20 20 1800
...
106 rows selected.
在此示例中,EMPLOYEES表和DEPARTMENTS表中的DEPARTMENT_ID列已使用ON子句联接起来。只要EMPLOYEES表中的部门ID 等于DEPARTMENTS表中的部门ID,就返回相应的行。要限定相匹配的column_names,表别名是必需的。还可以使用ON子句来联接名称不相同的列。示例所示的联接列
(e.department_id = d.department_id)两边的圆括号是可选的。因此,即便是ON e.department_id = d.department_id效果也一样。
使用ON子句创建三向联接
hr@TEST0924> SELECT employee_id, city, department_name FROM employees e JOIN departments d
2 ON d.department_id = e.department_id JOIN locations l ON d.location_id = l.location_id;
EMPLOYEE_ID CITY DEPARTMENT_NAME
----------- ------------------------------ ------------------------------
100 Seattle Executive
101 Seattle Executive
102 Seattle Executive
...
106 rows selected.
三向联接是指三个表的联接。在符合SQL:1999 的语法中,从左至右执行联接。这样,要执行的第一个联接是EMPLOYEES JOIN DEPARTMENTS。第一个联接条件可以引用EMPLOYEES和DEPARTMENTS中的列,但不能引用LOCATIONS中的列。第二个联接条件可以引用全部三个表中的列。
注:示例也可以使用USING子句实现:
hr@TEST0924> SELECT e.employee_id, l.city, d.department_name FROM employees e JOIN departments d USING (department_id) JOIN locations l USING (location_id)
2 ;
EMPLOYEE_ID CITY DEPARTMENT_NAME
----------- ------------------------------ ------------------------------
100 Seattle Executive
101 Seattle Executive
102 Seattle Executive
...
106 rows selected.
对联接应用附加条件
使用AND子句或WHERE子句可应用附加条件:
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
AND e.manager_id = 149 ;
或
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
WHERE e.manager_id = 149 ;
可以对联接应用附加条件。
所示示例对EMPLOYEES和DEPARTMENTS表执行联接,另外,还仅显示经理ID 为149 的雇员。要对ON子句添加附加条件,可以添加AND子句。或者,可以使用WHERE子句应用附加条件。
将表联接到自身
有时需要将表联接到自身。要查找每位雇员的经理的姓名,需要将EMPLOYEES表联接到自身,即执行自联接。例如,要查找Lorentz 的经理的姓名,需要执行以下操作:
在EMPLOYEES表中通过搜索LAST_NAME列来查找Lorentz。
通过搜索MANAGER_ID列查找Lorentz 的经理编号。Lorentz 的经理编号为103。
通过搜索LAST_NAME列查找EMPLOYEE_ID为103 的经理的姓名。Hun