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 的经理的姓名。Hunold的雇员编号为103,因此Hunold是Lorentz 的经理。 在这一过程中,对表进行了两次搜索。第一次是在表中LAST_NAME列中查找Lorentz,得知其MANAGER_ID值为103。第二次是搜索EMPLOYEE_ID列以查找103,然后在LAST_NAME列中找到了Hunold。
ON子句还可以用于联接同一表内或者不同表中具有不同名称的列。 所示示例为EMPLOYEES表基于EMPLOYEE_ID和MANAGER_ID列进行自联接。 注:示例所示的联接列(e.manager_id = m.employee_id)两边的圆括号是可选的。因此,即便是ON e.manager_id = m.employee_id效果也一样。
非等值联接 非等值联接是一个包含非等号运算符的联接条件。 EMPLOYEES表和JOB_GRADES表之间的关系就是一个非等值联接的示例。EMPLOYEES表中的SALARY列的范围介于JOB_GRADES表的LOWEST_SAL和HIGHEST_SAL列中的值之间。因此,可以根据每位雇员的薪金划分其等级。通过使用等号(=) 以外的运算符可以实现这一关系。
使用非等值联接检索记录 SELECT e.last_name, e.salary, j.grade_level FROM employees e JOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal;
示例中创建了一个非等值联接来评估雇员的薪金等级。薪金必须介于任何一对最低薪金和最高薪金之间。 值得注意的是,在执行这一查询时,所有雇员只能出现一次。雇员不能在列表中重复出现。 这有以下两个原因: JOB_GRADES表中的任何一行都不包含重叠的等级。也就是说,每位雇员的薪金值只能介于薪金等级表中某一行的最低薪金值和最高薪金值之间。 所有雇员的薪金都在职务等级表提供的限额之内。也就是说,任何雇员的薪金都不低于LOWEST_SAL列中的最低值,也不高于HIGHEST_SAL列中的最高值。 注:可以使用其它条件,如<=和>=,但最简单的方法是使用BETWEEN。请记住,在使用BETWEEN条件时,应先指定最低值,后指定最高值。Oracle Server 将BETWEEN条件解释为一对AND条件。因此,使用BETWEEN没有性能优势,只是为了简化逻辑才使用它。 示例中指定了表别名,这是考虑到性能原因,而不是因为可能出现的混淆。
使用OUTER联接返回没有直接匹配的记录 如果某一行不满足联接条件,则查询结果中就不会出现该行。 针对EMPLOYEES和DEPARTMENTS表使用简单等值联接来返回右侧的结果。结果集不包含以下内容: 部门ID 190,因为EMPLOYEES表中不存在具有该部门ID 的雇员 姓氏为Grant 的雇员,因为没有为该雇员分配部门ID 要返回没有任何雇员部门记录,或者返回没有分配部门的雇员,您可以使用OUTER联接。
INNER联接与OUTER联接 在SQL:1999 中,如果两个表的联接只返回相匹配的行,则称该联接为INNER联接。 如果两个表之间的联接不仅返回INNER联接的结果,还返回左(或右)表中不匹配的行,则称该联接为左(或右)OUTER联接。 如果两个表之间的联接不仅返回INNER联接的结果,还返回左和右联接的结果,则称该联接为完全OUTER联接。
使用NATUR