• Bazy danych
  • Polecenia SQL bez tajemnic - DDL, DML, DQL, DCL i TCL

Polecenia SQL bez tajemnic - DDL, DML, DQL, DCL i TCL

Tymoteusz Maciejewski • 11 listopada 2026
Schemat klasyfikuje polecenia SQL: DDL (CREATE, ALTER), DML (SELECT, INSERT), DCL (GRANT) i TCL (COMMIT).

Spis treści

Kończysz zapytanie, naciskasz „uruchom” i nagle tabela jest pusta albo zmieniły się wiersze, których nie planujesz ruszać. Polecenia SQL zwykle dzieli się na grupy według ich funkcji, ale ta klasyfikacja nie zawsze jest formalnym podziałem języka ani gwarancją, że każde polecenie zadziała tak samo w każdej bazie.

Diagram klasyfikuje polecenia SQL: DDL (CREATE, ALTER), DML (SELECT, INSERT), DCL (GRANT) i TCL (COMMIT).

Najpierw ustal, czy polecenie czyta dane, zmienia je czy zmienia strukturę

  • SELECT odczytuje dane, a INSERT, UPDATE i DELETE zmieniają wiersze.
  • CREATE, ALTER i DROP dotyczą obiektów bazy, takich jak tabele.
  • WHERE ogranicza zakres modyfikacji, ale jego brak może oznaczać zmianę lub usunięcie wszystkich wierszy.
  • BEGIN, COMMIT i ROLLBACK pomagają kontrolować transakcję, choć zachowanie zależy od silnika bazy.
  • LIMIT i niektóre inne elementy składni różnią się między systemami.

Pięć grup porządkuje polecenia, ale nie jest ścisłą klasyfikacją SQL

Gdy czytasz zestawienie poleceń, skróty DDL, DML, DQL, DCL i TCL pomagają szybko rozpoznać ich rolę. Traktuj je jednak jako praktyczny podział dydaktyczny, a nie uniwersalną taksonomię narzuconą przez standard SQL.

Przykładowo SELECT bywa opisywany jako DQL, czyli język zapytań, choć w części materiałów zalicza się go do szerszej grupy DML. Sama nazwa kategorii mniej pomaga niż odpowiedź na pytanie: czy polecenie czyta dane, zmienia rekordy, strukturę, uprawnienia czy stan transakcji?

Uważam, że początkującej osobie bardziej przyda się rozpoznawanie skutków komendy niż zapamiętywanie skrótów. W praktyce te skutki są widoczne już w nazwie polecenia i jego klauzulach.

SELECT, INSERT, UPDATE i DELETE obsługują codzienną pracę z rekordami

Najczęściej zaczynasz od odczytu. SELECT pobiera wskazane kolumny z tabeli, a WHERE zawęża wynik do wierszy spełniających warunek:

SELECT email, status
FROM users
WHERE status = 'active';

Gdy wstawiasz nowe dane, używasz INSERT INTO; gdy zmieniasz istniejące, UPDATE; gdy usuwasz wiersze, DELETE. W tych dwóch ostatnich poleceniach warunek wymaga szczególnej uwagi: bez WHERE aktualizacja lub usunięcie obejmie całą tabelę. Dokumentacja PostgreSQL wyraźnie pokazuje, że DELETE FROM products; usuwa wszystkie wiersze.

UPDATE users
SET status = 'inactive'
WHERE last_login < DATE '2024-01-01';

DELETE FROM sessions
WHERE expires_at < CURRENT_TIMESTAMP;

Przed wykonaniem zmiany możesz użyć warunku z polecenia modyfikującego w osobnym SELECT, by zobaczyć, które rekordy pasują. Przy odczycie większych zbiorów ograniczaj też liczbę zwracanych wierszy, ale pamiętaj, że składnia limitu różni się między bazami.

CREATE, ALTER i DROP zmieniają strukturę bazy

Dodanie kolumny nie zmienia pojedynczego rekordu, lecz samą tabelę. Polecenia z grupy DDL tworzą, modyfikują lub usuwają obiekty bazy, takie jak tabele, widoki i indeksy.
PolecenieSkutekPrzykład
CREATETworzy obiektCREATE TABLE tasks (id INTEGER, title VARCHAR(200));
ALTERZmienia istniejący obiektALTER TABLE tasks ADD COLUMN done BOOLEAN;
DROPUsuwa obiektDROP TABLE tasks;
TRUNCATEOpróżnia tabelęTRUNCATE TABLE tasks;

DROP TABLE usuwa tabelę jako obiekt, a TRUNCATE usuwa jej zawartość, pozostawiając samą tabelę. Nie zakładaj jednak, że TRUNCATE to po prostu szybszy DELETE: może inaczej działać z wyzwalaczami, kluczami obcymi i transakcjami.

COMMIT nie zawsze cofnie zmianę w strukturze tabeli

Transakcja grupuje operacje, które mają zostać zatwierdzone razem. BEGIN rozpoczyna blok, COMMIT zatwierdza zmiany, a ROLLBACK wycofuje niezakończoną transakcję; dokładne zachowanie zależy jednak od systemu bazy i rodzaju polecenia.

BEGIN;

UPDATE accounts
SET balance = balance - 50
WHERE account_id = 17;

UPDATE accounts
SET balance = balance + 50
WHERE account_id = 42;

COMMIT;

Tu oba przelewy są częścią jednej transakcji, więc nie powinien zostać zatwierdzony tylko jeden z nich. W PostgreSQL bez jawnego bloku każde poprawne polecenie działa domyślnie w osobnej transakcji. Inaczej trzeba myśleć o MySQL: w MySQL 8.4 wiele poleceń DDL, w tym ALTER TABLE, DROP TABLE i TRUNCATE TABLE, powoduje niejawne zatwierdzenie aktywnej transakcji. Opisuje to dokumentacja MySQL 8.4 Reference Manual.

Wniosek jest praktyczny: przed zmianą struktury nie polegaj na ROLLBACK jako uniwersalnym „cofnij”. Sprawdź zachowanie konkretnego silnika i rodzaju polecenia, zanim wykonasz je na ważnej bazie.

Klauzule i dialekt decydują o tym, co naprawdę wykona baza

Dwie komendy mogą wyglądać niemal identycznie, a mimo to różnić się składnią albo szczegółami działania. Na przykład do ograniczania liczby wierszy PostgreSQL i MySQL obsługują LIMIT, natomiast w Microsoft SQL Server spotkasz między innymi TOP lub składnię OFFSET ... FETCH. Dokumentacja polecenia SELECT w PostgreSQL zaznacza, że LIMIT i OFFSET są składnią specyficzną dla PostgreSQL, używaną również przez MySQL.

Równie ważna jest kolejność klauzul. WHERE filtruje wiersze przed grupowaniem, a HAVING pozwala filtrować wyniki grupowania. Jeśli zapytanie zawiera ORDER BY i ograniczenie wyników, sortowanie powinno poprzedzać limit, by wynik nie zależał od przypadkowej kolejności zwróconych rekordów.

SytuacjaMożliwy skutekCo zrobić
UPDATE lub DELETE bez WHEREZmiana albo usunięcie wszystkich wierszy tabeliUruchom najpierw SELECT z planowanym warunkiem
LIMIT odrzucony przez bazęSkładnia nie pasuje do dialektuSprawdź dokumentację używanego systemu i zastosuj jego składnię limitowania
ROLLBACK po poleceniu DDL w MySQLZmiana mogła już zatwierdzić wcześniejszą transakcjęZweryfikuj zasady niejawnego zatwierdzania przed wykonaniem DDL
Wynik z LIMIT bez stabilnego sortowaniaPrzy kolejnych wykonaniach mogą pojawić się inne wierszeDodaj ORDER BY po kolumnie zapewniającej przewidywalną kolejność

Jeśli przenosisz zapytanie między bazami, zacznij od sprawdzenia składni limitowania, obsługi transakcji i poleceń DDL. To te różnice najłatwiej przeoczyć w kodzie, który na pierwszy rzut oka wygląda przenośnie.

Bezpieczny nawyk zaczyna się przed uruchomieniem komendy

Przed zmianą danych przeczytaj polecenie od końca: czy warunek wskazuje właściwe rekordy, czy tabela jest poprawna i czy sesja działa w oczekiwanym trybie transakcji. Przy niepewnym UPDATE lub DELETE najpierw uruchom odpowiadający mu SELECT, a przy większej zmianie sprawdź możliwość odtworzenia danych z kopii.

Najpierw rozpoznaj skutek, potem wykonuj. Gdy wiesz, czy komenda odczytuje rekordy, modyfikuje je, zmienia strukturę czy steruje transakcją, łatwiej przewidzieć zarówno wynik zapytania, jak i moment, w którym zmiany staną się trwałe.

FAQ - Najczęstsze pytania

SELECT odczytuje dane, a INSERT, UPDATE i DELETE modyfikują wiersze. CREATE, ALTER i DROP dotyczą obiektów bazy, takich jak tabele, widoki i indeksy, natomiast TRUNCATE usuwa zawartość tabeli, pozostawiając sam obiekt. BEGIN, COMMIT i ROLLBACK sterują transakcją, a DCL odnosi się do uprawnień. To praktyczny podział, ponieważ SELECT bywa też zaliczany do szerszej grupy DML.

Bez klauzuli WHERE polecenie UPDATE zmieni wszystkie wiersze tabeli, a DELETE usunie wszystkie wiersze. Przed wykonaniem modyfikacji uruchom najpierw osobne SELECT z tym samym warunkiem, aby sprawdzić zakres operacji.

Nie należy traktować ROLLBACK jako uniwersalnego sposobu cofania zmian struktury. W MySQL 8.4 wiele poleceń DDL, w tym ALTER TABLE, DROP TABLE i TRUNCATE TABLE, powoduje niejawne zatwierdzenie aktywnej transakcji. Przed wykonaniem takiej operacji sprawdź zasady konkretnego silnika i przygotuj możliwość odtworzenia danych.

LIMIT jest obsługiwany między innymi przez PostgreSQL i MySQL, ale Microsoft SQL Server korzysta na przykład z TOP lub składni OFFSET ... FETCH. Po zmianie systemu sprawdź jego dokumentację oraz składnię limitowania. Jeśli używasz ograniczenia wyników, dodaj stabilne ORDER BY, ponieważ bez sortowania kolejne wykonania mogą zwrócić inne wiersze.

Oceń artykuł

Ocena: 4.50 Liczba głosów: 2

Tagi

sql
ddl
transakcje
dml
dialekty
Autor Tymoteusz Maciejewski
Tymoteusz Maciejewski
Moje dni wypełnia zgłębianie kodu i analiza nowych technologii, zawsze z myślą o tym, jak najlepiej przekazać tę wiedzę dalej. Nazywam się Tymoteusz Maciejewski i od 12 lat aktywnie działam w świecie programowania, technologii i kariery w IT. Interesuje mnie nie tylko samo tworzenie oprogramowania, ale także proces, który prowadzi do zrozumienia złożonych zagadnień i uporządkowania ich w przystępny sposób. Na lukasz-zielinski.pl staram się dzielić się tym, co sam odkrywam, sprawdzając informacje u podstaw i dbając o to, by treści były aktualne i zrozumiałe dla każdego, kto chce rozwijać się w tej dynamicznej branży.

Udostępnij artykuł

Napisz komentarz