Co oznacza „select count (1) from table_name” w dowolnej tabeli bazy danych?

94

Kiedy wykonujemy select count(*) from table_name, zwraca liczbę wierszy.

Co robi count(1)? Co to 1oznacza? Czy to to samo, co count(*)(ponieważ daje taki sam wynik przy wykonaniu)?

Nrj
źródło
1
Interesujące pytanie. Interesuje mnie również, czy odpowiedź jest zależna od implementacji (np. Czy wynik zapytania jest taki sam w SQL Server, jak w Oracle).
Jon Schneider

Odpowiedzi:

108

Parametr funkcji COUNT jest wyrażeniem, które ma być obliczane dla każdego wiersza. Funkcja COUNT zwraca liczbę wierszy, dla których wynikiem wyrażenia jest wartość różna od null. (* to specjalne wyrażenie, które nie jest oceniane, po prostu zwraca liczbę wierszy).

Istnieją dwa dodatkowe modyfikatory wyrażenia: ALL i DISTINCT. Określają one, czy duplikaty są odrzucane. Ponieważ ALL jest wartością domyślną, Twój przykład jest taki sam jak count (ALL 1), co oznacza, że ​​zachowywane są duplikaty.

Ponieważ wyrażenie „1” ma wartość różną od null dla każdego wiersza, a ponieważ nie usuwasz duplikatów, COUNT (1) powinien zawsze zwracać tę samą liczbę co COUNT (*).

Jeffrey L Whitledge
źródło
Pamiętaj, wybierz DISTINCT coloumn1 z tabeli1! = Wybierz liczbę (DISTINCT coloumn1) z tabeli1;
Kanagavelu Sugumar
Również count (1) tutaj 1 nie jest coloumn nie, to jest wyrażenie. np. wybierz 1 z tabeli 1; wypisze 1 liczbę razy dla żadnego z wierszy, które ma tabela.
Kanagavelu Sugumar
wybierz liczbę (DISTINCT / ALL nazwa_kolumny) z tabeli1; zwróci nie wszystkich / odrębnych wartości NIE NULL kolumny (nazwa_kolumny).
Kanagavelu Sugumar
wybierz DISTINCT kolumna1 z tabeli1; będzie zawierać jedną wartość NULL w kolumnie (kolumna1). wybierz liczbę (DISTINCT coloumn1) z tabeli1; nie będzie zawierać nawet jednego wiersza NULL.
Kanagavelu Sugumar
1
@datps - W rzeczywistości istnieje nieograniczona liczba wyrażeń, które dają ten sam wynik. COUNT („Witaj, świecie!”) Powinno działać równie dobrze. (Nie próbowałem tego). Pytanie brzmi więc, po co tworzyć specjalne wyrażenie (*), skoro istnieje już nieograniczona liczba sposobów zrobienia tego samego? Nie mogę mówić w imieniu twórców SQL (którzy mają wiele grzechów do odpokutowania :)), ale prawdopodobnie było tak, że ludzie nie musieliby arbitralnie wybierać wyrażenia niezerowego. To by pomieszało intencje autora zapytania. „Dlaczego napisali 1 zamiast 2? To musi coś znaczyć!”
Jeffrey L Whitledge,
27

Oto link , który pomoże odpowiedzieć na Twoje pytania. W skrócie:

count (*) jest poprawnym sposobem zapisu, a count (1) jest ZOPTYMALIZOWANE, ABY BYĆ count (*) wewnętrznie - ponieważ

a) policz wiersze, w których 1 nie jest zerowe, jest mniej wydajne niż
b) policz wiersze

Eddie Awad
źródło
18

Różnica między count (*) a count (1) w Oracle?

count (*) oznacza, że ​​policzy wszystkie rekordy, tj. każdą komórkę ALE

count (1) oznacza, że ​​doda jedną pseudokolumnę o wartości 1 i zwróci liczbę wszystkich rekordów


źródło
9

Jest to podobne do różnicy między

SELECT * FROM table_name and SELECT 1 FROM table_name.  

Jeśli zrobisz

SELECT 1 FROM table_name

da ci numer 1 dla każdego wiersza w tabeli. Więc tak count(*)i count(1)zapewni takie same wyniki, jak będzie count(8)lubcount(column_name)

ChrisHDog
źródło
3
count (nazwa_kolumny) to nie to samo - nie liczy wierszy z wartością null w tej kolumnie. Zobacz tutaj, aby uzyskać szczegółowe informacje: stackoverflow.com/questions/169784
Blorgbeard jest dostępny
Hmm, właściwie to dotyczy SQL Server. Przypuszczam, że Oracle może działać inaczej.
Blorgbeard wychodzi
Count nie powinien nigdy używać wartości NULL, ponieważ w standardowym SQL, ORacle i SQL Server powinny mieć takie samo zachowanie w tym względzie.
Thorsten
"podobny do różnicy między SELECT * FROM nazwa_tabeli i SELECT 1 FROM nazwa_tabeli." -- nie całkiem. SELECT * i SELECT 1 są różne. SELECT (*) i SELECT (1) dają ten sam wynik.
David Aldridge
7

Nie ma różnicy.

COUNT(1)to po prostu zliczanie stałej wartości 1 kolumny dla każdego wiersza. Jak powiedzieli inni użytkownicy tutaj, jest to to samo, co COUNT(0)lub COUNT(42). NULLWystarczy jakakolwiek niewartość.

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

Optymalizator Oracle najwyraźniej używał błędów, które spowodowały, że na liczbę wpłynęła wybrana kolumna i czy znajdowała się w indeksie, więc powstała konwencja COUNT (1).

Cade Roux
źródło
5
SELECT COUNT(1) from <table name>

powinien zrobić dokładnie to samo, co

SELECT COUNT(*)  from <table name>

Być może istniały lub nadal istnieją powody, dla których będzie działać lepiej niż SELECT COUNT(*)w przypadku niektórych baz danych, ale uważam, że to błąd w bazie danych.

SELECT COUNT(col_name) from <table name>

ma jednak inne znaczenie, ponieważ zlicza tylko wiersze z wartością inną niż null dla danej kolumny.

Thilo
źródło
3

w wyroczni uważam, że mają one dokładnie to samo znaczenie

Jarod Elliott
źródło
Czy 1 odnosi się do pierwszej kolumny?
dacracot
1
nie, 1 odnosi się do stałej liczby 1. Kiedy mówisz ORDER BY 1, odnosi się to do pierwszej kolumny.
Thilo
nad tym się zastanawiałem jakiś czas temu, ale możesz podać dowolną liczbę, która jest większa niż liczba kolumn, nadal wynik jest taki sam. Więc zdecydowanie nie jest to numer kolumny.
Nrj
@dacracot: może, ale nie sądzę. Z tego, co rozumiem, wyrocznia po prostu przepisuje count (1) to be count (*) w tle
Jarod Elliott
2

Możesz przetestować w ten sposób:

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;
Vikas Kumar
źródło
0

W zależności od tego, kogo zapytasz, niektóre osoby zgłaszają, że wykonywanie select count(1) from random_table;działa szybciej niż select count(*) from random_table. Inni twierdzą, że są dokładnie tacy sami.

To łącze twierdzi, że różnica prędkości między 2 jest spowodowana PEŁNYM SKANOWANIEM TABELI a SZYBKIM PEŁNYM SKANOWANIEM.

Johann Zacharee
źródło
Źle interpretujesz link. LS zwraca uwagę, że COUNT (COLUMN) może być takie samo i szybsze niż COUNT (*), ale tylko wtedy, gdy żadna kolumna NOT NULL nie jest indeksowana, ale kolumna jest indeksowana i faktycznie nie ma wartości null. Bardziej podchwytliwe pytanie.
David Aldridge
1
Próbowałem użyć linku, aby udokumentować twierdzenie, że w pewnych okolicznościach COUNT (1) może być szybsze niż COUNT (*). Niektóre wcześniejsze odpowiedzi wskazywały, że nie ma różnic między 2, a ja podałem możliwy kontrprzykład.
Johann Zacharee