Что означает «выбрать количество (1) из table_name» в любых таблицах базы данных?

93

Когда мы выполняем, select count(*) from table_nameон возвращает количество строк.

Что count(1)делать? Что 1здесь означает? Это то же самое count(*)(поскольку дает тот же результат при исполнении)?

Nrj
источник
1
Интересный вопрос. Мне также было бы интересно узнать, зависит ли ответ от реализации (например, является ли результат запроса таким же в SQL Server, как и в Oracle).
Джон Шнайдер

Ответы:

107

Параметр функции COUNT - это выражение, которое нужно вычислить для каждой строки. Функция COUNT возвращает количество строк, для которых выражение имеет ненулевое значение. (* - это специальное выражение, которое не оценивается, оно просто возвращает количество строк.)

У выражения есть два дополнительных модификатора: ALL и DISTINCT. Они определяют, отбрасываются ли дубликаты. Поскольку ALL является значением по умолчанию, ваш пример такой же, как count (ALL 1), что означает, что дубликаты сохраняются.

Поскольку выражение «1» оценивается как ненулевое для каждой строки и поскольку вы не удаляете дубликаты, COUNT (1) всегда должен возвращать то же число, что и COUNT (*).

Джеффри Л. Уитледж
источник
Помните, выберите DISTINCT coloumn1 из table1! = Выберите count (DISTINCT coloumn1) из table1;
Канагавелу Сугумар
Также count (1) здесь 1 не столбец, это выражение. например) выберите 1 из table1; будет печатать 1 раз для всех строк, которые есть в таблице.
Канагавелу Сугумар
выберите количество (DISTINCT / ALL columnName) из table1; не вернет все / отдельные значения NOT NULL столбца (columnName).
Канагавелу Сугумар
выберите DISTINCT column1 из table1; будет включать одно значение NULL в столбец (column1). выберите количество (DISTINCT coloumn1) из table1; не будет включать даже одну строку NULL.
Канагавелу Сугумар
1
@datps - на самом деле существует неограниченное количество выражений, которые дают одинаковый результат. COUNT ('Hello, world!') Также должен работать. (Я не пробовал.) Итак, вопрос в том, зачем создавать специальное выражение (*), когда уже существует неограниченное количество способов сделать то же самое? Я не могу говорить от имени создателей SQL (которым нужно искупить множество грехов :)), но, вероятно, это было сделано для того, чтобы людям не пришлось произвольно выбирать ненулевое выражение. Это могло бы запутать намерения автора запроса. «Почему они написали 1 вместо 2? Это должно что-то значить!»
Джеффри Л. Уитледж, 03
26

Вот это ссылка , которая поможет ответить на ваши вопросы. Короче говоря:

count (*) - это правильный способ записать его, а count (1) ОПТИМИЗИРОВАН, чтобы быть count (*) внутри - поскольку

а) подсчет строк, где 1 не равно нулю, менее эффективен, чем
б) подсчет строк

Эдди Авад
источник
17

Разница между count (*) и count (1) в оракуле?

count (*) означает, что он будет считать все записи, т.е. каждую ячейку, НО

count (1) означает, что он добавит один псевдостолбец со значением 1 и вернет количество всех записей


источник
9

Это похоже на разницу между

SELECT * FROM table_name and SELECT 1 FROM table_name.  

Если вы сделаете

SELECT 1 FROM table_name

он даст вам номер 1 для каждой строки в таблице. Так что да count(*)и count(1)даст те же результаты, что и will count(8)илиcount(column_name)

ChrisHDog
источник
3
count (column_name) не совсем то же самое - он не считает строки с нулевым значением в этом столбце. Подробности см. Здесь: stackoverflow.com/questions/169784
Blorgbeard отсутствует
Хм, на самом деле это для SQL Server. Полагаю, Oracle может работать иначе.
Blorgbeard выйдет
Count никогда не должен использовать значения NULL в соответствии со стандартным SQL, ORacle и SQL Server должны иметь такое же поведение в этом отношении.
Торстен
"аналогично разнице между SELECT * FROM table_name и SELECT 1 FROM table_name." -- на самом деле, нет. SELECT * и SELECT 1 разные. SELECT (*) и SELECT (1) дают одинаковый результат.
Дэвид Олдридж
7

Нет никакой разницы.

COUNT(1)в основном просто подсчитывает постоянное значение 1 столбец для каждой строки. Как говорили здесь другие пользователи, это то же самое, что COUNT(0)или COUNT(42). NULLДостаточно любой неценности.

http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789

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

Кейд Ру
источник
5
SELECT COUNT(1) from <table name>

должен делать то же самое, что и

SELECT COUNT(*)  from <table name>

Могли быть или все еще есть некоторые причины, по которым он будет работать лучше, чем SELECT COUNT(*)в какой-то базе данных, но я считаю, что это ошибка в БД.

SELECT COUNT(col_name) from <table name>

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

Тило
источник
3

в оракуле я считаю, что они имеют точно такое же значение

Джарод Эллиотт
источник
1 относится к первой колонке?
dacracot
1
нет, 1 относится к константе 1. Когда вы говорите ORDER BY 1, это относится к столбцу один.
Тило
это то, о чем я задумывался некоторое время назад, но вы можете указать любое число, которое больше, чем количество столбцов, но результат тот же. Так что это определенно не номер столбца.
Nrj
@dacracot: может, но я так не думаю. Насколько я понимаю, оракул просто переписывает count (1), чтобы он был count (*) в фоновом режиме
Джарод Эллиот
2

Вы можете проверить это так:

create table test1(
 id number,
 name varchar2(20)
);

insert into test1 values (1,'abc');
insert into test1 values (1,'abc');

select * from test1;
select count(*) from test1;
select count(1) from test1;
select count(ALL 1) from test1;
select count(DISTINCT 1) from test1;
Викас Кумар
источник
0

В зависимости от того, кого вы спросите, некоторые люди сообщают, что выполнение select count(1) from random_table;выполняется быстрее, чем select count(*) from random_table. Другие утверждают, что они точно такие же.

В этой ссылке утверждается, что разница в скорости между двумя вариантами связана с ПОЛНЫМ сканированием таблицы и быстрым полным сканированием.

Иоганн Захари
источник
Вы неверно истолковываете ссылку. LS подчеркивает, что COUNT (COLUMN) может быть тем же самым и быстрее, чем COUNT (*), но только тогда, когда не индексируются столбцы NOT NULL, но COLUMN индексируется и фактически не имеет нулевых значений. Скорее вопрос с подвохом.
Дэвид Олдридж
1
Я пытался использовать ссылку, чтобы задокументировать утверждение, что в некоторых случаях COUNT (1) может быть быстрее, чем COUNT (*). В некоторых более ранних ответах говорилось, что между этими двумя нет различий, и я приводил возможный встречный пример.
Иоганн Захари