Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy vấn con vô hướng (scalar subquery) trong MySQL: Kết quả trả về và hạn chế


Truy vấn con vô hướng (scalar subquery) trong MySQL trả về chính xác một giá trị cột từ một hàng. Chúng ta có thể dùng nó ở bất kỳ nơi nào cho phép một cột đơn lẻ.

Trường hợp 1: Trả về 0 hàng

Nếu truy vấn con trả về 0 hàng, giá trị của biểu thức scalar subquery sẽ là NULL.

Trường hợp 2: Trả về nhiều hơn 1 hàng

Nếu truy vấn con trả về nhiều hơn 1 hàng, MySQL sẽ báo lỗi do tính chất của scalar subquery.

Ví dụ minh họa

Sử dụng dữ liệu từ bảng Customers và Reservations:

mysql> Select * from Customers;
+-------------+----------+
| Customer_Id | Name     |
+-------------+----------+
|           1 | Rahul    |
|           2 | Yashpal  |
|           3 | Gaurav   |
|           4 | Virender |
+-------------+----------+

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 |
+------+-------------+------------+

Truy vấn trả về chính xác một giá trị:

mysql> Select Name from Customers 
    WHERE customer_id = (Select Customer_id FROM reservations where id = 3);
+---------+
| Name    |
+---------+
| Yashpal |
+---------+
1 row in set (0.00 sec)

Truy vấn con trả về 0 hàng (id=10 không tồn tại):

mysql> Select Name from Customers 
    WHERE customer_id = (Select Customer_id FROM reservations where id = 10);
Empty set (0.00 sec)

MySQL trả về tập rỗng vì giá trị scalar subquery là NULL.

Hạn chế

Không thể dùng scalar subquery với các câu lệnh yêu cầu giá trị literal. Ví dụ: mệnh đề LIMIT yêu cầu đối số integer literal, nên không thể dùng scalar subquery cung cấp giá trị này.