Az SQL-ben a záradék (angolul clause) egy SQL-utasítás olyan része, amely meghatározza, hogy mit szeretnénk lekérdezni, milyen feltételekkel, milyen sorrendben vagy hogyan csoportosítva. (Szokták a záradékokat klauzáknak is hívni.)
Például:
SELECT nev, eletkor
FROM diakok
WHERE eletkor >= 18
ORDER BY nev;
Ebben az utasításban több záradékot is használunk:
SELECT – mit szeretnénk lekérdezni?FROM – melyik táblából?WHERE – milyen feltételnek megfelelő sorokat?ORDER BY – milyen sorrendben?Az SQL-utasításokat általában pontosvesszővel (;) zárjuk.
A SELECT segítségével megadjuk, hogy milyen adatokat szeretnénk látni.
Például:
SELECT nev
FROM diakok;
Ez a diakok táblából csak a nev oszlopot jeleníti meg.
Több oszlopot is lekérdezhetünk:
SELECT nev, eletkor, varos
FROM diakok;
A * azt jelenti, hogy az összes oszlopot szeretnénk lekérdezni:
SELECT *
FROM diakok;
Ez kényelmes, de nagyobb adatbázisoknál általában jobb konkrétan megadni a szükséges oszlopokat.
A FROM segítségével mondjuk meg, hogy melyik táblából szeretnénk az adatokat lekérdezni.
SELECT nev
FROM diakok;
Itt:
SELECT → mit kérünk?
FROM → honnan kérjük?
Például:
SELECT *
FROM tanarok;
a tanarok táblából kér le minden oszlopot.
A WHERE segítségével feltételt adhatunk meg.
Csak azok a sorok jelennek meg, amelyek megfelelnek a feltételnek.
Például:
SELECT *
FROM diakok
WHERE eletkor >= 18;
Ez csak azokat a diákokat adja vissza, akik legalább 18 évesek.
A WHERE feltételeiben gyakran használjuk az alábbi jeleket:
| Operátor | Jelentése |
|---|---|
= |
egyenlő |
<> |
nem egyenlő |
!= |
nem egyenlő |
> |
nagyobb |
< |
kisebb |
>= |
nagyobb vagy egyenlő |
<= |
kisebb vagy egyenlő |
Szöveges értékeket idézőjelbe kell tenni.
SELECT *
FROM diakok
WHERE varos = 'Budapest';
Ez csak a budapesti diákokat jeleníti meg.
Az AND segítségével több feltételt egyszerre adhatunk meg.
SELECT *
FROM diakok
WHERE eletkor >= 18 AND varos = 'Budapest';
Ez csak azokat a diákokat adja vissza, akik:
Mindkét feltételnek teljesülnie kell.
Az OR esetében elegendő, ha legalább az egyik feltétel teljesül.
SELECT *
FROM diakok
WHERE varos = 'Budapest' OR varos = 'Debrecen';
Ez a budapesti vagy debreceni diákokat adja vissza.
A NOT egy feltétel ellentétét jelenti.
SELECT *
FROM diakok
WHERE NOT varos = 'Budapest';
Ez azokat a diákokat adja vissza, akik nem Budapesten laknak.
Egyszerűbb formában ezt is írhatjuk:
SELECT * FROM diakok WHERE varos <> 'Budapest';
vagy
SELECT * FROM diakok WHERE varos != 'Budapest';
A BETWEEN segítségével egy tartományon belüli értékeket kereshetünk.
Például:
SELECT *
FROM diakok
WHERE eletkor BETWEEN 14 AND 18;
Ez a 14 és 18 év közötti értékeket keresi.
A BETWEEN esetén a két szélső érték is beletartozik.
Tehát:
14 ≤ életkor ≤ 18
Az IN segítségével több lehetséges értéket adhatunk meg.
Például:
SELECT *
FROM diakok
WHERE varos IN ('Budapest', 'Szeged', 'Pécs');
Ez a három város valamelyikében élő diákokat adja vissza.
Az előző lekérdezést több OR segítségével is megfogalmazhatnánk:
SELECT *
FROM diakok
WHERE varos = 'Budapest'
OR varos = 'Szeged'
OR varos = 'Pécs';
Az IN általában áttekinthetőbb.
A LIKE segítségével mintára kereshetünk szövegekben.
Különösen hasznos, ha nem tudjuk pontosan, mi szerepel egy mezőben.
% helyettesítő karakterA % tetszőleges számú karaktert helyettesíthet.
Például:
SELECT *
FROM diakok
WHERE nev LIKE 'A%';
Ez azokat a neveket keresi, amelyek A betűvel kezdődnek.
WHERE nev LIKE '%a';
Az a betűre végződő neveket keresi.
WHERE nev LIKE '%ann%';
Olyan neveket keres, amelyek valahol tartalmazzák az ann karaktersorozatot.
_ helyettesítő karakterA LIKE mellett az _ pontosan egy karaktert helyettesít.
Például:
WHERE nev LIKE 'An_a';
Itt az _ helyén pontosan egy karakternek kell állnia.
Az ORDER BY segítségével sorba rendezhetjük a lekérdezés eredményét.
Például:
SELECT * FROM diakok ORDER BY nev;
Ez név szerint, növekvő sorrendben rendezi az eredményt.
Az alapértelmezett sorrend az ASC:
SELECT * FROM diakok ORDER BY nev ASC;
Az ASC jelentése:
ascending – növekvő
A DESC segítségével csökkenő sorrendet kérhetünk:
SELECT * FROM diakok ORDER BY eletkor DESC;
Több oszlop alapján is rendezhetünk.
SELECT * FROM diakok ORDER BY varos ASC, nev ASC;
A program először város szerint rendez.
Ha két diák ugyanabban a városban van, akkor közöttük név szerint rendez.
A LIMIT segítségével meghatározhatjuk, hogy legfeljebb hány sort szeretnénk megkapni.
SELECT * FROM diakok LIMIT 5;
Ez legfeljebb 5 sort ad vissza.
Nagyon hasznos például a legjobb eredmények keresésénél:
SELECT * FROM diakok ORDER BY atlag DESC LIMIT 3;
Ez először átlag szerint csökkenő sorrendbe rendezi a diákokat, majd csak az első 3 eredményt adja vissza.
A DISTINCT segítségével az ismétlődő értékeket kiszűrhetjük.
Tegyük fel, hogy több diák ugyanabban a városban lakik.
SELECT varos FROM diakok;
Ilyen eredményt kaphatunk:
Budapest
Budapest
Szeged
Pécs
Budapest
Szeged
A DISTINCT használatával:
SELECT DISTINCT varos FROM diakok;
eredmény:
Budapest
Szeged
Pécs
Minden város csak egyszer jelenik meg.
A GROUP BY segítségével az adatokat csoportokba rendezhetjük.
Ez különösen akkor hasznos, amikor valamilyen összesítést szeretnénk készíteni.
Például szeretnénk megtudni, hogy hány diák lakik az egyes városokban:
SELECT varos, COUNT(*) FROM diakok GROUP BY varos;
Lehetséges eredmény:
Budapest 25
Szeged 8
Pécs 6
Debrecen 10
A GROUP BY varos azt jelenti:
Csoportosítsuk a sorokat város szerint.
A GROUP BY mellett gyakran használunk összesítő függvényeket.
Megszámolja a sorokat:
SELECT COUNT(*) FROM diakok;
Összeadja az értékeket:
SELECT SUM(fizetes) FROM dolgozok;
Átlagot számol:
SELECT AVG(eletkor) FROM diakok;
Megkeresi a legkisebb értéket:
SELECT MIN(eletkor) FROM diakok;
Megkeresi a legnagyobb értéket:
SELECT MAX(eletkor) FROM diakok;
A HAVING hasonlít a WHERE záradékhoz, de fontos különbség van közöttük.
A WHERE az egyedi sorokat szűri.
A HAVING a csoportokat szűri.
Például:
SELECT varos, COUNT(*) AS letszam
FROM diakok
GROUP BY varos
HAVING COUNT(*) >= 10;
Ez csak azokat a városokat jeleníti meg, ahol legalább 10 diák lakik.
Ezt érdemes nagyon jól megjegyezni.
A WHERE -> A csoportosítás előtt szűri a sorokat.
SELECT *
FROM diakok
WHERE eletkor >= 18;
A HAVING -> A csoportosítás után szűri a csoportokat.
SELECT varos, COUNT(*)
FROM diakok
GROUP BY varos
HAVING COUNT(*) >= 10;
Egyszerűen:
WHERE → sorokat szűr
HAVING → csoportokat szűr
Az AS segítségével nevet adhatunk egy oszlopnak vagy táblának.
Például:
SELECT nev AS diak_neve FROM diakok;
Az eredményben az oszlop neve diak_neve lesz.
Összesítő függvényeknél különösen hasznos:
SELECT COUNT(*) AS letszam FROM diakok;
Így nem egy nehezen olvasható COUNT(*) feliratot kapunk, hanem:
letszam
-------
25
Egy összetettebb SELECT lekérdezés például így nézhet ki:
SELECT varos, AVG(eletkor) AS atlageletkor
FROM diakok
WHERE eletkor >= 14
GROUP BY varos
HAVING AVG(eletkor) > 15
ORDER BY atlageletkor DESC
LIMIT 5;
A záradékok tipikus sorrendje:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
| Záradék | Feladata | Példa |
|---|---|---|
SELECT |
Mit kérünk le? | SELECT nev |
FROM |
Melyik táblából? | FROM diakok |
WHERE |
Milyen sorokat? | WHERE eletkor > 18 |
GROUP BY |
Hogyan csoportosítsuk? | GROUP BY varos |
HAVING |
Milyen csoportokat? | HAVING COUNT(*) > 5 |
ORDER BY |
Hogyan rendezzük? | ORDER BY nev |
LIMIT |
Hány sort kérünk? | LIMIT 10 |
DISTINCT |
Ismétlődések kiszűrése | SELECT DISTINCT varos |