1. Giới thiệu

ANY ALL là hai toán tử trong MySQL được sử dụng để so sánh một giá trị với một tập hợp con được trả về bởi một truy vấn con (subquery). Cả hai đều được sử dụng với các toán tử so sánh như =, >, <, >=, <=, và <> để thực hiện các so sánh với nhiều giá trị.

  • ANY: Trả về TRUE nếu bất kỳ giá trị nào trong tập hợp con thỏa mãn điều kiện.
  • ALL: Trả về TRUE nếu tất cả các giá trị trong tập hợp con thỏa mãn điều kiện.

Bài viết này sẽ giúp bạn hiểu rõ hơn về cách sử dụng ANYALL, cú pháp, và các ví dụ thực tế từ bảng dữ liệu giả định.

2. Cú pháp của ANY và ALL trong MySQL

Cú pháp của ANY:

shell
SELECT column1, column2, ...
FROM table_name
WHERE column_name comparison_operator ANY (subquery);

Cú pháp của ALL:

shell
SELECT column1, column2, ...
FROM table_name
WHERE column_name comparison_operator ALL (subquery);
  • comparison_operator: Các toán tử so sánh như =, >, <, >=, <=, <>.
  • subquery: Là một truy vấn con trả về một tập hợp giá trị để so sánh với column_name.

3. Bảng dữ liệu giả định

Giả sử chúng ta có hai bảng employeesdepartments như sau:

Bảng employees:

employee_idfirst_namelast_namedepartment_idsalary
1JohnDoe11500000
2JaneSmith21700000
3BobJohnson11300000
4AliceBrown32000000
5CharlieGreenNULL1800000

Bảng departments:

department_iddepartment_name
1Sales
2Marketing
3HR
4IT

4. Cách sử dụng ANY

Toán tử ANY trả về TRUE nếu bất kỳ giá trị nào trong tập hợp con thỏa mãn điều kiện.

a. Sử dụng ANY với toán tử so sánh

Ví dụ 1: Tìm các nhân viên có lương lớn hơn lương của ít nhất một nhân viên trong phòng ban "Sales"

shell
SELECT first_name, last_name, salary
FROM employees
WHERE salary > ANY (
    SELECT salary
    FROM employees
    WHERE department_id = 1
);

Kết quả:

first_namelast_namesalary
JaneSmith1700000
AliceBrown2000000
CharlieGreen1800000

Trong ví dụ này, ANY kiểm tra xem lương của nhân viên có lớn hơn bất kỳ lương nào trong phòng ban "Sales" hay không. Nếu có, nhân viên đó sẽ được trả về.

b. Sử dụng ANY với điều kiện khác

Ví dụ 2: Tìm các nhân viên có mức lương bằng với mức lương của bất kỳ nhân viên nào trong phòng ban "Marketing"

shell
SELECT first_name, last_name, salary
FROM employees
WHERE salary = ANY (
    SELECT salary
    FROM employees
    WHERE department_id = 2
);

Kết quả:

first_namelast_namesalary
JaneSmith1700000
CharlieGreen1800000

Trong ví dụ này, ANY kiểm tra xem lương của nhân viên có bằng với lương của bất kỳ nhân viên nào trong phòng ban "Marketing" hay không.

5. Cách sử dụng ALL

Toán tử ALL trả về TRUE nếu tất cả các giá trị trong tập hợp con thỏa mãn điều kiện.

a. Sử dụng ALL với toán tử so sánh

Ví dụ 3: Tìm tất cả các nhân viên có lương cao hơn tất cả các nhân viên trong phòng ban "Sales"

shell
SELECT first_name, last_name, salary
FROM employees
WHERE salary > ALL (
    SELECT salary
    FROM employees
    WHERE department_id = 1
);

Kết quả:

first_namelast_namesalary
JaneSmith1700000
AliceBrown2000000
CharlieGreen1800000

Trong ví dụ này, ALL kiểm tra xem lương của nhân viên có cao hơn tất cả các lương trong phòng ban "Sales" hay không. Nếu đúng, nhân viên đó sẽ được trả về.

b. Sử dụng ALL với các điều kiện khác

Ví dụ 4: Tìm tất cả các nhân viên có mức lương nhỏ hơn mức lương của tất cả các nhân viên trong phòng ban "HR"

shell
SELECT first_name, last_name, salary
FROM employees
WHERE salary < ALL (
    SELECT salary
    FROM employees
    WHERE department_id = 3
);

Kết quả:

first_namelast_namesalary
JohnDoe1500000
BobJohnson1300000
JaneSmith1700000
CharlieGreen1800000

Trong ví dụ này, ALL kiểm tra xem lương của nhân viên có thấp hơn tất cả các lương trong phòng ban "HR" hay không. Nếu đúng, nhân viên đó sẽ được trả về.

6. Các ví dụ thực tế khác về ANY và ALL trong MySQL

Ví dụ 1: Tìm các nhân viên có lương lớn hơn ít nhất một nhân viên trong phòng ban "Marketing"

shell
SELECT first_name, last_name, salary
FROM employees
WHERE salary > ANY (
    SELECT salary
    FROM employees
    WHERE department_id = 2
);

Ví dụ 2: Tìm các nhân viên có lương nhỏ hơn lương của tất cả các nhân viên trong phòng ban "HR"

shell
SELECT first_name, last_name, salary
FROM employees
WHERE salary < ALL (
    SELECT salary
    FROM employees
    WHERE department_id = 3
);

Ví dụ 3: Tìm các nhân viên có lương bằng với bất kỳ lương nào trong phòng ban "Sales"

shell
SELECT first_name, last_name, salary
FROM employees
WHERE salary = ANY (
    SELECT salary
    FROM employees
    WHERE department_id = 1
);

Ví dụ 4: Tìm các nhân viên có lương cao hơn tất cả các nhân viên trong phòng ban "Marketing"

shell
SELECT first_name, last_name, salary
FROM employees
WHERE salary > ALL (
    SELECT salary
    FROM employees
    WHERE department_id = 2
);

7. Một số lưu ý khi sử dụng ANY và ALL trong MySQL

a. Sử dụng ANY khi chỉ cần thỏa mãn một điều kiện

Toán tử ANY rất hữu ích khi bạn chỉ cần kiểm tra xem một giá trị có lớn hơn hoặc nhỏ hơn bất kỳ giá trị nào trong tập hợp con. Điều này giúp bạn tìm ra các giá trị mà không cần tất cả các giá trị trong tập hợp con phải thỏa mãn điều kiện.

b. Sử dụng ALL khi cần thỏa mãn tất cả các điều kiện

Toán tử ALL yêu cầu tất cả các giá trị trong tập hợp con phải thỏa mãn điều kiện. Điều này phù hợp khi bạn cần so sánh một giá trị với tất cả các giá trị trong tập hợp con.

c. Kết hợp với các hàm tổng hợp

Cả ANYALL đều có thể kết hợp với các hàm tổng hợp (như SUM(), AVG()) để thực hiện các so sánh phức tạp hơn.

Kết luận

ANYALL là các toán tử mạnh mẽ được sử dụng để thực hiện các phép so sánh phức tạp với một tập hợp con được trả về bởi truy vấn con. Trong khi ANY trả về TRUE nếu bất kỳ giá trị nào trong tập hợp thỏa mãn điều kiện, thì ALL yêu cầu tất cả các giá trị trong tập hợp phải thỏa mãn điều kiện.

Hãy thử áp dụng các ví dụ này trong các bài tập và dự án thực tế trên CodeTutHub để thành thạo hơn về cách sử dụng ANYALL trong MySQL!