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.
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.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ề name và age của tất cả nhân viên trong bảng employees.
*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.
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.
Bạn có thể sử dụng AND và OR để 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.
ORDER BYBạ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.
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.
LIKE để tìm kiếm mẫu dữ liệuMệ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.
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.
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.
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 EmployeeName và EmployeeSalary.
JOINBạ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.
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 employees có department_id khớp với bảng departments).
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.
SELECT COUNT(*) AS TotalEmployees FROM employees;
Lệnh này trả về tổng số nhân viên trong bả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.
GROUP BY để nhóm dữ liệuMệ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.
HAVING để lọc dữ liệu sau khi nhómKhá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.
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.
DISTINCT để loại bỏ bản ghi trùng lặpMệ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.
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.
CASE trong câu lệnh SELECTCASE 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.
UNION để kết hợp nhiều truy vấnUNION đượ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.
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.
EXISTS để kiểm tra sự tồn tạiEXISTS đượ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.
NOT EXISTS để kiểm tra sự không tồn tạiTrườ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).
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.
FROMTruy 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.
FULLTEXT để tìm kiếm văn bảnFULLTEXT 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.
ALL và ANY)ALL và ANY đượ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.
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.
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.
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ế.