Когда мы выполняем, 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» оценивается как ненулевое для каждой строки и поскольку вы не удаляете дубликаты, COUNT (1) всегда должен возвращать то же число, что и COUNT (*).
Разница между 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)
даст те же результаты, что и will 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).
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
. Другие утверждают, что они точно такие же.
В этой ссылке утверждается, что разница в скорости между двумя вариантами связана с ПОЛНЫМ сканированием таблицы и быстрым полным сканированием.