ĐĂNG KÝ ĐỂ NHẬN THÔNG TIN MỚI NHẤT

GROUP BY – Tự học SQL cơ bản (phần 5) – Gộp nhóm các bản ghi trong câu lệnh SQL

GROUP BY – Tự học SQL cơ bản (phần 5) – Gộp nhóm các bản ghi trong câu lệnh SQL

Trong bài viết thứ 5 của Chương trình tự học SQL cơ bản, anh em sẽ được tìm hiểu với các nội dung sau:

  • Aggregate Function trong SQL
  • Gộp nhóm dữ liệu với GROUP trong câu lệnh SQL.
  • Sử dụng điều kiện HAVING trong mệnh đề GROUP BY.

1. Thế nào là Aggregate Function trong SQL?

Ở các bài viết trước, ta đã sử dụng các hàm cơ bản phổ biến trong SQL khi làm việc với CSDL. Nhưng đây chỉ là các hàm bình thường, trả về 1 output cho 1 bản ghi nhận vào làm input. Tức là nếu có 37 bản ghi trong bảng thì câu lệnh truy vấn có dùng hàm cũng trả về 37 kết quả.

SELECT UPPER(first_name)
FROM employees;
SELECT ROUND(salary) 
FROM employees;

Các hàm như trên gọi là Scalar Function trong SQL. Ngược lại ta có Aggregate Function, các hàm này sẽ trả về 1 output từ 1 nhóm các bản ghi làm input trong hàm. Ví dụ đầu tiên là hàm COUNT dùng để đếm số lượng bản ghi trên các Hệ CSDL.

SELECT COUNT(*) 
FROM employees;

Hàm COUNT cũng có thể dùng với DISTINCT như sau. Ví dụ đếm số họ khác nhau trong tên nhân viên.

SELECT COUNT(DISTINCT last_name)
FROM employees;

Một loại hàm khác là SUMAVG cho phép tính tổng và trung bình các giá trị trong bảng. Ví dụ tính tổng lương và trung bình lương tất cả nhân viên

SELECT SUM(salary)
FROM employees;

SELECT AVG(salary)
FROM employees;

Hoặc ta có thể tìm số lương thấp nhất và cao nhất với MINMAX như sau trong SQL.

SELECT MIN(salary)
FROM employees;

SELECT MAX(salary)
FROM employees;

Kết hợp MINMAX với điều kiện WHERE để tìm đầy đủ thông tin của nhân viên có lương thấp và cao nhất.

SELECT * FROM employees 
WHERE salary = (SELECT MIN(salary) FROM employees);

SELECT * FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

Câu lệnh truy vấn được đặt trong dấu ngoặc ( ) như trên được gọi là truy vấn con – Subquery trong SQL. Chi tiết và cách sử dụng các câu Subquery sẽ ở phần … của chương trình

2. Mệnh đề GROUP BY trong SQL

Ở trên ta đã sử dụng các Aggregate Function để tính toán tổng, đếm, min hay max từ toàn bộ bản ghi trong một bảng.

Nhưng nếu muốn chỉ tính toán trên 1 nhóm các bản ghi riêng biệt như các nhân viên cùng một phòng ban hay các nhân viên cùng một người quản lý chẳng hạn thì làm như nào? Lúc này ta sẽ sử dụng đến mệnh đề GROUP BY trong SQL.

Ví dụ dưới đây ta sẽ đếm số lượng nhân viên của mỗi phòng ban sử dụng GROUP BYCOUNT.

SELECT 
   department_id, 
   COUNT(employee_id)
FROM employees
GROUP BY department_id;

GROUP BY có thể gộp nhóm cho nhiều cột, ví dụ đếm số nhân viên cùng một người quản lý của từng phòng ban.

SELECT 
   department_id,
   manager_id, 
   COUNT(employee_id)
FROM employees
GROUP BY department_id, manager_id
ORDER BY 1, 2;

Lưu ý các cột đứng sau SELECT bắt buộc phải có trong mệnh đề GROUP BY hoặc được đặt trong một Aggregate Function, nếu không CSDL sẽ không hiểu phải dùng cột đó ra sao trong câu lệnh truy vấn.

Mệnh đề GROUP BY có cú pháp sử dụng tương tự trên các Hệ CSDL khác. 

3. Sử dụng điều kiện HAVING trong Mệnh đề GROUP BY

Vẫn ví dụ đếm số nhân viên cùng một người quản lý của từng phòng ban, nhưng chỉ lấy của các phòng ban mã là 10, 30, 30. Ta có thể dùng thêm điều kiện WHERE trong câu lệnh như sau

SELECT 
   department_id,
   manager_id, 
   COUNT(employee_id)
FROM employees
WHERE department_id IN (10, 30, 50)
GROUP BY department_id, manager_id
ORDER BY 1, 2;

Câu lệnh trên vẫn trả về kết quả bình thường, nhưng nếu chẳng may ta đặt điều kiện WHERE đứng sau GROUP BY thì ngay lập tức sẽ gặp lỗi do CSDL không hiểu được câu lệnh. 

SELECT 
   department_id,
   manager_id, 
   COUNT(employee_id)
FROM employees
GROUP BY department_id, manager_id
WHERE department_id IN (10, 30, 50)
ORDER BY 1, 2;

Nguyên nhân do điều kiện WHERE chỉ dùng để lọc toàn bộ bản ghi trong bảng. Khi đứng sau GROUP nghĩa là ta đang ép nó lọc dữ liệu trong một nhóm bản ghi trả về từ GROUP, dẫn đến lỗi câu lệnh truy vấn.

Để giải quyết vấn đề trên, ta sẽ sử dụng điều kiện HAVING với GROUP BY thay vì WHERE như sau.

SELECT 
   department_id,
   manager_id, 
   COUNT(employee_id)
FROM employees
GROUP BY department_id, manager_id
HAVING department_id IN (10, 30, 50)
ORDER BY 1, 2;

HAVING chỉ dùng được với và đứng sau GROUP BY để lọc các bản ghi trả về từ GROUP BY. Lưu ý phân biệt giữa WHERE và HAVING để tránh nhầm lẫn giữa 2 điều kiện. HAVING cũng dùng tương tự trên tất cả các Hệ CSDL.

Tiếp theo

Tự học SQL cơ bản (phần 6)

Liên Hệ với Wecommit

Nếu bạn muốn liên hệ với Wecommit, bạn có thể trao đổi trực tiếp qua Facebook cùng Trần Quốc Huy – người sáng lập của Wecommit.

Nếu bạn muốn chúng tôi đồng hành xây dựng sự nghiệp với bạn trong 01 năm (bạn sẽ có rất nhiều kiến thức, kinh nghiệm ĐỘC QUYỀN về tối ưu cơ sở dữ liệu) bạn có thể đăng ký trải nghiệm chương trình Từ điển tối ưu 100x hiệu năng của chúng tôi.

Views: 54





    Câu hỏi bảo mật

    Trả lời

    Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *