MySQL - SubQuery: Hướng dẫn cho người mới bắt đầu

Xin chào các bạn tương lai của các nhà thông thái cơ sở dữ liệu! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của các truy vấn con trong MySQL. Đừng lo lắng nếu bạn mới làm quen với lập trình - tôi sẽ là người bạn thân thiện của bạn, giải thích các khái niệm phức tạp thành những phần nhỏ, dễ tiêu hóa. Vậy, hãy cầm một tách cà phê (hoặc trà, nếu đó là sở thích của bạn), và chúng ta cùng nhảy vào!

MySQL - SubQuery

Truy vấn con là gì?

Trước khi bắt đầu, hãy hiểu xem truy vấn con là gì. Hãy tưởng tượng bạn đang lên kế hoạch cho một buổi tiệc và cần lập danh sách bạn bè thích bánh kem chocolate. Bạn đầu tiên lập danh sách tất cả bạn bè của mình, sau đó đánh dấu những người thích bánh kem chocolate. Trong thuật ngữ SQL, danh sách chính là truy vấn chính của bạn, và quá trình đánh dấu những người thích bánh kem chocolate là truy vấn con của bạn. Đó là một truy vấn trong một truy vấn - khá thú vị phải không?

Bây giờ, hãy cùng khám phá cách chúng ta có thể sử dụng truy vấn con trong các câu lệnh MySQL khác nhau.

Truy vấn con với câu lệnh SELECT

Câu lệnh SELECT giống như một kính lúp cho cơ sở dữ liệu của bạn. Nó giúp bạn tìm và lấy thông tin cụ thể. Khi chúng ta thêm một truy vấn con vào SELECT, nó giống như thêm một kính lúp thứ hai để nhìn kỹ hơn!

Giả sử chúng ta có hai bảng: employeesdepartments. Chúng ta muốn tìm tất cả nhân viên làm việc trong phòng 'IT'.

SELECT first_name, last_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = 'IT'
);

Trong ví dụ này, truy vấn con (SELECT department_id FROM departments WHERE department_name = 'IT') chạy trước. Nó tìm department_id của phòng IT. Sau đó, truy vấn chính sử dụng ID này để tìm tất cả nhân viên trong phòng đó.

Hãy tưởng tượng như này: Bạn đầu tiên hỏi, "ID của phòng IT là gì?", sau đó sử dụng câu trả lời đó để hỏi, "Ai làm việc trong phòng có ID này?"

Truy vấn con với câu lệnh INSERT

Bây giờ, hãy nói về việc sử dụng truy vấn con với INSERT. Điều này giống như sao chép thông tin từ một danh sách này sang danh sách khác, nhưng chỉ một phần.

Giả sử chúng ta có một bảng top_performers và muốn.fill nó với các nhân viên đã đạt doanh số trên 100.000 đô la.

INSERT INTO top_performers (employee_id, employee_name, sales)
SELECT employee_id, CONCAT(first_name, ' ', last_name), total_sales
FROM employees
WHERE total_sales > 100000;

Ở đây, truy vấn con thực tế là toàn bộ câu lệnh SELECT. Nó tìm tất cả nhân viên có doanh số trên 100.000 đô la, và câu lệnh INSERT thêm họ vào bảng top_performers.

Giống như nói, "Tìm tất cả những người bán hàng xuất sắc và đặt họ vào danh sách VIP của chúng ta!"

Truy vấn con với phép so sánh

Truy vấn con cũng có thể được sử dụng với các phép so sánh như >, <, =, v.v. Điều này rất hữu ích khi bạn muốn so sánh một giá trị với kết quả từ một truy vấn khác.

Hãy tìm tất cả nhân viên có mức lương cao hơn mức lương trung bình:

SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);

Truy vấn con (SELECT AVG(salary) FROM employees) tính toán mức lương trung bình. Truy vấn chính sau đó so sánh mức lương của mỗi nhân viên với mức lương trung bình này.

Giống như hỏi, "Ai là những người có thu nhập cao trong công ty chúng ta?"

Truy vấn con với toán tử IN hoặc NOT IN

Các toán tử IN và NOT IN rất hữu ích khi bạn muốn kiểm tra xem một giá trị có khớp với bất kỳ giá trị nào trong một danh sách hay không. Với truy vấn con, danh sách đó có thể được tạo ra động!

Hãy tìm tất cả nhân viên cũng là quản lý:

SELECT first_name, last_name
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
WHERE manager_id IS NOT NULL
);

Ở đây, truy vấn con tạo ra một danh sách tất cả các ID quản lý. Truy vấn chính sau đó tìm tất cả nhân viên có ID trong danh sách này.

Giống như hỏi, "Ai nằm trong danh sách quản lý?"

Truy vấn con trong chương trình client

Mặc dù hầu hết các ví dụ của chúng ta là trực tiếp trong SQL, bạn cũng có thể sử dụng truy vấn con trong các chương trình client. Điều này đặc biệt hữu ích khi bạn cần thực hiện các thao tác phức tạp hoặc khi truy vấn con phụ thuộc vào đầu vào của người dùng.

Dưới đây là một ví dụ đơn giản bằng Python sử dụng thư viện mysql-connector:

import mysql.connector

# Kết nối đến cơ sở dữ liệu
cnx = mysql.connector.connect(user='your_username', password='your_password',
host='127.0.0.1', database='your_database')
cursor = cnx.cursor()

# Lấy đầu vào từ người dùng
department = input("Nhập tên phòng ban: ")

# Tạo và thực thi truy vấn
query = """
SELECT first_name, last_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = %s
)
"""
cursor.execute(query, (department,))

# Lấy và in kết quả
for (first_name, last_name) in cursor:
print(f"{first_name} {last_name}")

# Đóng kết nối
cursor.close()
cnx.close()

Script này yêu cầu người dùng nhập tên phòng ban, sau đó tìm tất cả nhân viên trong phòng ban đó. Giống như có một trợ lý robot thân thiện có thể nhanh chóng tra cứu thông tin cho bạn!

Kết luận

Chúc mừng! Bạn đã chính thức bước vào thế giới mạnh mẽ của truy vấn con trong MySQL. Nhớ rằng, thực hành là chìa khóa của sự hoàn hảo, vì vậy đừng ngại thử nghiệm với các khái niệm này.

Dưới đây là bảng tóm tắt nhanh về các loại truy vấn con chúng ta đã覆盖:

Loại truy vấn con Mô tả Ví dụ sử dụng
SELECT Truy vấn trong một câu lệnh SELECT Tìm dữ liệu liên quan giữa các bảng
INSERT Sử dụng SELECT như một truy vấn con trong INSERT Sao chép dữ liệu đã lọc sang bảng khác
So sánh Sử dụng kết quả truy vấn con để so sánh So sánh với kết quả tổng hợp
IN/NOT IN Kiểm tra sự tồn tại trong kết quả truy vấn con Tìm khớp giữa dữ liệu liên quan
Chương trình client Sử dụng truy vấn con trong mã ứng dụng Truy vấn động dựa trên đầu vào người dùng

Nhớ rằng, truy vấn con là như vũ khí bí mật trong bộ công cụ SQL của bạn. Chúng có thể看起来 phức tạp ban đầu, nhưng với sự thực hành, bạn sẽ sử dụng chúng như một chuyên gia trong thời gian ngắn!

Chúc các bạn thành công, những người chủ tương lai của dữ liệu!

Credits: Image by storyset