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

แบบสอบถามย่อยสเกลาร์ MySQL ส่งคืนเอาต์พุตประเภทใด มีข้อ จำกัด ในการใช้งานกับแบบสอบถาม MySQL อย่างไร


MySQL scalar subquery ส่งคืนค่าคอลัมน์หนึ่งค่าจากแถวเดียว และเราสามารถใช้ค่านี้ในที่ที่อนุญาตให้ใช้คอลัมน์เดียวได้ ต่อไปนี้เป็นกรณีที่แบบสอบถามย่อยสเกลาร์ส่งคืนค่าอื่นที่ไม่ใช่หนึ่งแถว -

Case1 − เมื่อส่งคืน 0 แถว

ในกรณีที่เคียวรีย่อยส่งคืน 0 แถว ค่าของนิพจน์เคียวรีย่อยสเกลาร์จะเป็น NULL

Case2 − เมื่อส่งคืนมากกว่าหนึ่งแถว

ในกรณีที่เคียวรีย่อยส่งคืนมากกว่าหนึ่งแถว เนื่องจากคุณสมบัติของเคียวรีย่อยสเกลาร์ MySQL จะส่งกลับข้อผิดพลาด

สามารถเข้าใจได้ด้วยความช่วยเหลือของตัวอย่างซึ่งใช้ข้อมูลจากตารางต่อไปนี้ -

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 = 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 คืนค่าชุดว่าง เช่น 0 แถว เนื่องจากค่าของนิพจน์เคียวรีย่อยสเกลาร์เป็น NULL (ไม่มี id ที่เท่ากับ 10)

ข้อจำกัดในการใช้เคียวรีย่อยสเกลาร์กับเคียวรี MySQL คือ เราสามารถใช้เคียวรีย่อยสเกลาร์กับข้อความสั่งที่อนุญาตเฉพาะค่าตามตัวอักษรเท่านั้น ตัวอย่างเช่น ตามที่เราทราบดีว่า LIMIT ต้องการอาร์กิวเมนต์จำนวนเต็มตามตัวอักษร ดังนั้นเราจึงใช้เคียวรีย่อยสเกลาร์เพื่อระบุค่าเหล่านี้ไม่ได้