MySQL子查询(Subquery)是指嵌套在另一个SQL查询中的查询。子查询可以出现在SELECT、FROM、WHERE和HAVING子句中。子查询的结果可以作为外部查询的条件或数据来源。
假设我们有两个表:employees
和 departments
。
-- employees 表
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
salary INT,
department_id INT
);
-- departments 表
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(100)
);
-- 插入示例数据
INSERT INTO departments (id, name) VALUES (1, 'HR'), (2, 'Engineering');
INSERT INTO employees (id, name, salary, department_id) VALUES
(1, 'Alice', 50000, 1),
(2, 'Bob', 60000, 2),
(3, 'Charlie', 55000, 1);
查找工资高于HR部门平均工资的员工:
SELECT name
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = 1
);
查找每个部门中工资最高的员工:
SELECT d.name AS department_name, e.name AS employee_name, e.salary
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE e.salary = (
SELECT MAX(salary)
FROM employees
WHERE department_id = e.department_id
);
问题:子查询可能导致性能问题,尤其是在大数据集上。 原因:子查询可能会导致数据库多次扫描数据,增加查询时间。 解决方法:
问题:标量子查询只能返回单个值,但有时需要返回多个值。 原因:子查询返回多个值时,会导致语法错误。 解决方法:
问题:子查询嵌套层次过深可能导致语法错误或性能问题。 原因:MySQL对子查询嵌套层次有限制。 解决方法:
通过以上内容,您可以更好地理解MySQL子查询的基础概念、类型、应用场景以及常见问题的解决方法。
领取专属 10元无门槛券
手把手带您无忧上云