3. blokk · Lekérdezések — SELECT · 7e. témakör
A 7a-ban már számoltunk oszlopokkal, a 7b-ben aggregáltunk — most megismerjük a skalárfüggvényeket: szöveg-, szám-, dátum- és feltételes függvényeket, amelyek soronként alakítják az értékeket. Címkék összefűzése, kerekítés, dátumszámítás, feltételtől függő érték — végig élőben kipróbálhatóan.
A függvény egy beépített művelet, amely a bemenetéből egy értéket számol ki. Két nagy család van, és fontos nem összekeverni őket:
| Skalárfüggvény | Aggregáló függvény (7b) | |
|---|---|---|
| Miből számol? | Egy sor értékeiből | Sok sor értékeiből |
| Mit ad? | Soronként egy-egy értéket | Az egész halmazra egyetlen értéket |
| Példa | UPPER(nev), ROUND(ar) | COUNT(*), AVG(ar) |
Ebben a témakörben a skalárfüggvényeket vesszük sorra négy csoportban: szöveg, szám, dátum és feltételes. Bárhol használhatók, ahol kifejezés állhat — a SELECT-listában, a WHERE-ben, az ORDER BY-ban is.
| Függvény | Mit csinál | Példa → eredmény |
|---|---|---|
CONCAT(a, b, ...) | Összefűzés (7a-ból ismerős) | CONCAT('Ár: ', 6990) → Ár: 6990 |
UPPER() / LOWER() | Csupa nagy- / kisbetűssé alakít | UPPER('egér') → EGÉR |
CHAR_LENGTH() | Hossz karakterben | CHAR_LENGTH('árvíz') → 5 |
LENGTH() | Hossz bájtban | LENGTH('árvíz') → 7 |
SUBSTRING(s, kezdet, hossz) | Részszöveg — 1-től indexel! | SUBSTRING('Monitor', 1, 3) → Mon |
TRIM() | Szóközök levágása elölről-hátulról | TRIM(' hé ') → hé |
REPLACE(s, mit, mire) | Csere a szövegben | REPLACE('a-b', '-', '+') → a+b |
LEFT(s, n) / RIGHT(s, n) | Az első / utolsó n karakter | LEFT('Monitor', 3) → Mon |
-- Nagybetűs név és a név eleje: SELECT nev, UPPER(nev) AS nagybetus, SUBSTRING(nev, 1, 7) AS eleje FROM termek;
Az ékezetes betűk UTF-8-ban 2 bájtot foglalnak, ezért
CHAR_LENGTH('árvíz') = 5, de
LENGTH('árvíz') = 7. Ha a szöveg hossza érdekel,
szinte mindig a CHAR_LENGTH kell.
Ha a CONCAT bármelyik tagja NULL, az egész eredmény
NULL lesz! Megoldás: burkold a bizonytalan tagot
IFNULL-ba (5. szakasz), vagy használd a
CONCAT_WS(elválasztó, a, b, ...) változatot, amely a
NULL tagokat egyszerűen kihagyja.
A kerekítőket (ROUND, CEIL,
FLOOR, TRUNCATE) a
7b témakörben már megismertük — itt a többi gyakori
számfüggvény:
| Függvény | Mit csinál | Példa → eredmény |
|---|---|---|
ABS(x) | Abszolút érték | ABS(-5) → 5 |
MOD(a, b) | Osztási maradék (ugyanaz, mint az a % b — a gyakorlóban ez utóbbit használd) | MOD(10, 3) → 1 |
POWER(a, b) | Hatványozás | POWER(2, 10) → 1024 |
SQRT(x) | Négyzetgyök | SQRT(144) → 12 |
-- 15% kedvezményes ár, egészre kerekítve: SELECT nev, ar, ROUND(ar * 0.85) AS akcios_ar FROM termek;
| Függvény | Mit csinál | Példa → eredmény |
|---|---|---|
NOW() | Aktuális dátum és idő | 2026-09-06 14:30:00 |
CURDATE() / CURTIME() | Csak a mai dátum / csak az idő | 2026-09-06 / 14:30:00 |
YEAR() · MONTH() · DAY() | A dátum egy-egy része | YEAR('2026-09-06') → 2026 |
DATEDIFF(d1, d2) | A két dátum különbsége napokban (d1 − d2) | DATEDIFF('2026-03-10', '2026-03-01') → 9 |
DATE_ADD / DATE_SUB | Dátumhoz ad / kivon (INTERVAL) | DATE_ADD('2026-03-01', INTERVAL 30 DAY) → 2026-03-31 |
DATE_FORMAT(d, minta) | Dátum formázása szöveggé | DATE_FORMAT(NOW(), '%Y. %m. %d.') → 2026. 09. 06. |
-- Hány napja regisztráltak a vásárlók? SELECT vezeteknev, regisztracio_datuma, DATEDIFF(CURDATE(), regisztracio_datuma) AS eltelt_nap FROM vasarlo; -- 30 napos garancia lejárata: SELECT DATE_ADD(CURDATE(), INTERVAL 30 DAY) AS garancia_vege;
%Y = négyjegyű év, %m = hónap
(01–12), %d = nap (01–31), %H = óra
(00–23), %i = perc. Magyar formátum:
DATE_FORMAT(d, '%Y. %m. %d.').
-- Van-e készleten? SELECT nev, IF(keszlet > 0, 'van készlet', 'elfogyott') AS allapot FROM termek;
-- Árkategóriába sorolás: SELECT nev, ar, CASE WHEN ar < 10000 THEN 'olcsó' WHEN ar < 100000 THEN 'közepes' ELSE 'drága' END AS arkategoria FROM termek;
A CASE felülről lefelé megy: az első igaz
feltétel ága nyer; ha egyik sem igaz, az ELSE (enélkül NULL). A
CASE szabványos SQL — az IF() a MySQL
rövidebb írásmódja két ágra.
-- Ha nincs kategória, 0-t mutatunk helyette: SELECT nev, IFNULL(kategoria_id, 0) AS kategoria FROM termek; -- COALESCE: az ELSŐ nem-NULL értéket adja a felsoroltak közül: SELECT COALESCE(NULL, NULL, 'harmadik') AS ertek;
IFNULL(x, pot): egy érték + egy pótérték.
COALESCE(a, b, c, ...): akárhány jelölt, az első nem-NULL nyer —
ez ráadásul szabványos SQL, minden rendszerben működik.
Próbáld ki a függvényeket a webshopon! A seedben most van egy kategória nélküli termék is
(Ajándékutalvány) — az IFNULL/COALESCE
rajta mutatja meg magát.
A motor SQLite-alapú. Itt működik: CONCAT, UPPER/LOWER,
SUBSTRING, TRIM, REPLACE, LENGTH, ROUND/CEIL/FLOOR, ABS, POWER, SQRT, a
% (maradék), CASE, IFNULL, COALESCE.
Csak éles MySQL-en fut (a gyakorló jelzi):
a dátumfüggvények (NOW, CURDATE, DATEDIFF, DATE_ADD, DATE_FORMAT…),
az IF(), a CHAR_LENGTH, a
LEFT/RIGHT, a MOD() (itt: %) és a
TRUNCATE.
Két apró eltérés: a gyakorló LENGTH-e
karakterben számol (mint MySQL-ben a CHAR_LENGTH), az
UPPER/LOWER pedig az ékezetes betűket nem váltja át — éles
MySQL-en igen. (Internetkapcsolat szükséges a motorhoz.)
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás — a kódírós feladatokat futtasd is le a fenti élő gyakorlóban!
Melyik függvénnyel alakítod a szöveget csupa nagybetűssé?
Mi a különbség a CHAR_LENGTH és a
LENGTH között? Mikor tér el a kettő?
Mit ad vissza ez a kifejezés? Előbb gondold végig, aztán futtasd le!
SELECT SUBSTRING('Billentyűzet', 1, 6);
Miért lesz az alábbi eredménye NULL, és hogyan javítanád kétféleképpen?
SELECT CONCAT('Kategória: ', NULL);
Mit ír ki soronként ez a lekérdezés a Webkamera HD-re (keszlet = 0)?
SELECT nev, IF(keszlet > 0, 'van', 'nincs') FROM termek;
Kódírás: írd ki minden termék nevét nagybetűsen és a nevének hosszát
karakterben! (A gyakorlóban a hosszra a LENGTH-et használd;
éles MySQL-en a CHAR_LENGTH a pontos.)
Kódírás: sorold a termékeket árkategóriákba
CASE-zel: 10 000 alatt „olcsó", 100 000 alatt „közepes",
fölötte „drága"!
Kódírás: írj lekérdezést, amely minden termékhez kiírja a 15% kedvezményes, egészre kerekített árat, és a kategória-azonosító helyén 0-t mutat, ha nincs kategória (Ajándékutalvány)!
Éles MySQL-re (Workbench): írd ki a mai dátumot
ÉÉÉÉ. hh. nn. formátumban, és számold ki
DATEDIFF-fel, hány napja regisztrált Nagy Anna
(2026-01-12)!
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
| skalárfüggvény | soronként egy értékből egy értéket számol (≠ aggregáló) |
| CONCAT · CONCAT_WS | összefűzés — NULL taggal az egész NULL; a CONCAT_WS kihagyja a NULL-okat |
| UPPER · LOWER | nagy-/kisbetűssé alakítás (csak az eredményben) |
| CHAR_LENGTH · LENGTH | hossz karakterben · bájtban — ékezetnél eltér |
| SUBSTRING(s, kezdet, hossz) | részszöveg — 1-től indexel |
| TRIM · REPLACE · LEFT · RIGHT | szóközvágás · csere · első/utolsó n karakter |
| ABS · MOD (%) · POWER · SQRT | abszolút érték · maradék · hatvány · gyök (kerekítés: 7b) |
| NOW · CURDATE · CURTIME | aktuális dátum+idő · csak dátum · csak idő |
| YEAR · MONTH · DAY | a dátum részei |
| DATEDIFF · DATE_ADD (INTERVAL) | különbség napokban · dátumhoz adás/kivonás |
| DATE_FORMAT | dátum formázása: %Y év, %m hónap, %d nap, %H:%i idő |
| IF · CASE WHEN | feltételtől függő érték — az IF két ág (MySQL), a CASE több ág (szabványos) |
| IFNULL · COALESCE | pótérték NULL helyett · az első nem-NULL a felsoroltakból |
CONCAT (NULL taggal NULL!),
UPPER/LOWER, SUBSTRING (1-től),
TRIM, REPLACE;
hossz: CHAR_LENGTH (karakter) vs
LENGTH (bájt).ABS, MOD (a
% operátorral azonos), POWER,
SQRT — a kerekítők a 7b-ből.NOW/CURDATE, DATEDIFF
(napokban), DATE_ADD ... INTERVAL,
DATE_FORMAT.IF (két ág),
CASE WHEN (több ág, szabványos); NULL-pótlás:
IFNULL / COALESCE.