什么是 MySQL 子查询及其一般类别?
子查询最好定义为查询中的查询。子查询使您能够编写查询,这些查询根据在查询运行时实际生成的条件选择数据行。更正式地说,它是在另一个 SELECT 语句的一个子句中使用 SELECT 语句。实际上,一个子查询可以包含在另一个子查询中,该子查询又包含在另一个子查询中,依此类推。子查询也可以嵌套在 INSERT、UPDATE 和 DELETE 语句中。子查询必须用括号括起来。
只要子查询返回单个值,它就可以用在允许使用表达式的任何位置。这意味着返回单个值的子查询也可以在 FROM 子句列表中作为对象列出。这被称为内联视图,因为当子查询用作 FROM 子句的一部分时,它被视为虚拟表或视图。子查询可以放在主查询的 FROM 子句、WHERE 子句或 HAVING 子句中。它也称为内部查询或内部 SELECT,包含子查询的查询称为外部查询或外部 SELECT 或容器查询。以下是其一般类别:
标量子查询
标量子查询返回单个值,即一行一列数据。标量子查询是一个简单的操作数,我们几乎可以在任何允许使用单列或字面量的地方使用它。为了说明这一点,我们使用包含以下数据的表“汽车”、“客户”和“预订”:
mysql> Select * from Cars; +------+--------------+---------+ | ID | Name | Price | +------+--------------+---------+ | 1 | Nexa | 750000 | | 2 | Maruti Swift | 450000 | | 3 | BMW | 4450000 | | 4 | VOLVO | 2250000 | | 5 | Alto | 250000 | | 6 | Skoda | 1250000 | | 7 | Toyota | 2400000 | | 8 | Ford | 1100000 | +------+--------------+---------+ 8 rows in set (0.02 sec) mysql> Select * from Customers; +-------------+----------+ | Customer_Id | Name | +-------------+----------+ | 1 | Rahul | | 2 | Yashpal | | 3 | Gaurav | | 4 | Virender | +-------------+----------+ 4 rows in set (0.00 sec) mysql> Select * from Reservations; +------+-------------+------------+ | ID | Customer_id | Day | +------+-------------+------------+ | 1 | 1 | 2017-12-30 | | 2 | 2 | 2017-12-28 | | 3 | 2 | 2017-12-29 | | 4 | 1 | 2017-12-25 | | 5 | 3 | 2017-12-26 | +------+-------------+------------+ 5 rows in set (0.00 sec)
众所周知,标量子查询将返回单个值,以下是标量子查询:
mysql> Select Name from Customers WHERE Customer_id = (Select Customer_id FROM Reservations WHERE ID = 5); +--------+ | Name | +--------+ | Gaurav | +--------+ 1 row in set (0.06 sec)
表子查询
表子查询返回一个结果,其中包含一个或多个行,这些行包含一个或多个列的数据。以下使用表“汽车”、“客户”和“预订”中的数据的查询是表子查询的示例:
mysql> Select Name from customers where Customer_id IN (SELECT DISTINCT Customer_id from reservations); +---------+ | Name | +---------+ | Rahul | | Yashpal | | Gaurav | +---------+ 3 rows in set (0.05 sec)
相关子查询
相关子查询是在其 WHERE 子句中使用外部查询中的值的子查询。以下使用表“汽车”中的数据的查询是相关子查询的示例:
mysql> Select Name from cars WHERE Price < (SELECT AVG(Price) from Cars); +--------------+ | Name | +--------------+ | Nexa | | Maruti Swift | | Alto | | Skoda | | Ford | +--------------+ 5 rows in set (0.00 sec) mysql> Select Name from cars WHERE Price > (SELECT AVG(Price) from Cars); +--------+ | Name | +--------+ | BMW | | VOLVO | | Toyota | +--------+ 3 rows in set (0.00 sec)
广告