什么是 MySQL 子查询及其一般类别?

mysqlmysqli database

子查询最好定义为查询中的查询。子查询使您能够编写查询,以选择在运行时执行查询时实际开发的条件的数据行。更正式地说,它是在另一个 SELECT 语句的子句中使用 SELECT 语句。事实上,子查询可以包含在另一个子查询中,而子查询又在另一个子查询中,依此类推。子查询还可以嵌套在 INSERT、UPDATE 和 DELETE 语句中。子查询必须括在括号中。

子查询可用于允许表达式的任何地方,只要它返回单个值。这意味着返回单个值的子查询也可以作为对象列在 FROM 子句列表中。这被称为内联视图,因为当子查询用作 FROM 子句的一部分时,它会被视为虚拟表或视图。子查询可以放在主查询的 FROM 子句、WHERE 子句或 HAVING 子句中。它也被称为 INNER QUERY 或 INNER SELECT,包含子查询的查询被称为 OUTER QUERY 或 OUTER SELECT 或 CONTAINER QUERY。以下是它的一般类别 −

标量子查询

标量子查询返回单个值,即一行包含一列数据。标量子查询是一个简单的操作数,我们几乎可以在任何单列或文字合法的地方使用它。为了说明这一点,我们使用具有以下数据的表 ‘Cars’、‘Customers’ 和 ‘Reservations’−

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)

表子查询

表子查询返回的结果包含一行或多行数据,这些行包含一列或多列数据。以下查询使用来自表"cars"、"Customers"和"Reservations"的数据,是表子查询的一个示例 −

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 子句中使用外部查询的值的子查询。以下使用表"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)

相关文章