Język SQL (Structured Query Language) to nieodłączny element matury z informatyki, szczególnie w części praktycznej dotyczącej baz danych. Choć jego podstawy mogą wydawać się proste, wielu maturzystów traci cenne punkty przez typowe błędy. W tym artykule omówimy najczęstsze pomyłki i podpowiemy, jak ich unikać.
1. Błędy składniowe - diabeł tkwi w szczegółach
Najprostsze do wyłapania, ale i najczęstsze. Składnia SQL jest rygorystyczna, a drobne pomyłki mogą uniemożliwić wykonanie zapytania.
- Literówki w słowach kluczowych: Np. `SLECT` zamiast `SELECT`, `FORM` zamiast `FROM`, `WERE` zamiast `WHERE`.
- Brakujące lub nadmiarowe przecinki: Szczególnie w listach kolumn w `SELECT` lub wartości w `INSERT INTO`.
- Niewłaściwe użycie cudzysłowów: Pamiętaj, że wartości tekstowe (stringi) w SQL umieszcza się w apostrofach (np. `'Warszawa'`). Nazwy tabel i kolumn zazwyczaj nie wymagają cudzysłowów, chyba że zawierają spacje lub znaki specjalne (wtedy używa się cudzysłowów podwójnych `" "` lub specyficznych dla danego systemu, np. nawiasów kwadratowych `[ ]` w MS Access).
- Zapominanie o średniku na końcu zapytania: Choć niektóre systemy (jak MS Access w pojedynczych zapytaniach) wybaczają jego brak, w bardziej złożonych skryptach lub innych bazach danych jest on wymagany do oddzielenia poleceń.
2. Logika w klauzuli `WHERE` - precyzja to podstawa
Klauzula `WHERE` filtruje dane. Błędy logiczne w tym miejscu prowadzą do otrzymania niepoprawnych wyników.
- Mylenie operatorów `AND` i `OR`: `AND` wymaga spełnienia obu warunków, `OR` przynajmniej jednego. Zastanów się, czy chcesz zawęzić (`AND`) czy rozszerzyć (`OR`) wyniki.
- Brak nawiasów przy złożonych warunkach: Jeśli łączysz więcej niż dwa warunki za pomocą `AND` i `OR`, używaj nawiasów do określenia kolejności operacji, np. `WHERE (kolumna1 = 'A' AND kolumna2 = 'B') OR kolumna3 = 'C'`.
- Problemy z `BETWEEN`: Operator `BETWEEN` jest obustronnie domknięty (`BETWEEN wartosc1 AND wartosc2` oznacza `wartosc1 <= kolumna <= wartosc2`). Upewnij się, że `wartosc1` jest mniejsza lub równa `wartosc2`.
- Niewłaściwe użycie `LIKE`: Do wyszukiwania wzorców używaj `LIKE`. Pamiętaj o znakach specjalnych: `%` (zastępuje dowolny ciąg znaków, nawet pusty) i `_` (zastępuje dokładnie jeden znak). Np. `LIKE 'Kowalsk_'` znajdzie 'Kowalski' i 'Kowalska', a `LIKE '%ski'` znajdzie 'Kowalski', 'Malinowski'.
- Porównywanie z `NULL`: Wartości `NULL` nie można porównywać standardowymi operatorami (`=`, `!=`). Zamiast `kolumna = NULL` używaj `kolumna IS NULL`, a zamiast `kolumna != NULL` używaj `kolumna IS NOT NULL`.
3. Łączenie tabel (`JOIN`) - sztuka budowania relacji
Zadania maturalne często wymagają pobierania danych z wielu powiązanych tabel. Tu czyhają kolejne pułapki.
- Brak warunku łączenia lub błędny warunek: Jeśli zapomnisz o klauzuli `ON` w `JOIN` lub podasz w niej nieprawidłowe kolumny, otrzymasz iloczyn kartezjański (każdy wiersz z jednej tabeli połączony z każdym wierszem z drugiej), co jest zazwyczaj błędem.
- Niewłaściwy typ złączenia: Najczęściej używane to `INNER JOIN` (zwraca tylko pasujące wiersze z obu tabel) i `LEFT JOIN` (zwraca wszystkie wiersze z lewej tabeli i pasujące z prawej; jeśli nie ma dopasowania, kolumny z prawej tabeli będą miały `NULL`). Wybór zależy od tego, jakie dane chcesz uzyskać.
- Niejednoznaczne nazwy kolumn: Jeśli obie łączone tabele mają kolumnę o tej samej nazwie (np. `ID`), musisz ją poprzedzić nazwą tabeli lub jej aliasem (np. `Klienci.ID`, `Zamowienia.ID`). Zaleca się używanie aliasów tabel dla skrócenia zapisu: `FROM Klienci K JOIN Zamowienia Z ON K.ID = Z.KlientID`.
4. Grupowanie danych (`GROUP BY`) i funkcje agregujące
Agregacja danych (np. sumowanie, liczenie średniej) wymaga poprawnego użycia `GROUP BY`.
- Brakujące kolumny w `GROUP BY`: Jeśli w klauzuli `SELECT` masz kolumny, które nie są użyte w funkcjach agregujących (np. `SUM()`, `COUNT()`, `AVG()`), muszą one znaleźć się w klauzuli `GROUP BY`. Inaczej baza danych nie będzie wiedziała, jak pogrupować wiersze.
- Użycie `WHERE` zamiast `HAVING`: Klauzula `WHERE` filtruje wiersze *przed* grupowaniem. Jeśli chcesz filtrować *po* zgrupowaniu (na podstawie wyników funkcji agregujących), musisz użyć klauzuli `HAVING`. Np. `SELECT Kategoria, AVG(Cena) FROM Produkty GROUP BY Kategoria HAVING AVG(Cena) > 100`.
- Niezrozumienie działania funkcji agregujących: `COUNT(*)` liczy wszystkie wiersze w grupie. `COUNT(kolumna)` liczy wiersze, gdzie `kolumna` nie jest `NULL`. `COUNT(DISTINCT kolumna)` liczy unikalne wartości w `kolumnie` (nie `NULL`).
5. Modyfikacja danych (`INSERT`, `UPDATE`, `DELETE`) - uwaga na skutki!
Choć rzadsze w skomplikowanych zadaniach, podstawy modyfikacji danych też trzeba znać.
- `INSERT INTO`: Upewnij się, że liczba i typy podawanych wartości zgadzają się z liczbą i typami kolumn w tabeli lub w liście kolumn, którą podajesz.
- `UPDATE` i `DELETE`: Najważniejsze - nie zapominaj o klauzuli `WHERE`! Jeśli jej nie użyjesz w poleceniu `UPDATE`, zmodyfikujesz *wszystkie* wiersze w tabeli. Jeśli pominiesz `WHERE` w `DELETE`, usuniesz *wszystkie* dane z tabeli. To najczęstszy i najpoważniejszy błąd prowadzący do utraty danych (na maturze - do błędnego wyniku).
Praktyczne porady na koniec
- Dokładnie czytaj polecenia: Zrozum, jakie dane masz wybrać, jak je filtrować i grupować.
- Testuj na małych próbkach: Zanim napiszesz skomplikowane zapytanie, testuj jego fragmenty.
- Korzystaj z widoku SQL w MS Access: Nawet jeśli projektujesz zapytania w widoku graficznym (QBE), zaglądaj do widoku SQL, aby zrozumieć, jak Twoje działania przekładają się na kod. To świetna nauka!
- Sprawdzaj typy danych: Upewnij się, że porównujesz i łączysz kolumny o zgodnych typach danych.
- Nie spiesz się: Lepiej napisać zapytanie wolniej, ale poprawnie, niż szybko i z błędami.
Unikanie tych błędów znacząco zwiększy Twoje szanse na dobry wynik z części praktycznej matury z informatyki. Powodzenia!
