MySQL – SQL-záradékok

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:

Az SQL-utasításokat általában pontosvesszővel (;) zárjuk.

A SELECT záradék

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 záradék

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 záradék

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.

Összehasonlító operátorok

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 feltételek

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 operátor

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 operátor

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 operátor

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 záradék

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 használata

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 záradék

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ő karakter

A % 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.

Az _ helyettesítő karakter

A 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 záradék

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 szerinti rendezés

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 záradék

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

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 záradék

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.

Összesítő függvények

A GROUP BY mellett gyakran használunk összesítő függvényeket.

COUNT()

Megszámolja a sorokat:

SELECT COUNT(*) FROM diakok;

SUM()

Összeadja az értékeket:

SELECT SUM(fizetes) FROM dolgozok;

AVG()

Átlagot számol:

SELECT AVG(eletkor) FROM diakok;

MIN()

Megkeresi a legkisebb értéket:

SELECT MIN(eletkor) FROM diakok;

MAX()

Megkeresi a legnagyobb értéket:

SELECT MAX(eletkor) FROM diakok;

A HAVING záradék

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.

WHERE vagy HAVING?

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 – alias

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

A záradékok sorrendje

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

A legfontosabb záradékok összefoglalása

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