Подтвердить что ты не робот

В чем разница между count (0), count (1)... и count (*) в mySQL/SQL?

Недавно я задал этот вопрос в интервью. Я попробовал это в mySQL и получил те же результаты (окончательные результаты). Все указали количество строк в этой конкретной таблице. Может ли кто-нибудь объяснить основное различие между ними.

4b9b3361

Ответ 1

Ничего, если вы не укажете поле в таблице или выражение в скобках вместо постоянных значений или *

Позвольте мне дать вам подробный ответ. Граф даст вам нулевой номер записи данного поля. Скажем, у вас есть таблица с именем A

select 1 from A
select 0 from A
select * from A

все возвращают одинаковое количество записей, то есть количество строк в таблице A. Все же результат отличается. Если в таблице записано 3 записи. С именами полей X и Y

select 1 from A will give you

1
1
1

select 0 from A will give you
0
0
0

select * from A will give you ( assume two columns X and Y is in the table )
X      Y
--     --
value1 value1
value2 (null)
value3 (null)

Итак, все три запроса возвращают одинаковое число. Если вы не используете

select count(Y) from A 

поскольку есть только одно ненулевое значение, вы получите 1 в качестве вывода

Ответ 2

COUNT(*) будет подсчитывать количество строк, а COUNT(expression) будет считать ненулевые значения в выражении, а COUNT(column) будет считать все ненулевые значения в столбце.

Поскольку оба значения 0 и 1 являются ненулевыми значениями, COUNT(0)=COUNT(1), и оба они будут эквивалентны количеству строк COUNT(*). Это другое понятие, но результат будет таким же.

Ответ 3

Теперь - все они должны выполняться одинаково.

В прошедшие дни, хотя COUNT (1) (или любая другая константа, которую вы выбрали), иногда рекомендуется рекомендовать по COUNT (*), потому что плохой код оптимизации запроса заставит базу данных получить все данные поля до запуска подсчета. Поэтому COUNT (1) был быстрее, но теперь это не имеет значения.

Ответ 4

COUNT(*), COUNT(1) , COUNT(0), COUNT('Y') , ...

Все вышеперечисленное возвращает общее количество записей (включая нулевые).

Но COUNT('any constant') быстрее, чем COUNT(*).

Ответ 5

Допустим, у нас есть таблица с колонками

Table 
-------
col_A  col_B

Система возвращает все значения столбца (нулевые и ненулевые), когда мы запрашиваем

select col_A from Table

Система возвращает значения столбцов, которые не равны нулю, когда мы запрашиваем

select count(col_A) from Table

Система возвращает общее количество строк, когда мы запрашиваем

select count(*) from Table

Ответ 6

Производительность и качество счета (параментро) и консультация по регистрациям нет нуля и консультации (*) количество запросов (*).

Ответ 7

Поскольку выражение 1 является константным выражением, они всегда должны давать один и тот же результат, но реализации могут отличаться, так как некоторые СУБД могут проверять наличие 1 IS NULL для каждой отдельной строки в группе. Это все еще выполняется PostgreSQL 11.3, как я показал в этой статье.

Я сравнил запросы по 1М строкам, выполнив подсчет двух типов:

-- Faster
SELECT count(*) FROM t;

-- 10% slower on PostgreSQL 11.3
SELECT count(1) FROM t;

Одной из причин, по которой люди могут использовать менее интуитивный COUNT(1), может быть то, что исторически, это был наоборот.