SQL od zera: rodziny poleceń, składnia i typy danych

INF.03 · teoria
autor: redakcja · 07.09.2026 · aktualizacja: 08.09.2026
Czym jest SQL, na jakie rodziny dzielą się polecenia (DDL, DML, DCL, DQL), jak wygląda poprawna składnia zapytania i jak dobrać typ danych kolumny w MySQL. Lekcja 8.1 kursu INF.03.
SQL (Structured Query Language, czyli struk­tu­ral­ny język za­py­tań) to język, w którym mówisz bazie, CO ma zrobić, a nie jak to zrobić. Pi­szesz „daj pro­duk­ty droż­sze niż sto zło­tych", a nie „przej­rzyj tabelę wiersz po wier­szu". Na eg­za­mi­nie pi­sem­nym wra­ca­ją dwa py­ta­nia z tej lekcji: do której ro­dzi­ny należy dane po­le­ce­nie oraz jaki typ danych pasuje do ko­lum­ny. W części prak­tycz­nej od typu danych zależy punkt za za­da­nie w ro­dza­ju „dodaj ko­lum­nę miesz­czą­cą liczby od 0 do 255".

Cztery ro­dzi­ny po­le­ceń

Po­le­ceń SQL jest kil­ka­dzie­siąt, ale na eg­za­mi­nie dzieli się je na cztery grupy według tego, czego do­ty­czą.
Skrót
Pełna nazwa
Co robi
Po­le­ce­nia
DDL
Data Definition Language
de­fi­niu­je STRUKTURĘ: bazy, tabele, ko­lum­ny
CREATE, ALTER, DROP, TRUNCATE
DML
Data Manipulation Language
zmie­nia DANE w ta­be­lach
INSERT, UPDATE, DELETE
DQL
Data Query Language
po­bie­ra dane
SELECT
DCL
Data Control Language
nadaje i od­bie­ra upraw­nie­nia
GRANT, REVOKE
Piąta, rza­dziej pytana grupa to TCL (Transaction Control Language): START TRANSACTION, COMMIT, ROLLBACK. Zaj­mu­je się nią lekcja o trans­ak­cjach.
Po­dział ma prostą logikę: DDL do­ty­czy POJEMNIKA (tabela, ko­lum­na), DML jego ZAWARTOŚCI (wier­sze), DCL tego, KTO ma prawo tam za­glą­dać. Część pod­ręcz­ni­ków i pytań za­li­cza SELECT do DML, bo obie grupy ope­ru­ją na danych, a nie na struk­tu­rze. Jeżeli w py­ta­niu jest osobna od­po­wiedź DQL, wy­bierz DQL; jeżeli jej nie ma, SELECT to DML.
Pu­łap­ka: DROP TABLE i DELETE brzmią po­dob­nie, a należą do róż­nych rodzin. DROP usuwa CAŁĄ TABELĘ razem ze struk­tu­rą (DDL), DELETE usuwa WIERSZE, a pusta tabela zo­sta­je (DML).

Jak wy­glą­da po­praw­ne po­le­ce­nie

SELECT nazwa, cena FROM produkt WHERE cena > 100;
Kilka zasad, które w py­ta­niach de­cy­du­ją o po­praw­nej od­po­wie­dzi:
  • Śred­nik kończy po­le­ce­nie. W phpMyAdmin jedno za­py­ta­nie za­dzia­ła bez niego, ale skrypt z wie­lo­ma po­le­ce­nia­mi bez śred­ni­ków nie ma szans się wy­ko­nać.
  • Wiel­kość liter w sło­wach klu­czo­wych nie ma zna­cze­nia, select działa tak samo jak SELECT. Przy­ję­ło się pisać słowa klu­czo­we wiel­ki­mi li­te­ra­mi, bo to zwięk­sza czy­tel­ność i tak za­pi­sa­ne są w ar­ku­szach.
  • Wiel­kość liter w na­zwach tabel ma zna­cze­nie na Li­nuk­sie, a nie ma na Win­dow­sie. Skoro serwer eg­za­mi­na­cyj­ny może być inny niż twój, trzy­maj się do­kład­nie nazw z za­da­nia.
  • Tekst stoi w apo­stro­fach: 'Kraków'. Cu­dzy­słów " w MySQL też za­dzia­ła, ale apo­strof jest stan­dar­dem SQL. Liczby za­pi­su­je się bez apo­stro­fów.
  • Od­wrot­ny apo­strof (znak pod kla­wi­szem Esc) otacza nazwę ko­lum­ny lub tabeli, gdy nazwa za­wie­ra spację albo jest słowem klu­czo­wym, jak nazwa produktu albo order. phpMyAdmin dodaje go wszę­dzie, ale w za­da­niu nie jest po­trzeb­ny.
  • Ko­men­tarz to -- treść do końca wier­sza (dwa myśl­ni­ki i SPACJA) albo /* treść */ na kilka wier­szy. MySQL ro­zu­mie także # treść.
  • Białe znaki są do­wol­ne. Za­py­ta­nie w jednym wier­szu i za­py­ta­nie roz­bi­te na pięć wier­szy to dla bazy to samo. Roz­bi­jaj, bo ła­twiej zna­leźć błąd.
Za­py­ta­nie po­ni­żej wy­ko­nu­je się w prze­glą­dar­ce, na tabeli produkt:
[ SQL ]
baza: sklep
zapytanie
32/4000
Otwórz w placu zabaw ›

Typy danych: liczby

Typ mówi, co wolno wpisać do ko­lum­ny i ile miej­sca zajmie jedna war­tość. Wybór typu to jedna z pierw­szych de­cy­zji przy two­rze­niu tabeli i jedno z częst­szych pytań na eg­za­mi­nie.
Typ
Zakres
Roz­miar
Kiedy używać
TINYINT
-128 do 127; UNSIGNED 0 do 255
1 bajt
wiek, liczba sztuk, ocena
SMALLINT
-32 768 do 32 767
2 bajty
rok, liczba stron
INT
około -2,1 mld do 2,1 mld
4 bajty
do­myśl­ny wybór dla id i liczb cał­ko­wi­tych
BIGINT
bardzo duże liczby cał­ko­wi­te
8 bajtów
licz­ni­ki, iden­ty­fi­ka­to­ry glo­bal­ne
DECIMAL(m, d)
do­kład­nie m cyfr, w tym d po prze­cin­ku
za­leż­ny
CENY i pie­nią­dze
FLOAT, DOUBLE
liczby zmien­no­prze­cin­ko­we
4 lub 8 bajtów
po­mia­ry, wyniki ob­li­czeń
UNSIGNED (bez znaku) prze­su­wa zakres: skoro nie ma liczb ujem­nych, górna gra­ni­ca rośnie dwu­krot­nie. Dla­te­go ko­lum­na na war­tość „od 0 do 255" to TINYINT UNSIGNED, i do­kład­nie o to pyta jeden z ar­ku­szy prak­tycz­nych.
Pu­łap­ka: ceny za­pi­su­je się w DECIMAL(8,2), a nie w FLOAT. FLOAT prze­cho­wu­je liczbę w przy­bli­że­niu, więc suma wielu cen po­tra­fi wyjść 19,999999 za­miast 20. DECIMAL liczy do­kład­nie.

Typy danych: tekst, data i reszta

Typ
Co prze­cho­wu­je
Uwaga
CHAR(n)
tekst STAŁEJ dłu­go­ści n znaków
krót­kie kody: CHAR(2) na skrót kraju; krót­sza war­tość jest do­peł­nia­na spa­cja­mi
VARCHAR(n)
tekst do n znaków
do­myśl­ny wybór na imię, nazwę, adres
TEXT
długi tekst, do 65 535 znaków
opisy, treść ar­ty­ku­łu; nie ma sensu na na­zwi­sko
DATE
data RRRR-MM-DD
data uro­dze­nia, termin
TIME
go­dzi­na GG:MM:SS
czas trwa­nia
DATETIME
data i go­dzi­na
moment za­mó­wie­nia
TIMESTAMP
data i go­dzi­na, za­pi­sy­wa­na w stre­fie UTC
znacz­nik zmiany re­kor­du
BOOLEAN
prawda lub fałsz
w MySQL to na­praw­dę TINYINT(1): 0 to fałsz, 1 to prawda
ENUM('a','b')
jedna war­tość z po­da­nej listy
płeć, status za­mó­wie­nia
BLOB
dane bi­nar­ne
plik, obraz; na stro­nach lepiej trzy­mać ścież­kę do pliku
Róż­ni­ca między CHAR a VARCHAR jest ulu­bio­nym py­ta­niem: CHAR(10) zawsze zaj­mu­je dzie­sięć znaków, VARCHAR(10) tyle, ile fak­tycz­nie wpi­sa­no, plus jeden bajt na dłu­gość. Do ko­lum­ny z na­zwi­ska­mi wy­bierz VARCHAR, do ko­lum­ny z kodem pocz­to­wym o stałym for­ma­cie CHAR.
Format daty w SQL jest zawsze RRRR-MM-DD, czyli '2026-09-07', nie­za­leż­nie od tego, jak datę wy­świe­tla system ope­ra­cyj­ny. Zapis '07.09.2026' w za­py­ta­niu nie za­dzia­ła.

NULL, czyli brak war­to­ści

NULL (nic) to nie zero i nie pusty tekst. Ozna­cza, że war­to­ści nie znamy. Ko­lum­na z ogra­ni­cze­niem NOT NULL nie przyj­mie ta­kie­go wier­sza, a ko­lum­na bez tego ogra­ni­cze­nia przyj­mie. Po­rów­na­nia z NULL nie dzia­ła­ją przez =, tylko przez IS NULL, co opi­su­je lekcja o SELECT.
sztuk INT NULL -- wolno nie wiedzieć, ile jest sztuk nazwa VARCHAR(80) NOT NULL -- nazwa jest obowiązkowa

Na eg­za­mi­nie

Py­ta­nia z tej lekcji mają trzy kształ­ty. Pierw­szy: „Do której grupy po­le­ceń należy ALTER TABLE" z od­po­wie­dzia­mi DDL, DML, DCL, DQL. Drugi: „Który typ danych za­pi­sze war­tość 12,50 zł bez błędu za­okrą­gle­nia" albo „Jaki typ wybrać dla war­to­ści od 0 do 255". Trzeci: roz­po­zna­nie błędu w za­pi­sie, na przy­kład daty w pol­skim for­ma­cie albo tekstu bez apo­stro­fów.
W części prak­tycz­nej typy danych po­ja­wia­ją się przy po­le­ce­niu ALTER TABLE ... ADD, gdzie arkusz opi­su­je ko­lum­nę sło­wa­mi, a ty masz dobrać typ. Za­pa­mię­taj trzy pary: liczby cał­ko­wi­te to INT, małe liczby do­dat­nie to TINYINT UNSIGNED, pie­nią­dze to DECIMAL.

Ściąga

Rzecz
Za­pa­mię­taj
DDL
CREATE, ALTER, DROP, TRUNCATE: struk­tu­ra
DML
INSERT, UPDATE, DELETE: dane
DQL
SELECT: po­bie­ra­nie danych
DCL
GRANT, REVOKE: upraw­nie­nia
koniec po­le­ce­nia
śred­nik
ko­men­tarz
-- tekst, /* tekst */, # tekst
tekst i data
w apo­stro­fach, data jako 'RRRR-MM-DD'
liczba cał­ko­wi­ta
INT, mała do­dat­nia TINYINT UNSIGNED (0 do 255)
cena
DECIMAL(8,2), nigdy FLOAT
krótki tekst
VARCHAR(n); stała dłu­gość CHAR(n)
brak war­to­ści
NULL, blo­ku­je go NOT NULL
Pobierz ściągę PDF
ZAWODNIK
egzamin zawodowy INF.02 · INF.03 · INF.04
Serwer Discord
Egzaminy zawodowe IT/Matury/Studia
@yastor
© 2026 Zawodnik · by Yastor
Arkusze i zasady oceniania pochodzą z CKE. Serwis nie jest powiązany z Centralną Komisją Egzaminacyjną.