Joins

连接是组合来自两个或多个表、视图或物化视图的行的查询 

以下示例连接employeesdepartments表(FROM子句),仅选择满足指定条件的行(WHERE子句),并使用投影从两列中检索数据(SELECT)。示例输出遵循 SQL 语句。

 

SELECT email, department_name
FROM   employees 
JOIN   departments
ON     employees.department_id = departments.department_id
WHERE  employee_id IN (100,103)
ORDER BY email;

EMAIL                     DEPARTMENT_NAME
------------------------- ------------------------------
AHUNOLD                   IT
SKING                     Executive

下图表示上述查询中显示的连接中的投影和选择操作。

投影和选择

 

大多数联接在FROM子句或WHERE子句中都至少有一个联接条件,用于比较来自不同表的两列。数据库组合成对的行,每个行包含每个表中的一行,对于这些行,联接条件的计算结果为TRUE。优化器根据连接条件、索引和表的任何可用统计信息确定数据库连接表的顺序。

联接类型包括:

  • Inner joins

内部联接是两个或多个表的联接,它只返回满足联接条件的行。例如,如果加入条件是employees.department_id=departments.department_id。则不返回不满足此条件的行。

  • Outer joins

外部联接返回满足联接条件的所有行,还返回一个表中其他表中没有满足条件的行。

表a和B的左外部联接的结果始终包含左表a的所有记录,即使联接条件与右表B中的记录不匹配。如果不存在B中的匹配行,则B列包含B中不匹配的行的空值。例如,如果不是所有员工都在部门中,然后,employees(左表)和departments(右表)的左外部联接将检索employmes中的所有行,即使department中的行都不满足联接条件(employeres.departmentid为空)。

表a和表B的右外部联接的结果包含右表B的所有记录,即使联接条件与左表a中的行不匹配。如果a中没有匹配的行,则a列中的行与a中的行都不匹配。例如,如果不是所有部门都有员工,employees(左表)和departments(右表)的右外部联接将检索department中的所有行,即使employers中没有满足联接条件的行。

 full outer join完全外部联接是左外部联接和右外部联接的组合。

  • 笛卡尔积

如果联接查询中的两个表没有联接条件,则数据库将执行笛卡尔联接。一个表格的每一行与另一个表格中的每一行都相结合。例如,如果员工有107行,部门有27行,那么笛卡尔积包含107*27行。笛卡尔积很少有用。

Subqueries

子查询是嵌套在另一个SQL语句中的SELECT语句。当您必须执行多个查询来解决单个问题时,子查询非常有用。

语句的每个查询部分称为查询块。在以下查询中,括号中的子查询是内部查询块:

SELECT first_name, last_name 
FROM   employees
WHERE  department_id 
IN     ( SELECT department_id 
         FROM departments 
         WHERE location_id = 1800 );

内部SELECT语句检索位置ID为1800的部门的ID。外部查询块需要这些部门ID,它检索子查询提供ID的部门中员工的姓名。

SQL语句的结构并不强制数据库首先执行内部查询。例如,数据库可以将整个查询重写为员工和部门的联接,这样子查询就不会单独执行。另一个示例是,虚拟专用数据库(VPD)功能可以使用WHERE子句限制对员工的查询,以便数据库首先查询员工,然后获取部门ID。优化器确定检索请求行的最佳步骤顺序。

 

posted @ 2022-10-06 16:45  wongchaofan  阅读(220)  评论(0编辑  收藏  举报