8.FELADATSOR
(INFORMÁCIÓS RENDSZEREK)
Témakör: SQL DML, táblák
tartalmának
módosítása: delete,
update, insert
+ehhez szükséges a tranzakció-kezelés: commit, rollback, savepoint
>> Lásd EA+ Ullman-Widom Tankönyv 6.5.-6.6. szakasz [ 6.ea.pdf /1.rész]
>>
[ kiegészítés: Oracle
segédanyagok: SQL09_DML.pdf ]
FELADATSOR: dolgozo,
osztaly (SQL DML: DELETE, INSERT és UPDATE)
Előkészítés:
Ezekhez a DML feladatokhoz ámenetileg most
megszorítások
(mint
például hivatkozási
épség) megadása
nélkül hozzuk létre a
táblákat.
-- Emlékeztető: Dolgozo,
Osztaly, Fiz_Kategoria: createDolg+Constraints
A
módosítást egy
másodpéldányon
(oszt2, dolg2, fizkat2) végezzük, hogy
a tábla eredeti tartalma
megmaradjon és a
megszorítások se zavarjanak.
DROP TABLE fizkat2;
DROP TABLE dolg2;
DROP TABLE oszt2;
CREATE TABLE oszt2 AS SELECT * FROM Osztaly;
CREATE TABLE dolg2 AS SELECT * FROM Dolgozo;
CREATE TABLE fizkat2 AS SELECT * FROM Fiz_Kategoria;
-- Az SQL DML feladatok után
kérdezzük
le a módosított tábla
tartalmát,
-- majd állítsuk vissza a
tábla
eredeti tartalmát a ROLLBACK
utasítással!
ROLLBACK; -- visszaállítjuk a tábla
eredeti tartalmát (a további feladatokhoz)
COMMIT; -- ezzel véglegesítjük a
táblák tartalmát (befejezzük
a
tranzakciót)
DELETE - sorok törlése
DELETE [FROM ] tábla
[WHERE feltétel ]
1. Töröljük azokat a
dolgozókat (a dolg2
táblából),
akiknek jutaléka NULL.
2. Töröljük azokat a
dolgozókat,
akiknek a belépési dátuma 1982 előtti.
3. Töröljük azokat a
dolgozókat,
akik osztályának telephelye DALLAS.
4. Töröljük azokat a
dolgozókat,
akiknek a fizetése kisebb, mint az
átlagfizetés.
5. Töröljük azokat a
dolgozókat,
akiknek a fizetése kisebb, mint a saját
osztályuk átlagfizetése.
6. Töröljük a legjobban kereső dolgozót.
7. Töröljük ki azokat az
osztályokat (az oszt2
táblából), ahol dolgozik valaki,
akinek a fizetése
a Fiz_Kategoria tábla szerint a 2-es
kategóriába esik.
8. Töröljük ki azon
osztályokat,
amelyeknek 2 olyan dolgozója van, akinek
a fizetése a 2-es
fizetési
kategóriába esik a Fiz_Kategoria tábla
alapján.
UPDATE - tábla tartalmának
módosítása
UPDATE tábla
SET oszlop = érték [, oszlop =
érték, ... ]
[WHERE feltétel ]
1. Növeljük meg a 20-as
osztályon a
dolgozók fizetését 20%-kal.
2. Növeljük meg azok
fizetését
500-zal, akik jutaléka NULL vagy
a
fizetésük kisebb az átlagnál.
3. Növeljük meg mindenkinek a
jutalékát a jelenlegi maximális
jutalékkal,
ha valakinek ismeretlen a jutaléka (NULL) tekintsük 0-nak.
4. Módosítsuk 'Loser'-re a
legrosszabbul kereső
dolgozó nevét.
5. Növeljük meg azoknak a
dolgozóknak a
jutalékát 3000-rel, akiknek
legalább 2
közvetlen
beosztottjuk van.
Az ismeretlen (NULL)
jutalékot
vegyük úgy, mintha 0 lenne.
6. Növeljük meg azoknak a
dolgozóknak a
fizetését a jelenlegi minimális
fizetés
5%-kával, akiknek van olyan
beosztottja,
aki minimális fizetéssel rendelkezik.
7. Növeljük meg a nem
főnökök
fizetését a saját osztályuk
átlagfizetésével.
8. Összetett, több lépéses feladat a Kende-Nagy feladatgyűjteményből (ott 5.5/c)
Bővítsük a dolg2 táblát
egy lakhely oszloppal, az új oszlop létrehozása:
ALTER TABLE dolg2 ADD lakhely VARCHAR2(30);
majd módosítsuk
a táblát töltsük fel a lakcím
oszlopát a következőképpen:
A BOSTON-ban dolgozók CHICAGO-ban, a CHICAGO-ban dolgozók pedig
BOSTON-ban laknak, kivéve azokat a CHICAGO-i dolgozókat, akiknek
BLAKE a főnöke, mert ők INDIANAPOLIS-ban laknak, feltéve, hogy
nem CLERK foglalkozásúak, mert akkor sehol sem laknak (NULL).
INSERT -- 1.alakja - egy új sor felvitele
értékek megadásával
INSERT INTO tábla [(oszlop [, oszlop... ])]
VALUES (érték [, érték...
]);
1. Vigyünk fel egy 'Kovacs' nevű
új
dolgozót a 10-es osztályra a következő
értékekkel: dkod=1,
dnev='Kovacs', oazon=10,
belépés=aktuális dátum,
fizetés=a 10-es
osztály
átlagfizetése. A többi oszop legyen NULL.
2. Példa a
helyettesítő/felhasználói
változókra:
&Numerikus/'&Karakteres'
az insert
utasításban, itt a
felhasználónak kell begépelnie az
értékeket:
INSERT INTO dolg2 (dkod, dnev, oazon)
VALUES (&DOLGKOD, upper('&DOLGNEV'), &OSZTAZON);
-- -- -- -- --
INSERT -- 2.alakja - több sor felvitele
alkérdéssel
INSERT INTO tábla [(oszlop [, oszlop... ])]
(SFW alkérdés);
3. Több sor felvitele: Hozzunk létre egy
UjOsztaly nevű táblát, amelynek
attribútumai megegyeznek az
Osztály tábla oszlopaival, plusz van
még egy numerikus
típusú letszam nevű új oszlopa.
DROP TABLE UjOsztaly;
CREATE TABLE UjOsztaly
AS SELECT o.*, 0 letszam
FROM Osztaly o
WHERE 1=2;
Ebbe az UjOsztaly
táblába az insert
utasítás 2.
alakjával (alkérdéssel )
vigyünk fel
új sorokat az osztály és
dolgozó
táblák
aktuális tartalmának
felhasználásával minden
osztály
adatát kiegészítve az
adott
osztályon
dolgozók
létszámával.
Azok az
osztályok is jelenjenek meg ahol nem dolgozik
senki,
ott a
létszám 0 legyen.
Továbbá ha
vannak olyan dolgozók,
akiknek nem ismert az osztálya,
azok
létszámát egy olyan sorba
írjuk be, amelyben az adatok
oazon=0, onev= 'FIKTIV'
és telephely='ISMERETLEN' legyenek.
4. Több sor felvitele: Hozzunk
létre egy
UjDolg nevű táblát, amelynek
attribútumai megegyeznek az
Dolgozo tábla oszlopaival, plusz van
még egy numerikus
típusú
Nyeremény nevű attribútuma.
Ebbe az UjDolg
táblába az insert
utasítás 2.
alakjával (alkérdéssel )
vigyünk fel
új sorokat a dolgozo
táblák
sorait egészítsük ki
véletlenszám
generátor
függvénnyel adjuk meg a nyereményt,
amely 1000 és 3000
közötti 100-ra
kerekített érték legyen!
Segítség:
- Ujdolg tábla
létrehozása
hasonlóan, mint az előző UjOsztaly tábla volt.
INSERT INTO UjDolg (dkod, dnev, oazon, fonoke, fizetes, nyeremeny)
(SELECT dkod, dnev, oazon, fonoke, fizetes,
round(dbms_random.value(1000, 3000),-2) nyeremeny
FROM Dolgozo d);
>> Önálló
gyakorlásra: Oracle
Példatár Feladatok.pdf
5.fejezet DML feladatai