2013-08-17 3 views
24

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

+1

Имейте значение «null» в столбце. Затем сделайте подсчет столбца. Посмотрите, как подсчеты различаются. Выбор «0» или «1» - это просто выбор константы для каждой строки, при этом не будет задействован «нуль». – Glenn

+0

Возможный дубликат [В SQL, какая разница между count (column) и count (\ *)?] (Http://stackoverflow.com/questions/59294/in-sql-whats-the-difference-between-countcolumn -and-count) – newtover

ответ

30

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

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

select 1 from A 
select 0 from A 
select * from 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 в качестве выхода

+1

Итак, почему именно интегральные значения передаются функции count? – Dhruv

+0

@DhruvSingh дал вам больше подробностей в моем ответе – Bren

+0

@Bren есть ли какие-либо отличия в плане производительности? –

20

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

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

+0

Спасибо fthiella. @brhneser имеет много подробного ответа для новичка, подобного мне. – Dhruv

+1

Да, вы правы, но я думаю, что 'count (*)' займет больше времени, чем 'count (1)', не так ли? Если да, то использование 'count (1)' будет лучше для производительности. :) – Yubaraj

+3

@Yubaraj count (1) имел лучшие показатели, чем count (*), по крайней мере, на некоторых dbms, но в настоящее время оптимизатор способен подсчитать счетчик (*), эквивалентный счету (1) – fthiella

10

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

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

Смежные вопросы