W bazie danych sklepu istnieją dwie tabele powiązane relacją: produkty oraz oceny. Tabela oceny zawiera dowolną liczbę ocen klientów dla danego produktu opisaną polami: id, ocena (pole numeryczne), produktID (klucz obcy). Aby wskazać najniższą ocenę dla produktu o ID równym 10, należy posłużyć się zapytaniem
A.
SELECT MIN(ocena) FROM oceny WHERE produktID = 10;
B.
SELECT MIN COUNT(ocena) FROM oceny WHERE produktID = 10;
C.
COUNT MIN SELECT ocena FROM oceny WHERE produktID = 10;
D.
MIN SELECT ocena FROM oceny WHERE produktID = 10;
To zapytanie jest poprawne, bo używa funkcji agregującej MIN(ocena), która zwraca najmniejszą wartość z kolumny ocena. Klauzula FROM oceny wskazuje tabelę, z której pobieramy dane, a WHERE produktID = 10 ogranicza analizę tylko do ocen wystawionych dla konkretnego produktu. Czyli baza nie szuka najniższej oceny w całym sklepie, tylko wśród rekordów powiązanych z produktem o ID 10. To jest dokładnie to, czego wymaga treść zadania.
W praktyce takie zapytanie przyda się np. w panelu sklepu, gdy chcemy pokazać najgorszą opinię o produkcie, wykryć produkty z problemami jakościowymi albo obliczać statystyki ocen: MIN, MAX, AVG, COUNT. Z mojego doświadczenia warto też pamiętać, że jeśli produkt nie ma żadnych ocen, wynik funkcji MIN będzie NULL, a nie 0. To ważne przy wyświetlaniu danych w aplikacji, np. w PHP lub JavaScript trzeba wtedy obsłużyć brak wyniku. Dobrą praktyką jest także indeksowanie kolumny produktID, bo przy większej tabeli ocen warunek WHERE będzie wykonywał się znacznie szybciej. Składnia SELECT MIN(kolumna) FROM tabela WHERE warunek; jest standardowym i czytelnym sposobem zapisu w SQL.
W praktyce takie zapytanie przyda się np. w panelu sklepu, gdy chcemy pokazać najgorszą opinię o produkcie, wykryć produkty z problemami jakościowymi albo obliczać statystyki ocen: MIN, MAX, AVG, COUNT. Z mojego doświadczenia warto też pamiętać, że jeśli produkt nie ma żadnych ocen, wynik funkcji MIN będzie NULL, a nie 0. To ważne przy wyświetlaniu danych w aplikacji, np. w PHP lub JavaScript trzeba wtedy obsłużyć brak wyniku. Dobrą praktyką jest także indeksowanie kolumny produktID, bo przy większej tabeli ocen warunek WHERE będzie wykonywał się znacznie szybciej. Składnia SELECT MIN(kolumna) FROM tabela WHERE warunek; jest standardowym i czytelnym sposobem zapisu w SQL.
W tym zadaniu kluczowe jest zrozumienie, że najniższą wartość w kolumnie wyznacza funkcja agregująca MIN, ale musi ona zostać użyta we właściwym miejscu składni SQL. Poprawna kolejność podstawowego zapytania to SELECT, potem lista wybieranych wyrażeń, następnie FROM z nazwą tabeli i ewentualnie WHERE z warunkiem filtrowania rekordów. SQL nie działa tak, że można dowolnie przestawiać słowa kluczowe, bo parser bazy danych oczekuje konkretnej struktury polecenia.
Zapisy w stylu COUNT MIN SELECT ocena albo MIN SELECT ocena są niepoprawne składniowo. Funkcja MIN nie jest osobnym poleceniem uruchamianym przed SELECT, tylko funkcją, którą wpisuje się w części SELECT, np. SELECT MIN(ocena). Podobnie COUNT też jest funkcją agregującą, ale służy do liczenia liczby rekordów lub wartości, a nie do znajdowania najmniejszej oceny. To częsty błąd myślowy: ktoś widzi, że chodzi o wiele ocen, więc próbuje dodać COUNT, ale liczenie ocen nie odpowiada na pytanie, jaka jest najniższa ocena.
Zapis SELECT MIN COUNT(ocena) również nie ma sensu w tej postaci. Funkcje agregujące wymagają nawiasów i argumentów, np. MIN(ocena) albo COUNT(ocena). Nie można po prostu postawić MIN przed COUNT i oczekiwać, że baza odczyta to jako najniższą ocenę. Nawet gdyby rozważać zagnieżdżanie agregacji, to SELECT MIN(COUNT(ocena)) wymagałoby innego kontekstu, zwykle grupowania lub podzapytania, a semantycznie nadal dotyczyłoby liczby ocen, nie ich wartości. Najpierw trzeba odfiltrować rekordy przez WHERE produktID = 10, a potem obliczyć minimum z kolumny ocena. Moim zdaniem to jeden z tych przykładów, gdzie najlepiej zapamiętać prosty wzorzec: agregat w SELECT, tabela w FROM, warunek w WHERE.
Zapisy w stylu COUNT MIN SELECT ocena albo MIN SELECT ocena są niepoprawne składniowo. Funkcja MIN nie jest osobnym poleceniem uruchamianym przed SELECT, tylko funkcją, którą wpisuje się w części SELECT, np. SELECT MIN(ocena). Podobnie COUNT też jest funkcją agregującą, ale służy do liczenia liczby rekordów lub wartości, a nie do znajdowania najmniejszej oceny. To częsty błąd myślowy: ktoś widzi, że chodzi o wiele ocen, więc próbuje dodać COUNT, ale liczenie ocen nie odpowiada na pytanie, jaka jest najniższa ocena.
Zapis SELECT MIN COUNT(ocena) również nie ma sensu w tej postaci. Funkcje agregujące wymagają nawiasów i argumentów, np. MIN(ocena) albo COUNT(ocena). Nie można po prostu postawić MIN przed COUNT i oczekiwać, że baza odczyta to jako najniższą ocenę. Nawet gdyby rozważać zagnieżdżanie agregacji, to SELECT MIN(COUNT(ocena)) wymagałoby innego kontekstu, zwykle grupowania lub podzapytania, a semantycznie nadal dotyczyłoby liczby ocen, nie ich wartości. Najpierw trzeba odfiltrować rekordy przez WHERE produktID = 10, a potem obliczyć minimum z kolumny ocena. Moim zdaniem to jeden z tych przykładów, gdzie najlepiej zapamiętać prosty wzorzec: agregat w SELECT, tabela w FROM, warunek w WHERE.