MySQL predikátumok

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:

Predikátumok csoportjai

1. Összehasonlító predikátumok

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. */

2. A BETWEEN predikátum

A 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;

3. Az IN predikátum

Az 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');

4. A LIKE predikátum

A 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%';

5. NULL értékek vizsgálata

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

6. Logikai operátorok

A predikátumokat egymással is összekapcsolhatjuk.

A legfontosabb logikai operátorok:

6.1. AND => minden feltételnek teljesülnie kell

SELECT * 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. */

6.2. OR => legalább az egyik feltételnek teljesülnie kell

SELECT * FROM diak WHERE osztaly = '12A' OR osztaly = '12B'; /* A 12A vagy a 12B osztály tanulóit kapjuk. */

6.3. 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:

  1. NOT
  2. AND
  3. OR

Ezé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;

Összetett predikátumok

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;

Predikátumok részlekérdezésekkel

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.

További pedikátumok

Az EXISTS predikátum

Az 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 );

Az ALL és az ANY / SOME

Ritká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' );