Lekérdezés létrehozása SQL nyelv segítségével

SQL utasítások kipróbálása a w3schools.com oldalon


Választó lekérdezések

A legegyszerűbb SQL utasítás a következő

SELECT mezőnevek FROM táblák;

Adott táblák adott mezőinek értékét adja vissza.

SELECT név,cím FROM Beteg;

A lekérdezés kilistázza minden beteg nevét és címét a Beteg táblából. Amennyiben a tábla összes mezőjét látni szeretnénk, a mezőnevek felsorolása helyett írhatunk * karaktert.

SELECT * FROM Beteg;

Ez a lekérdezés kilistázza a betegek minden adatát, vagyis minden mezőt.

Rekordok szűrése feltételekkel

A mezőkre vonatkozó feltételeket a WHERE kulcsszó után írhatjuk be.

SELECT mezőnevek FROM táblák WHERE feltételek;

SELECT név,cím FROM Beteg WHERE szoba=120;

A lekérdezés kilistázza azon betegek nevét és címét, akik a 120-as szobában laknak.

Számokra vonatkozó feltételek

SELECT név,cím FROM Beteg WHERE szoba=120;

Akik a 120-as szobában laknak.

SELECT név,cím FROM Beteg WHERE szoba<120;

Akiknek a szobaszáma kisebb, mint 120.

SELECT név,cím FROM Beteg WHERE szoba>120;

Akiknek a szobaszáma nagyobb, mint 120.

SELECT név,cím FROM Beteg WHERE szoba<>120

Akik nem a 120-as szobában laknak.

SELECT név,cím FROM Beteg WHERE szoba BETWEEN 120 AND 140;

Ahol a szobaszám 120 és 140 közé esik – beleértve a határokat is.

Szövegre vonatkozó feltételek

Szövegre kétféleképpen is szabhatunk feltételt: Vagy egy fix értékre keresünk rá, vagy valamilyen mintára illeszkedő értékeket keresünk meg.

SELECT név,szoba FROM Beteg WHERE név = „Nyúl Béla”;

Ebben az esetben fix értékre (Nyúl Béla) kerestünk rá. Vagyis kilistáztuk Nyúl Béla nevét és szobaszámát.

A másik lehetőség a LIKE operátor használata, melynek segítségével mintát lehet illeszteni a szövegre. A LIKE operátort az „=” helyére kell írni, és a LIKE után idézőjelek között adható meg a minta.

SELECT név,szoba FROM Beteg WHERE név LIKE „Nyúl*”;

A „Nyúl”-lal kezdődő nevű betegek neve és szobaszáma.

A minta tartalmazhat *-t és ?-t is, ezek használata megegyezik a fájlkelzelésből ismert * és ? használatával. A * 0, egy, vagy több tetszőleges karaktert helyettesít, míg a ? mindig pontosan egy karaktert helyettesíthet. Ha speciális karakterre akarunk keresni, akkor ezeket szögletes zárójelek között kell megadni (pl. [*]). Szintén szögletes zárójelek között kell megadni, ha intervallumba eső karaktert keresünk (pl. [a-z]).

A következő táblázat összefoglalja a LIKE művelettel végrehajtható kereséseket.

Helyettesítendő Minták Megfelelő érték Nem megfelelő érték
Több karakter a*a
*ab*
aa, aBa, aBBBa
abc, AABB, Xab
aBC
aZb, bac
Speciális karakter a[*]a a*a aaa
Több karakter ab* abcdefg, abc cab, aab
Egyetlen karakter a?a aaa, a3a, aBa aBBBa
Egyetlen számjegy a#a a0a, a1a, a2a aaa, a10a
Karakter tartomány [a-z] f, p, j 2, &
Tartományon kívüli [!a-z] 9, &, % b, a
Nem számjegy [!0-9] A, a, &, ~ 0, 1, 9
Kombinált a[!b-m]# An9, az0, a99 abc, aj0

Dátumra vonatkozó feltételek

Dátumokkal kapcsolatos feltételek kialakításához általában a dátumkezelő függvényeket használjuk. Ezek a következők:

  • Year(Dátum) – Visszaadja a dátum év részét.

  • Month(Dátum) – Visszaadja a dátum hónap részét (1..12).

  • Day(Dátum) – Visszaadja a dátum nap részét.

  • Date() – Visszaadja a mai dátumot.

  • Dateserial(év,hó,nap) – A három megadott értékből dátumot csinál.

  • DateDiff(„tartomány”,dátum1,dátum2) – Visszaadja a megadott két dátum közötti különbséget, mely különbség lehet nap, hónap és év is a tartománytól függően. Az „yyyy” jelöli az évet, a „m” jelöli a hónapot, „d” jelöli a napot.

  • DateAdd(„tartomány”,növekmény,dátum) – A DateAdd függvény segítségével dátumhoz lehet hozzáadni napokat, heteket, hónapokat, ill. éveket is. Hogy mit az előbbiek közül, azt a tartomány határozza meg, és hogy mennyit azt pedig a növekmény.

    SELECT név,szül FROM Beteg WHERE YEAR(szül)<1974;

    Kilistázza az 1974 előtt született betegek nevét és születési dátumát.

    SELECT név,szül FROM Beteg WHERE Dátum = DATESERIAL(1965,4,3)

    Kilistázza az 1965. április 3-án született betegek nevét és születési dátumát.

    SELECT név FROM Beteg WHERE DATEDIFF(„yyyy”,szül,Date())=12

    Kilistázza a 12 éves betegeket.

Logikai értékre vonatkozó feltételek

Egy logikai érték már önmagában feltétel, hiszen értéke igaz vagy hamis lehet csak. Éppen ezért a következő módon vizsgálhatunk logikai értéket, mint feltételt:

SELECT név,szül FROM Beteg WHERE neme;

Kikeresi azokat az értékeket, ahol a neme mező értéke igaz.

SELECT név,szül FROM Beteg WHERE NOT(neme);

Kikeresi azokat az értékeket, ahol a neme mező értéke hamis.

Összetett feltételek kialakítása

Lekérdezésünk tartalmazhat több feltételt is, melyeket és-sel (AND) ill. vagy-gyal (OR) kapcsolhatunk össze. A WHERE kulcsszót több feltétel esetén is csak egyszer kell leírni.

SELECT név,cím FROM Beteg WHERE szoba=120 AND YEAR(szül)=1963;

Kilistázzuk azon betegek nevét és címét, akik a 120-as szobában laknak és 1963-ban születtek.

  1. Kifejezések és függvények, mint oszlopok

    Eddigi lekérdezéseinkben minden oszlop megfelelt egy mezőnek a táblából. Lehetőségünk van azonban olyan oszlopokat is elhelyezni a lekérdezésben, melyek nem mezői a táblának, hanem más mezőkből számított értékeket tartalmaznak.

    Például szeretnénk látni minden betegről, hogy hány gyógyszert fogyaszt összesen a kórházban tartózkodása alatt. Olyan mezőnk nincs, amely ezt az értéket tárolná, viszont van egy mezőnk, ami megmutatja, hogy mennyi a beteg napi gyógyszeradagja (gyadag) és van egy mezőnk, ami megmutatja, hogy hány napig marad a kórházban (napok). Ha ezt a két értéket összeszorozzuk minden betegnél külön-külön, akkor megkapjuk, hogy melyik beteg hány gyógyszert vesz be összesen a benntartózkodása alatt.

    A lekérdezés a következőképpen néz ki:

    SELECT név,napok*gyadag FROM Beteg;

    Kifejezéseink kialakításához függvényeket is használhatunk.

    SELECT név,felvétel,napok,DATEADD(„d”,napok,felvétel) FROM Beteg;

    Ez a lekérdezés kiírja a betegek nevét, felvételének időpontját, azt hogy hány napig maradnak bent, és hogy mikor mennek haza. A négy érték közül csak hármat tartalmaz a tábla, a távozás időpontját nem. Viszont a felvétel időpontjából, és a bent eltöltendő napok számából ki tudjuk ezt számolni, mégpedig a DateAdd függvénnyel.

  2. Adatok rendezése

    Az eddigi lekérdezésekben a rekordok olyan sorrendben jelentek meg, amilyen sorrendben a táblába felvittük őket. Lehetőségünk van viszont valamely mező (ill. mezők) értékei szerint sorba rendezni adatainkat az ORDER BY kulcsszó segítségével, melyet a feltétel rész után adhatunk meg.

    SELECT név,cím FROM Beteg WHERE szoba=120 ORDER BY név;

    A 120-as szoba lakóinak nevét és címét kapjuk vissza, név szerint rendezve.

    A rendezés lehet növekvő és csökkenő egyaránt. Az alapértelmezett rendezés a növekvő.

    ORDER BY név;

    Növekvő sorrend. (ASCending = növekvő)

    ORDER BY név DESC;

    Csökkenő sorrend. (DESCending = csökkenő)

  3. Csoportosító függvények, adatok csoportosítása

    Csoportosító függvények

    Az eddig megismert függvények mindegyike egy adott rekordon végzett el valamilyen műveletet. Arra idáig nem volt lehetőségünk, hogy különböző rekordok valamely mezőit összegezzük, vagy átlagoljuk, stb. Erre a célra a következő függvények állnak rendelkezésünkre:

    SUM(mező)

    Összegzi a mező értékeit.

    AVG(mező)

    Átlagolja a mező értékeit

    MIN(mező)

    A mező értékei közül a legkisebb.

    MAX(mező)

    A mező értékei közül a legnagyobb.

    COUNT(*)

    A rekordok száma.

    SELECT SUM(gyadag) FROM Beteg;

    Ekkor visszakapjuk a kórház teljes napi gyógyszerfogyasztását.

    SELECT AVG(gyadag) FROM Beteg;

    Ekkor visszakapjuk a kórház átlagos napi gyógyszerfogyasztását.

    SELECT COUNT(*) FROM Beteg WHERE szoba=120;

    Visszakapjuk, hogy hányan laknak a 120-as szobában.

    Csoportosítás

    A csoportosító függvények nem csak a teljes táblára vonatkozhatnak, hanem kiszámolhatjuk őket csoportonként is, ha az adatokat csoportosítjuk valamely mező értékei szerint. Csoportosítás a GROUP BY kulcsszó segítségével történik:

    SELECT szoba,COUNT(*) FROM Beteg GROUP BY szoba;

    Minden szobaszám mellett láthatjuk, hogy hányan laknak az adott szobában.

    Rekordokra vonatkozó feltételek

    A rekordok szűrése a WHERE kulcsszóval természetesen itt is megengedett.

    SELECT szoba, AVG(napok) FROM Beteg WHERE NOT(neme);

    Szobánként visszakapjuk a nők átlagos bentmaradási idejét.

    Csoportosító függvényekre vonatkozó feltételek

    Ha a csoportosító függvényekre vonatkozó feltételt akarunk megadni, azt a HAVING kulcsszóval tehetjük meg. A HAVING résznek a GROUP BY rész után kell állnia.

    SELECT szoba, AVG(napok) FROM Beteg GROUP BY szoba HAVING COUNT(*)>10;

    Listát kapunk szobánként az átlag bentmaradási időről, de csak azokban a szobákban, ahol több, mint 10 beteg lakik.

WHERE – Az eredeti sorokat lehet vele megszűrni.
HAVING(=miután) Az agregáció során létrejött, csoportosított sorokat lehet vele megszűrni.
(Különböző részek összegyűjtése; egymástól különálló elemek, részek csoportosítása, összekapcsolása, egybeépítése, felhalmozása.)


Akciólekérdezések

Az akciólekérdezések nem listáznak ki adatokat, hanem mindig csak módosítanak, törölnek, stb. (valamilyen műveletet végeznek velük). Ha elmentünk egy ilyen lekérdezést arttól még nem változnak az adatok, csak akkor, ha le is futtatjuk ezt. (Access-ben ez a lekérdezés futtatása szerkesztő nézetben a piros színű felkiáltójellel történhet.)

Törlő lekérdezés

DELETE * FROM Orvosok WHERE fizetés>500000;

Törli azokat a rekordokat az orvosok táblából, akiknek a fizetése nagyobb, mint 500000 Ft.

Frissítő lekérdezés

UPDATE Betegek SET gyadag=gyadag*2 WHERE szoba=120;

Növeljük a gyógyszeradagját a kétszeresére a 120. szoba lakóinak.

Hozzáfűző lekérdezés

INSERT INTO Orvos(Név,Cím,Osztály,Fizetés,dátum) SELECT név,Cím,”Sebészet”,100000,Date();