Когда мы выполняем select count(*) from table_name
, он возвращает количество строк.
Что делает count(1)
? Что означает 1
здесь? Это то же самое, что и count(*)
(поскольку он дает тот же результат при выполнении)?
Когда мы выполняем select count(*) from table_name
, он возвращает количество строк.
Что делает count(1)
? Что означает 1
здесь? Это то же самое, что и count(*)
(поскольку он дает тот же результат при выполнении)?
Параметр функции COUNT - это выражение, которое должно быть оценено для каждой строки. Функция COUNT возвращает количество строк, для которых выражение оценивается как ненулевое значение. (* - специальное выражение, которое не оценивается, оно просто возвращает количество строк.)
Есть два дополнительных модификатора для выражения: ALL и DISTINCT. Они определяют, выбраны ли дубликаты. Поскольку ALL является значением по умолчанию, ваш пример совпадает с count (ALL 1), что означает, что дубликаты сохраняются.
Поскольку выражение "1" оценивает значение non-null для каждой строки, и поскольку вы не удаляете дубликаты, COUNT (1) всегда должен возвращать тот же номер, что и COUNT (*).
Вот ссылка, которая поможет ответить на ваши вопросы. Короче говоря:
count (*) - правильный способ записи он и счет (1) ОПТИМАЛЬНО БЫТЬ count (*) внутренне - поскольку
a) подсчитывать строки, где 1 не является нулевым менее эффективен, чем б) подсчитать строки
Разница между count (*) и count (1) в оракуле?
count (*) означает, что он будет считать все записи в каждой ячейке НО
count (1) означает, что он добавит один псевдо-столбец со значением 1 и возвращает количество всех записей
Это похоже на разницу между
SELECT * FROM table_name and SELECT 1 FROM table_name.
Если вы делаете
SELECT 1 FROM table_name
он даст вам номер 1 для каждой строки в таблице. Итак, да count(*)
и count(1)
будут давать те же результаты, что и count(8)
или count(column_name)
Нет никакой разницы.
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) возникло.
в oracle я считаю, что они имеют точно такое же значение
SELECT COUNT(1) from <table name>
должен делать то же самое, что и
SELECT COUNT(*) from <table name>
Возможно, были или остаются некоторые причины, по которым он будет работать лучше, чем SELECT COUNT(*)
в некоторой базе данных, но я бы подумал, что ошибка в БД.
SELECT COUNT(col_name) from <table name>
однако имеет другое значение, так как он подсчитывает только строки с ненулевым значением для данного столбца.
Вы можете протестировать следующее:
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;
В зависимости от того, кого вы спрашиваете, некоторые люди сообщают, что выполнение select count(1) from random_table;
выполняется быстрее, чем select count(*) from random_table
. Другие утверждают, что они точно такие же.
Эта ссылка утверждает, что разница в скорости между 2 связана с FULL TABLE SCAN и FAST FULL SCAN.