主题
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
适用于将多个表中的相关数据结合,而子查询则提供了更加灵活的查询方式,尤其是在复杂的查询需求下。