MySQL子查询及其通用类别是什么?
子查询最好定义为查询内的查询。子查询使您能够编写查询,选择在运行时实际开发的标准数据行。更正式地说,它是在另一个SELECT语句的一个子句中使用SELECT语句的使用。实际上,一个子查询可以包含在另一个子查询中,该子查询位于另一个子查询中,依此类推。还可以在INSERT,UPDATE和DELETE语句中嵌套子查询。子查询必须放在括号中。
任何允许表达式的地方都可以使用子查询,只要它返回单个值。这意味着返回单个值的子查询也可以在FROM子句列表中列出为对象。这称为行内视图,因为当子查询用作FROM子句的一部分时,它被视为虚拟表或视图。子查询可以放置在主查询的FROM子句,WHERE子句或HAVING子句中。它也称为INNER QUERY或INNER SELECT,包含子查询的查询称为OUTER QUERY或OUTER SELECT或CONTAINER QUERY。以下是其通用类别−
阅读更多:MySQL 教程
标量子查询
标量子查询返回单个值,即包含一行数据的一列。标量子查询是一个简单的操作数,我们可以在几乎任何允许单列或文字的地方使用它。为了说明它,我们使用具有以下数据的表“Cars”、“Customers”和“Reservations”−
mysql>从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>从客户中选择*;
+-------------+----------+
| Customer_Id | Name |
+-------------+----------+
| 1 | Rahul |
| 2 | Yashpal |
| 3 | Gaurav |
| 4 | Virender |
+-------------+----------+
4 rows in set (0.00 sec)
mysql>从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>从客户中选择名称,其中Customer_id =(从Reservations中选择Customer_id WHERE ID = 5);
+--------+
| Name |
+--------+
| Gaurav |
+--------+
1 row in set (0.06 sec)
表子查询
表子查询返回一个带有一个或多个列的一行或多行数据的结果。以下使用表“cars”、“Customers”和“Reservations”的数据的查询是表子查询的示例−
mysql>从客户中选择名称where Customer_id IN(SELECT DISTINCT Customer_id from reservations);
+---------+
| Name |
+---------+
| Rahul |
| Yashpal |
| Gaurav |
+---------+
3 rows in set (0.05 sec)
相关子查询
相关子查询是在其WHERE子句中使用外部查询中的值的子查询。以下查询使用来自“cars”表的数据作为相关子查询的示例−
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)