SQL - Sub Queries

Xin chào các bạn đam mê SQL! Tôi rất vui mừng được làm hướng dẫn viên cho các bạn trong hành trình thú vị vào thế giới của các truy vấn con (subqueries) trong SQL. Là một ai đó đã dạy khoa học máy tính trong nhiều năm, tôi có thể告诉 bạn rằng các truy vấn con giống như gia vị bí mật có thể nâng cao kỹ năng SQL của bạn từ tốt lên xuất sắc. Hãy cùng nhau lặn sâu và giải mã những bí ẩn của các truy vấn con nhé!

SQL - Sub Queries

SQL Subqueries

What are Subqueries?

Hãy tưởng tượng bạn đang làm một sandwich. Bánh mì là truy vấn chính của bạn, nhưng điều làm cho nó thực sự ngon là phần nhân bên trong - đó là truy vấn con của bạn! Trong thuật ngữ SQL, một truy vấn con là một truy vấn được nhúng bên trong một truy vấn khác. Nó giống như hỏi một câu hỏi trong một câu hỏi, cho phép bạn thực hiện các thao tác phức tạp mà có thể không thể thực hiện được với một truy vấn đơn.

Hãy xem một ví dụ đơn giản:

SELECT employee_name
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Marketing');

Trong truy vấn này, phần bên trong dấu ngoặc đơn là truy vấn con của chúng ta. Nó đang tìm department_id của phòng ban Marketing, sau đó được sử dụng bởi truy vấn ngoài để tìm tất cả nhân viên trong phòng ban đó.

Rules to be followed

Trước khi chúng ta đi sâu hơn, hãy cùng xem qua một số quy tắc quan trọng khi sử dụng các truy vấn con:

  1. Các truy vấn con phải được bao bọc trong dấu ngoặc đơn.
  2. Một truy vấn con chỉ có thể có một cột trong phần SELECT,除非主查询中有多列用于比较。
  3. Lệnh ORDER BY không thể được sử dụng trong một truy vấn con, mặc dù truy vấn chính có thể sử dụng ORDER BY.
  4. Các truy vấn con trả về nhiều hơn một hàng chỉ có thể được sử dụng với các toán tử giá trị nhiều như toán tử IN.

Dưới đây là bảng tóm tắt các quy tắc này:

Quy tắc Mô tả
Dấu ngoặc đơn Các truy vấn con phải được bao bọc trong dấu ngoặc đơn
Một cột Truy vấn SELECT của truy vấn con thường chỉ trả về một cột
Không ORDER BY ORDER BY không thể được sử dụng trong một truy vấn con
Nhiều hàng Sử dụng các toán tử giá trị nhiều cho các truy vấn con trả về nhiều hàng

Subqueries with the SELECT Statement

Các truy vấn con thường được sử dụng nhất với câu lệnh SELECT. Chúng có thể rất mạnh mẽ cho việc lấy dữ liệu dựa trên các điều kiện động. Hãy xem một ví dụ phức tạp hơn:

SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);

Truy vấn này lấy tất cả các sản phẩm có giá cao hơn giá trung bình của tất cả các sản phẩm. Truy vấn con tính toán giá trung bình, và truy vấn chính sử dụng kết quả này để lọc các sản phẩm.

Dưới đây là một ví dụ khác sử dụng một truy vấn con trong phần SELECT:

SELECT
employee_name,
salary,
(SELECT AVG(salary) FROM employees) as avg_salary
FROM employees;

Truy vấn này không chỉ lấy tên và lương của mỗi nhân viên mà còn bao gồm cả lương trung bình của tất cả nhân viên trong mỗi hàng. Nó giống như có một báo cáo nhỏ cho mỗi nhân viên!

Subqueries with the INSERT Statement

Các truy vấn con cũng có thể được sử dụng với câu lệnh INSERT để.fill dữ liệu từ bảng khác. Dưới đây là một ví dụ:

INSERT INTO high_salary_employees (employee_id, employee_name, salary)
SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) * 1.5 FROM employees);

Truy vấn này chèn vào bảng high_salary_employees tất cả các nhân viên có lương hơn 1.5 lần lương trung bình. Nó giống như tạo một danh sách VIP của những người có thu nhập cao nhất!

Subqueries with the UPDATE Statement

Các truy vấn con có thể làm cho câu lệnh UPDATE mạnh mẽ hơn. Hãy xem một ví dụ:

UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');

Truy vấn này tăng giá của tất cả các sản phẩm trong danh mục 'Electronics' lên 10%. Truy vấn con tìm category_id của 'Electronics', sau đó được sử dụng bởi truy vấn chính để cập nhật các sản phẩm đúng.

Subqueries with the DELETE Statement

Cuối cùng, hãy xem cách sử dụng các truy vấn con với câu lệnh DELETE:

DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
);

Truy vấn này xóa tất cả các đơn hàng của những khách hàng không đặt hàng trong một năm qua. Truy vấn con tìm tất cả các khách hàng như vậy, và truy vấn chính xóa các đơn hàng của họ.

Và thế là bạn đã có nó, các bạn ơi! Chúng ta đã cùng nhau hành trình qua thế giới của các truy vấn con trong SQL, từ khái niệm cơ bản đến các ứng dụng phức tạp hơn. Nhớ rằng, thực hành là cách tốt nhất để hoàn thiện, vì vậy đừng ngần ngại thử nghiệm các truy vấn này trên cơ sở dữ liệu của riêng bạn.

Như tôi luôn nói với học sinh của mình, SQL giống như một con dao quân多用 - và các truy vấn con là lưỡi dao ẩn giấu có thể giúp bạn thoát khỏi những tình huống khó khăn. Vậy hãy tiếp tục khám phá, tiếp tục truy vấn, và quan trọng nhất, hãy tiếp tục học hỏi!

Credits: Image by storyset