Столбец NULLABLE SQL Server против функции SQL COUNT () - PullRequest
3 голосов
/ 16 ноября 2011

Может ли кто-нибудь помочь мне понять что-то? Когда я могу, я обычно избегаю (*) в операторе SQL. Что ж, сегодня была расплата. Вот сценарий:

CREATE TABLE Tbl (Id INT IDENTITY(1, 1) PRIMARY KEY, Name NVARCHAR(16))

INSERT INTO Tbl VALUES (N'John')
INSERT INTO Tbl VALUES (N'Brett')
INSERT INTO Tbl VALUES (NULL)

Я мог бы посчитать количество записей, где Name равно NULL, следующим образом:

SELECT COUNT(*) FROM Tbl WHERE Name IS NULL

Избегая (*), я обнаружил, что следующие два утверждения дают мне два разных результата:

SELECT COUNT(Id) FROM Tbl WHERE Name IS NULL
SELECT COUNT(Name) FROM Tbl WHERE Name IS NULL

Первый оператор правильно возвращает 1 , тогда как второй оператор дает 0 . Why или How?

Ответы [ 6 ]

5 голосов
/ 16 ноября 2011

Это потому, что

Функция COUNT(column_name) возвращает количество значений (значения NULL не учитываются) указанного столбца

, поэтому при подсчете IdВы получите ожидаемый результат, при подсчете имени нет, но ответ, предоставленный запросом, является правильным

1 голос
/ 16 ноября 2011

«COUNT ()» не считает значения NULL. Итак, в основном:

SELECT COUNT(Id) FROM Tbl WHERE Name IS NULL

вернет количество строк, где («ID» не равен NULL) И («имя» равно NULL); результат "1"

В то время как:

SELECT COUNT(Name) FROM Tbl WHERE Name IS NULL

будет подсчитывать строки, где («Имя» не равно нулю) И («Имя» равно нулю); результат всегда будет 0

1 голос
/ 16 ноября 2011

Все описано в COUNT (Transact-SQL) .

COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

ALL - по умолчанию

COUNT(*) возвращает количество элементов вгруппа. включает значения NULL и дубликаты.

COUNT(ALL expression) вычисляет выражение для каждой строки в группе и возвращает число ненулевых значений .

0 голосов
/ 16 ноября 2011

* в COUNT(*) не то же самое * в SELECT * FROM...

SELECT COUNT(*) FROM T; очень конкретно означает мощность табличного выражения T.

SELECT COUNT(1) FROM T; сгенерирует те же результаты, что и COUNT(*), но если содержимое скобок не *, то оно должно быть проанализировано.

SELECT COUNT(c) FROM T;, где c - это столбец со значением NULL в таблице. T будет подсчитывать ненулевые значения.

P.S. Я могу спокойно использовать SELECT * FROM... в правильных обстоятельствах.

P.P.S. Ваш «стол» не имеет ключа: рассмотрим INSERT INTO Tbl VALUES ('John', 'John', 'John', NULL, NULL, NULL); будет разрешено, если результаты будут бессмысленными.

0 голосов
/ 16 ноября 2011

«Всегда избегайте использования *» - одно из тех общих утверждений, которым слепо следуют люди.Если бы вы знали причины, по которым вы избегали *, вы бы знали, что ни одна из этих причин не применима при подсчете (*).

0 голосов
/ 16 ноября 2011

Как уже было сказано, COUNT (column_name) не учитывает значения NULL.Если вы не хотите использовать COUNT(*), используйте COUNT(1), но на самом деле вы не увидите разницу в производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...