Với dữ liệu thực tế, việc tổng hợp tính toán là chuyện … thường ngày ở huyện. Đơn giản như đếm tổng số hồ sơ đăng ký thi đại học, tính doanh thu trong ngày của một cửa hàng, trung bình doanh thu từng quý trong năm… 

Cần hiểu 1 cách rõ ràng hơn, việc tính toán tổng hợp chính là xử lý nhiều dòng dữ liệu để trả ra 1 kết quả mang ý nghĩa tổng hợp.

Với nhu cầu như vậy, Oracle SQL đã hỗ trợ sẵn các hàm tính toán tổng hợp, các mệnh đề liên quan đến việc tổng hợp dữ liệu cho chúng ta.

 

Hàm đếm COUNT

COUNT(* | [Distinct|All] expr):

count(*): đếm tất cả các dòng, kể cả dòng có giá trị null

count(expr): đếm tất cả các dòng có giá trị expr khác null

count(distinct expr): đếm tất cả các dòng có giá trị expr khác null và không trùng lặp

 

 

Hàm tính tổng SUM

SUM([Distinct|All] expr): tính tổng giá trị, bỏ qua các giá trị null, mặc định là tính tổng các giá trị kể cả các giá trị trùng lặp. Hàm này dùng cho giá trị kiểu số.

 

 

Hàm tính trung bình AVG

AVG([Distinct|All] expr): tính giá trị trung bình, bỏ qua các giá trị null, nếu dùng Distinct thì chỉ tính giá trị trung bình trên những dòng không trùng lặp. Hàm này dùng cho giá trị kiểu số.

 

 

 

Hàm tìm giá trị lớn nhất MAX

MAX([Distinct|All] expr): tìm giá trị lớn nhất, bỏ qua các giá trị null. Hàm này dùng cho giá trị kiểu số, ký tự hoặc ngày tháng.

 

 

Hàm tìm giá trị nhỏ nhất MIN

MIN([Distinct|All] expr): tìm giá trị nhỏ nhất, bỏ qua các giá trị null. Hàm này dùng cho giá trị kiểu số, ký tự hoặc ngày tháng.

 

 

Hàm tính phương sai VARIANCE

VARIANCE([Distinct|All] expr): tìm phương sai, bỏ qua các giá trị null

 

Hàm tính độ lệch chuẩn STDDEV

STDDEV([Distinct|All] expr): tìm độ lệch chuẩn, bỏ qua các giá trị null

 

 

Do các hàm tính toán tổng hợp hay bỏ qua các giá trị null, do đó nhiều khi ta phải xử lý các giá trị null để ra được kết quả mong muốn chính xác hơn.

VD: tính trung bình tiền hoa hồng của các nhân viên. Nếu tính bình thường, chỉ là trung bình của những nhân viên được nhận hoa hồng:

 

 

Muốn tính chính xác hơn, ta phải chia đều trên tổng số nhân viên. Như vậy những nhân viên không được nhận ta cho hoa hồng bằng 0

 

 

 

Mệnh đề GROUP BY

 

Mệnh đề GROUP BY dùng để tính toán tổng hợp theo các nhóm nhỏ. Mệnh đề GROUP BY đứng sau mệnh đề WHERE. Khi sử dụng GROUP BY, những cột nào ở câu SELECT không nằm trong group function (các hàm tính toán tổng hợp ở trên), đều phải cho vào GROUP BY, và không sử dụng alias.

 

Ví dụ, ta muốn tính trung bình lương của mỗi phòng ban trong công ty:

 

 

Thực tế cột chúng ta muốn tính tổng theo có thể không cần nằm trong mệnh đề SELECT (ở ví dụ trên là department_id). Tuy kết quả vẫn ra nhưng sẽ không đầy đủ ý nghĩa:

 

 

Có thể group trên nhiều cột nếu muốn:

 

 

Mệnh đề HAVING

 

Mệnh đề HAVING dùng để lọc các kết quả tổng hợp sau khi đã tính toán. Trong HAVING, ta đưa ra điều kiện giới hạn kết quả tổng hợp. Cần phân biệt rõ ràng, mệnh đề WHERE dùng để lọc các dòng dữ liệu từ đầu, sau đó group function & GROUP BY thực hiện tính toán tổng hợp, cuối cùng HAVING mới lọc kết quả và trả về.

 

Ví dụ, ta muốn lấy những nhân viên vào làm từ 2005 trở về trước, tính trung bình lương những người đó theo phòng, rồi lấy những phòng ban nào có lương trung bình trên $10000

 

 

Hàm tổng hợp có thể lồng nhau