Câu lệnh SELECT trong MySQL là một trong những câu lệnh quan trọng nhất, được sử dụng để truy vấn và lấy dữ liệu từ cơ sở dữ liệu. Để hiểu rõ về SELECT, chúng ta sẽ đi từ những ví dụ cơ bản đến các tình huống nâng cao hơn.

1. Cú pháp cơ bản của câu lệnh SELECT

Cú pháp cơ bản của câu lệnh SELECT như sau:

SELECT column1, column2, ...
FROM table_name;

Trong đó:

  • column1, column2, …: Tên các cột mà bạn muốn truy vấn.
  • table_name: Tên của bảng chứa dữ liệu.

Ví dụ:

Giả sử chúng ta có bảng employees với các cột: id, name, age, và salary.

SELECT name, age
FROM employees;

Lệnh này sẽ lấy thông tin về nameage của tất cả nhân viên trong bảng employees.

2. Lấy tất cả cột dữ liệu với dấu *

Nếu muốn lấy tất cả các cột trong bảng, bạn có thể sử dụng ký tự *.

SELECT *
FROM employees;

Lệnh này sẽ trả về toàn bộ dữ liệu của bảng employees.

3. Sử dụng WHERE để lọc dữ liệu

Để truy vấn dữ liệu theo điều kiện cụ thể, chúng ta sử dụng mệnh đề WHERE.

SELECT name, salary
FROM employees
WHERE age > 30;

Câu lệnh này trả về danh sách nhân viên có tuổi lớn hơn 30.

Kết hợp nhiều điều kiện với AND, OR

Bạn có thể sử dụng ANDOR để kết hợp nhiều điều kiện trong WHERE.

SELECT name, salary
FROM employees
WHERE age > 30 AND salary > 5000;

Câu lệnh này trả về danh sách nhân viên có tuổi lớn hơn 30 và mức lương lớn hơn 5000.

SELECT name, salary
FROM employees
WHERE age > 30 OR salary > 5000;

Câu lệnh này trả về nhân viên có tuổi lớn hơn 30 hoặc lương lớn hơn 5000.

4. Sắp xếp dữ liệu với ORDER BY

Bạn có thể sử dụng ORDER BY để sắp xếp kết quả theo thứ tự tăng dần (ASC) hoặc giảm dần (DESC).

SELECT name, salary
FROM employees
ORDER BY salary DESC;

Lệnh này sẽ sắp xếp danh sách nhân viên theo lương giảm dần.

5. Giới hạn số dòng trả về với LIMIT

Để giới hạn số lượng kết quả trả về, chúng ta sử dụng LIMIT.

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;

Lệnh này sẽ lấy 5 nhân viên có mức lương cao nhất.

6. Sử dụng LIKE để tìm kiếm mẫu dữ liệu

Mệnh đề LIKE được sử dụng để tìm kiếm dữ liệu dựa trên một mẫu.

SELECT name
FROM employees
WHERE name LIKE 'J%';

Lệnh này sẽ trả về danh sách nhân viên có tên bắt đầu bằng chữ ‘J’. Ký tự % đại diện cho bất kỳ chuỗi ký tự nào.

7. Sử dụng IN để kiểm tra nhiều giá trị

Mệnh đề IN giúp kiểm tra một cột có thuộc vào một tập hợp giá trị cụ thể không.

SELECT name, salary
FROM employees
WHERE age IN (25, 30, 35);

Lệnh này trả về danh sách nhân viên có tuổi là 25, 30 hoặc 35.

8. Sử dụng BETWEEN để kiểm tra khoảng giá trị

Mệnh đề BETWEEN giúp kiểm tra xem giá trị có nằm trong một khoảng xác định.

SELECT name, salary
FROM employees
WHERE salary BETWEEN 3000 AND 6000;

Lệnh này trả về danh sách nhân viên có mức lương từ 3000 đến 6000.

9. Alias (Bí danh) cho cột hoặc bảng

Bí danh (AS) được sử dụng để đặt tên tạm cho cột hoặc bảng, giúp kết quả dễ đọc hơn.

SELECT name AS EmployeeName, salary AS EmployeeSalary
FROM employees;

Lệnh này trả về kết quả với các cột được đổi tên thành EmployeeNameEmployeeSalary.

10. Kết hợp nhiều bảng với JOIN

Bạn có thể kết hợp dữ liệu từ nhiều bảng khác nhau bằng cách sử dụng các kiểu JOIN như INNER JOIN, LEFT JOIN, RIGHT JOIN.

Ví dụ sử dụng INNER JOIN:

Giả sử có bảng departments với các cột: id, department_name.

SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;

Lệnh này sẽ trả về tên nhân viên và tên phòng ban tương ứng, chỉ với những nhân viên có phòng ban (bảng employeesdepartment_id khớp với bảng departments).

11. Tính toán trên dữ liệu với hàm tổng hợp

MySQL cung cấp các hàm tổng hợp để thực hiện các tính toán trên dữ liệu như COUNT, SUM, AVG, MIN, MAX.

Tính số lượng nhân viên:

SELECT COUNT(*) AS TotalEmployees
FROM employees;

Lệnh này trả về tổng số nhân viên trong bảng.

Tính tổng lương:

SELECT SUM(salary) AS TotalSalary
FROM employees;

Lệnh này trả về tổng mức lương của tất cả nhân viên.

12. Sử dụng GROUP BY để nhóm dữ liệu

Mệnh đề GROUP BY được sử dụng để nhóm dữ liệu dựa trên một hoặc nhiều cột.

SELECT department_id, AVG(salary) AS AvgSalary
FROM employees
GROUP BY department_id;

Lệnh này trả về mức lương trung bình của từng phòng ban.

13. Sử dụng HAVING để lọc dữ liệu sau khi nhóm

Khác với WHERE, HAVING được sử dụng để lọc dữ liệu sau khi đã sử dụng GROUP BY.

SELECT department_id, AVG(salary) AS AvgSalary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;

Lệnh này trả về những phòng ban có mức lương trung bình lớn hơn 5000.

14. Lồng câu lệnh SELECT

Bạn có thể lồng một câu lệnh SELECT bên trong câu lệnh khác.

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

Lệnh này trả về danh sách nhân viên có lương lớn hơn mức lương trung bình của tất cả nhân viên.

15. Sử dụng DISTINCT để loại bỏ bản ghi trùng lặp

Mệnh đề DISTINCT được sử dụng để loại bỏ các kết quả trùng lặp trong dữ liệu.

SELECT DISTINCT department_id
FROM employees;

Lệnh này trả về danh sách các department_id khác nhau trong bảng employees.

Kết luận:

Câu lệnh SELECT trong MySQL là công cụ mạnh mẽ giúp bạn truy vấn và thao tác dữ liệu từ cơ sở dữ liệu. Bạn có thể kết hợp nhiều mệnh đề như WHERE, ORDER BY, JOIN, và sử dụng các hàm tổng hợp, các kỹ thuật nhóm dữ liệu với GROUP BY, cũng như thực hiện các phép tính toán phức tạp khác để khai thác dữ liệu hiệu quả.

Dưới đây là một số ví dụ nâng cao về câu lệnh SELECT trong MySQL, giúp bạn hiểu sâu hơn về các trường hợp phức tạp khi làm việc với dữ liệu lớn và các yêu cầu truy vấn đặc biệt.

1. Sử dụng CASE trong câu lệnh SELECT

CASE trong MySQL được sử dụng để đưa ra các giá trị có điều kiện giống như một lệnh if-else.

SELECT name, 
       salary, 
       CASE 
           WHEN salary > 7000 THEN 'High'
           WHEN salary BETWEEN 5000 AND 7000 THEN 'Medium'
           ELSE 'Low'
       END AS SalaryLevel
FROM employees;

Lệnh này sẽ trả về tên nhân viên, mức lương, và phân loại mức lương (Cao, Trung bình, Thấp) dựa trên giá trị của salary.

2. Sử dụng UNION để kết hợp nhiều truy vấn

UNION được sử dụng để kết hợp kết quả của nhiều truy vấn SELECT khác nhau. Các truy vấn phải có cùng số lượng cột và kiểu dữ liệu tương ứng.

SELECT name, salary 
FROM employees 
WHERE department_id = 1
UNION
SELECT name, salary 
FROM employees 
WHERE department_id = 2;

Lệnh này sẽ trả về danh sách nhân viên từ cả hai phòng ban (có department_id là 1 và 2). UNION sẽ loại bỏ các bản ghi trùng lặp. Nếu muốn bao gồm tất cả bản ghi (kể cả bản trùng), bạn có thể sử dụng UNION ALL.

3. Tự nối bảng (Self-Join)

Tự nối bảng là việc nối một bảng với chính nó để truy vấn các mối quan hệ phức tạp trong cùng một bảng.

SELECT A.name AS Employee, B.name AS Manager
FROM employees A
INNER JOIN employees B ON A.manager_id = B.id;

Lệnh này sẽ trả về tên nhân viên và tên của người quản lý của họ. Trong bảng employees, cột manager_id là khóa ngoại trỏ đến id của người quản lý trong cùng bảng.

4. Sử dụng EXISTS để kiểm tra sự tồn tại

EXISTS được sử dụng để kiểm tra xem một truy vấn con có trả về kết quả nào hay không. Điều này rất hữu ích khi bạn muốn biết một điều kiện có thỏa mãn trong một tập hợp con dữ liệu hay không.

SELECT name
FROM employees E
WHERE EXISTS (SELECT 1 
              FROM departments D 
              WHERE D.id = E.department_id AND D.department_name = 'Sales');

Lệnh này trả về danh sách nhân viên thuộc phòng ban “Sales”. EXISTS trả về TRUE nếu truy vấn con trả về bất kỳ kết quả nào.

5. Sử dụng NOT EXISTS để kiểm tra sự không tồn tại

Trường hợp này ngược lại với EXISTS, bạn có thể sử dụng NOT EXISTS để lọc những dữ liệu không tồn tại trong bảng khác.

SELECT name
FROM employees E
WHERE NOT EXISTS (SELECT 1 
                  FROM departments D 
                  WHERE D.id = E.department_id);

Lệnh này sẽ trả về các nhân viên không thuộc phòng ban nào (tức là không có giá trị department_id trong bảng departments).

6. Tính toán với các phép toán phức tạp

Bạn có thể sử dụng các phép toán số học phức tạp trong câu lệnh SELECT. Ví dụ sau sẽ tính tổng mức lương cho tất cả nhân viên và cộng thêm 10% tiền thưởng.

SELECT name, salary, (salary * 0.1) AS Bonus, (salary + salary * 0.1) AS TotalCompensation
FROM employees;

Lệnh này sẽ trả về mức lương, tiền thưởng, và tổng thu nhập của từng nhân viên.

7. Subquery trong mệnh đề FROM

Truy vấn con (Subquery) trong mệnh đề FROM là khi bạn lồng một truy vấn bên trong một truy vấn lớn hơn, nhằm xử lý hoặc tách dữ liệu từ nhiều cấp độ.

SELECT department_name, AVG(salary) AS AvgSalary
FROM (SELECT D.department_name, E.salary
      FROM employees E
      INNER JOIN departments D ON E.department_id = D.id) AS DeptSalary
GROUP BY department_name;

Lệnh này sẽ tính mức lương trung bình của từng phòng ban bằng cách kết hợp dữ liệu từ hai bảng và nhóm chúng lại với GROUP BY.

8. Sử dụng FULLTEXT để tìm kiếm văn bản

FULLTEXT cho phép tìm kiếm toàn văn bản trong MySQL trên các cột dạng chuỗi. Chỉ hỗ trợ trên bảng có kiểu MyISAM hoặc InnoDB với các cột đã lập chỉ mục.

SELECT name 
FROM employees 
WHERE MATCH(name, job_title) 
AGAINST('developer');

Lệnh này sẽ tìm kiếm tất cả các nhân viên có từ “developer” trong tên hoặc tiêu đề công việc.

9. Lọc dữ liệu với các điều kiện phức tạp (Sử dụng ALLANY)

ALLANY được sử dụng để so sánh một giá trị với tất cả hoặc bất kỳ giá trị nào trong một tập hợp con.

Ví dụ với ALL:

SELECT name, salary
FROM employees
WHERE salary > ALL (SELECT salary 
                    FROM employees 
                    WHERE department_id = 2);

Lệnh này trả về những nhân viên có lương lớn hơn tất cả nhân viên thuộc phòng ban có department_id = 2.

Ví dụ với ANY:

SELECT name, salary
FROM employees
WHERE salary > ANY (SELECT salary 
                    FROM employees 
                    WHERE department_id = 2);

Lệnh này trả về những nhân viên có lương lớn hơn ít nhất một nhân viên thuộc phòng ban có department_id = 2.

Kết luận:

Các ví dụ nâng cao trên minh họa những tính năng mạnh mẽ của câu lệnh SELECT trong MySQL. Bạn có thể thực hiện các phép tính phức tạp, kết hợp nhiều bảng, làm việc với dữ liệu con, và sử dụng các hàm đặc biệt để khai thác dữ liệu hiệu quả hơn trong các ứng dụng thực tế.