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

SQL COUNT () cho người mới bắt đầu

Trong SQL, COUNT() hàm là một hàm tổng hợp trả về số lượng mục được tìm thấy trong một nhóm.

Bạn có thể sử dụng COUNT() trong nhiều phần của một truy vấn. Ví dụ:bạn có thể sử dụng nó trong SELECT danh sách hoặc HAVING mệnh đề khi lọc nhóm.

Bảng mẫu

Giả sử chúng ta có bảng sau:

SELECT * FROM Pets;

Kết quả:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

Các ví dụ sau sẽ sử dụng COUNT() khi truy vấn bảng này.

Ví dụ

Đây là một ví dụ đơn giản để bắt đầu.

SELECT COUNT(*) AS Count
FROM Pets;

Kết quả:

+---------+
| Count   |
|---------|
| 8       |
+---------+

Điều này cho chúng ta biết rằng có 8 hàng trong bảng. Chúng tôi biết điều đó vì chúng tôi đã sử dụng ký tự đại diện dấu hoa thị (* ) để chỉ định tất cả các hàng và tất cả các cột.

Đếm một cột cụ thể

Bạn cũng có thể chỉ định một cột cụ thể để đếm. COUNT() hàm chỉ đếm không phải NULL kết quả, vì vậy nếu bạn chỉ định một cột chứa NULL giá trị, những giá trị đó sẽ không được tính.

Đây là một ví dụ để chứng minh ý tôi muốn nói.

SELECT COUNT(DOB) AS Count
FROM Pets;

Kết quả:

+---------+
| Count   |
|---------|
| 6       |
+---------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Trong trường hợp này, Pets bảng chứa hai NULL các giá trị trong DOB cột (hai vật nuôi chưa cung cấp ngày sinh của chúng) và COUNT(DOB) trả về 6, thay vì 8 khi chúng tôi sử dụng COUNT(*) .

Lý do COUNT(*) trong ví dụ trước đã trả về tất cả các hàng, là do hai hàng đó đã làm có dữ liệu trong các cột khác.

Trong ví dụ của tôi, DBMS của tôi cũng trả về một cảnh báo về điều này. Bạn có thể nhận được cảnh báo hoặc không, tùy thuộc vào DBMS và cấu hình cụ thể của bạn.

Kết quả được lọc

COUNT() hàm đếm các hàng được trả về bởi truy vấn. Vì vậy, nếu bạn lọc kết quả, kết quả là COUNT() sẽ phản ánh điều đó.

SELECT COUNT(*) AS Count
FROM Pets
WHERE PetName = 'Fluffy';

Kết quả:

+---------+
| Count   |
|---------|
| 2       |
+---------+

Trong trường hợp này, có hai vật nuôi có tên là Fluffy. Do đó, hai hàng sẽ được trả về bởi truy vấn và kết quả của COUNT()2 .

Đếm số cột riêng biệt

Theo mặc định, COUNT() hàm bao gồm một ALL ngầm hiểu từ khóa. Điều này có nghĩa là nó bao gồm các bản sao trong kết quả của nó.

Nhưng bạn cũng có tùy chọn thêm DISTINCT từ khóa để chỉ định rằng chỉ các giá trị khác biệt được trả về. Có nghĩa là, bạn có thể chỉ định rằng nó loại trừ các bản sao.

Hãy chọn PetName cột. Nếu bạn nhìn vào bảng gốc ở trên, bạn có thể thấy rằng PetName cột bao gồm hai hàng có cùng giá trị (Fluffy ).

Đầu tiên, chúng tôi sẽ chạy một COUNT(ALL PetName) truy vấn để bao gồm tất cả các giá trị trùng lặp trong tổng số:

SELECT COUNT(ALL PetName) AS Count
FROM Pets;

Kết quả:

+---------+
| Count   |
|---------|
| 8       |
+---------+

Vì vậy, có tám hàng. Hãy nhớ rằng đây là kết quả tương tự mà chúng tôi sẽ nhận được nếu chúng tôi không bao gồm ALL từ khóa, bởi vì ALL là mặc định.

Bây giờ chúng ta sẽ chạy một COUNT(DISTINCT PetName) để loại bỏ bất kỳ bản sao nào khỏi số lượng.

SELECT COUNT(DISTINCT PetName) AS Count
FROM Pets;

Kết quả:

+---------+
| Count   |
|---------|
| 7       |
+---------+

Lần này kết quả là 7 . Điều này là do giá trị trùng lặp của chúng tôi đã bị loại bỏ. Nghĩa là, giá trị trùng lặp được xử lý như thể chỉ có một giá trị.

Sử dụng COUNT() với HAVING Mệnh đề

Bạn có thể bao gồm COUNT() hoạt động trong nhiều phần của một truy vấn. Nó không chỉ giới hạn ở SELECT danh sách.

Đây là một ví dụ sử dụng COUNT() trong cả HAVING và mệnh đề SELECT danh sách.

SELECT 
    PetTypeId, 
    COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;

Kết quả:

+-------------+---------+
| PetTypeId   | Count   |
|-------------+---------|
| 3           | 4       |
| 2           | 3       |
+-------------+---------+

Trong trường hợp này, chúng tôi đã sử dụng HAVING mệnh đề kết hợp với GROUP BY mệnh đề để chỉ trả về những hàng có COUNT(PetTypeId) lớn hơn 2 .

Bạn không bị giới hạn chỉ với) Toán tử cho người mới bắt đầu ”> lớn hơn toán tử (> ) khi sử dụng HAVING mệnh đề. Bạn có thể sử dụng cùng các toán tử mà bạn có thể sử dụng với WHERE mệnh đề (chẳng hạn như = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE , v.v.).

Xem Các toán tử SQL để biết danh sách các toán tử có sẵn trong SQL.

Chức năng cửa sổ

Tùy thuộc vào DBMS của bạn, bạn có thể sử dụng OVER mệnh đề với COUNT() của bạn chức năng tạo một chức năng cửa sổ.

Một hàm cửa sổ thực hiện một hoạt động giống như tổng hợp trên một tập hợp các hàng truy vấn. Nó tạo ra một kết quả cho mỗi hàng truy vấn. Điều này trái ngược với hoạt động tổng hợp, nhóm các hàng truy vấn thành một hàng kết quả duy nhất.

Dưới đây là một ví dụ để chứng minh khái niệm này.

Chúng tôi đã thấy Pets bàn. Cơ sở dữ liệu của chúng tôi cũng có Owners và nó chứa dữ liệu sau:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Simpson    | (489) 591-0408 | NULL              |
| 4         | Boris       | Trump      | (349) 611-8908 | NULL              |
| 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
| 6         | Burt        | Tyson      | (309) 565-0112 | [email protected]  |
+-----------+-------------+------------+----------------+-------------------+

Chúng tôi có thể truy xuất dữ liệu từ các bảng này và trình bày chúng dưới dạng một tập hợp kết quả bằng cách sử dụng phép nối.

Chúng tôi cũng có thể sử dụng COUNT() chức năng với OVER để áp dụng một hàm cửa sổ cho dữ liệu.

SELECT 
    CONCAT(o.FirstName, ' ', o.LastName) AS Owner,
    p.PetName,
    COUNT(PetId) OVER (PARTITION BY CONCAT(o.FirstName, ' ', o.LastName)) AS "Number of pets from this owner"
FROM Owners o 
INNER JOIN Pets p 
ON p.OwnerId = o.OwnerId
ORDER BY "Number of pets from this owner" DESC;

Kết quả:

+---------------+-----------+----------------------------------+
| Owner         | PetName   | Number of pets from this owner   |
|---------------+-----------+----------------------------------|
| Nancy Simpson | Wag       | 3                                |
| Nancy Simpson | Fluffy    | 3                                |
| Nancy Simpson | Fetch     | 3                                |
| Bart Pitt     | Scratch   | 2                                |
| Bart Pitt     | Bark      | 2                                |
| Boris Trump   | Meow      | 2                                |
| Boris Trump   | Fluffy    | 2                                |
| Homer Connery | Tweet     | 1                                |
+---------------+-----------+----------------------------------+

Trong trường hợp này, chúng tôi đã sử dụng OVER mệnh đề với COUNT() của chúng tôi mệnh đề để phân chia số lượng thành chỉ tên của chủ sở hữu.

Kết quả là chủ sở hữu có nhiều vật nuôi được hiển thị trên nhiều hàng (vì mỗi vật nuôi cũng phải được hiển thị) và mỗi hàng chứa tổng số vật nuôi của chủ sở hữu đó.

Khái niệm này cũng có thể được áp dụng cho các hàm tổng hợp khác trong SQL, chẳng hạn như SUM() , MIN() , MAX()AVG() .

COUNT_BIG()

Nếu bạn đang đếm các tập dữ liệu lớn nghiêm túc trong SQL Server, bạn có thể thấy rằng COUNT() hàm tạo ra lỗi do số lượng quá cao. Điều này sẽ chỉ xảy ra khi số lượng của bạn lớn hơn 2,147,483,647.

Trong những trường hợp như vậy, bạn có thể sử dụng COUNT_BIG() , có thể phục vụ cho số lượng lớn hơn nhiều.

Xem Cách thực hiện COUNT_BIG() Hoạt động trong SQL Server và COUNT() so với COUNT_BIG() để được giải thích chi tiết hơn.

ANSI SQL Standard

COUNT() hàm được liệt kê trong tiêu chuẩn SQL và nó có sẵn trong hầu hết (nếu không phải tất cả) của các DBMS chính và hoạt động khá giống nhau trên chúng.

Để biết các ví dụ về mã được thực hiện trong các DBMS khác nhau, hãy xem SQLite COUNT() , Máy chủ SQL COUNT() và MySQL COUNT() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mô hình dữ liệu đăng ký SaaS

  2. Cách sử dụng mệnh đề HAVING trong SQL

  3. Tính đúng đắn và ràng buộc

  4. Cách xóa cột trong SQL

  5. Tìm hiểu phân tích dữ liệu cơ bản với các chức năng của cửa sổ SQL