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 (*).
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
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ść.
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).
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.
SELECTCOUNT(col_name) from <tablename>
ma jednak inne znaczenie, ponieważ zlicza tylko wiersze z wartością inną niż null dla danej kolumny.
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:
createtable test1(
idnumber,
namevarchar2(20)
);
insertinto test1 values (1,'abc');
insertinto test1 values (1,'abc');
select * from test1;
selectcount(*) from test1;
selectcount(1) from test1;
selectcount(ALL1) from test1;
selectcount(DISTINCT1) from test1;
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.
Ź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.
Odpowiedzi:
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 (*).
źródło
Oto link , który pomoże odpowiedzieć na Twoje pytania. W skrócie:
źródło
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
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(*)
icount(1)
zapewni takie same wyniki, jak będziecount(8)
lubcount(column_name)
źródło
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, coCOUNT(0)
lubCOUNT(42)
.NULL
Wystarczy 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).
źródło
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.
źródło
w wyroczni uważam, że mają one dokładnie to samo znaczenie
źródło
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;
źródło
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.
źródło