A predikátum egy olyan SQL-kifejezés, amely azt vizsgálja, hogy egy adott feltétel teljesül-e vagy sem.
📌 A predikátumokat adatok szűrésére használjuk a WHERE és HAVING záradékokban.
Például:
SELECT * FROM diak WHERE eletkor >= 18;
Ebben az eletkor >= 18 egy predikátum. A lekérdezés csak azokat a diákokat választja ki, akik legalább 18 évesek.
A predikátumokkal vizsgálhatjuk, hogy:
NULL-e;Az egyik legfontosabb predikátumcsoport az összehasonlító operátorok csoportja.
| Operátor | Jelentése |
|---|---|
= |
egyenlő |
<> |
nem egyenlő |
!= |
nem egyenlő |
> |
nagyobb |
< |
kisebb |
>= |
nagyobb vagy egyenlő |
<= |
kisebb vagy egyenlő |
Példák:
SELECT * FROM diak WHERE osztaly = '12A'; /* A `12A` osztályba járó diákok */
SELECT * FROM diak WHERE eletkor = 18; /* A 18 éves diákok */
/* Mindkettő következő operátor használható annak kifejezésére, hogy két érték nem egyenlő. */
SELECT * FROM diak WHERE osztaly <> '12A';
SELECT * FROM diak WHERE osztaly != '12A';
SELECT * FROM diak WHERE eletkor > 18; /* Csak a 18 évnél idősebb diákok.*/
SELECT * FROM diak WHERE eletkor <> 18; /* Csak a 18 évnél fiatalabb diákok. */
SELECT * FROM diak WHERE eletkor >= 18; /* A 18 évesek és az annál idősebbek. */
SELECT * FROM diak WHERE eletkor <= 18; /* Legfeljebb 18 éves diákok. */
BETWEEN predikátumA BETWEEN segítségével azt vizsgáljuk, hogy egy érték egy adott tartományba esik-e.
Szintaxisa:
kifejezés BETWEEN alsó_érték AND felső_érték
Példa:
/* A 16, 17 és 18 éves diákokat választja ki. */
SELECT * FROM diak WHERE eletkor BETWEEN 16 AND 18;
📌 A BETWEEN mindkét szélső értéket tartalmazza.
Tehát az eletkor BETWEEN 16 AND 18 ugyanazt jelenti, mint az eletkor >= 16 AND eletkor <= 18.
NOT BETWEEN => A tartományon kívüli értékeket választhatjuk ki:
/* Minden olyan diák, akinek életkora nem 16 és 18 közé esik. */
SELECT * FROM diak WHERE eletkor NOT BETWEEN 16 AND 18;
IN predikátumAz IN segítségével megvizsgálhatjuk, hogy egy érték szerepel-e egy felsorolt értéklistában.
Példa:
/* Azokat a diákokat adja vissza, akik a három megadott osztály valamelyikébe járnak. */
SELECT * FROM diak WHERE osztaly IN ('10A', '10B', '10C');
A WHERE osztaly IN ('10A', '10B', '10C') az alábbi feltétel rövidebb formája:
WHERE osztaly = '10A'
OR osztaly = '10B'
OR osztaly = '10C'
📌 Az IN különösen hasznos hosszabb listák esetén.
`
NOT IN => Ha azt szeretnénk megkapni, hogy egy érték ne szerepeljen a listában.
SELECT * FROM diak WHERE osztaly NOT IN ('10A', '10B');
LIKE predikátumA LIKE szövegek mintázatának vizsgálatára szolgál.
Hasznos, ha nem a teljes szöveget ismerjük, csak egy részét.
A legfontosabb helyettesítő karakterek:
| Karakter | Jelentése |
|---|---|
% |
tetszőleges számú karakter (0 vagy bármennyi) |
_ |
pontosan egy karakter |
Példák:
/* Keressük azokat a neveket, amelyek `Kiss` szóval kezdődnek. */
SELECT * FROM diak WHERE nev LIKE 'Kiss%'; -- Pl.: Kiss Anna, Kiss Gábor...
/* Azokat a neveket keressük, amelyek `Anna` végződésűek. */
SELECT * FROM diak WHERE nev LIKE '%Anna';
/* Az `Anna` bárhol szerepelhet a szövegben. */
SELECT * FROM diak WHERE nev LIKE '%Anna%';
SELECT kod FROM diak WHERE kod LIKE 'A_1'; -- Pl.: AB1, AC1 ...
NOT LIKE => Ha nem szeretnénk a mintára illeszkedő értékeket.
SELECT * FROM diak WHERE nev NOT LIKE 'Kiss%';
NULL értékek vizsgálataA NULL az SQL-ben különleges érték.
A NULL azt jelenti, hogy nincs érték / az érték ismeretlen vagy nem áll rendelkezésre.
📌 A NULL vizsgálatához az IS NULL és IS NOT NULL predikátumokat használjuk.
Példa:
SELECT * FROM diak WHERE telefonszam IS NULL; /* Azok a diákok akiknél nincs telefonszám megadva. */
SELECT * FROM diak WHERE telefonszam IS NOT NULL; /* Azok a diákok, akiknél van telefonszám. */
📌 Fontos szabály: NULL vizsgálatára ne használjunk = vagy <> operátort.
A predikátumokat egymással is összekapcsolhatjuk.
A legfontosabb logikai operátorok:
ANDORNOTAND => minden feltételnek teljesülnie kellSELECT * FROM diak WHERE eletkor >= 18 AND osztaly = '12A';
/* Csak azok a diákok kerülnek be, akik:
1. legalább 18 évesek;
2. és a 12A osztályba járnak. */
OR => legalább az egyik feltételnek teljesülnie kellSELECT * FROM diak WHERE osztaly = '12A' OR osztaly = '12B';
/* A 12A vagy a 12B osztály tanulóit kapjuk. */
NOT => megfordítja a feltétel logikai eredményét.SELECT * FROM diak WHERE NOT osztaly = '12A'; /* Azok a diákok akik nem a 12A osztályba járnak. */
A logikai műveletek sorrendje
Ha egy feltételben több logikai operátort használunk, fontos a kiértékelés sorrendje.
Általánosságban:
NOTANDOREzért ezt:
WHERE A OR B AND C
a MySQL úgy értelmezi, mint:
WHERE A OR (B AND C)
Nem pedig így:
WHERE (A OR B) AND C
📌 A félreértések elkerülése érdekében használjunk zárójeleket.
WHERE (osztaly = '12A' OR osztaly = '12B') AND eletkor >= 18;
A gyakorlatban gyakran több predikátumot kombinálunk.
Példák:
-- Azok a diákok, akik 16–18 évesek, és vagy a 10A, vagy a 10B osztályba járnak.
SELECT * FROM diak WHERE eletkor BETWEEN 16 AND 18 AND osztaly IN ('10A', '10B');
-- A K betűvel kezdődő nevű, legalább 18 éves diákok.
SELECT * FROM diak WHERE nev LIKE 'K%' AND eletkor >= 18;
Az IN és az EXISTS segítségével részlekérdezéseket is használhatunk.
Példa:
SELECT * FROM diak
WHERE osztaly IN (
SELECT osztaly
FROM osztalyok
WHERE tagozat = 'informatika'
);
Itt a belső lekérdezés először meghatározza az informatikai tagozathoz tartozó osztályokat, majd a külső lekérdezés ezekhez az osztályokhoz tartozó diákokat választja ki.
EXISTS predikátumAz EXISTS azt vizsgálja, hogy egy részlekérdezés eredményez-e legalább egy sort.
Példa:
SELECT * FROM diak
WHERE EXISTS (
SELECT 1
FROM jegy
WHERE jegy.diak_id = diak.id
);
A lekérdezés azokat a diákokat választja ki, akikhez legalább egy jegy tartozik.
Az EXISTS számára elsősorban az a fontos, hogy van-e legalább egy megfelelő rekord.
Nem az a lényeg, hogy pontosan mi szerepel a részlekérdezés SELECT részében.
Ezért gyakori az SELECT 1 használata.
NOT EXISTS => nincs-e egyetlen megfelelő rekord sem.
Példa:
-- Azok a diákok, akiknek nincs jegyük.
SELECT * FROM diak
WHERE NOT EXISTS (
SELECT 1
FROM jegy
WHERE jegy.diak_id = diak.id
);
ALL és az ANY / SOMERitkábban, de fontosabb SQL-lekérdezésekben találkozhatunk az ALL, ANY és SOME predikátumokkal is.
ALL => egy feltételnek a részlekérdezés összes eredményére teljesülnie kell.
-- Azok a diákok, akik idősebbek a 10A osztály minden tanulójánál.
SELECT *
FROM diak
WHERE eletkor > ALL (
SELECT eletkor FROM diak WHERE osztaly = '10A'
);
ANY => a feltételnek a részlekérdezés eredményei közül legalább egyre teljesülnie kell.
-- Azok a diákok, akik legalább egy 10A-s diáknál idősebbek.
SELECT *
FROM diak
WHERE eletkor > ANY (
SELECT eletkor FROM diak WHERE osztaly = '10A'
);