7.GYAKORLAT (ADATBÁZISOK)
Táblák tartalmának
módosítása;
Táblák
létrehozása, integritási
megszorítások
>> I.RÉSZ
- SQL DML: TÁBLÁK TARTALMÁNAK
MÓDOSÍTÁSA, TRANZAKCIÓK
>> II.RÉSZ
- SQL DDL: TÁBLÁK
LÉTREHOZÁSA, INTEGRITÁSI
MEGSZORÍTÁSOK
I.RÉSZ
SQL DML utasítások [DELETE,
UPDATE, INSERT]; Tranzakciók
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
/1ré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
II.RÉSZ
Táblák
és integritási
megszorítások: [CREATE
| ALTER | DROP ] TABLE
>> SQL DDL,
relációs
séma megadása create
table-példák.txt
- create table
táblanév
(oszlopnév típus, stb) milyen
adattípusokat
ismerünk?
- Az Oracle fő adattípusai:
SQL
Lang.Ref. Data
Types (varchar2,
number, date)
>> Integritási
megszorítások alter_table-megszorítás-példák.txt
- Oracle kulcsok,
hivatkozási épség
megadása: SQL
Lang.Ref, Constraint
>> Lásd EA+ Ullman-Widom
Tankönyv 2.3.
és 7.1.-7.3.szakasz [ 6.ea.pdf/2rész
]
>>
[ kiegészítés: Oracle
segédanyagok: SQL10_DDL.pdf
]
-- -- -- -- --
1.) Dolgozo,
Osztaly, Fiz_Kategoria táblák,
példa: createDolg+Constraints
E/K diagramja: Egyedhz:
Dolgozó, Osztály; Kapcsolatok: sok-egy
kapcsolatok
Dolgozo (dkod,
dnev, foglalkozas,
fonoke, belepes, fizetes, jutalek, oazon)
Osztaly (oazon, onev,
telephely)
Készítsünk a fenti
táblákhoz
(megszorítások nélküli)
másolatokat:
DROP TABLE dolg1;
DROP TABLE oszt1;
CREATE TABLE
oszt1 AS SELECT * FROM Osztaly;
CREATE TABLE
dolg1 AS SELECT * FROM Dolgozo;
majd az
új táblákat lássa
el az
alábbi
megszorításokkal:
- Legyen a dkod elsődleges
kulcs a dolg1
táblában, és legyen az oazon
elsődleges kulcs a
oszt1
táblában és idegen kulcs a
dolg1
táblában és
a
hivatkozási épséget itt
úgy állítsa be, hogy egy
osztály
törlése
esetén
ennek az
osztálynak a
dolgozóit is törölje a dolg1
táblából!
- Egy új dolgozó
fizetése nem maradhat hiányzó
érték, és csak az
adott
700
és 7000 USD
értéktartománybeli
fizetést kaphasson!
- Ellenőrizze ezeket a
megszorításokat sikeres
(megfelelő rekord felvitele)
és sikertelen
(hibás rekord)
adatbeviteli kísérletekkel, majd
állítsa vissza
az eredeti
táblatartalmakat
(rollback).
-- -- -- -- --
2.) Készítsünk el SQL-ben két
táblát: sportcsapatok és
játékosok.
- Az egyik a sportcsapatok:
csapatnev, varos, tagdij
oszlopokkal,
- ebben a
táblában legyen összetett kulcs
(csapatnev, varos),
- és ha a varos nem
'Budapest', akkor a tagdíj <= 5000 legyen.
- A másik a
játékosok táblának az
attribútumai legyenek:
nev, mezszam,
szuldatum, szulvaros, csapatnev, varos
és itt is legyen
összetett kulcs (mezszam, csapatnev, varos),
- a játékosok
táblában a
(csapatnev, varos) legyen idegen
kulcs,
vagyis itt hivatkozunk a
sportcsapatok tábla elsődleges kulcsára,
- a nev oszlopot
kötelező kitölteni és egyedinek kell
lennie,
- és a szulvaros mezőben
csak olyan várost lehet megadni,
ami szerepel a sportcsapatok
tábla varos oszlopában.
-- -- -- -- --
3.) Modellezési feladatok [ E/K
emlékeztető: INFR_EK_feladatok.pdf ]
Rajzoljunk fel a
táblán/papíron E/K diagramokat, majd
alakítsuk
át
rel.sémákra
és a
szükséges megszorításokra,
készítsük el a
táblákat!
>>
Példák E/K diagramra
és relációs
sémákra való
átalakításukra:
- egy
áruház
dolgozói, vevői és
beszállítói: EK_pelda_A.pdf
- egy orvosi
rendelő orvosai és páciensei: EK_pelda_B.pdf
-- -- -- -- --
>> Önálló
gyakorlásra: Oracle
Példatár Feladatok.pdf
5.fejezet DDL feladatai