联接两个或更多表时,需要使用表名来限定列的名称,以避免混淆。如果不使用表前缀,则SELECT列表中的DEPARTMENT_ID列可能来自DEPARTMENTS表,也可能来自EMPLOYEES表。因此需要添加表前缀来执行查询。如果两个表中没有相同的列名,则无需限定列。但是,使用表前缀可以提高性能,因为这等于告知Oracle Server 查找这些列的确切位置。 但是,使用表名限定列名可能非常耗时,特别是当表名较长时。可改为使用表别名。就像列别名是列的另一个名称一样,表别名也是表的另一个名称。表别名有助于使SQL 代码变得更短,因而占用更少的内存。 先指定表全名,然后是一个空格,再后面是表别名。例如,EMPLOYEES表的别名可以是e,而DEPARTMENTS表的别名可以是d。
hr@TEST0924> DESC locations Name Null Type ----------------------------------------------------- -------- ------------------------------------ LOCATION_ID NOT NULL NUMBER(4) STREET_ADDRESS VARCHAR2(40) POSTAL_CODE VARCHAR2(12) CITY NOT NULL VARCHAR2(30) STATE_PROVINCE VARCHAR2(25) 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,