Prawidłowe zapytanie to: SELECT COUNT(*) FROM Zamowienia;. Funkcja agregująca COUNT() w SQL służy właśnie do zliczania rekordów, a gwiazdka * oznacza „wszystkie kolumny”, czyli w praktyce każdy wiersz w tabeli. Silnik bazy danych nie patrzy wtedy na konkretne pola, tylko sprawdza ile wierszy spełnia warunek w klauzuli FROM/WHERE. To jest standardowy zapis opisany w dokumentacji większości systemów bazodanowych, takich jak MySQL, PostgreSQL, SQL Server czy Oracle. Moim zdaniem warto od razu zapamiętać ten wzorzec, bo jest używany dosłownie wszędzie: do paginacji wyników w aplikacjach webowych (np. policzenie ile jest wszystkich zamówień, żeby wyświetlić numer strony), do raportów (ile zamówień w danym miesiącu), do monitoringu (ile rekordów ma tabela po imporcie danych) itd. Bardzo często łączy się COUNT(*) z klauzulą WHERE, np.: SELECT COUNT(*) FROM Zamowienia WHERE status = 'zrealizowane'; – wtedy zliczasz tylko wybrane zamówienia, spełniające warunek. Dobra praktyka jest też taka, że jeśli chcesz policzyć wszystkie wiersze, to używasz właśnie COUNT(*), a nie COUNT(nazwa_kolumny), bo COUNT(kolumny) pomija wartości NULL. To czasem jest pożądane, ale domyślnie, przy zwykłym „ile jest rekordów w tabeli”, stosuje się COUNT(*). W wielu optymalizacjach baz danych silnik ma specjalne mechanizmy, które potrafią bardzo szybko policzyć COUNT(*) bez czytania całej tabeli, co jest kolejnym powodem, żeby korzystać z tej formy, zgodnie z dobrą praktyką branżową.
W SQL bardzo ważne jest precyzyjne trzymanie się składni języka, bo nawet jeśli coś „wygląda logicznie”, to silnik bazy danych tego nie zrozumie. W przypadku zliczania rekordów mamy w standardzie jasno zdefiniowaną funkcję agregującą COUNT(), która zawsze występuje w kontekście instrukcji SELECT. Samo napisanie COUNT(Zamowienia); bez SELECT i bez gwiazdki jest sprzeczne ze składnią SQL – baza nie wie, czy Zamowienia to tabela, kolumna, czy może alias. Brakuje też słowa kluczowego FROM, więc takie wyrażenie po prostu nie jest poprawnym zapytaniem. Częsty błąd polega też na mieszaniu słowa ALL z innymi elementami składni. Konstrukcja SELECT ALL(*) FROM Zamowienia; wygląda jakby miała zwrócić wszystkie rekordy, ale po pierwsze, ALL stosuje się do listy kolumn, a nie do gwiazdki w nawiasach, a po drugie, taka forma jest niezgodna ze standardem SQL. ALL i DISTINCT mogą występować po SELECT, ale bez nawiasów, np. SELECT ALL kolumna FROM tabela; i w dodatku ALL jest domyślne, więc i tak jest zbędne. To zapytanie i tak nie liczy wierszy, tylko próbowałoby je wypisać (gdyby było poprawne składniowo), czyli rozwiązuje zupełnie inne zadanie niż w pytaniu. Kolejny typowy trop to mylenie funkcji SUM() z COUNT(). SUM() służy do sumowania wartości liczbowych w konkretnej kolumnie, np. SELECT SUM(kwota) FROM Zamowienia; oblicza łączną wartość zamówień. Zostawienie pustych nawiasów SUM() bez wskazania kolumny jest niepoprawne, bo silnik nie wie, co ma sumować. Nawet gdyby tam była kolumna, to dalej nie liczyłbyś rekordów, tylko sumę liczbową. To zupełnie inny rodzaj operacji agregującej. Z mojego doświadczenia widać, że wiele osób próbuje „zgadywać” składnię SQL, zamiast oprzeć się na standardowych wzorcach. Dobra praktyka w branży jest prosta: do liczenia wierszy w tabeli zawsze używamy SELECT COUNT(*) FROM nazwa_tabeli; ewentualnie z dodatkowymi warunkami w klauzuli WHERE. Taki zapis jest czytelny, jednoznaczny i działa tak samo w większości popularnych systemów bazodanowych, co ma ogromne znaczenie w projektach wieloosobowych i w dłuższej perspektywie utrzymania kodu.