在 MariaDB 中,子查询是另一个 MariaDB 查询中的查询,并嵌入在 WHERE 子句中。它用于返回数据,该数据在主查询中用作条件,以进一步限制要检索的数据。

子查询可以与 SELECT、UPDATE、INSERT、DELETE 语句以及表达式运算符一起使用。它可以是相等运算符或比较运算符,例如 =、>、=、<= 和 Like 运算符。

子查询必须遵循一些规则:

  • 子查询必须括在括号内。
  • 子查询可以放置在多个 MariaDB 子句中:WHERE 子句、HAVING 子句、FROM 子句。
  • 子查询是另一个查询中的查询。外部查询称为主查询,内部查询称为子查询
  • 子查询通常首先执行,其输出用于完成主查询或外部查询的查询条件。
  • ORDER BY 命令不能用于子查询,尽管主查询可以使用 ORDER BY。 GROUP BY 命令可用于执行与子查询中的 ORDER BY 相同的功能。
  • 子查询是位于比较运算符的右侧。
  • 子查询的 SELECT 子句中只能有一列,除非主查询中有多个列可供子查询比较其选定的列。
  • 返回多行的子查询只能与多个值运算符(例如 IN 运算符)一起使用。
  • BETWEEN 运算符不能与子查询一起使用。但是,BETWEEN 运算符可以在子查询中使用。

使用 SELECT 语句的子查询

MariaDB 子查询最常与 SELECT 语句一起使用。

语法

SELECT column_name  
FROM table_name  
WHERE column_name expression operator   
( SELECT column_name  from table_name WHERE ... ); 

示例:

考虑一个名为Employee的数据库表,其中包含以下记录:

EmpIDNameCityAgeSalary
1JohnLondon253000
2MarryNew York242750
3JoParis272800
4KimAmsterdam303100
5RameshNew Delhi283000
6HuangBeijing282800

带有 SELECT 语句的子查询将是:

SELECT * FROM Employee
  WHERE EmpID IN (SELECT EmpID   
    FROM Employee   
    WHERE Salary > 2800); 

这将产生如下所示的结果:

EmpIDNameCityAgeSalary
1JohnLondon253000
4KimAmsterdam303100
5RameshNew Delhi283000

带有 INSERT 语句的子查询

MariaDB 子查询也可以与 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 语句的子查询

MariaDB 子查询还可以与 UPDATE 语句结合使用。使用带有 UPDATE 语句的子查询时,可以更新表中的单列或多列。

语法

UPDATE table  
SET column_name = new_value  
WHERE VALUE OPERATOR  
   (SELECT COLUMN_NAME  
   FROM TABLE_NAME  
   WHERE condition); 

示例:

考虑名为 Employee 的数据库表,包含以下记录:

EmpIDNameCityAgeSalary
1JohnLondon253000
2MarryNew York242750
3JoParis272800
4KimAmsterdam303100
5RameshNew Delhi283000
6HuangBeijing282800

带有 UPDATE 语句的子查询将是:

UPDATE Employee  
  SET Salary = Salary * 1.2  
  WHERE Salary IN (SELECT Salary FROM Employee  
    WHERE Salary <= 2800);  

-- 查看结果
SELECT * FROM Employee; 

这将产生结果如下所示:

EmpIDNameCityAgeSalary
1JohnLondon253000
2MarryNew York243300
3JoParis273360
4KimAmsterdam303100
5RameshNew Delhi283000
6HuangBeijing283360

带有 DELETE 语句的子查询

MariaDB 子查询也可以与 结合使用DELETE 语句与上述任何其他语句一样。

语法

DELETE FROM TABLE_NAME  
WHERE VALUE OPERATOR  
   (SELECT COLUMN_NAME  
   FROM TABLE_NAME  
   WHERE condition); 

示例:

考虑一个名为 Employee 的数据库表具有以下记录:

EmpIDNameCityAgeSalary
1JohnLondon253000
2MarryNew York242750
3JoParis272800
4KimAmsterdam303100
5RameshNew Delhi283000
6HuangBeijing282800

带有 UPDATE 语句的子查询将是:

DELETE FROM Employee  
  WHERE Age IN (SELECT Age FROM Employee  
  WHERE Age >= 28 );  

-- 查看结果
SELECT * FROM Employee; 

这将产生如下所示的结果:

EmpIDNameCityAgeSalary
1JohnLondon253000
2MarryNew York242750
3JoParis272800