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

แบบสอบถามย่อย MySQL และหมวดหมู่ทั่วไปคืออะไร


เคียวรีย่อยกำหนดได้ดีที่สุดในฐานะคิวรีภายในเคียวรี เคียวรีย่อยช่วยให้คุณสามารถเขียนคิวรีที่เลือกแถวข้อมูลสำหรับเกณฑ์ที่พัฒนาขึ้นจริงในขณะที่คิวรีดำเนินการขณะรันไทม์ เป็นทางการมากขึ้น มันคือการใช้คำสั่ง SELECT ภายในหนึ่งในคำสั่งย่อยของคำสั่ง SELECT อื่น อันที่จริง เคียวรีย่อยสามารถอยู่ภายในเคียวรีย่อยอื่น ซึ่งอยู่ภายในเคียวรีย่อยอื่น และอื่นๆ แบบสอบถามย่อยสามารถซ้อนอยู่ภายในคำสั่ง INSERT, UPDATE และ DELETE แบบสอบถามย่อยต้องอยู่ในวงเล็บ

สามารถใช้แบบสอบถามย่อยที่ใดก็ได้ที่อนุญาตให้ใช้นิพจน์ได้ โดยให้ส่งกลับค่าเดียว ซึ่งหมายความว่าแบบสอบถามย่อยที่ส่งกลับค่าเดียวยังสามารถแสดงเป็นวัตถุในรายการคำสั่ง FROM นี่เรียกว่ามุมมองแบบอินไลน์ เนื่องจากเมื่อใช้เคียวรีย่อยเป็นส่วนหนึ่งของคำสั่งย่อย FROM จะถือว่าเป็นตารางเสมือนหรือมุมมอง แบบสอบถามย่อยสามารถวางได้ทั้งในส่วนคำสั่ง FROM, ส่วนคำสั่ง WHERE หรือส่วนคำสั่ง HAVING ของแบบสอบถามหลัก เรียกอีกอย่างว่า INNER QUERY หรือ INNER SELECT และเคียวรีที่มีเคียวรีย่อยเรียกว่า OUTER QUERY หรือ OUTER SELECT หรือ CONTAINER QUERY ต่อไปนี้เป็นหมวดหมู่ทั่วไป -

แบบสอบถามย่อยสเกลาร์

เคียวรีย่อยสเกลาร์ส่งคืนค่าเดียว กล่าวคือ หนึ่งแถวที่มีข้อมูลหนึ่งคอลัมน์ เคียวรีย่อยสเกลาร์เป็นตัวถูกดำเนินการอย่างง่าย และเราสามารถใช้ได้เกือบทุกที่ที่คอลัมน์เดียวหรือตามตัวอักษรถูกกฎหมาย เพื่อแสดงให้เห็นว่าเราใช้ตาราง 'รถยนต์', 'ลูกค้า' และ 'การจอง' ที่มีข้อมูลดังต่อไปนี้ -

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)

แบบสอบถามย่อยตาราง

แบบสอบถามย่อยของตารางส่งกลับผลลัพธ์ที่มีแถวอย่างน้อยหนึ่งแถวที่มีข้อมูลอย่างน้อยหนึ่งคอลัมน์ แบบสอบถามต่อไปนี้โดยใช้ข้อมูลจากตาราง 'รถยนต์', 'ลูกค้า' และ 'การจอง' เป็นตัวอย่างของแบบสอบถามย่อยตาราง -

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 แบบสอบถามต่อไปนี้โดยใช้ข้อมูลจากตาราง 'รถยนต์' เป็นตัวอย่างของแบบสอบถามย่อยที่มีความสัมพันธ์ -

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)