Az SQL WHERE utasítás és az operátorok bemutatása példákkal (NOT, AND, OR, BETWEEN, LIKE, IN, EXISTS, ANY, ALL)
Ebben a leckében megtanuljuk továbbfinomítani az SQL lekérdezéseinket, a WHERE záradékkal, utasítással, illetve bemutatásra kerülnek a leggyakrabban használt operátorok is: egyenlő, nem egyenlő (NOT), kisebb, nagyobb, kisebb vagy egyenlő, nagyobb vagy egyenlő, AND (és), OR (vagy), BETWEEN, LIKE, IN, EXISTS, ANY és ALL.
Mi az az SQL WHERE?
Az SQL WHERE utasítását arra használjuk, hogy a lekérdezést szűrni tudjuk, a lekérdezés eredményeként csak azok a rekordok kerülnek megjelenítésre, amelyek eleget tesznek a WHERE után meghatározott feltételeknek.
Csak úgy, mint a programozási nyelvekben, itt is meghatározhatunk egyszerű és összetett feltételeket, melyek során használhatunk logikai, aritmetikai és relációs operátorokat is.
SQL WHERE szintaktika
A szintaktika alapvetően nagyon egyszerű, először jönnie kell a SELECT záradéknak, majd a FROM-nak és ezeket követi a WHERE.
SELECT oszlop(ok)
FROM tábla
WHERE feltétel(ek);
Code language: SQL (Structured Query Language) (sql)
A WHERE utasítás után kell meghatároznunk azokat a feltételt vagy feltételeket, amelyeket szeretnénk, ha teljesülni. Csak azok a rekordok kerülnek majd kilistázásra, amelyek teljesítik a feltételeket.
Természetesen a WHERE záradékot nem csak SELECT esetében lehet használni, hanem UPDATE, DELETE és egyéb utasítások esetében is. De ezek a későbbi leckékben részletesebben is kifejtésre kerülnek majd.
SQL WHERE operátorok
Fentebb pár szóban már említésre került, hogy a WHERE záradék esetében használhatók operátorok, lentebb egy részletes listát találtok az összes használható operátorról egy leírással és példával együtt.
De előtte soroljuk fel tételesen az SQL operátorait:
- egyenlő operátor
- nagyobb operátor
- kisebb operátor
- nagyobb vagy egyenlő operátor
- kisebb vagy egyenlő operátor
- nem egyenlő (NOT) operátor
- AND operátor
- OR operátor
- BETWEEN operátor
- LIKE operátor
- IN operátor
Egyenlő operátor
Az egyenlő operátorral konkrét egyenlőséget vizsgálhatunk. Csak azok a rekordok lesznek kilistázva, amelyek esetében a feltételnél megadott kulcs és érték teljes egyezőséget mutat.
Jelölése: =
Szintaktika:
WHERE oszlop = érték;
Code language: SQL (Structured Query Language) (sql)
A „oszlop” helyére kell megadnunk azt, hogy melyik oszlop a helyére, az „érték” helyére pedig azt, hogy milyen értéket várunk.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE vezeteknev="Horváth";
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Nagyobb operátor
A nagyobb operátorral azokat a rekordokat szűrhetjük ki, amelyek esetében a vizsgált oszlop értéke nagyobb az általunk meghatározott értéknél.
Jelölése: >
Szintaktika:
WHERE oszlop > érték;
Code language: SQL (Structured Query Language) (sql)
Az „oszlop” helyére kell megadnunk azt az oszlopot, amelyikre szeretnénk a vizsgálatot megtenni, az „érték” helyére pedig azt az értéket kell megadnunk, amelynél nagyobbakat keresünk.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE szuletesi_ev>2000;
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Losonczi | Léna | Nyíregyháza | 2005 |
Kisebb operátor
A kisebb operátorral azokat a rekordokat szűrhetjük ki, amelyek esetében a vizsgált oszlop értéke kisebb az általunk meghatározott értéknél.
Jelölése: <
Szintaktika:
WHERE oszlop < érték;
Code language: SQL (Structured Query Language) (sql)
Az „oszlop” helyére kell megadnunk azt az oszlopot, amelyikre szeretnénk a vizsgálatot megtenni, az „érték” helyére pedig azt az értéket kell megadnunk, amelynél kisebbeket keresünk.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE szuletesi_ev<2000;
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Balogh | Beatrix | Miskolc | 1985 |
Nagyobb vagy egyenlő operátor
A nagyobb vagy egyenlő operátorral azokat a rekordokat szűrhetjük ki, amelyek esetében a vizsgált oszlop értéke nagyobb vagy egyenlő az általunk meghatározott értéknél.
Jelölése: >=
Szintaktika:
WHERE oszlop >= érték;
Code language: SQL (Structured Query Language) (sql)
Az „oszlop” helyére kell megadnunk azt az oszlopot, amelyikre szeretnénk a feltételvizsgálatot végrehajtani, az „érték” helyére pedig azt az értéket kell megadnunk, amelynél nagyobb vagy egyenlő oszlopértékeket keresünk.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE szuletesi_ev>=1961;
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
Kisebb vagy egyenlő operátor
A kisebb vagy egyenlő operátorral azokat a rekordokat szűrhetjük ki, amelyek esetében a vizsgált oszlop értéke kisebb vagy egyenlő az általunk meghatározott értéknél.
Jelölése: <=
Szintaktika:
WHERE oszlop <= érték;
Code language: SQL (Structured Query Language) (sql)
Az „oszlop” helyére kell megadnunk azt az oszlopot, amelyikre szeretnénk a feltételvizsgálatot végrehajtani, az „érték” helyére pedig azt az értéket kell megadnunk, amelynél kisebb vagy egyenlő oszlopértékeket keresünk.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE szuletesi_ev<=2005;
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
Nem egyenlő vagy NOT operátor
Csak azok a rekordok kerülnek kilistázásra, amelyek esetében a vizsgált oszlop értéke nem egyezik meg a megadott értékkel.
Jelölése: <> vagy != vagy NOT
Szintaktika:
WHERE oszlop <> érték;
Code language: SQL (Structured Query Language) (sql)
WHERE oszlop != érték;
Code language: SQL (Structured Query Language) (sql)
WHERE NOT oszlop = érték;
Code language: SQL (Structured Query Language) (sql)
Az „oszlop” helyére megadjuk a vizsgálandó oszlopot, míg az „érték” helyére azt az értéket, amellyel nem szeretnénk, ha egyenlő lenne az oszlop.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE szuletesi_ev!=2005;
vagy
SELECT *
FROM sql_table
WHERE szuletesi_ev<>2005;
vagy
SELECT *
FROM sql_table
WHERE NOT szuletesi_ev=2005;
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Balogh | Beatrix | Miskolc | 1985 |
AND operátor
Az AND operátor kicsit eltér az előzőektől, hiszen ezzel nem egy konkrét oszlop és a hozzákapcsolódó érték viszonyát tudjuk meghatározni, hanem segítségével több feltételt tudunk összefűzni. Az AND operátor megszabja, hogy csak azok a rekordok legyenek kilistázva, amelyek esetében az összes feltétel teljesül.
Jelölése: AND
Szintaktika:
WHERE feltétel1 AND feltétel2 ...;
Code language: SQL (Structured Query Language) (sql)
Az egyes feltételeket az AND kulcsszóval fűzzük össze. Tetszőleges számú feltételt adhatunk meg.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE szuletesi_ev>1985 AND szuletesi_ev<2005;
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
OR operátor
Az OR az előző operátorhoz hasonlóan több feltétel összekapcsolására használható. Viszont ebben az esetben nem csak azok a rekordok kerülnek kilistázásra, amelyek esetében az összes feltétel teljesül, hanem azok is, amelyek esetében csak a feltételek egy része.
Jelölése: OR
Szintaktika:
WHERE feltétel1 OR feltétel2 ...;
Code language: SQL (Structured Query Language) (sql)
A feltételek összefűzése az OR kulcsszóval történik. A feltételek száma, csak úgy mint az AND esetében, itt is tetszőleges.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE lakhely="Budapest" OR lakhely="Debrecen";
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
BETWEEN operátor
A BETWEEN operátorral megadhatjuk, hogy egy rekord csak akkor kerüljön megjelenítésre, ha az értéke két végpont közé esik.
Jelölése: BETWEEN
Szintaktika:
WHERE oszlop BETWEEN érték1 AND érték2;
Code language: SQL (Structured Query Language) (sql)
Az „oszlop” helyére azt az oszlopot kell megadni, amelyen a vizsgálatot szeretnénk végezni, majd ezt követi a BETWEEN kulcsszó, amely után a két végpont értékét kell megadnunk, amely közé szeretnénk, hogy essenek az eredmények.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE szuletesi_ev BETWEEN 1985 AND 1989;
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Balogh | Beatrix | Miskolc | 1985 |
LIKE operátor
A LIKE operátort arra lehet használni, hogy egy adott mintának (patern) megfelelő oszlopértékeket keressünk.
Jelölése: LIKE
Szintaktika:
WHERE oszlop LIKE minta;
Code language: SQL (Structured Query Language) (sql)
Az „oszlop” helyére megadjuk azt, hogy melyik oszlopra szeretnénk mintát keresni, míg a „minta” helyére azt, hogy milyen minta alapján szeretnénk keresni.
A minták felépítése során helyettesítő karaktereket (wildcard) használhatunk. A két leggyakrabban használt helyettesítő karakter:
- % vagy *: bármennyi karakter helyettesítésére alkalmas
- _ vagy ?: egyetlen egy karakter helyettesítésére alkalmas
Megjegyzés: A * és a ? a Microsoft Access-ben használhatóak.
A következő példán keresztül sokkal könnyebben érthető lesz a LIKE használata.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE vezeteknev LIKE "L%";
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
A fenti példa szerint megadtuk, hogy a „vezeteknev” oszlopnak nagy L betűvel kell kezdődnie, amelyet több karakter is követ, így listázásra kerül Lakatos és Losonczi is. Ha „L_”-t adtunk volna meg, akkor semmi sem került volna kilistázásra, mert nincs olyan, amit csak egyetlen egy karakter követ a nagy L után.
IN operátor
Az IN operátorral egy halmazt határozhatunk meg, amelynek elemeit elfogadunk a vizsgált oszlop értékéül.
Jelölése: IN
Szintaktika:
WHERE oszlop IN (értékek);
Code language: SQL (Structured Query Language) (sql)
Az „oszlop” helyére azt az oszlopot kell megadni, amelyre szeretnénk az IN kulcsszó után következő halmaz értékeit vizsgálni.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE lakhely IN ("Debrecen", "Nyíregyháza");
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Mivel az IN után szereplő halmazban a Debrecen és a Nyíregyháza szerepelt, így a lekérdezés eredményei között megjelenik az összes olyan rekord, ahol a lakhely az előbb említett kettő közül valamelyik.
EXISTS operátor
Az EXISTS operátorral azt tudjuk tesztelni, hogy az allekérdezésnek van-e eredménye vagy sem. Ha az allakérdezés rekorddal vagy rekordokkal tér vissza, akkor az EXISTS operátor TRUE (igaz) értéket ad vissza, ellenkező esetben FALSE-t, azaz hamist.
Jelölése: EXISTS
Szintaktika:
WHERE EXISTS (allekérdezés);
Code language: SQL (Structured Query Language) (sql)
A WHERE záradék és az EXISTS operátor után szimplán adjuk meg zárójelek közé az allekérdezést.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE EXISTS (SELECT * FROM sql_table WHERE lakhely="Budapest");
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
Az allekérdezésben azt vizsgáltuk, hogy van-e budapesti lakhellyel rendelkező személy, és mivel van, így az egész főlekérdezés lefut. Amennyiben nem lenne budapesti lakos, úgy a főlekérdezés sem kerülne kiértékelésre, hiszen az EXISTS operátor hamis értékkel térne vissza.
ANY operátor
Csak úgy, mint az előző operátor, ez is egy logikai értékkel tér vissza: igazzal, ha van olyan rekord, amely eleget tesz az allekérdezésnek, és hamissal, ha egyetlen egy rekord sem tesz eleget az allekérdezésnek.
Jelölése: ANY
Szintaktika:
WHERE oszlop operátor ANY (allekérdezés);
Code language: SQL (Structured Query Language) (sql)
A WHERE után meg kell adnunk egy oszlopot, majd egy értékösszehasonlító operátort, amely lehet: =, <>, !=, >, <, >=, <=. Ezt követi az ANY operátor és a zárójelek között az allekérdezés.
Példa:
sql_table tábla
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE keresztnev = ANY (SELECT keresztnev FROM sql_table WHERE lakhely="Budapest");
Code language: SQL (Structured Query Language) (sql)
Eredmény
vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|
Horváth | Tamás | Budapest | 1989 |
Lakatos | Dezső | Debrecen | 1961 |
Losonczi | Léna | Nyíregyháza | 2005 |
Balogh | Beatrix | Miskolc | 1985 |
Mivel van olyan rekord, amely eleget tesz az allekérdezésnek, így a főlekérdezés is kiértékelésre kerül.
ALL operátor
Az előző operátorral szemben itt nem elég, hogy legyen egy olyan rekord, amely megfelel az allekérdezésnek, az ALL operátor használatakor minden rekordnak meg kell felelni az allekérdezésben támasztott feltételeknek. Akkor tér vissza TRUE értékkel, ha az összes rekord megfelel az allekérdezésnek, minden ellenkező esetben FALSE értékkel tér vissza.
Jelölése: ALL
Szintaktika:
WHERE oszlop operátor ALL (allekérdezés);
Code language: SQL (Structured Query Language) (sql)
A WHERE után meg kell adnunk egy oszlopot, majd egy értékösszehasonlító operátort, amely lehet: =, <>, !=, >, <, >=, <=. Ezt követi az ALL operátor és a zárójelek között az allekérdezés.
Példa:
sql_table tábla
ID | vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|---|---|---|---|
1 | Horváth | Tamás | Budapest | 1989 |
2 | Lakatos | Dezső | Debrecen | 1961 |
3 | Losonczi | Léna | Nyíregyháza | 2005 |
4 | Balogh | Beatrix | Miskolc | 1985 |
SQL lekérdezés
SELECT *
FROM sql_table
WHERE ID = ANY (SELECT ID FROM sql_table WHERE lakhely="Budapest");
Code language: SQL (Structured Query Language) (sql)
Eredmény
ID | vezeteknev | keresztnev | lakhely | szuletesi_ev |
---|
Mivel nem mindegyik rekord tesz eleget a „lakhely” egyenlő „Budapest” feltételnek, így végül egy rekord sem kerül kilistázásra.