Computer >> Máy Tính >  >> Lập trình >> MySQL

Truy vấn con MySQL và các danh mục chung của nó là gì?


Tốt nhất nên xác định một truy vấn con là một truy vấn trong một truy vấn. Truy vấn con cho phép bạn viết các truy vấn chọn hàng dữ liệu cho các tiêu chí thực sự được phát triển trong khi truy vấn đang thực thi trong thời gian chạy. Chính thức hơn, nó là việc sử dụng một câu lệnh SELECT bên trong một trong các mệnh đề của một câu lệnh SELECT khác. Trên thực tế, một truy vấn con có thể được chứa bên trong một truy vấn con khác, bên trong một truy vấn con khác, v.v. Một truy vấn con cũng có thể được lồng vào bên trong các câu lệnh INSERT, UPDATE và DELETE. Truy vấn con phải được đặt trong dấu ngoặc đơn.

Truy vấn con có thể được sử dụng ở bất kỳ nơi nào cho phép biểu thức với điều kiện nó trả về một giá trị duy nhất. Điều này có nghĩa là một truy vấn con trả về một giá trị duy nhất cũng có thể được liệt kê như một đối tượng trong danh sách mệnh đề FROM. Đây được gọi là dạng xem nội tuyến vì khi truy vấn con được sử dụng như một phần của mệnh đề FROM, nó được coi như một bảng hoặc dạng xem ảo. Một truy vấn con có thể được đặt trong mệnh đề FROM, mệnh đề WHERE hoặc mệnh đề HAVING của truy vấn chính. Nó còn được gọi là QUERY INNER hoặc INNER SELECT và truy vấn có chứa truy vấn con được gọi là OUTER QUERY hoặc OUTER SELECT hoặc CONTAINER QUERY. Tiếp theo là các danh mục chung của nó -

Truy vấn con vô hướng

Truy vấn con vô hướng trả về một giá trị duy nhất, tức là một hàng với một cột dữ liệu. Một truy vấn con vô hướng là một toán hạng đơn giản và chúng ta có thể sử dụng nó ở hầu hết mọi nơi mà một cột hoặc một chữ là hợp pháp. Để minh họa điều đó, chúng tôi đang sử dụng các bảng "Ô tô", "Khách hàng" và "Đặt chỗ" có dữ liệu sau -

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)

Như chúng ta biết rằng truy vấn con vô hướng sẽ trả về một giá trị duy nhất, sau đây là truy vấn con vô hướng -

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)

Truy vấn con trong bảng

Truy vấn con trong bảng trả về kết quả có một hoặc nhiều hàng chứa một hoặc nhiều cột dữ liệu. Truy vấn sau sử dụng dữ liệu từ các bảng "xe hơi", "Khách hàng" và "Đặt chỗ trước" là một ví dụ về truy vấn con của bảng -

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)

Truy vấn con có liên quan

Truy vấn con tương quan là một truy vấn con sử dụng các giá trị từ truy vấn bên ngoài trong mệnh đề WHERE của nó. Truy vấn sau sử dụng dữ liệu từ bảng 'ô tô' là một ví dụ về truy vấn con tương quan -

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)