Недавно я задал этот вопрос в интервью. Я попробовал это в mySQL и получил те же результаты (окончательные результаты). Все указали количество строк в этой конкретной таблице. Может ли кто-нибудь объяснить основное различие между ними.
В чем разница между count (0), count (1)... и count (*) в mySQL/SQL?
Ответ 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)
, может быть то, что исторически, это был наоборот.