Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Giới thiệu về Phân nhóm và Tính tổng trong SQL

Một trong những khía cạnh mạnh mẽ nhất của SQL là khả năng thực hiện tổng hợp dữ liệu. Hai trong số các công cụ tổng hợp dữ liệu SQL mạnh mẽ nhất là phân nhóm tổng cộng . Trong hướng dẫn này, bạn học tập hợp dữ liệu SQL bằng cách sử dụng nhóm và tính tổng.

Hàm tổng hợp trong SQL

Trong SQL, tổng hợp là quá trình vận hành hoặc tính toán một tập giá trị. Mục đích là trả về một giá trị tóm tắt duy nhất. SQL bao gồm một số Hàm tổng hợp rất mạnh mẽ như AVG() , COUNT() , SUM() , MAX()MIN() . Đến lượt nó, các hàm này thường được tìm thấy nhất trong các câu lệnh SQL triển khai GROUP BY mệnh đề. Tuy nhiên, các chức năng này không cần phải được liên kết với điều khoản đó.

Lưu ý Trừ khi được đề cập khác, tất cả các lệnh cơ sở dữ liệu được trình bày trong hướng dẫn này hoạt động tốt trên cả MySQL PostgreSQL .

Hướng dẫn này sử dụng CourseTaken bảng để chứng minh các hàm tổng hợp. Từ dòng lệnh, tạo CourseTaken bảng.

CREATE TABLE CourseTaken (
    SSNumber CHAR(9) NOT NULL,
    CourseId CHAR(6) NOT NULL,
    NumericGrade INT NOT NULL,
    YearTaken INT NOT NULL
);

CourseTaken bảng chứa dữ liệu cột sau:

SSNumber CourseId NumericGrade YearTaken
111111111 CSC101 98 2021
111111111 ENG101 95 2022
222222222 CSC101 100 2022
222222222 EEE101 75 2022
333333333 POL101 92 2021
333333333 CSC101 84 2022

Sử dụng một Hàm tổng hợp trong SQL để tính một giá trị tóm tắt duy nhất

Các phần bên dưới cung cấp các ví dụ khác nhau sử dụng các hàm tổng hợp để trả về một giá trị tóm tắt duy nhất. Tất cả các ví dụ đều sử dụng CourseTaken bảng đã được tạo trong phần Hàm tổng hợp của hướng dẫn.

Ví dụ 1:

Trong ví dụ này, hàm tổng hợp trả về điểm số trung bình cho tất cả sinh viên tham gia khóa học CSC101 vào năm 2022.

SELECT AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101
AND YearTaken = 2022;

SQL trả về điểm trung bình sau:

Avg Grade
---------
92

Ví dụ 2:

Hàm tổng hợp bên dưới trả về số lượng sinh viên đã tham gia khóa học CSC101 trước năm 2022.

SELECT COUNT(SSNumber) AS 'Student Count'
FROM CourseTaken
WHERE CourseId = 'CSC101'
AND YearTaken < 2022;

Số lượng sau được trả về:

Student Count
---------
1

Ví dụ 3:

Trong ví dụ này, một hàm tổng hợp được sử dụng để lấy điểm số tối đa được ghi lại trong bất kỳ năm nào bởi Sinh viên thi CSC101 .

SELECT MAX(NumericGrade) AS 'Max Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'

Điểm tối đa được trả lại là như sau:

Max Grade
---------
100

Dữ liệu tổng hợp bằng cách sử dụng các hàm của nhóm

Các ví dụ sau chứng minh việc sử dụng GROUP BY mệnh đề sử dụng dữ liệu từ CourseTaken bảng.

Ví dụ 1:

Ví dụ dưới đây xác định điểm trung bình của mỗi sinh viên cho tất cả các khóa học mà họ đã học cho đến nay. Để thực thi điều này, hãy sử dụng SQL Group By mệnh đề nhóm theo Sinh viên (trong trường hợp này là SSNumber cột).

SELECT SSNumber, AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY SSNumber

Kết quả trả về điểm trung bình cho mỗi học sinh.

+-----------+----------+
| SSNumber  | Avg Grade|
+-----------+----------+
| 111111111 | 96.5     |
| 222222222 | 87.5     |
| 333333333 | 88       |
+-----------+----------+

Ví dụ 2:

Hàm tổng hợp bên dưới tìm điểm trung bình nhận được qua mỗi CourseId trong CourseTaken bàn. Để thực hiện việc này, hãy nhóm theo CourseId trong YearTaken với mã SQL sau:

SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken

Bạn sẽ thấy kết quả sau:

+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98        |
| POL101 | 2021 | 92        |
| CSC101 | 2022 | 92        |
| EEE101 | 2022 | 75        |
| ENG101 | 2022 | 95        |
+--------+------+-----------+
Lưu ý Ví dụ trên phức tạp hơn một chút. Bạn nhóm theo hai cột thay vì một (CourseId trong vòng Year ). Do đó, bạn tính điểm trung bình và nhóm theo CSC101 cho năm 2021 tách biệt với Điểm trung bình cho CSC101 cho năm 2022 . Khóa học CSC101 cho Năm 2022 là tập hợp của hai hàng, trong khi tất cả các hàng Nhóm Theo khác là tập hợp của một hàng. Ngoài ra, từ khái niệm Đặt hàng (Order By mệnh đề) bạn có thể hiển thị các kết quả có thứ tự (được sắp xếp) theo Course trong một năm nhất định.

Ví dụ 3:

Từ truy vấn SQL trong ví dụ trước, bạn có thể hạn chế số hàng mà bạn thao tác bằng cách thêm WHERE mệnh đề cho truy vấn. Ví dụ:để tạo điểm trung bình mà sinh viên nhận được chỉ cho CourseId CSC101 , nhóm theo CourseId trong YearTaken . Mã SQL sau có thể thực hiện điều này:

SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken

Trong mã SQL ở trên, bạn đang thêm một điều kiện (thông qua WHERE ) trước khi tổng hợp nhóm thực tế được thực hiện (thông qua GROUP BY mệnh đề).

Kết quả sau được trả về:

+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98        |
| CSC101 | 2022 | 92        |
+--------+------+-----------+

Ví dụ 4:

Từ truy vấn SQL trong Ví dụ 2, bạn có thể áp dụng một điều kiện trước khi trả về kết quả cuối cùng. Để thực hiện điều này, hãy sử dụng Having trong SQL mệnh đề. Bạn có thể xác định điểm trung bình trên mọi CourseId , trong đó điểm trung bình tổng hợp lớn hơn 90 . Bạn có thể nhóm lại theo CourseId trong YearTaken . Mã SQL sau có thể thực hiện điều này:

SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’
FROM CourseTaken
GROUP BY CourseId, YearTaken
HAVING AVG(NumericGrade) > 90
ORDER BY CourseId, YearTaken

Kết quả như sau:

+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98        |
| POL101 | 2021 | 92        |
| CSC101 | 2022 | 92        |
| ENG101 | 2022 | 95        |
+--------+------+-----------+

Hàng cho CourseId EEE101 đã không được trả lại. Điều này là do Having mệnh đề lọc ra sau GROUP BY mệnh đề đã được thực thi (CourseId EEE101 Điểm trung bình của tôi là dưới 90).

Ví dụ 5:

Xây dựng dựa trên mã SQL từ Ví dụ 3 Ví dụ 4 , bạn có thể tạo các truy vấn tổng hợp sử dụng cả WhereHaving mệnh đề. Ví dụ:bạn có thể xác định các khóa học đã được thực hiện trong 2021 , trong đó điểm trung bình cho các khóa học đó đã thực hiện lớn hơn 93 . Đây, Where mệnh đề lọc ra các kết quả trước Group By tổng hợp dữ liệu được thực hiện và Having mệnh đề lọc ra các kết quả trả về sau Group By tổng hợp dữ liệu được thực hiện. Mã SQL sau có thể thực hiện điều này:

SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’
FROM CourseTaken
WHERE YearTaken = 2021
GROUP BY CourseId, YearTaken
HAVING AVG(NumericGrade) > 93
ORDER BY CourseId

Kết quả trả về như sau:

+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98        |
+--------+------+-----------+

Ví dụ 6:

Bạn có thể đếm số hàng được liên kết với mỗi Group By tổng hợp trong một truy vấn. Dựa trên mã SQL mẫu trước đó, bạn có thể tạo điểm trung bình mà Students nhận được chỉ dành cho CourseId CSC101 , được nhóm theo CourseId trong YearTaken . Mã phải cung cấp số lượng sinh viên (số lượng) được liên kết với mỗi nhóm. Mã SQL sau có thể thực hiện điều này:

SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’,
Count(SSNumber) AS ‘Count’
FROM CourseTaken
WHERE CourseId = ‘CSC101’
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken

Count(SSNumber) trong SELECT mệnh đề có thể đã được chỉ định là Count(*) . Sự khác biệt giữa hai cú pháp là Count(*) bao gồm các hàng có NULL các giá trị trong chúng cũng như vậy. Theo CourseTaken định nghĩa bảng ở trên, tất cả các cột trong CourseTaken bảng phải chứa các giá trị không rỗng (NOT NULL thuộc tính đảm bảo điều này). Count(SSNumber)Count(*) sẽ tương đương về mặt chức năng trong ví dụ này.

Kết quả sau được trả về:

+--------+------+-----------+-------+
| Course | Year | Avg Grade | Count |
+--------+------+-----------+-------+
| CSC101 | 2021 | 98        | 1     |
| CSC101 | 2022 | 92        | 2     |
+--------+------+-----------+-------+

Kết luận

Hướng dẫn này cung cấp các khối xây dựng cho các hoạt động tổng hợp dữ liệu mạnh mẽ của SQL để nhóm và tính tổng. Như đã lưu ý, bạn có thể hạn chế các giá trị trở thành một phần của các nhóm này bằng cách sử dụng Where mệnh đề trong các truy vấn trước khi tập hợp được thực hiện. Bạn có thể lọc ra các hàng kết quả được nhóm lại (sau khi tổng hợp được thực hiện) bằng cách sử dụng Having mệnh đề trong các truy vấn SQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. khóa chính hai cột mysql với tự động tăng

  2. Ngoại lệ trong chuỗi chính java.sql.SQLException:Quyền truy cập bị từ chối đối với người dùng '' @ 'localhost' (sử dụng mật khẩu:NO)

  3. Ví dụ về CURTIME () - MySQL

  4. Thực hiện thay đổi đối với nhiều bản ghi dựa trên sự thay đổi của một bản ghi với SQL

  5. ScaleGrid DBaaS mở rộng dịch vụ lưu trữ MySQL thông qua đám mây AWS