• Nem Talált Eredményt

6. Normalizálás 46

11.3. Rekordok törlése

felhasznalok

felh.nev jelszo email vezeteknev keresztnev u._belepes_datuma

. . . . . . . . . . . . . . . . . .

gnemeth jelszo gnemeth@inf.u-szeged.hu Németh Gábor 2018-11-18 10:00:00

. . . . . . . . . . . . . . . . . .

A módosítás utáni érték pedig a következő:

felhasznalok

felh.nev jelszo email vezeteknev keresztnev u._belepes_datuma

. . . . . . . . . . . . . . . . . .

gnemeth jelszo gnemeth@inf.u-szeged.hu Németh Gábor 2018-11-18 16:25:00

. . . . . . . . . . . . . . . . . .

11.3. Rekordok törlése

A rekordokat a DELETE FROM utasítással tudjuk törölni. Az utasítás után csak a táblanevet kell megadni, illetve opcionálisan egy WHERE záradékban meg lehet adni a feltételt. Fontos, hogy amennyiben nem adunk meg WHERE záradékot, a törlés a teljes tábla tartalomra vonatkozik, vagyis minden rekord ki lesz törölve a táblából (maga a séma megmarad). Amennyiben meg van adva a WHERE záradékban egy feltétel, csak azok a sorok törlődnek, amelyek eleget tesznek a feltételnek.

A DELETE FROM utasítás

D E L E T E F R O M t á b l a n é v [W H E R E f e l t é tel ];

11.3.1. példa

Tekintsük most is a Fórum példát! Tegyük fel, hogy az aktuális fel-használó (legyen most isgnemeth) leiratkozik az 5382 számú hírfolyam-ról. Töröljük a bejegyzést a táblából!

gnemeth leiratkozása az 5382-es hírfolyamról

D E L E T E F R O M k o v e t i W H E R E h i r f o l y a m _ a z o n o s i t o = 5 3 8 2 AND f e l h a s z n a l o n e v = ’ g n e m e t h ’ ;

Ha ezután kilistázzuk akovetitábla rekordjait, akkor a törölt rekordot már nem találjuk a listában.

11.3.2. példa

Töröljük aFórum adatbázisból az összes olyan felhasználót, aki több, mint egy éve nem lépett be.

Régi felhasználók törlése

D E L E T E F R O M f e l h a s z n a l o k W H E R E Y E A R(C U R R E N T _ D A T E)

-Y E A R( u t o l s o _ b e l e p e s _ i d o p o n t j a ) >= 1;

A CURRENT_TIMESTAMP-hez hasonlóan a CURRENT_DATE kulcsszó a több nagyobb adatbáziskezelő rendszerben létezik és az aktuális rendszer-dátumot adja vissza. A YEAR() függvény a paraméterként megadott dátum év értékével tér vissza.

Kérdések és feladatok

1. Írjon SQL utasítást, amely létrehozza a 362-es számú hírfolyamot „SQL utasítások” megnevezéssel!

2. Írjon SQL utasítást, amely a Programkalauz adatbázisba beszúrja a 2018. december 31-én 20:00-24:00 tartó „Városi szilveszteri party”

rekordot a programok közé! A rendezvény honlapja: „www.pecs.hu” a kapcsolat mezőhöz pedig a „szilveszter@pecs.hu” értéket kell rendelni.

A rendezvény ingyenes.

3. Írjon SQL utasítást, amely a Programkalauz adatbázisból törli az összes elmúlt eseményt!

4. Írjon SQL utasítást, amelyFórumadatbázisfelhasználók táblájában az összes felhasználó nevét nagybetűssé alakítja. Használja azUPPER() függvényt a nagybetűssé alakításhoz, amelynek egyetlen paramétere a nagybetűssé alakítandó karaktersorozat!

5. Írjon SQL utasítást, amely aFórumadatbázisban hozzárendeli a „Szil-veszter” szót az 542-es sorszámú hírfolyamhoz!

12. fejezet

Lekérdezések SQL-ben

Már láttuk a korábbi fejezetben, hogy hogyan tudunk egy adatbázisba adato-kat felvinni, módosítani, valamint azt is, hogy hogyan tudjuk azoadato-kat törölni.

Ebben a fejezetben arra látunk példákat, hogy hogyan lehet az adatbázisból adatokat kiolvasni. Habár ezek az utasítások nem módosítják az adatokat, mégis gondosan kell összeállítani azokat, mivel egy hibásan leírt lekérdező utasítás nem a megfelelő információt fogja szolgáltatni. Megjegyezzük azt is, hogy a lekérdezések bizonyos tekintetben a relációs algebrában megismert műveletek implementációi.

12.1. A SELECT utasítás

Az adatok lekérdezése a SELECT utasítással történik. Ennek legegyszerűbb formája a következő:

A SELECT utasítás egyszerűbb formája

S E L E C T o s z l o p l i s t a F R O M t á bla ;

Megjegyezzük, hogy az oszloplista helyére *-ot is írhatunk. Ha az oszloplista szerepel a SELECTutasítás után, akkor ezen oszloplistának megfe-lelő adatokat fogjuk kilistázni a táblából. Ha pedig * szerepel, akkor atábla minden oszlopa ki lesz listázva a séma szerkezetének megfelelően.

12.1.1. példa

Listázzuk ki a Fórumadatbázisból az uzenettábla tartalmát!

91

Az uzenet tábla tartalmának listázása

S E L E C T * F R O M u z e n e t ;

Az eredmény ehhez hasonló lesz:

uzenet

sorszám tartalom mikor felhasznalonev hirfolyam_azonosito

1 Hello mindenkinek! 2018-10-03 11:10:00 gnemeth 1

2 Sziasztok! 2018-10-06 09:45:00 pbalazs 1

3 Sziasztok! 2018-10-07 10:01:00 pkardos 1

4 Tudja-e valaki, hogy . . . 2018-10-15 17:00.00 pkardos 1 5 Szerintem itt nézd meg . . . 2018-10-16 14:32:00 bodnaar 1

A SELECT utasítás teljes szintaxisa a következő, ahol az opcionális kulcs-szavakat szögletes zárójellel jelöltük:

A SELECT utasítás

S E L E C T [D I S T I N C T] o s z l o p l i s t a F R O M t á b l a l i s t a

[W H E R E f e l t é tel ]

[G R O U P BY o s z l o p l i s t a ] [H A V I N G c s o p o r t f e l t é tel ]

[O R D E R BY o s z l o p l i s t a [D E S C]];

A SELECTutasításban az egyes kulcsszavak és záradékok a következő mű-veleteket jelentik:

SELECT oszloplista: itt a projekció műveletét (vagyis oszlopok kiválasztását) hajtjuk végre azoszloplistában megadott oszlopok szerint.

DISTINCT: ez a kulcsszó az eredménytáblában ismétlődő sorok közül csak egyet-egyet ír ki.

FROM táblalista: Descartes-szorzat készítése atáblalistában felsorolt táb-lákból.

WHERE feltétel: szelekció a feltétel szerint.

GROUP BY oszloplista: csoportosítás az oszloplistában szereplő oszlopok értékei szerint. Több oszlop esetében érték n−esket kell figyelembe venni, nem csak különálló oszlopértékeket.

HAVING csoportfeltétel: a csoportosítás után a csoportok rekordjaira vonat-kozó szelekció.

12.1. A SELECT UTASÍTÁS 93 ORDER BY oszloplista: azoszloplistábanszereplő oszlopok adatainak ren-dezése növekvő (ASC) vagy csökkenő (DESC) sorrendben. Az alapértel-mezett rendezés a növekvő sorrend.

A SELECT utasítás műveleteinek sorrendje eltér a szintaxisban mega-dottaktól. A műveleteket az alábbi sorrendben kell figyelembe venni:

1. FROM - Descartes-szorzat készítése a felsorolt táblákból.

2. WHERE - A Descartes-szorzatból a megadott feltétel szerint sorokat vá-lasztunk ki.

3. GROUP BY- Csoportosítás.

4. HAVING- Csoport szelekció.

5. SELECT [DISTINCT] - Projekció.

6. ORDER BY- Rendezés.

Amennyiben a lekérdezés csoportosítást tartalmaz, a SELECT után csak olyan oszlopnév lehet, amely szerepel a GROUP BYoszloplistájában, a csopor-tosítás alapján értéke egyértelmű, vagy összesítő függvényben szerepel.

12.1.2. példa

Tekintsük a Fórum adatbázist!

FELHASZNÁLÓ(felhasználónév, jelszó, email, vezetéknév, keresztnév, utolsó belépés időpontja)

ÜZENET(sorszám, tartalom, mikor,felhasználónév, hírfolyam azonosító) HÍRFOLYAM(azonosító, megnevezés)

KULCSSZAVAK(hírfolyam azonosító, kulcsszó) KÖVETI(hírfolyam azonosító, felhasználónév)

Listázzuk ki az üzenetek tartalmát, írjuk ki minden üzenethez a bekül-dés dátumát illetve a felhasználó nevét is! Rendezzük az üzeneteket a beküldési dátumuk (uzenet.mikor attribútum) szerint csökkenő sor-rendbe!

Üzenetek listázása

1 Hello mindenkinek! 2018-10-03 11:10:00 gnemeth 1

2 Sziasztok! 2018-10-06 09:45:00 pbalazs 1

3 Sziasztok! 2018-10-07 10:01:00 pkardos 1

4 Tudja-e valaki, hogy . . . 2018-10-15 17:00.00 pkardos 1 5 Szerintem itt nézd meg . . . 2018-10-16 14:32:00 bodnaar 1

felhasznalo

felhasznalonev jelszo vezeteknev keresztnev utolso_belepes_idopontja

pbalazs Bp1234 Balázs Péter 2019-07-03 12:10:00

gnemeth Ng5678 Németh Gábor 2018-11-23 15:25:00

pkardos Kp4567 Kardos Péter 2019-02-24 09:52:00

bodnaar Bp9876 Bodnár Péter 2019-03-16 18:30:00

vargalg Vl6543 Varga László Gábor 2019-02-10 15:00:00

eredmény(Afelhasznalotáblanevet itt f-fel rövidítjük, mert hosszú lenne.)

f.felhasznalonev f.vezeteknev f.keresztnev uzenet.tartalom uzenet.mikor bodnaar Bodnár Péter Szerintem itt nézd meg . . . 2018-10-16 14:32:00 pkardos Kardos Péter Tudja-e valaki, hogy . . . 2018-10-15 17:00.00

pkardos Kardos Péter Sziasztok! 2018-10-07 10:01:00

pbalazs Balázs Péter Sziasztok! 2018-10-06 09:45:00

gnemeth Németh Gábor Hello mindenkinek! 2018-10-03 11:10:00