Database
 sql >> база данни >  >> RDS >> Database

SQL COUNT() за начинаещи

В SQL, COUNT() функцията е обобщена функция, която връща броя на елементите, намерени в група.

Можете да използвате COUNT() в множество части на заявка. Например, можете да го използвате в SELECT списък или HAVING клауза при филтриране на групи.

Примерна таблица

Да предположим, че имаме следната таблица:

SELECT * FROM Pets;

Резултат:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

Следващите примери ще използват COUNT() функция при запитване към тази таблица.

Пример

Ето един прост пример, за да започнете.

SELECT COUNT(*) AS Count
FROM Pets;

Резултат:

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

Това ни казва, че в таблицата има 8 реда. Знаем това, защото използвахме заместващия знак за звездичка (* ), за да посочите всички редове и всички колони.

Пребройте конкретна колона

Можете също така да посочите конкретна колона за броене. COUNT() функцията отчита само не-NULL резултати, така че ако посочите колона, която съдържа NULL стойности, тези стойности няма да бъдат отчетени.

Ето пример, за да демонстрирам какво имам предвид.

SELECT COUNT(DOB) AS Count
FROM Pets;

Резултат:

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

В този случай Pets таблицата съдържа две NULL стойности в DOB колона (два домашни любимци не са посочили датата си на раждане) и така COUNT(DOB) връща 6 вместо 8, когато използвахме COUNT(*) .

Причината COUNT(*) в предишния пример върна всички редове, защото тези два реда направиха има данни в другите колони.

В моя пример моята СУБД също върна предупреждение за това. Може да получите или да не получите предупреждение, в зависимост от вашата СУБД и конкретната ви конфигурация.

Филтрирани резултати

COUNT() функцията преброява редовете, върнати от заявката. Така че, ако филтрирате резултатите, резултатът от COUNT() ще отрази това.

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

Резултат:

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

В този случай има два домашни любимци с име Fluffy. Следователно, два реда биха били върнати от заявката и резултатът от COUNT() е 2 .

Преброяване на отделни колони

По подразбиране COUNT() функцията включва имплицитно ALL ключова дума. Това означава, че включва дубликати в своите резултати.

Но също така имате възможност да добавите DISTINCT ключова дума, за да посочите, че се връщат само различни стойности. Това означава, че можете да посочите, че изключва дубликати.

Нека изберем PetName колона. Ако погледнете оригиналната таблица по-горе, можете да видите, че PetName колоната включва два реда с една и съща стойност (Fluffy ).

Първо ще изпълним COUNT(ALL PetName) заявка, за да включи всички дублиращи се стойности в броя:

SELECT COUNT(ALL PetName) AS Count
FROM Pets;

Резултат:

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

И така, има осем реда. Не забравяйте, че това е същият резултат, който бихме получили, ако не бяхме включили ALL ключова дума, защото ALL е по подразбиране.

Сега ще изпълним COUNT(DISTINCT PetName) за да премахнете всички дубликати от преброяването.

SELECT COUNT(DISTINCT PetName) AS Count
FROM Pets;

Резултат:

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

Този път резултатът е 7 . Това е така, защото нашата дублирана стойност беше елиминирана. Тоест, дублираната стойност се третира така, сякаш има само една стойност.

Използване на COUNT() с HAVING Клауза

Можете да включите COUNT() функция в множество части на заявка. Не се ограничава само до SELECT списък.

Ето пример, който използва COUNT() както в HAVING клауза и SELECT списък.

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

Резултат:

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

В този случай използвахме HAVING клауза във връзка с GROUP BY клауза за връщане само на онези редове, които имат COUNT(PetTypeId) от по-голямо от 2 .

Не сте ограничени само до ) Оператор за начинаещи”>по-голям от оператора (> ), когато използвате HAVING клауза. Можете да използвате същите оператори, които можете да използвате с WHERE клауза (като = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE и др.).

Вижте SQL оператори за списък с оператори, налични в SQL.

Функции на прозореца

В зависимост от вашата СУБД, може да сте в състояние да използвате OVER клауза с вашия COUNT() функция за създаване на прозоречна функция.

Прозоречната функция изпълнява агрегатно-подобна операция върху набор от редове на заявка. Той произвежда резултат за всеки ред на заявката. Това е в контраст с агрегирана операция, която групира редовете на заявката в един ред с резултати.

Ето пример за демонстриране на концепцията.

Вече видяхме Pets маса. Нашата база данни също има Owners таблица и съдържа следните данни:

+-----------+-------------+------------+----------------+-------------------+
| 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]  |
+-----------+-------------+------------+----------------+-------------------+

Можем да извлечем данни от тези таблици и да ги представим като един набор от резултати, като използваме присъединяване.

Можем също да използваме COUNT() функция с OVER клауза за прилагане на прозоречна функция към данните.

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;

Резултат:

+---------------+-----------+----------------------------------+
| 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                                |
+---------------+-----------+----------------------------------+

В този случай използвахме OVER клауза с нашия COUNT() клауза за разделяне на броя само на името на собственика.

Резултатът е, че собствениците с множество домашни любимци се показват на няколко реда (защото всеки домашен любимец също трябва да бъде показан) и всеки ред съдържа общия брой на домашните любимци на този собственик.

Тази концепция може да се приложи и към други агрегатни функции в SQL, като SUM() , MIN() , MAX() и AVG() .

COUNT_BIG()

Ако броите сериозно големи набори от данни в SQL Server, може да откриете, че COUNT() функцията генерира грешка, поради твърде голямото число. Това ще се случи само, че броят ви е по-голям от 2 147 483 647.

В такива случаи можете да използвате COUNT_BIG() , което може да обслужва много по-големи числа.

Вижте как COUNT_BIG() Работи в SQL Server и COUNT() срещу COUNT_BIG() за по-подробно обяснение.

ANSI SQL стандарт

COUNT() функцията е посочена в SQL стандарта и е налична в повечето (ако не във всички) от основните СУБД и работи почти по същия начин в тях.

За примери за код, направени в различни СУБД, вижте SQLite COUNT() , SQL Server COUNT() и 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. SQL не е равен на (!=) оператор за начинаещи

  2. SQL с чужд ключ:Всичко, което трябва да знаете за операциите с чужд ключ

  3. Намаляване на фрагментацията на индекса

  4. Всичко, което трябва да знаете за нормализирането на базата данни

  5. Внедряване на приложение Django в AWS Elastic Beanstalk