在 MySQL 中,子查询是另一个 MySQL 查询中的查询,嵌入在 WHERE 子句中。它用于返回数据,该数据在主查询中用作条件,以进一步限制要检索的数据。
子查询可以与 SELECT、UPDATE、INSERT、DELETE 语句以及表达式运算符一起使用。它可以是相等运算符或比较运算符,例如 =、>、=、<= 和 Like 运算符。
子查询必须遵循一些规则:
- 子查询必须括在括号内。
- 子查询可以放置在多个 MySQL 子句中:WHERE 子句、HAVING 子句、FROM 子句。
- 子查询是另一个查询中的查询。外部查询称为主查询,内部查询称为子查询。
- 子查询通常首先执行,其输出用于完成主查询或外查询的查询条件。
- ORDER BY 命令不能用于子查询,尽管主查询可以使用 ORDER BY。 GROUP BY 命令可用于执行与子查询中的 ORDER BY 相同的功能。
- 子查询是位于比较运算符的右侧。
- 子查询的 SELECT 子句中只能有一列,除非主查询中有多个列可供子查询比较其选定的列。
- 返回多行的子查询只能与多个值运算符(例如 IN 运算符)一起使用。
- BETWEEN 运算符不能与子查询一起使用。不过,BETWEEN 运算符可以在子查询中使用。
使用 SELECT 语句的子查询
MySQL 子查询最常与 SELECT 语句一起使用。
语法
SELECT column_name
FROM table_name
WHERE column_name expression operator
( SELECT column_name from table_name WHERE ... );
示例:
考虑一个名为Employee的数据库表,其中包含以下记录:
EmpID | Name | City | Age | Salary |
---|---|---|---|---|
1 | John | London | 25 | 3000 |
2 | Marry | New York | 24 | 2750 |
3 | Jo | Paris | 27 | 2800 |
4 | Kim | Amsterdam | 30 | 3100 |
5 | Ramesh | New Delhi | 28 | 3000 |
6 | Huang | Beijing | 28 | 2800 |
带有 SELECT 语句的子查询将是:
SELECT * FROM Employee
WHERE EmpID IN (SELECT EmpID
FROM Employee
WHERE Salary > 2800);
这将产生如下所示的结果:
EmpID | Name | City | Age | Salary |
---|---|---|---|---|
1 | John | London | 25 | 3000 |
4 | Kim | Amsterdam | 30 | 3100 |
5 | Ramesh | New Delhi | 28 | 3000 |
带有 INSERT 语句的子查询
MySQL 子查询也可以与 INSERT 语句一起使用。在插入语句中,从子查询返回的数据用于插入到另一个表中。子查询中选定的数据可以使用任何字符、日期或数字函数进行修改。
语法
INSERT INTO table_name (column1, column2, column3....)
SELECT *
FROM table_name
WHERE VALUE OPERATOR
示例:
考虑表 Employee_Temp 与 Employee 表具有相似的结构。要将完整的 Employee 表复制到 Employee_Temp 表中,可以使用以下查询:
INSERT INTO Employee_Temp
SELECT * FROM Employee
WHERE EmpID IN (SELECT EmpID
FROM Employee);
使用 UPDATE 语句的子查询
MySQL子查询也可以与UPDATE语句结合使用。使用带有 UPDATE 语句的子查询时,可以更新表中的单列或多列。
语法
UPDATE table
SET column_name = new_value
WHERE VALUE OPERATOR
(SELECT COLUMN_NAME
FROM TABLE_NAME
WHERE condition);
示例:
考虑名为 Employee 的数据库表,包含以下记录:
EmpID | Name | City | Age | Salary |
---|---|---|---|---|
1 | John | London | 25 | 3000 |
2 | Marry | New York | 24 | 2750 |
3 | Jo | Paris | 27 | 2800 |
4 | Kim | Amsterdam | 30 | 3100 |
5 | Ramesh | New Delhi | 28 | 3000 |
6 | Huang | Beijing | 28 | 2800 |
带有 UPDATE 语句的子查询将是:
UPDATE Employee
SET Salary = Salary * 1.2
WHERE Salary IN (SELECT Salary FROM Employee
WHERE Salary <= 2800);
--查看结果
SELECT * FROM Employee;
这将产生结果如下所示:
EmpID | Name | City | Age | Salary |
---|---|---|---|---|
1 | John | London | 25 | 3000 |
2 | Marry | New York | 24 | 3300 |
3 | Jo | Paris | 27 | 3360 |
4 | Kim | Amsterdam | 30 | 3100 |
5 | Ramesh | New Delhi | 28 | 3000 |
6 | Huang | Beijing | 28 | 3360 |
带有DELETE语句的子查询
MySQL子查询也可以与结合使用DELETE 语句与上述任何其他语句一样。
语法
DELETE FROM TABLE_NAME
WHERE VALUE OPERATOR
(SELECT COLUMN_NAME
FROM TABLE_NAME
WHERE condition);
示例:
考虑一个名为 Employee 表具有以下记录:
EmpID | Name | City | Age | Salary |
---|---|---|---|---|
1 | John | London | 25 | 3000 |
2 | Marry | New York | 24 | 2750 |
3 | Jo | Paris | 27 | 2800 |
4 | Kim | Amsterdam | 30 | 3100 |
5 | Ramesh | New Delhi | 28 | 3000 |
6 | Huang | Beijing | 28 | 2800 |
带有 UPDATE 语句的子查询将是:
DELETE FROM Employee
WHERE Age IN (SELECT Age FROM Employee
WHERE Age >= 28 );
--查看结果
SELECT * FROM Employee;
这将产生如下所示的结果:
EmpID | Name | City | Age | Salary |
---|---|---|---|---|
1 | John | London | 25 | 3000 |
2 | Marry | New York | 24 | 2750 |
3 | Jo | Paris | 27 | 2800 |