Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

Subquery แบบสเกลาร์ (Scalar Subquery) ใน MySQL คืนค่าอะไรและมีข้อจำกัดอะไร


MySQL Scalar Subquery คืนค่า คอลัมน์เดียวจากแถวเดียว (exactly one column value from one row) และใช้ได้ที่อนุญาตให้ใช้คอลัมน์เดียว กรณีที่คืนค่าไม่ใช่ 1 แถว มี 2 กรณี:

กรณีที่ 1 - คืน 0 แถว

ถ้า Subquery คืน 0 แถว ค่าของ Scalar Subquery จะเป็น NULL

กรณีที่ 2 - คืนมากกว่า 1 แถว

ถ้า Subquery คืนมากกว่า 1 แถว MySQL จะคืนข้อผิดพลาด (Error) เนื่องจาก Scalar Subquery ต้องคืนได้มากสุด 1 แถว

ตัวอย่าง

ใช้ข้อมูลจากตาราง Customers และ Reservations:

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)

คืนค่า 1 แถว 1 คอลัมน์ (ปกติ)

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)

คืนค่า 0 แถว (เป็น NULL)

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

MySQL คืน Empty set เพราะ Scalar subquery เป็น NULL (ไม่มี id = 10)

ข้อจำกัด

ไม่สามารถใช้ Scalar Subquery กับคำสั่งที่ต้องการค่าคงที่ (Literal) เท่านั้น เช่น LIMIT ต้องการจำนวนเต็มแบบ Literal จึงไม่สามารถใช้ Scalar Subquery ให้ค่า LIMIT ได้