Saturday, December 20, 2014

Định nghĩa, sử dụng của mệnh đề Group by và Having

Định nghĩa, sử dụng của mệnh đề Group by và Having

Trong sql server, chúng ta nhóm bởi mệnh đề nhóm các bản ghi của bảng dữ liệu theo cách chúng ta cần. Chúng ta sử dụng mệnh đề Having để lọc dữ liệu từ dữ liệu chúng ta đã sử dụng mệnh đề Group by. Mệnh đề Having hoạt động chỉ khi tồn tại mệnh đề Group by, nghĩa là để sử dụng mệnh đề having chúng ta cần mệnh đề Group by trước. Hãy xem qua cả hai mệnh đề.

Mệnh đề Group by

Group By được sử dụng cho việc nhóm các bản ghi của các bảng trong cơ sở dữ liệu. Mệnh đề này tạo thành một dòng tương ứng được nhóm và quá trình này được gọi là tập hợp. Để sử dụng mệnh đề Group by chúng ta phải sử dụng ít nhất một chức năng tổng hợp trong câu lệnh Select. Chúng ta có thể Group by với mệnh đề Where
Cấu trúc cho mệnh đề Group By
  1. SELECT Col1, Col2, Aggreate_function
  2. FROM Table_Name
  3. WHERE Condition
  4. GROUP BY Col1, Col2

Hãy nhìn mệnh đề Group By làm việc như thế nào. Giả sử chúng ta có một bảng StudentMarks với nội dung điểm cho mỗi đối tượng sinh viên (học sinh)
  1. Create table StudentMarks
  2. (
  3. st_RollNo int ,
  4. st_Name varchar(50),
  5. st_Subject varchar(50),
  6. st_Marks int
  7. )
  8. --Thêm dữ liệu cho bảng dữ liệu
  9. insert into StudentMarks(st_RollNo,st_Name,st_Subject,st_Marks)
  10. values(1,'Mohan','Physics',75);
  11. insert into StudentMarks(st_RollNo,st_Name,st_Subject,st_Marks)
  12. values(1,'Mohan','Chemistry',65);
  13. insert into StudentMarks(st_RollNo,st_Name,st_Subject,st_Marks)
  14. values(1,'Mohan','Math',70);
  15. insert into StudentMarks(st_RollNo,st_Name,st_Subject,st_Marks) values(2,'Vipul','Physics',70);
  16. insert into StudentMarks(st_RollNo,st_Name,st_Subject,st_Marks)
  17. values(2,'Vipul','Chemistry',75);
  18. insert into StudentMarks(st_RollNo,st_Name,st_Subject,st_Marks) values(2,'Vipul','Math',60);
  19. insert into StudentMarks(st_RollNo,st_Name,st_Subject,st_Marks)
  20. values(3,'Jitendra','Physics',85);
  21. insert into StudentMarks(st_RollNo,st_Name,st_Subject,st_Marks)
  22. values(3,'Jitendra','Chemistry',75);
  23. insert into StudentMarks(st_RollNo,st_Name,st_Subject,st_Marks)
  24. values(3,'Jitendra','Math',60);
  25. --Dùng câu lệnh select để xem dữ liệu của chúng ta
  26. select * from StudentMarks

  1. -- Mệnh đề Group By mà không sử dụng mệnh đề Where
  2. SELECT st_Name, SUM(st_Marks) AS 'Total Marks'
  3. FROM StudentMarks
  4. GROUP BY st_Name;

  1. -- Mệnh đề Group By kết hợp Where
  2. SELECT st_Name, SUM(st_Marks) AS 'Total Marks'
  3. FROM StudentMarks
  4. where st_Name='Mohan'
  5. GROUP BY st_Name;

  1. --Mệnh đề Group By để tìm sinh viên có điểm lớn nhất
  2. SELECT st_Subject,max(st_Marks) AS 'Max Marks in Subject'
  3. FROM StudentMarks
  4. GROUP BY st_Subject;

Mệnh đề Having

Mệnh đề này hoạt động chỉ khi sử dụng Group By trong các bảng dữ liệu và hành động tương ứng phép lọc "Like" trong mệnh đề Where . Chúng ta sử dụng mệnh đề Having để lọc dữ liệu đã được lấy từ mệnh đề Group By trước đó. Để sử dụng mệnh đề Having cần sử dụng mệnh đề Group By trước.
  1. -- Mệnh đề having mà không có điều kiện Where
  2. SELECT st_Name, SUM(st_Marks) AS 'Students Scored > 205'
  3. FROM StudentMarks
  4. GROUP BY st_Name
  5. HAVING SUM(st_Marks) > 205

  1. -- Sử dụng Having và Where
  2. SELECT st_Name, SUM(st_Marks) AS 'Students Scored > 205'
  3. FROM StudentMarks
  4. where st_RollNo between 1 and 3
  5. GROUP BY st_Name
  6. HAVING SUM(st_Marks) > 205

Lưu ý

  1. Để sử dụng mệnh đề Group By, chúng ta cần ít nhất một hàm tổng hợp trong sql server.
  2. Tất cả các cột được sử dụng bởi các hàm phải có trong danh sách Group By
  3. Chúng ta có thể sử dụng Group By có thể có hoặc không có mệnh đề Where.
  4. Để sử dụng Having chúng ta phải sử dụng Group By trước
Tóm lại
Trong bài viết này tôi cố gắng giải thích về mệnh đề Group By và Having. Tôi hi vọng sau khi đọc bài viết này bạn sẽ quen với mệnh đề Group By và Having. Tôi muốn nhận được phản hồi từ những người đọc qua blog của tôi. Vui lòng gửi phản hồi, câu hỏi hoặc bình luận về bài viết này. Đấy là những đóng góp đáng quý để tôi viết tiếp các bài viết khác đầy đủ hơn. Cảm ơn!

4 comments:

  1. Em chao anh, anh ơi cho em hỏi câu "Tất cả các cột được sử dụng bởi các hàm phải có trong danh sách Group By" trong phần chú ý của anh em không hiểu lắm, anh có thể nói rõ hơn được không ak, có vi du minh hoa thi cang tot ạ. Thank anh!

    ReplyDelete
    Replies
    1. Chỗ này anh viết có thể hơi khó hiểu thật. Ý anh như ví dụ này: "Lấy tên các học sinh và tổng điểm của các học sinh đó". Ta có câu lệnh: select [ten_hs],sum([diem]) from [danh_sach_diem] group by [ten_hs]. Thì trong này [ten_hs] được lấy ra mà không có hàm sử dụng thì nó phải chưa trong danh sách group by. Tương ứng có bao nhiêu cái được select ra như thế thì phải có bấy nhiêu trong group by. Chẳng hạn: select [ten_hs],[lop],[mon],sum([diem]) from [danh_sach_diem] group by [ten_hs],[lop],[mon]....

      Delete
  2. vang em hieu roi ak, thank anh

    ReplyDelete