В SQL Server, COUNT()
функцията връща броя на елементите, намерени в група. Можете да го използвате, за да разберете колко реда има в таблица или набор от резултати.
Синтаксис
Синтаксисът е така:
-- БРОЙ синтаксис на функцията за агрегиране ( { [ [ ALL | DISTINCT ] израз ] | * } ) -- COUNT синтаксис на аналитична функция ( [ ALL ] { израз | * } ) НАД ( [] )
ALL
прилага агрегатната функция към всички стойности. Това е стойността по подразбиране.
DISTINCT
указва, че функцията връща броя на уникалните ненулеви стойности.
expression
е израз от всякакъв тип, с изключение на изображение , ntext , или текст . Обобщени функции и подзаявки не се поддържат в израза.
*
указва, че всички редове трябва да бъдат преброени и върнати, включително дублиращи се редове и редове, които съдържат нулеви стойности. COUNT(*)
не приема параметри и не поддържа използването на DISTINCT
. Освен това не изисква израз параметър (тъй като не използва информация за конкретна колона).
OVER ( [ <partition_by_clause> ]
разделя резултатния набор, произведен от FROM
клауза в дялове, към които се прилага функцията. Ако не е посочено, функцията третира всички редове от резултата от заявката като една група.
Пример 1 – Основна употреба
Ето основен пример, показващ как работи тази функция:
ИЗБЕРЕТЕ БРОЙ(*) КАТО „Брой на редове“ ОТ Изпълнители;
Резултат:
+------------+| Брой редове ||------------|| 16 |+------------+
В този случай има 16 реда в Изпълнители таблица.
Само за да сме сигурни, ето ги:
ИЗБЕРЕТЕ *ОТ Изпълнители;
Резултат:
+------------+------------------------+-------- ------+------------+| ArtistId | Име на изпълнител | ActiveFrom | CountryId ||-----------+-----------------------+-------- -----+------------|| 1 | Iron Maiden | 1975-12-25 | NULL || 2 | AC/DC | 11.01.1973 г. | NULL || 3 | Алън Холдсуърт | 1969-01-01 | NULL || 4 | Бъди Рич | 1919-01-01 | NULL || 5 | Девин Таунсенд | 1993-01-01 | NULL || 6 | Джим Рийвс | 1948-01-01 | NULL || 7 | Том Джоунс | 1963-01-01 | NULL || 8 | Maroon 5 | 1994-01-01 | NULL || 9 | Сценарият | 2001-01-01 | NULL || 10 | Осветено | 1988-06-26 | NULL || 11 | Black Sabbath | 1968-01-01 | NULL || 12 | Майкъл се научава да рок | 15.03.1988 | NULL || 13 | Карабао | 1981-01-01 | NULL || 14 | Karnivool | 1997-01-01 | NULL || 15 | Птиците от Токио | 2004-01-01 | NULL || 16 | Bodyjar | 1990-01-01 | NULL |+-----------+-----------------------+-------- -----+------------+
Както се очаква, се връщат 16 реда.
Забележете, че CountryId колоната не съдържа нищо освен нулеви стойности. Това ще бъде полезно за следващия пример.
Пример 2 – Посочете колона
Предишният пример използва звездичка (*
), за да посочите всички редове. Това води до преброяване на всички редове, независимо дали има дубликати или съдържат нулеви стойности.
Можете също да посочите конкретна колона. Когато направите това, нулевите стойности не се отчитат. Тоест всички редове, съдържащи нулева стойност за тази колона, не се отчитат.
Ето пример за използване на CountryId колона, както е споменато в предишния пример:
ИЗБЕРЕТЕ COUNT(CountryId) КАТО „Брой на редове“ ОТ Изпълнители;
Резултат:
+------------+| Брой редове ||------------|| 0 |+------------+
Както видяхме в предишния пример, всички редове за тази колона са NULL
. Следователно резултантният брой редове е нула.
Нека добавим някои стойности в тази колона:
UPDATE ArtistsSET CountryId =2WHERE ArtistName IN („AC/DC“, „Karnivool“, „Birds of Tokyo“, „Bodyjar“);
Сега нека отново преброим редовете за тази колона:
ИЗБЕРЕТЕ COUNT(CountryId) КАТО „Брой на редове“ ОТ Изпълнители;
Резултат:
+------------+| Брой редове ||------------|| 4 |+------------+
Пример 3 – С DISTINCT
Този пример използва DISTINCT
клауза за връщане само на отделни редове (т.е. недублирани).
В предишния пример актуализирах таблицата, така че същият
CountryId
беше приложен към четирима изпълнители (използвах SET CountryId = 2
за четиримата художници). Това доведе до четири реда със същия
CountryId
.
Ето какво се случва, ако преброя колко различни CountryId s са в тази таблица:
ИЗБЕРЕТЕ COUNT(DISTINCT CountryId) 'Distinct CountryIds'FROM Изпълнители;
Резултат:
<пред>+-----------------------+| Различни идентификатори на държави ||-----------------------|| 1 |+-----------------------+Това може да се очаква, защото въпреки че има четири реда с CountryId , все още е само един отделен CountryId .
Само за да сме сигурни, нека го стартираме заедно с неговата „неотличима“ версия:
ИЗБЕРЕТЕ COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct'FROM Artists;
Резултат:
+----------------+------------+| Неразличими | Различни ||----------------+-----------|| 4 | 1 |+----------------+-----------+
Така че неразличимата версия показва колко пъти
CountryId
се появява в таблицата, докато DISTINCT
версията отчита множеството поява за 1.
Нека добавим още един CountryId към масата:
UPDATE ArtistsSET CountryId =1WHERE ArtistName ='Carabao';
И сега стартирайте заявката отново:
ИЗБЕРЕТЕ COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct'FROM Artists;
Резултат:
+----------------+------------+| Неразличими | Различни ||----------------+-----------|| 5 | 2 |+----------------+-----------+
Пример 4 – Използвайте клауза WHERE
Ето един бърз пример за използване на WHERE
клауза.
ИЗБЕРЕТЕ COUNT(*) КАТО 'Брой на редове'FROM ArtistsWHERE ActiveFrom>='2000-01-01';
Резултат:
+------------+| Брой редове ||------------|| 2 |+------------+
Пример 5 – С GROUP BY
Ето пример за групиране на изпълнителите в една колона, след което преброяване на всички албуми за всеки изпълнител в другата колона.
Пример:
ИЗБЕРЕТЕ ИМЕ на изпълнител, COUNT(al.AlbumId) 'Брой албуми'ОТ Изпълнители arINNER ПРИСЪЕДИНЕТЕ Албуми alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY 'Брой албуми' DESC;
Резултат:
+-------------------+--------------------+ | Име на изпълнител | Брой албуми ||-----------------------+-------------------- || Iron Maiden | 5 || Майкъл се научава да рок | 3 || Сценарият | 3 || Том Джоунс | 3 || Девин Таунсенд | 3 || Алън Холдсуърт | 2 || Бъди Рич | 1 || AC/DC | 1 || Джим Рийвс | 1 |+------------------------+--------------------+предварително>Пример 6 – С клаузата HAVING
Можем да настроим предишния пример, за да включим само онези изпълнители, които имат повече от определен брой албуми. Можем да направим това с помощта на
HAVING
клауза.ИЗБЕРЕТЕ Име на изпълнител, COUNT(al.AlbumId) 'Брой албуми'ОТ ИЗПЪЛНИТЕЛИ arINNER ПРИСЪЕДИНЕТЕ се към албуми alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameHAVING COUNT(al.AlbumId)> 2ORDER BY 'Брой албуми';предварително>Резултат:
+-------------------+--------------------+ | Име на изпълнител | Брой албуми ||-----------------------+-------------------- || Iron Maiden | 5 || Майкъл се научава да рок | 3 || Сценарият | 3 || Том Джоунс | 3 || Девин Таунсенд | 3 |+-----------------------+--------------------+предварително>Пример 7 – Разделяне с клауза OVER
Можете да използвате
OVER
клауза сPARTITION BY
за разделяне на резултатите на дялове.В този пример използвам
OVER (PARTITION BY ArtistName)
за да изброите всеки албум, който изпълнителят е продуцирал, както и общия брой албуми за този изпълнител.SELECT ArtistName, AlbumName, COUNT(AlbumId) OVER (PARTITION BY ArtistName) 'Брой албуми от този изпълнител'FROM Изпълнители arINNER ПРИСЪЕДИНЕТЕ се Албуми alON al.ArtistId =ar.ArtistIdORDER BY 'Брой албуми от този изпълнител' DESC;Резултат:
+-----------------------+--------------------- -----+-------------------------------------+| Име на изпълнител | Име на албум | Брой албуми от този изпълнител ||-----------------------+----------------- ---------+---------------------------------------|| Iron Maiden | Powerslave | 5 || Iron Maiden | Някъде във времето | 5 || Iron Maiden | Част от ума | 5 || Iron Maiden | Убийци | 5 || Iron Maiden | Без молитва за умиращите | 5 || AC/DC | Мощност | 3 || AC/DC | Отново в черно | 3 || AC/DC | Рок или бюст | 3 || Майкъл се научава да рок | Синя нощ | 3 || Майкъл се научава да рок | Вечност | 3 || Майкъл се научава да рок | Скандинавия | 3 || Девин Таунсенд | Зилтоид Всезнаещият | 3 || Девин Таунсенд | Жертвите на Cool | 3 || Девин Таунсенд | Epicloud | 3 || Том Джоунс | Дълго изгубен куфар | 3 || Том Джоунс | Похвала и порицание | 3 || Том Джоунс | Along Came Jones | 3 || Алън Холдсуърт | Цяла нощ грешно | 2 || Алън Холдсуърт | Шестнадесетте мъже от Тейн | 2 || Бъди Рич | Big Swing Face | 1 || Джим Рийвс | Пеене надолу по алеята | 1 || Сценарият | Няма звук без тишина | 1 |+-----------------------+--------------------- ----+-------------------------------------+Имайте предвид, че това кара броят на изпълнителите и албумите да се повтарят в няколко реда, но това може да се очаква, когато искаме също да изброим всеки албум на отделен ред.
Пример 8 – С STRING_AGG()
Ако не искате всеки изпълнител и брой албуми да се повтарят на няколко реда, както в предишния пример, винаги можете да използвате
STRING_AGG()
функция за извеждане на албумите като списък. В този случай няма да имате нужда отOVER
клауза.Пример:
SELECT ArtistName, STRING_AGG(AlbumName, ', ') 'Albums', COUNT(AlbumId) 'Count'FROM Artists arINNER JOIN Албуми alON al.ArtistId =ar.ArtistIdGROUP BY ArtistNameORDER BY 'pre>Count' DESC;Резултат:
+-----------------------+--------------------- -------------------------------------------------- ---------+--------+| Име на изпълнител | Албуми | Брой ||-----------------------+--------------------- -------------------------------------------------- ---------+--------|| Iron Maiden | Powerslave, Някъде във времето, Piece of Mind, Killers, Без молитва за умиращите | 5 || AC/DC | Powerage, обратно в черно, рок или бюст | 3 || Майкъл се научава да рок | Синя нощ, Вечност, Скандинавия | 3 || Девин Таунсенд | Ziltoid Всезнаещият, Жертви на Cool, Epicloud | 3 || Том Джоунс | Отдавна изгубен куфар, хвала и вина, Along Came Jones | 3 || Алън Холдсуърт | Цяла нощ грешна, Шестнадесетте мъже от Тейн | 2 || Бъди Рич | Big Swing Face | 1 || Джим Рийвс | Пеене надолу по алеята | 1 || Сценарият | Няма звук без тишина | 1 |+-----------------------+--------------------- -------------------------------------------------- --------+--------+МНОГО редове?
COUNT()
функцията връща резултата си като int тип данни. Ако имате толкова много редове, че резултатът е по-голям от товаint може да се справи, опитайтеCOUNT_BIG()
вместо това.
COUNT_BIG()
работи по същия начин катоCOUNT()
, с изключение на това, че резултатите му се връщат като bigint стойност на типа данни.Може също да обмислите използването на
APPROX_COUNT_DISTINCT()
в някои случаи.
APPROX_COUNT_DISTINCT()
връща приблизителна стойност, а не точна стойност. Той обаче е проектиран да бъде много по-отзивчив отCOUNT()
иCOUNT_BIG()
, така че може да бъде полезно за моменти, когато отзивчивостта е по-важна от прецизността.Той е проектиран да връща уникални, различни от нулеви стойности, така че би било подходящо само за моменти, когато обикновено използвате
DISTINCT
клауза сCOUNT_BIG()
.Също така имайте предвид, че към момента на писане на
APPROX_COUNT_DISTINCT()
е в състояние на публичен преглед.