Що означає “вибрати count (1) from table_name” у будь-якій таблиці бази даних?


92

Коли ми виконуємо, select count(*) from table_nameце повертає кількість рядків.

Що робить count(1)? Що 1тут означає? Це те саме, що count(*)(оскільки при виконанні дає той самий результат)?


1
Цікаве питання. Мене також цікавить, чи відповідає відповідь на реалізацію (наприклад, чи такий результат запиту такий самий у SQL Server, як і в Oracle).
Jon Schneider

Відповіді:


106

Параметр функції COUNT - це вираз, який слід обчислювати для кожного рядка. Функція COUNT повертає кількість рядків, для яких вираз обчислюється, ненульовим значенням. (* - це спеціальний вираз, який не обчислюється, він просто повертає кількість рядків.)

Для виразу є два додаткові модифікатори: ALL і DISTINCT. Вони визначають, чи видаляються дублікати. Оскільки ALL є типовим, ваш приклад такий самий, як count (ALL 1), що означає, що дублікати зберігаються.

Оскільки вираз "1" для кожного рядка має ненульове значення, і оскільки ви не видаляєте дублікати, COUNT (1) завжди повинен повертати те саме число, що і COUNT (*).


Запам’ятайте, виберіть з таблиці1 ВИДІЛЕННЯ coloumn1! = Виберіть кількість (DISTINCT coloumn1) з таблиці1;
Канагавелу Сугумар

Також підрахунок (1) тут 1 - це не осінь ні, це вираз. наприклад) виберіть 1 із таблиці1; надрукує 1 раз на жоден рядок таблиці.
Канагавелу Сугумар

виберіть кількість (DISTINCT / ALL стовпець) з таблиці1; поверне жодне з усіх / різних NOT NULL значень стовпця (columnName).
Канагавелу Сугумар

виберіть DISTINCT стовпець1 із таблиці1; буде включати одне значення NULL у стовпець (column1). виберіть кількість (ВИДАЛИТИ колоніум1) з таблиці1; не буде включати навіть один рядок NULL.
Канагавелу Сугумар

1
@datps - насправді існує необмежена кількість виразів, які дають однаковий результат. COUNT ('Привіт, світе!') Повинен працювати так само добре. (Я не пробував.) Отже, питання в тому, навіщо створювати спеціальний вираз (*), коли вже існує необмежена кількість способів робити те саме? Я не можу говорити за творців SQL (у яких є багато гріхів, щоб спокутувати :)), але це було, мабуть, тому людям не довелося б довільно вибирати ненульовий вираз. Це могло заплямувати наміри автора запиту. "Чому вони написали 1 замість 2? Це, мабуть, щось означає!"
Jeffrey L Whitledge

26

Ось посилання, яке допоможе відповісти на ваші запитання. Коротко:

count (*) - це правильний спосіб записати його, і count (1) ОПТИМІЗОВАНО БУТИ count (*) внутрішньо - оскільки

а) підрахувати рядки, де 1 не дорівнює нулю, менш ефективно, ніж
б) підрахувати рядки


17

Різниця між count (*) та count (1) в Oracle?

count (*) означає, що він буде рахувати всі записи, тобто кожну клітинку, АЛЕ

count (1) означає, що він додасть один псевдо стовпець зі значенням 1 і поверне рахунок усіх записів


9

Це схоже на різницю між

SELECT * FROM table_name and SELECT 1 FROM table_name.  

Якщо ти зробиш

SELECT 1 FROM table_name

це дасть вам число 1 для кожного рядка таблиці. Отже, так count(*)і count(1)забезпечить ті самі результати, що count(8)іcount(column_name)


3
count (ім'я_столбця) не зовсім однаковий - він не враховує рядки з нулем у цьому стовпці. Дивіться тут для подробиць: stackoverflow.com/questions/169784
Blorgbeard виходить

Хм, насправді це для SQL Server. Я думаю, Oracle може працювати по-іншому.
Blorgbeard вийшов

Count ніколи не повинен використовувати значення NULL відповідно до стандартних SQL, ORacle та SQL Server повинні мати однакову поведінку в цьому відношенні.
Торстен

"подібно до різниці між SELECT * FROM ім'я таблиці та SELECT 1 FROM ім'я таблиці." -- не зовсім. 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

в Oracle я вважаю, що вони мають абсолютно однакове значення


Чи відноситься 1 до першої колонки?
дакракот

1
ні, 1 відноситься до константи 1. Коли ви говорите: ЗАМОВИТИ НА 1, це стосується першого стовпця.
Тіло

це те, про що я дивувався деякий час тому, але ви можете вказати будь-яке число, яке перевищує кількість стовпців, але результат все одно. Тож це точно не номер стовпця.
Nrj

@dacracot: може, але я не вірю в це. З того, що я розумію, оракул просто перезаписує count (1), щоб вважати count (*) у фоновому режимі
Jarod Elliott

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 (*). Деякі попередні відповіді стверджували, що між двома значеннями немає різниці, і я наводив можливий зустрічний приклад.
Йоганн Захарі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.