连接是组合来自两个或多个表、视图或物化视图的行的查询 。
以下示例连接employees
和departments
表(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。优化器确定检索请求行的最佳步骤顺序。