Что означает «выбрать количество (1) из таблицы_имя» в любой таблице базы данных? - PullRequest
82 голосов
/ 08 октября 2008

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

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

Ответы [ 9 ]

95 голосов
/ 08 октября 2008

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

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

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

26 голосов
/ 08 октября 2008

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

count (*) - правильный способ записи это и количество (1) оптимизировано, чтобы быть считать (*) внутренне - с

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

17 голосов
/ 11 ноября 2008

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

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

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

8 голосов
/ 08 октября 2008

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

SELECT * FROM table_name and SELECT 1 FROM table_name.  

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

SELECT 1 FROM table_name

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

6 голосов
/ 08 октября 2008

Разницы нет.

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 голосов
/ 08 октября 2008
SELECT COUNT(1) from <table name>

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

SELECT COUNT(*)  from <table name>

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

SELECT COUNT(col_name) from <table name>

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

2 голосов
/ 01 апреля 2014

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

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;
2 голосов
/ 08 октября 2008

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

0 голосов
/ 08 октября 2008

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

Эта ссылка утверждает, что разница в скорости между этими двумя значениями обусловлена ​​полным сканированием таблицы и быстрым полным просмотром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...