Oracle DB使用连接显示多个表中的数据(二)

2014-11-24 16:56:23 · 作者: · 浏览: 1
COUNTRY_ID CHAR(2)
hr@TEST0924> SELECT department_id,department_name, location_id, city FROM departments NATURAL JOIN locations ;
DEPARTMENT_ID DEPARTMENT_NAME LOCATION_ID CITY
------------- ------------------------------ ----------- ------------------------------
60 IT 1400 Southlake
50 Shipping 1500 South San Francisco
10 Administration 1700 Seattle
...
28 rows selected.
在示例中,通过LOCATION_ID列将LOCATIONS表和DEPARTMENT表联接起来,LOCATION_ID列是两个表中具有相同名称的唯一列。如果存在其它通用列,联接
也会使用所有这些列。
使用WHERE子句的自然联接
可以使用WHERE子句对自然联接施加其它限制。以下示例将输出行限制为部门ID 等于20 或50 的那些行:
hr@TEST0924> SELECT department_id, department_name, location_id, city FROM departments NATURAL JOIN locations WHERE department_id IN (20, 50);
DEPARTMENT_ID DEPARTMENT_NAME LOCATION_ID CITY
------------- ------------------------------ ----------- ------------------------------
20 Marketing 1800 Toronto
50 Shipping 1500 South San Francisco
使用USING子句创建联接
如果多个列具有相同的名称,但数据类型不匹配,请使用USING子句指定等值联接的列。
当有多个列相匹配时,使用USING子句可仅与一列相匹配。
NATURAL JOIN和USING语句是互相排斥的。
自然联接使用具有匹配的名称和数据类型的所有列来联接表。可以使用USING子句仅指定等值联接应使用的那些列。
联接列名
要确定雇员的部门名称,应将EMPLOYEES表中DEPARTMENT_ID列的值与DEPARTMENTS表中DEPARTMENT_ID列的值进行比较。EMPLOYEES表和
DEPARTMENTS表之间的关系就是等值联接关系,即这两个表中DEPARTMENT_ID列的值必须相等。通常,这种类型的联接涉及到主键和外键补码。
注:等值联接也称为简单联接或内部联接。
使用USING子句检索记录
hr@TEST0924> SELECT employee_id, last_name, location_id, department_id FROM employees JOIN departments USING (department_id) ;
EMPLOYEE_ID LAST_NAME LOCATION_ID DEPARTMENT_ID
----------- ------------------------- ----------- -------------
200 Whalen 1700 10
201 Hartstein 1800 20
...
106 rows selected.
在示例中,由于EMPLOYEES表和DEPARTMENTS表中的DEPARTMENT_ID列已联接起来,因此会显示雇员所在部门的LOCATION_ID。
在USING子句中使用表别名
hr@TEST0924> SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE d.location_id = 1400;
SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE d.location_id = 1400
*
ERROR at line 1:
ORA-25154: column part of USING clause cannot have qualifier
不要对USING子句中使用的列加以限定。
如果在SQL 语句的另一个位置使用了同一列,则不要对其设置别名。
使用USING子句进行联接时,不能对USING子句自身中使用的列加以限定。此外,如果在SQL 语句的任何位置使用了该列,则不能对其设置别名。例如,在示例提及的查询中,不能对WHERE子句中的location_id列设置别名,因为在USING子句中已使用该列。
USING子句中引用的那些列不能在SQL 语句的任何位置使用限定词(表名或别名)。
例如,下面的语句是有效的:
hr@TEST0924> SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE location_id = 1400;
CITY DEPARTMENT_NAME
------------------------------ ------------------------------
Southlake IT
这两个表中通用但未在USING子句中使用的列必须以表别名为前缀,否则会出现“column ambiguously defined(定义的列含糊不清)”错误。
在下面的语句中,manager_id既在employees表中又在departments表中,如果manager_id不以表别名为前缀,则会收到“column ambiguously defined(定义的列含糊不清)”错误。
下面的语句是有效的:
hr@TEST0924> SELECT first_name, d.department_name, d.manager_id FROM empl