Czytelny SQL — formatowanie zapytań i dobre praktyki
Jak układać zapytania SELECT z JOIN, WHERE i GROUP BY, żeby były zrozumiałe po miesiącu, jak nazywać aliasy, dlaczego warto unikać SELECT * i jak chronić się przed SQL injection. Z przykładami przed i po.
Przed i po
select u.id,u.imie,count(z.id) zamowien from uzytkownicy u left join zamowienia z on z.uzytkownik_id=u.id where u.aktywny=1 group by u.id,u.imie having count(z.id)>2 order by zamowien desc
SELECT u.id, u.imie, COUNT(z.id) AS zamowien FROM uzytkownicy u LEFT JOIN zamowienia z ON z.uzytkownik_id = u.id WHERE u.aktywny = 1 GROUP BY u.id, u.imie HAVING COUNT(z.id) > 2 ORDER BY zamowien DESC
Drugą wersję czyta się „z góry na dół”: jakie kolumny, skąd, z jakimi warunkami, jak pogrupowane. Taki układ zrobi automatycznie formatowanie SQL — przyda się zwłaszcza przy zapytaniach skopiowanych z logów lub wygenerowanych przez ORM.
Zasady czytelnego SQL
- Słowa kluczowe wielkimi literami, nazwy tabel i kolumn małymi — od razu widać strukturę.
- Jedna klauzula — jedna sekcja; kolumny w SELECT jedna pod drugą (łatwo dodać, usunąć, zakomentować).
- Warunki AND/OR na początku linii, nawiasy przy mieszaniu AND i OR —
a AND (b OR c)to co innego niża AND b OR c. - Jawne JOIN-y zamiast przecinków w FROM i warunków złączenia w WHERE.
- Znaczące aliasy —
udla użytkowników jest czytelne w krótkim zapytaniu; w długich lepiejuzyt,zam. - AS przy aliasach kolumn —
SUM(z.kwota) AS suma, a nie samoSUM(z.kwota) suma.
Unikaj SELECT *
Pobieranie wszystkich kolumn spowalnia zapytania (więcej danych z dysku i przez sieć), utrudnia korzystanie z indeksów pokrywających i psuje kod, gdy ktoś doda kolumnę do tabeli. Wypisuj kolumny, których naprawdę potrzebujesz.
SQL injection — najważniejsza zasada bezpieczeństwa
Nigdy nie sklejaj zapytania z tekstem od użytkownika:
// źle — podatne na SQL injection "SELECT * FROM uzytkownicy WHERE login = '" . $login . "'" // dobrze — zapytanie przygotowane z parametrem $st = $db->prepare('SELECT id, imie FROM uzytkownicy WHERE login = ?'); $st->execute([$login]);
Zapytania przygotowane (parametry) oddzielają kod SQL od danych — baza nigdy nie potraktuje danych jak polecenia. To ta sama idea co kodowanie danych przy wyświetlaniu w HTML (zob. ochrona przed XSS).
Wydajność w skrócie
- Indeksy na kolumnach używanych w WHERE, JOIN i ORDER BY.
- Unikaj funkcji na kolumnie w warunku (
WHERE YEAR(data) = 2026) — lepiej zakres:WHERE data >= '2026-01-01' AND data < '2027-01-01'. - LIMIT przy podglądzie danych i stronicowaniu.
- Sprawdzaj plan zapytania (
EXPLAIN) przy wolnych zapytaniach.
Wyniki zapytań często trafiają do API jako JSON — o formacie przeczytasz w poradniku co to jest JSON, a dane sformatujesz w formatowaniu JSON.
Narzędzia do tego poradnika
SQLbazy danychMySQLformatowanie koduSQL injectiondobre praktyki