MySQL:子查询(全面详解)
子查询是嵌套在另一个 SELECT, INSERT, UPDATE, 或 DELETE查询的查询。子查询可以在SQL语句中用括号表示。
子查询可以在以下几种情况下使用:
- 作为计算的一部分,用于从表中选择数据。
- 作为 FROM 子句的一部分,用于返回一个临时的表。
- 作为 WHERE 或 HAVING 子句的一部分,用于过滤结果集。
子查询的语法:
SELECT column_name [, column_name ]
FROM table1
WHERE [column_name operator] (SELECT [column_name]
FROM table2
WHERE condition);
例子:
- 单列子查询:
SELECT *
FROM employees
WHERE department_id = (SELECT id FROM departments WHERE name = 'Sales');
- 在 FROM 子句中使用子查询:
SELECT e1.first_name, e1.last_name
FROM (SELECT * FROM employees WHERE department_id = 1) AS e1
JOIN (SELECT * FROM employees WHERE department_id = 2) AS e2
ON e1.manager_id = e2.employee_id;
- 在 WHERE 子句中使用子查询:
SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM customers WHERE city = 'London');
- 在 SELECT 子句中使用子查询:
SELECT
(SELECT COUNT(*) FROM orders WHERE customer_id = e.customer_id) AS orders_count
FROM employees e;
- 在 GROUP BY 子句中使用子查询:
SELECT
(SELECT name FROM departments WHERE id = d.department_id) AS department_name,
COUNT(*)
FROM employees d
GROUP BY department_name;
子查询的性能优化:
- 尽可能使用 JOIN 来替代子查询,因为 JOIN 通常比子查询更高效。
- 尽可能减少子查询中的数据量,以避免不必要的性能开销。
- 确保子查询的 WHERE 子句中的条件对索引进行优化。
注意:在使用子查询时,确保子查询返回的是单行单列的值,除非在 WHERE IN, ANY, ALL, EXISTS 等操作中使用。
评论已关闭