VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
SQL với OracleTổng hợp
Bài 5/16
5 phút

Hàm tổng hợp

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Chủ cửa hàng không cần xem từng dòng. Họ muốn biết có bao nhiêu sản phẩm, tổng tồn kho là bao nhiêu, món rẻ nhất giá bao nhiêu. Để trả lời, cần gom cả bảng thành một con số, và hàm tổng hợp làm việc đó.

Khái niệm

🧮 Hàm tổng hợp (aggregate function): hàm nhận nhiều dòng và trả về một giá trị duy nhất, như đếm, cộng, tìm lớn nhất.

Hàm Trả về
COUNT(*) số dòng
COUNT(cột) số dòng mà cột đó không NULL
SUM(cột) tổng
AVG(cột) trung bình
MIN(cột), MAX(cột) nhỏ nhất, lớn nhất

Mọi hàm trong bảng, trừ COUNT(*), đều bỏ qua giá trị NULL. Chúng giống Count, Sum, Min, Max của LINQ. Riêng COUNT(cột) khác Count() của LINQ ở chỗ không đếm dòng NULL.

Ví dụ

SELECT COUNT(*)   AS product_count,
       SUM(stock) AS total_stock,
       MIN(price) AS min_price,
       MAX(price) AS max_price
FROM products;
  • Kết quả chỉ có một dòng: 5 sản phẩm, tổng tồn kho 181, rẻ nhất 5000, đắt nhất 450000.
  • AS product_count đặt tên cho cột kết quả.
  • Có thể kết hợp với WHERE: thêm WHERE stock > 0 thì chỉ tính các món còn hàng.

Thử ngay

SELECT COUNT(*)     AS total,
       COUNT(email) AS with_email
FROM customers;

Đoán trước khi chạy: có 4 khách hàng. Hai cột này có bằng nhau không?

Xem kết quả
TOTAL WITH_EMAIL
4 3

Không bằng. COUNT(*) đếm mọi dòng, còn COUNT(email) bỏ qua dòng có email NULL, tức là bỏ qua Chi.

Lỗi hay gặp

Lấy cột thường cùng với hàm tổng hợp. Hàm tổng hợp gom cả bảng thành một dòng, nên Oracle không biết phải hiện name của dòng nào và báo lỗi ORA-00937: not a single-group group function.

-- SAI — lỗi: name không được gom lại
SELECT name, COUNT(*) FROM products;
-- ĐÚNG — chỉ lấy giá trị đã tổng hợp
SELECT COUNT(*) FROM products;

Muốn đếm theo từng nhóm, ví dụ theo thành phố, thì dùng GROUP BY (học ở bài sau).

Tóm tắt

  • Hàm tổng hợp gom nhiều dòng thành một giá trị: COUNT, SUM, AVG, MIN, MAX.
  • COUNT(*) đếm mọi dòng, COUNT(cột) bỏ qua NULL.
  • Không lấy cột thường cùng hàm tổng hợp khi chưa có GROUP BY.
  • Kết hợp WHERE để chỉ tổng hợp các dòng cần.

Tự kiểm tra

0/3 câu
Câu 1

Bảng orders có 10 dòng, cột shipped_at NULL ở 4 dòng. COUNT(shipped_at) trả về bao nhiêu?

Câu 2

Muốn biết tổng số tiền của mọi dòng hàng, biết mỗi dòng có quantity và unit_price. Viết câu nào?

Câu 3

SELECT city, COUNT(*) FROM customers; báo ORA-00937. Vì sao?

NULL trong SQLGROUP BY và HAVING

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt