Skip to content

JOIN 与子查询 ​

JOIN 操作 ​

JOIN 是用来将两个或多个表中的数据结合起来,以便从多个表中提取相关信息。

内连接(INNER JOIN) ​

INNER JOIN 返回两个表中匹配的记录。

sql
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

左外连接(LEFT JOIN) ​

LEFT JOIN 返回左表中的所有记录,以及右表中匹配的记录。如果右表没有匹配记录,则结果为 NULL。

sql
SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;

右外连接(RIGHT JOIN) ​

RIGHT JOIN 返回右表中的所有记录,以及左表中匹配的记录。如果左表没有匹配记录,则结果为 NULL。

sql
SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;

全外连接(FULL OUTER JOIN) ​

FULL OUTER JOIN 返回左表和右表中的所有记录,左表和右表没有匹配时,结果为 NULL。

sql
SELECT employees.name, departments.name
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.id;

自连接(SELF JOIN) ​

自连接用于连接同一个表,通常用于查询与当前行有某种关系的其他行。

sql
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.id;

子查询 ​

子查询是嵌套在其他查询中的查询,通常用来处理复杂的查询条件。

简单子查询 ​

子查询通常在 WHERE 子句中作为条件使用。

sql
SELECT name, salary
FROM employees
WHERE department_id = (SELECT id FROM departments WHERE name = 'Sales');

子查询与 IN 语法 ​

使用 IN 与子查询结合,检查某个字段是否在子查询的结果中。

sql
SELECT name, salary
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE name = 'Sales');

子查询与 EXISTS 语法 ​

EXISTS 用于检查子查询是否返回结果。

sql
SELECT name
FROM employees e
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.id = e.department_id AND d.name = 'Sales');

聚合函数与子查询 ​

子查询可以与聚合函数一起使用,用来返回分组后的数据。

sql
SELECT name, salary
FROM employees
WHERE salary (SELECT AVG(salary) FROM employees);

小结 ​

JOIN 操作和子查询是 PostgreSQL 查询中非常强大的功能。JOIN 适用于将多个表中的相关数据结合,而子查询则提供了更加灵活的查询方式,尤其是在复杂的查询需求下。

JOIN 与子查询 ​

JOIN 操作 ​

JOIN 是用来将两个或多个表中的数据结合起来,以便从多个表中提取相关信息。

内连接(INNER JOIN) ​

INNER JOIN 返回两个表中匹配的记录。

sql
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

左外连接(LEFT JOIN) ​

LEFT JOIN 返回左表中的所有记录,以及右表中匹配的记录。如果右表没有匹配记录,则结果为 NULL。

sql
SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;

右外连接(RIGHT JOIN) ​

RIGHT JOIN 返回右表中的所有记录,以及左表中匹配的记录。如果左表没有匹配记录,则结果为 NULL。

sql
SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;

全外连接(FULL OUTER JOIN) ​

FULL OUTER JOIN 返回左表和右表中的所有记录,左表和右表没有匹配时,结果为 NULL。

sql
SELECT employees.name, departments.name
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.id;

自连接(SELF JOIN) ​

自连接用于连接同一个表,通常用于查询与当前行有某种关系的其他行。

sql
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.id;

子查询 ​

子查询是嵌套在其他查询中的查询,通常用来处理复杂的查询条件。

简单子查询 ​

子查询通常在 WHERE 子句中作为条件使用。

sql
SELECT name, salary
FROM employees
WHERE department_id = (SELECT id FROM departments WHERE name = 'Sales');

子查询与 IN 语法 ​

使用 IN 与子查询结合,检查某个字段是否在子查询的结果中。

sql
SELECT name, salary
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE name = 'Sales');

子查询与 EXISTS 语法 ​

EXISTS 用于检查子查询是否返回结果。

sql
SELECT name
FROM employees e
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.id = e.department_id AND d.name = 'Sales');

聚合函数与子查询 ​

子查询可以与聚合函数一起使用,用来返回分组后的数据。

sql
SELECT name, salary
FROM employees
WHERE salary (SELECT AVG(salary) FROM employees);

小结 ​

JOIN 操作和子查询是 PostgreSQL 查询中非常强大的功能。JOIN 适用于将多个表中的相关数据结合,而子查询则提供了更加灵活的查询方式,尤其是在复杂的查询需求下。

Released under the MIT License.