ÓBUDAI EGYETEM Neumann János Informatikai Kar Nappali Tagozat ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT NÉV: MÁK VIRÁG NEPTUN KÓD: A DOLGOZAT CÍME: Jani bácsi székadatbázisa Beadási határidő: 14. oktatási hét KÖVETELMÉNYEK: Készítse el az Oracle adatbázis-kezelő rendszerben a Jani bácsi székgyártó kisiparos ügyfélmegrendelés nyilvántartását. 1. Tárolnánk a székek megnevezését, típusát, színét, méretét, árát, a készlet nagyságot. 2. Tároljuk a vásárlók adatait is: név, cím, telefonszám, törzsvásárló-e. 3. Nyilvántartjuk a rendeléseket: ki, mikor, mit rendelt. A dolgozatnak tartalmaznia kell az alkalmazási környezet bemutatását, az elkészített rendszer tervét, az adatmodellt az algoritmus ismertetését, mellékletként pedig a kifejlesztett program forrásnyelvű, magyarázatokkal ellátott listáját, a tesztfutások jegyzőkönyvét, valamint CD-n a dolgozat dokumentum-állományát, továbbá az elkészített, működő program forrásnyelvű és a futtatáshoz szükséges állományait (például a feltöltött adattáblákat) is. 2010. február... Mák Virág Nagy Gabriella
Tartalomjegyzék Tartalomjegyzék...2 Normalizálás...3 Az ősmodell relációsémája...3 Függőségek:...3 Függőségek normalizálása:...4 Az eredmény adatmodell...5 Az adatbázis létrehozása...7 Az adatbázis feltöltése...9 Adattáblák...10 Lekérdezések...11 DML utasítások...17 DDL utasítások...20 2
Normalizálás Feltételezzük, hogy: A megnevezés, a szín és a típus együtt azonosítja a széket. A név és a telefonszám együtt azonosítja a vásárlót. Adott típusú szék többféle színben kapható, de ezek mérete és ára megegyezik. Az ősmodell relációsémája Székvásárlás <megnevezés, típus, szín, méret, ár, készlet, név, cím, telszám, törzsvásárló, dátum, mennyiség> ahol: megnevezés: a termék neve típus: a termék típusa szín: a termék színe méret: a termék mérete ár: 1 db termék ára készlet: a raktáron lévő mennyiség az adott termékből név: a vásárló neve cím: a vásárló címe telszám: a vásárló telefonszáma törzsvásárló: a vásárló törzsvásárló-e dátum: a vásárlás dátuma mennyiség: vásárolt mennyiség az adott termékből Függőségek: F vásárló = {név, telszám} => {cím, törzsvásárló} F termék = {megnevezés, típus} => {méret, ár} F készlet = {megnevezés, típus, szín} => {méret, ár, készlet} F vásárlás = {név, telszám, megnevezés, típus, dátum} => {mennyiség, szín, méret, ár, készlet, cím, törzsvásárló } 3
Függőségek normalizálása: a) F vásárló 1NF-ben van, mert nincs összetett attribútum. 2NF-ben van, mert 1NF-ben van és minden jobb oldalon álló attribútum függ az elsődleges attribútumoktól, és nem függ az elsődleges attribútumok egy részhalmazától. 3NF-ben van, mert 2NF-ben van és a másodlagos attribútumok között nincs függés (nincs tranzitív függés). BCNF-ben van, mert 3NF-ben van és nincs kulcstörés. b) F termék 1NF-ben van, mert nincs összetett attribútum. 2NF-ben van, mert 1NF-ben van és minden jobb oldalon álló attribútum függ az elsődleges attribútumoktól, és nem függ az elsődleges attribútumok egy részhalmazától. 3NF-ben van, mert 2NF-ben van és a másodlagos attribútumok között nincs függés (nincs tranzitív függés). BCNF-ben van, mert 3NF-ben van és nincs kulcstörés. c) F készlet 1NF-ben van, mert nincs összetett attribútum. A 2NF-et sérti, mert a "méret" és "ár" attribútumok csak az elsődleges attribútumok egy részhalmazától függnek. Dekompozíció: {megnevezés, típus} => {méret, ár} {megnevezés, típus, szín} => {készlet} Ezután: 3NF-ben van, mert 2NF-ben van és a másodlagos attribútumok között nincs függés (nincs tranzitív függés). BCNF-ben van, mert 3NF-ben van és nincs kulcstörés. d) F vásárlás 1NF-ben van, mert nincs összetett attribútum. A 2NF-et sérti, mert bizonyos másodlagos attribútumok csak az elsődleges attribútumok egy részhalmazától függnek. 4
Dekompozíció: {név, telszám, megnevezés, típus, szín, dátum} => {mennyiség} {megnevezés, típus} => {méret, ár} {megnevezés, típus, szín} => {készlet} {név, telszám} => {cím, törzsvásárló} Ezután: 3NF-ben van, mert 2NF-ben van és a másodlagos attribútumok között nincs függés (nincs tranzitív függés). BCNF-ben van, mert 3NF-ben van és nincs kulcstörés. Az eredmény adatmodell vásárlás<név, telszám, megnevezés, típus, szín, dátum, mennyiség> szék<megnevezés, típus, méret, ár> raktár<megnevezés, típus, szín, készlet> vásárló<név, telszám, cím, törzsvásárló> Idegen kulcsok: A "vásárlás" táblában a "név" és "telszám" a "vásárló" táblára nézve, a "megnevezés", "típus" és "szín" a "raktár" táblára nézve. A táblák attribútumai típussal: VÁSÁRLÁS név telszám megnevezés típus szín dátum mennyiség VARCHAR2(30) VARCHAR2(15) VARCHAR2(20) VARCHAR2(20) VARCHAR2(15) DATE NUMBER(3) megnevezés típus méret ár SZÉK VARCHAR2(20) VARCHAR2(20) NUMBER(3) NUMBER(5) 5
megnevezés típus szín RAKTÁR VARCHAR2(20) VARCHAR2(20) VARCHAR2(15) név telszám cím VÁSÁRLÓ VARCHAR2(30) VARCHAR2(15) VARCHAR2(50) készlet NUMBER(3) törzsvásárló NUMBER(1) 6
Az adatbázis létrehozása SET FEEDBACK OFF; ALTER SESSION SET NLS_DATE_LANGUAGE=ENGLISH; ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'; DROP TABLE vásárló; CREATE TABLE vásárló (név VARCHAR2(30), telszám VARCHAR2(15), cím VARCHAR2(50), törzsvásárló NUMBER(1), CONSTRAINT vásárló_pk PRIMARY KEY (név, telszám), CONSTRAINT törzs_ck CHECK (törzsvásárló IN (0,1))); DROP TABLE szék; CREATE TABLE szék (megnevezés VARCHAR2(20), típus VARCHAR2(20), méret NUMBER(3), ár NUMBER(5) NOT NULL, CONSTRAINT szék_pk PRIMARY KEY (megnevezés, típus)); DROP TABLE raktár; CREATE TABLE raktár (megnevezés VARCHAR2(20), típus VARCHAR2(20), szín VARCHAR2(15), készlet NUMBER(3), CONSTRAINT készlet_pk PRIMARY KEY (megnevezés, típus, szín), 7
CONSTRAINT szék_fk FOREIGN KEY (megnevezés, típus) REFERENCES szék(megnevezés, típus)); DROP TABLE vásárlás; CREATE TABLE vásárlás (név VARCHAR2(30), telszám VARCHAR2(15), megnevezés VARCHAR2(20), típus VARCHAR2(20), szín VARCHAR2(15), dátum DATE, mennyiség NUMBER(3) NOT NULL, CONSTRAINT vásárlás_pk PRIMARY KEY (név, telszám, megnevezés, típus, szín, dátum), CONSTRAINT vásárló_fk FOREIGN KEY (név, telszám) REFERENCES vásárló(név, telszám), CONSTRAINT raktár_fk FOREIGN KEY (megnevezés, típus, szín) REFERENCES raktár(megnevezés, típus, szín)); 8
Az adatbázis feltöltése INSERT INTO vásárló VALUES ('Farkas Piroska','20/123-4567','Erdőalja, Házikó utca 1',0); INSERT INTO vásárló VALUES ('Nemoda Buda','30/123-1234','Budapest, Budai vár',0); INSERT INTO vásárló VALUES ('Mezei Virág','70/987-6543','Mezőtúr, Virág utca 12',1); INSERT INTO szék VALUES ('Marcsa néni kedvence','hokedli',30,2500); INSERT INTO szék VALUES ('Gyermekszék','szék',50,3000); INSERT INTO szék VALUES ('Hármas sztár','háromlábú szék',70,5500); INSERT INTO szék VALUES ('Ebédlői szék','szék',80,7000); INSERT INTO raktár VALUES ('Marcsa néni kedvence','hokedli','fehér',10); INSERT INTO raktár VALUES ('Marcsa néni kedvence','hokedli','barna',15); INSERT INTO raktár VALUES ('Gyermekszék','szék','kék',24); INSERT INTO raktár VALUES ('Gyermekszék','szék','rózsaszín',43); INSERT INTO raktár VALUES ('Gyermekszék','szék','sárga',11); INSERT INTO raktár VALUES ('Hármas sztár','háromlábú szék','fekete',5); INSERT INTO raktár VALUES ('Ebédlői szék','szék','krémszínű',12); INSERT INTO vásárlás VALUES ('Farkas Piroska', '20/123-4567', 'Gyermekszék', 'szék', 'kék', '2010-02-03', 2); INSERT INTO vásárlás VALUES ('Farkas Piroska', '20/123-4567', 'Marcsa néni kedvence', 'hokedli', 'fehér', '2010-02-23', 1); INSERT INTO vásárlás VALUES ('Nemoda Buda', '30/123-1234', 'Ebédlői szék', 'szék', 'krémszínű', '2010-03-30', 4); INSERT INTO vásárlás VALUES ('Mezei Virág', '70/987-6543', 'Gyermekszék', 'szék', 'sárga', '2010-01-03', 20); INSERT INTO vásárlás VALUES ('Mezei Virág', '70/987-6543', 'Hármas sztár', 'háromlábú szék', 'fekete', '2010-04-15', 1); 9
Adattáblák Vásárlás Raktár Vásárló Készlet 10
Lekérdezések 1. Listázzuk ki a 3500 Ft-nál olcsóbb székek nevét, típusát és méretét. SELECT FROM WHERE megnevezés AS Név, típus AS Fajta, méret AS Mekkora szék ár<3500; Eredmény: NÉV FAJTA MEKKORA -------------------- -------------------- ---------- Marcsa néni kedvence hokedli 30 Gyermekszék szék 50 11
2. Jelenítsük meg a vásárlók adatait; ha nincs cím megadva, akkor helyette írjuk ki, hogy Hiányzó cím. SELECT FROM név AS "Vásárló neve", telszám AS Telefonszám, NVL(cím, 'Hiányzó cím') AS Cím, törzsvásárló AS "Törzsvásárló-e" vásárló; Eredmény: Vásárló neve TELEFONSZÁM CÍM Törzsvásárló-e ------------------------------ ------------------------------------------------------------------------------- Farkas Piroska 20/123-4567 Erdőalja, Házikó utca 1 0 Nemoda Buda 30/123-1234 Budapest, Budai vár 0 Mezei Virág 70/987-6543 Mezőtúr, Virág utca 12 1 12
3. Kérdezzük le a 2010-es évben eddig eladott székek összes értékét. SELECT FROM WHERE SUM(mennyiség*ár) AS Összesen vásárlás NATURAL JOIN szék EXTRACT(YEAR FROM dátum)=2010; Eredmény: ÖSSZESEN ----------------- 102000 13
4. Kérdezzük le típusonként a vásárolt székek átlagos darabszámát, amennyiben ez nagyobb, mint 5. SELECT FROM GROUP BY HAVING típus AS Típus, AVG(mennyiség) AS Átlag vásárlás NATURAL JOIN szék típus AVG(mennyiség)>5; Eredmény: TÍPUS ÁTLAG --------------- ---------- szék 8,66666667 14
5. Jelenítsük meg típusonként és azon belül színenként a székek átlagos készletmennyiségét. SELECT típus AS Típusa, szín AS Színe, AVG(készlet) AS Készletmennyiség FROM raktár GROUP BY ROLLUP (típus, szín); Eredmény: TÍPUSA SZÍNE KÉSZLETMENNYISÉG ------------------------- ----------------- ---------------- szék kék 24 szék sárga 11 szék krémszínű 12 szék rózsaszín 43 szék 22,5 hokedli barna 15 hokedli fehér 10 hokedli 12,5 háromlábú szék fekete 5 háromlábú szék 5 17,1428571 15
6. Rangsoroljuk a vásárlásokat az eladott mennyiség szerinti csökkenő rendben. Csak a vásárló nevét, a termék nevét és a mennyiséget listázzuk. SELECT FROM név, megnevezés, mennyiség, DENSE_RANK() OVER (ORDER BY mennyiség DESC) AS Rang vásárlás; Eredmény: NÉV MEGNEVEZÉS MENNYISÉG RANG -------------------------- ---------------------------------- -------------------------- ---------- Mezei Virág Gyermekszék 20 1 Nemoda Buda Ebédlői szék 4 2 Farkas Piroska Gyermekszék 2 3 Mezei Virág Hármas sztár 1 4 Farkas Piroska Marcsa néni kedvence 1 4 16
DML utasítások 1. Beszúrás: Mezei Virág vásárolt 3 db fehét hokedlit 2010. május 3-án. INSERT INTO vásárlás VALUES ('Mezei Virág', '70/987-6543', 'Marcsa néni kedvence', 'hokedli', 'fehér', '2010-05-03', 3); Ellenőrzés: SELECT FROM WHERE ORDER BY név, megnevezés, dátum, mennyiség vásárlás név='mezei Virág' AND telszám='70/987-6543' dátum DESC; Eredmény: NÉV MEGNEVEZÉS DÁTUM MENNYISÉG -------------------------- ---------------------------------- ----------------- ---------- Mezei Virág Marcsa néni kedvence 2010-05-03 3 Mezei Virág Hármas sztár 2010-04-15 1 Mezei Virág Gyermekszék 2010-01-03 20 17
2. Módosítás: Az előző feladatban megvásárolt termékeket vonjuk le a készletről. UPDATE SET WHERE raktár készlet=készlet-3 megnevezés='marcsa néni kedvence' AND típus='hokedli' AND szín='fehér'; Ellenőrzés: SELECT * FROM raktár WHERE megnevezés='marcsa néni kedvence' AND típus='hokedli' AND szín='fehér'; Eredmény: MEGNEVEZÉS TÍPUS SZÍN KÉSZLET ---------------------------------- ----------------- ---------------- ---------- Marcsa néni kedvence hokedli fehér 7 18
3. Törlés: Mezei Virág nem volt megelégedve a hokedlikkel, ezért visszahozta őket. Töröljük a vásárlást. DELETE FROM vásárlás WHERE név='mezei Virág' AND telszám='70/987-6543' AND megnevezés='marcsa néni kedvence' AND típus='hokedli' AND szín='fehér' AND dátum='2010-05-03'; Ellenőrzés: SELECT FROM WHERE ORDER BY név, megnevezés, dátum, mennyiség vásárlás név='mezei Virág' AND telszám='70/987-6543' dátum DESC; Eredmény: NÉV MEGNEVEZÉS DÁTUM MENNYISÉG ------------------------- -------------------------- ----------------- ---------- Mezei Virág Hármas sztár 2010-04-15 1 Mezei Virág Gyermekszék 2010-01-03 20 19
DDL utasítások 1. Oszlop beszúrás: Adjunk a "raktár" táblához egy új oszlopot, amely azt jelzi, hogy kell-e gyártani az adott termékből. ALTER TABLE ADD raktár (KellGyártaniMég NUMBER(1)); 2. Oszlop átnevezés: Nevezzük át a "KellGyártaniMég" oszlopot "Gyártandó"-ra. ALTER TABLE raktár RENAME COLUMN KellGyártaniMég TO Gyártandó; 3. Megszorítás hozzáadás: Gondoskodjunk róla, hogy a "Gyártandó" oszlopba csak 0 vagy 1 értéket lehessen beszúrni. ALTER TABLE raktár ADD CONSTRAINT gyárt_ck CHECK (Gyártandó IN (0,1)); Ellenőrzés: UPDATE SET raktár Gyártandó=2; Eredmény: Hiba a(z) 1. sorban: ORA-02290: ellenőrző megszorítás (SCOTT.GYÁRT_CK) megsértése 20