В 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()
.