🥬
FreshForFresh
  • ✌️Xin chào!
  • Overview
    • 💡Data structures and Algorithms
    • 👀Programming
    • 🧠Database
    • 🦴Back-End
    • ✨Front-End
    • 💐Spring Framework
    • 🛠️Tool
  • Data structures and Algorithms
    • 🎰Data Type
    • 🗑️Garbage collection
    • 🧩Data structures
    • 🎲Algorithms
  • Programming
    • 🧮Compiler
      • 🤖Tại sao phải cần compiler?
      • 📠Java Virtual Machine
  • 📈Thread
  • 🔐Lock & Deadlock
  • 🏇Race condition & Data Race
  • 🧯Synchronized
  • 🗜️Blocking IO và Non Blocking IO Client Server Socket
  • 🌐Languages
    • 🎛️Programming Language
    • 📑Client-Side & Server-Side
    • ⁉️Why java? Why javascript?
  • 🗼Design pattern
    • 🎨Front-End Design Pattern
    • 🏗️Back End Design Pattern
      • 🐴with Java
      • 🦄with Spring Boot
      • 🐖with Modern Backend Development
      • 🐁with Microservice
  • 🍀Clean Code
    • 🌊Chương 1: Code sạch
    • 📐Chương 2: Quy tắc đặt tên rõ nghĩa
    • 🚧Chương 3: Cách viết hàm
    • 👻Chương 4: Comments thế nào cho chuẩn?
    • 🥳Chương 5: Định dạng code.
    • 😈Chương 6: Đối tượng và cấu trúc dữ liệu
    • 🐛Chương 7: Xử lí lỗi
    • ☦️Chương 8: Ranh giới code
    • 🧪Chương 9: Unit test
    • 🥂Chương 10: Lớp đối tượng
    • 🥡Chương 11: Code sạch cấp hệ thống
  • Database
    • 🐔Giới thiệu
    • 📰Các loại cơ sở dữ liệu
    • 🐘Các loại DBMS phổ biến
    • 🕵️‍♀️SQL và cách sử dụng với relational database
      • 👺Lệnh SQL
      • 🛢️JOIN trong SQL
      • 🛕GROUP BY trong SQL
      • 🐼ORDER BY trong SQL
      • 🐣Truy vấn con SUBQUERY trong SQL Server
      • 🏦Transaction Trong SQL
      • 🇲🇰ACID
    • ☢️Thiết kế cơ sở dữ liệu
    • 🕍Consistency and concurrency handling
      • 🔒Database locking
      • 🎮Concurrency Control
      • 🙀Isolation Level
    • 🎨Performance & Scability
      • ☝️Indexing
      • 👯‍♂️Partitioning
      • 💅Các tips tăng hiệu suất SQL
      • 🇲🇬Kiểm tra và Xác thực việc Sao lưu và Phục hồi CSDL
      • 🌠Database sharding
      • 🧘‍♂️REPLICATION
      • 😁Các vấn đề ảnh hưởng đến performance.
  • Back-End
    • 🔫API?
    • 🐕‍🦺Web Services
    • 💾Phân biệt API và web service
    • 🙆‍♂️Tìm hiểu về RestAPI
    • 🧦SOAP
    • ✈️GraphQL API
    • 📊Compared GraphQL & REST
    • 📄Phân biệt HTTP & HTTPS
    • 🚵Client & Server
    • 🇩🇲DOM
  • Front-End
    • 🦑User Interface (UI)
    • 🛰️State Management
  • Spring Framework
    • 🔐Spring Security
      • 🌅Đơn giản hoá Spring Security
      • 🌸Spring Security: Authentication and Authorization In-Depth
      • 🚻OAuth2 Basic
      • 🀄JWT + Spring Security Oauth
      • 📤Logout trong ứng dụng sử dụng bảo mật Oauth
      • 🔂Reset Password
      • 🎗️OAuth2 Remember Me với Refresh Token
      • ⛓️OAuth2 cho một Spring REST API
  • Network
    • 💸Mạng máy tính căn bản
  • Tool
    • 🦏Các câu lệnh Docker cơ bản
    • 🦧Github
      • 🐰Các lệnh Git cơ bản
      • 🐇Một số trường hợp khi sử dụng Git
    • 🏚️WebServer
      • 🪂Tổng quan về kiến trúc hệ thống
      • 🔃Cơ bản về WebServer Nginx
  • Tài nguyên
    • 👨‍🏫Course
    • 📖Docs
Powered by GitBook
On this page
  • Cú pháp mệnh đề GROUP BY trong SQL Server
  • Ví dụ - dùng hàm SUM
  • Ví dụ - dùng hàm COUNT
  • Ví dụ - dùng hàm MIN
  • Ví dụ - dùng hàm MAX
  • Ví dụ - Dùng với mệnh đề HAVING
  1. Database
  2. SQL và cách sử dụng với relational database

GROUP BY trong SQL

Group by trong SQL là gì? Cách dùng Group by khi lập trình bằng SQL như thế nào?

Lệnh GROUP BY trong SQL Server được dùng để lấy dữ liệu tóm tắt dựa trên một hoặc nhiều nhóm. Các nhóm có thể được tạo thành từ một hoặc nhiều cột. Ví dụ, truy vấn GROUP BY sẽ được dùng để đếm số lượng nhân viên trong mỗi phòng ban, hoặc tính tổng lương của một bộ phận.

Bạn phải dùng các hàm tổng hợp như COUNT(), MAX(), MIN(), SUM(), AVG()… trong truy vấn SELECT. Kết quả câu lệnh GROUP BY trong SQL Server trả về một hàng cho từng giá trị của cột GROUP BY.

Cú pháp:

SELECT column1, column2,...columnN FROM table_name
[WHERE]
[GROUP BY column1, column2...columnN]
[HAVING]
[ORDER BY]

Mệnh đề SELECT có thể bao gồm cột được dùng với SQL GROUP BY. Vì thế, để bao gồm các cột khác trong hàm GROUP BY, dùng các hàm tổng hợp như COUNT(), MAX(), MIN(), SUM(), AVG() với những cột đó.

Đặc điểm nổi bật của GROUP BY trong SQL:

  • Được dùng để tạo thành nhóm các bản ghi.

  • Đứng sau mệnh đề WHERE nếu có và trước HAVING.

  • Có thể bao gồm một hoặc nhiều cột để tạo thành một hoặc nhiều nhóm dựa trên cột đó.

  • Chỉ các cột GROUP BY có thể được dùng bao gồm trong mệnh đề SELECT. Để dùng các cột khác trong SELECT, dùng hàm tổng hợp.

Để các bạn dễ theo dõi cách sử dụng GROUP BY trong SQL Server và tiện làm ví dụ, chúng ta sẽ sử dụng bảng dữ liệu dưới đây trong toàn bộ bài viết.

Bảng có tên Quantrimang.com, có 4 cột là IDChuyenmuc, Muccon, Chuyenmuclon, Sobai và 6 hàng như sau:


+------------+----------+-------------+-------+
|IDChuyenmuc |  Muccon  |Chuyenmuclon | Sobai |
+------------+----------+-------------+-------+
|    1       |SQL Server|Lap trinh    | 101   |
|    2       |Facebook  |Mang xa hoi  | 152   |
|    3       |Python    |Lap trinh    | 101   |
|    4       |JavaScript|Lap trinh    | 122   |
|    5       |Chrome    |Web          | 94    |
|    6       |Instagram |Mang xa hoi  | 165   |
+------------+----------+-------------+-------+

Cú pháp mệnh đề GROUP BY trong SQL Server

SELECT
    bieu_thuc1,  bieu_thuc2,...  bieu_thuc_n, 
       ham_tong_hop (bieu_thuc)
FROM
    ten_bang
[WHERE dieukien]
GROUP BY
    bieu_thuc1,
    bieu_thuc2,...;

Tên biến hoặc giá trị biến:

  • bieu_thuc1, bieu_thuc2,... bieu_thuc_n: Biểu thức không nằm bên trong hàm tổng hợp và phải nằm trong mệnh đề GROUP BY.

  • ham_tong_hop: Có thể là các hàm như SUM, COUNT, MIN, MAX hoặc AVG.

  • ten_bang: Bảng cần lấy bản ghi từ đó, phải có ít nhất 1 bảng trong mệnh đề FROM.

Ví dụ - dùng hàm SUM

SELECT Chuyenmuclon, SUM(Sobai) AS "Tong"
  FROM [Quantrimang.com]
  GROUP BY Chuyenmuclon;

Ví dụ này dùng hàm tính tổng SUM để trả về tên Chuyenmuclon và tổng số bài viết (Sobai) (theo tên chuyên mục lớn).

Khi đó ta có bảng kết quả trả về như sau:


+--------------+------+
| Chuyenmuclon | Tong |
+--------------+------+
|Lap trinh     | 324  |
|Mang xa hoi   | 317  |
|Web           | 94   |
+--------------+------+

Ví dụ - dùng hàm COUNT

SELECT  COUNT(Chuyenmuclon), Chuyenmuclon
  FROM [Quantrimang.com]
  WHERE Chuyenmuclon = 'Lap trinh'
  GROUP BY Chuyenmuclon;

Ở ví dụ này, hàm COUNT sẽ trả về số lượng Chuyenmuccon của Chuyenmuclon Lap trinh:


+------+--------------+
|      | Chuyenmuclon |
+------+--------------+
|  3   |  Lap trinh   |
+------+--------------+

Nếu không muốn lấy tên cột mà chỉ cần trả về số lượng mục con, bạn chạy lệnh sau:

SELECT  COUNT(Chuyenmuclon)
  FROM [Quantrimang.com]
  WHERE Chuyenmuclon = 'Lap trinh'
  GROUP BY Chuyenmuclon;

Kết quả trả về sẽ chỉ có số 3.

Ví dụ - dùng hàm MIN

SELECT Chuyenmuclon, MIN(Sobai) AS 'So luong it nhat'
 FROM [Quantrimang.com]
 GROUP BY Chuyenmuclon;

Mệnh đề GROUP BY dùng với hàm MIN ở trên sẽ trả về Chuyenmuclon và số lượng bài ít nhất của mục lớn đó.

Ví dụ - dùng hàm MAX

SELECT Chuyenmuclon, MAX(Sobai) AS 'So bai cao nhat'
 FROM [Quantrimang.com]
 GROUP BY Chuyenmuclon;

Ví dụ cuối cùng này trả về tên của Chuyenmuclon và số bài cao nhất của chuyên mục.

Ví dụ - Dùng với mệnh đề HAVING

Nếu đang băn khoăn tự hỏi làm thế nào lọc kết quả sau khi nhóm, mệnh đề HAVING sẽ giúp bạn giải quyết vấn đề này.

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;

Lưu ý, mệnh đề HAVING theo sau GROUP BY. Mặt khác, về cơ bản, đó là sự thay thế đơn giản cho WHERE với HAVING. Kết quả:

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

Bạn vẫn có thể dùng điều kiện WHERE để lọc kết quả trước khi nhóm. Nó sẽ hoạt động cùng với mệnh đề HAVING để lọc sau khi nhóm:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

Kết quả: Chỉ một nghệ sĩ trong cơ sở dữ liệu đã phát hành nhiều hơn 1 album sau năm 1990.

+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+
PreviousJOIN trong SQLNextORDER BY trong SQL

Last updated 1 year ago

dieukien: Tùy chọn. Đây là điều kiện mà bản ghi phải đáp ứng để được chọn.

Vì bạn đưa ra 1 cột (Chuyenmuclon) trong lệnh và không nằm trong hàm SUM nên sẽ phải dùng mệnh đề GROUP BY.

Kết quả sau khi dùng hàm MIN
Kết quả sau khi chạy hàm MAX
🕵️‍♀️
🛕
WHERE
SELECT