MySql教程
MySql用户管理
MySQL数据库
MySql表格和视图
MySQL查询
MySQL索引
MySQL子句
MySQL授权
MySql控制流
MySQL条件
MySQL连接
MySQL键
MySQL触发器
MySQL聚合函数
MySQL常用
MySQL正则表达式
MySql差异性

MySQL 子查询

MySQL中的子查询是一个查询,该查询嵌套到另一个SQL查询中,并嵌入SELECT,INSERT,UPDATE或DELETE语句以及各种运算符。我们还可以将子查询与另一个子查询嵌套在一起。子查询称为 内部查询,而包含子查询的查询称为 外部查询。首先执行内部查询,将结果提供给外部查询,然后执行主/外部查询。 MySQL 允许我们在任何地方使用子查询,但是必须在括号内将其关闭。 MySQL也将支持SQL标准支持的所有子查询形式和操作。
以下是使用子查询的规则:
子查询应始终在括号中使用。 如果主查询没有用于子查询的多列,则子查询在SELECT命令中只能有一个列。 我们可以对子查询使用各种比较运算符,例如>,<,=,IN,ANY,SOME和ALL。当子查询返回多行时,多行运算符非常有用。 尽管可以在主查询中使用它,但是我们不能在子查询中使用 ORDER BY 子句。 如果我们在 set函数中使用子查询,则不能将其立即包含在set函数中。
以下是使用子查询的优点:
子查询以结构化形式进行查询,使我们能够隔离语句的每个部分。 子查询提供了从表中查询数据的替代方法。否则,我们需要使用复杂的联接和联合。 子查询比复杂的join或union语句更具可读性。

MySQL子查询语法

以下是在MySQL中使用子查询的基本语法:
SELECT column_list (s) FROM  table_name
WHERE  column_name OPERATOR
   (SELECT column_list (s)  FROM table_name [WHERE])

MySQL子查询示例

让我们借助示例来理解它。假设我们有一个名为 "employees" 的表,其中包含以下数据:
表: employees
MySQL Subquery
以下是一个简单的SQL语句,它返回其ID在子查询中匹配的 员工详细信息:
SELECT emp_name, city, income FROM employees 
   WHERE emp_id IN (SELECT emp_id FROM employees);
此查询将返回以下输出:
MySQL Subquery

MySQL带有比较运算符的子查询

比较运算符是用于比较值并返回结果(真或假)的运算符。在MySQL <,>,=,<>,<=>等中使用以下比较运算符。我们可以在返回单个值的比较运算符之前或之后使用子查询。返回的值可以是算术表达式或列函数。之后,SQL将子查询结果与比较运算符另一侧的值进行比较。下面的示例对其进行了更清晰的解释:
下面是一个简单的 SQL 语句,该语句返回 在子查询的帮助下收入超过350000的员工详细信息:
SELECT * FROM employees 
   WHERE emp_id IN (SELECT emp_id FROM employees 
         WHERE income > 350000);
此查询首先执行子查询,该子查询返回收入> 350000的 雇员ID 。其次,主查询将返回雇员的所有详细信息,这些雇员的ID在子查询返回的结果集中。
执行该语句后,我们将获得以下输出,可以在其中看到雇员的详细信息其收入> 350000。
MySQL Subquery
让我们看看另一个比较运算符的示例,例如相等(=)使用子查询查找具有 最高收入的员工详细信息。
SELECT emp_name, city, income FROM employees 
   WHERE income = (SELECT MAX(income) FROM employees);
它将提供输出,我们可以在其中看到两个收入最高的雇员的详细信息。
MySQL Subquery

带有IN或NOT-IN运算符的MySQL子查询

如果子查询产生多个值,我们需要将IN或NOT IN运算符与WHERE子句。假设我们有一个名为 " Student" " Student2" 的表,其中包含以下数据:
表: Student
MySQL Subquery
表: Student2
MySQL子查询
以下带有NOT IN运算符的子查询返回 不属于洛杉矶市的学生详细信息来自两个表,如下所示:
SELECT Name, City FROM student
WHERE City NOT IN (
SELECT City FROM student2 WHERE City='Los Angeles');
执行后,我们可以看到结果包含不属于洛杉矶市的学生详细信息。
MySQL Subquery

FROM子句中的MySQL子查询

如果我们在FROM子句中使用子查询,MySQL将从子查询返回的输出用作临时表。我们将此表称为派生表,内联视图或实例化子查询。
以下子查询返回订单表中项目的最大,最小和平均数量:
SELECT Max(items), MIN(items), FLOOR(AVG(items))
FROM
    (SELECT order_id, COUNT(order_id) AS items FROM orders
    GROUP BY order_date) AS Student_order_detail;
它将给出如下输出:
MySQL Subquery

MySQL关联子查询

MySQL中的关联子查询是依赖于外部查询的子查询。它使用外部查询中的数据或包含对父查询的引用,该父查询也出现在外部查询中。 MySQL从外部查询的每一行对其进行一次评估。
SELECT emp_name, city, income
FROM employees emp WHERE income > ( 
SELECT AVG(income) FROM employees WHERE city = emp.city);
在上面的查询中,我们选择一个 雇员姓名和城市,其收入高于每个城市中所有雇员的平均收入。
MySQL Subquery
该子查询针对指定表的每个城市执行,因为它将针对每一行进行更改。因此,平均收入也会改变。然后,主查询会过滤收入高于子查询平均收入的员工详细信息。

具有EXISTS或NOT EXISTS的MySQL子查询

EXISTS运算符是一个布尔运算符,它返回true或false。它与子查询一起使用,并检查子查询中数据的存在。如果子查询完全返回任何记录,则此运算符返回true。否则,它将返回false。用于否定的NOT EXISTS运算符在子查询不返回任何行时给出真值。否则,它返回false。 EXISTS和NOT EXISTS都与关联子查询一起使用。以下示例更清楚地说明了这一点。假设我们有一个表 客户和订单,其中包含如下数据:
MySQL Subquery
下面的SQL语句使用EXISTS运算符来查找已下至少一笔订单的客户的姓名,职业和年龄。
SELECT name, occupation, age FROM customer C
WHERE EXISTS (SELECT * FROM Orders O
WHERE C.cust_id = O.cust_id);  
此语句使用NOT EXISTS运算符,该运算符返回尚未下订单的客户详细信息。
SELECT name, occupation, age FROM customer C
WHERE NOT EXISTS (SELECT * FROM Orders O
WHERE C.cust_id = O.cust_id);  
我们可以看到以下输出来了解上述查询结果。
MySQL Subquery
到要了解有关EXISTS运算符的更多信息,请单击此处。

MySQL ROW子查询

这是一个子查询,返回单行,在该行中我们可以获取多个列值。我们可以使用以下运算符比较行子查询=,>,<,> =,<=,<>,!=,<=>。让我们看下面的例子:
SELECT * FROM customer C WHERE ROW(cust_id, occupation) = (
SELECT order_id, order_date FROM Orders O WHERE C.cust_id = O.cust_id);
如果给定的行具有cust_id,职业值等于order_id,第一个表中任何行的order_date值,则WHERE表达式为TRUE,并且每个查询都返回这些第一个表行。否则,表达式为FALSE,查询将生成一个空集,该空集可以显示在下图中:
MySQL Subquery

带有ALL,ANY和SOME的MySQL子查询

我们可以使用一个子查询,在比较运算符之后紧跟着关键字ALL,ANY或SOME。以下是将子查询与ALL,ANY或SOME一起使用的语法:
operand comparison_operator ANY (subquery)
operand comparison_operator ALL (subquery)
operand comparison_operator SOME (subquery)
ALL关键字将值与子查询返回的值进行比较。因此,如果子查询返回的所有值的比较结果为TRUE,则返回TRUE。如果子查询返回的任何值的比较为TRUE,则ANY关键字将返回TRUE。 ANY和SOME关键字是相同的,因为它们是彼此的别名。以下示例对其进行了更清晰的说明:
SELECT cust_id, name FROM customer WHERE 
cust_id > ANY (SELECT cust_id FROM Orders);
我们将得到如下输出:
MySQL Subquery
如果我们在原位使用ALL的ANY,如果子查询返回的列中所有值的比较为TRUE,则返回TRUE。例如:
SELECT cust_id, name FROM customer WHERE 
cust_id > ALL (SELECT cust_id FROM Orders);
我们可以看到以下输出:
MySQL Subquery
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4