Adatbázis Rendszerek I. 9. SQL alapok (DDL esettanulmány) 66/1 B IT v: 2018.11.25 MAN
DDL Adatstruktúra definiáló utasítások DDL Data Definition Language Adatszerkezetek (elsősorban táblák) létrehozása, módosítása, törlése Egy tábla szerkezete, sémája a táblához tartozó mezőkkel egyértelműen megadható A mezők megadása a mező nevének és a mező adattípusának, valamint az integritási feltételeknek a kijelölésével történik Több tábla is létezhet ugyanazzal a szerkezettel, de a nevük nem lehet egyforma 66/2
Tábla (vagy más objektum) létrehozása CREATE objektumtípus objektumnév paraméterek; CREATE TABLE táblanév ( mezőnév adattípus [integritási feltétel], mezőnév adattípus [integritási feltétel], mezőnév adattípus [integritási feltétel] [,további integritási feltételek] ); CREATE TABLE Autó ( Rendszám char(7) primary key, Típus char(25) not null, Szín char(15) default 'Fehér', Kor number(3) check (Kor >= 0) ); 66/3 Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 JED-123 Nissan Ezüst 5 AKT-392 Trabant Kék 32
Tábla (vagy más objektum) létrehozása Kód 1 2 3 Rendszám Típus Szín GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék CREATE SEQUENCE k_s; insert into Autó values (k_s.nextval,... CREATE INDEX RIndex ON Autó (Rendszám); Rendszám AKT-392 GBC-765 Kód 3 1 JED-123 2 CREATE VIEW OpelAutó AS Select Kód, Rendszám, Szín from Autó Where Tipus='Opel'; Kód 1 Rendszám GBC-765 Szín Fehér 66/4
Adattípusok Alap adattípusok: Char(n) fixen n hosszúságú karaktersorozat, Hossza max. 2000 karakter A rövidebb szövegek végére szóközök kerülnek Number(n,m) n jegyű decimális szám, ebből m tizedes jegy; Number(8,2) 12345.12 Max. 38 számjegyből állhat Date dátum. 66/5
Oracle adattípusok Szöveges adattípusok CHAR (1-2000), fix hosszúságú adatok NCHAR (1-2000) Unicode kódolással VARCHAR (1-4000) változó hosszúságú adatok (null üres karakterlánc) VARCHAR2 (1-4000) Unicode kódolással (null = üres karakterlánc) LONG (max. 2 GB) CLOB (max. 4 GDb-1 adathoz) 66/6 NCLOB (max. 4 GDb-1 adathoz, Unicode kódolással)
Oracle adattípusok Numerikus adattípusok NUMBER (±10 125 ) Max. 38 számjegy INT (INTEGER) (±2 31 ) SMALLINT (±2 15 ) DECIMAL (±10 308 ) Max. 15 számjegy 66/7
Oracle adattípusok Dátum és időpont adattípusok DATE (ie. 4712.01.01 isz. 9999.12.31) TIMESTAMP (másodperc pontossággal) 66/8
Integritási feltételek megadása Primary key elsődleges kulcs References hivatkozás másik táblára Foreign key (mezőlista) References táblanév(mezőlista) idegen kulcs megadása ha a kulcs több mezőből áll Not null nem maradhat üresen a mező, kötelező kitölteni Unique a mező egyedi, nem kerülhet bele két egyforma érték Default alapérték megadása Check értékellenőrzés 66/9
Adattáblák létrehozása Megszorítások Az idm mező megadása különböző megszorításokkal: create table worker( idm int, nn df ch uq pk idm int not null, idm int default '29', idm int check(idm >500), idm int unique, idm int primary key, ); 66/10
Példák create table pld1 ( id int primary key, nev varchar2(100), datum date, suly float(8) ); create table pld2 ( az int primary key, hely varchar2(30), darab int check (darab>=0), foreign key (az) references pld1(id) ); 1 2 create sequence id_seq; create table pld3 ( id int default id_seq.nextval primary key, nev varchar2(50) not null unique, darab number(10) default '0' not null, idopont timestamp default sysdate, ); 66/11 3 Fontos a sorrend! 4
Kapcsolatok kialakítása 1:1 kapcsolat Ha egy idegen kulccsal összekapcsoljuk a két táblát, akkor csak azt jelezzük, hogy csak olyan értékek kerülhetnek a táblába, amelyek a másik tábla elsődleges kulcs mezőjében megtalálhatók, de ezek az adatok ismétlődhetnek a mezőben, vagyis ez egy 1:N kapcsolat. Az 1:1 kapcsolathoz le kell tiltani az ismétlődést, vagyis elő kell írni az Unique integritást. Ha az Unique integritást előírjuk, értékes adat csak egyszer szerepelhet az oszlopban, de null érték többször is. A null értékre nem vonatkozik az Unique integritás! 66/12
Kapcsolatok kialakítása 1:1 kapcsolat create table ember( ekód number(3) primary key, név varchar2(40) ); create table autó( rendszám char(7) primary key, tipus varchar2(25), ekód number(3) unique, foreign key(ekód) references ember(ekód) ); 66/13 Több null érték az oszlopban
Kapcsolatok kialakítása 1:N kapcsolat Ha nem írjuk elő az idegen kulcsra az Unique integritást, 1:N kapcsolatot alakítunk ki. create table ember( ekód number(3) primary key, név varchar2(40) ); create table autó( rendszám char(7) primary key, tipus varchar2(25), ekód number(3), foreign key(ekód) references ember(ekód) ); 66/14 Több azonos érték az oszlopban
Kapcsolatok kialakítása N:M kapcsolat Az N:M kapcsolatot egy kapcsolótáblával hozzuk létre create table ember( ekód number(3) primary key, név varchar2(40) ); create table autó( akód number(3) primary key, rendszám char(7), tipus varchar2(25) ); create table e_a( ekód number(3), akód number(3), foreign key(ekód) references ember(ekód), foreign key(akód) references autó(akód) ); 66/15
Kapcsolatok kialakítása N:M kapcsolat Ha nem tiltjuk le az ismétlődést, egy rekord többször is bekerülhet a kapcsolótáblába! Több azonos rekord! M1 M2 66/16 alter table e_a add constraint ea_pk primary key (ekód, akód) alter table e_a add constraint ea_uq unique (ekód, akód)
Kapcsolatok kialakítása N:M kapcsolat Az N:M kapcsolat kapcsolótáblájának helyes kialakítása: create table ember( ekód number(3) primary key, név varchar2(40) ); create table autó( akód number(3) primary key, rendszám char(7), tipus varchar2(25) ); create table e_a( ekód number(3), akód number(3), primary key (ekód, akód), foreign key(ekód) references ember(ekód), foreign key(akód) references autó(akód) ); 66/17
Többértékű tulajdonság kialakítása create table ember( ekód number(3) primary key, név varchar2(40) ); ekód Név create table nyelvism( ekód number(3), nyelv varchar2(25), primary key (ekód, nyelv), foreign key(ekód) references ember(ekód) ); Ember Nyelv A helyesen megválasztott elsődleges kulccsal próbáltuk megvédeni az adatok ismétlődését. Erre megfelelő, de az elírásokat (kisbetű-nagybetű, elírt adat) nem akadályozza meg 66/18
Többértékű tulajdonság kialakítása Javasolt kialakítás create table ember( ekód number(3) primary key, név varchar2(40) ); create table nyelvism( nykód number(3) primary key, nyelv varchar2(25) ); create table e_ny( ekód number(3), nykód number(3), primary key (ekód, nykód), foreign key(ekód) references ember(ekód), foreign key(nykód) references nyelvism(nykód) ); 66/19
Tábla módosítása, átnevezése ALTER TABLE táblanév [ADD (oszlopnév definíció,..., oszlopnév definíció)] [ALTER COLUMN (oszlopnév definíció,..., oszlopnév definíció)] [DROP COLUMN (oszlopnév,..., oszlopnév)] [RENAME COLUMN régi_név TO új_név] Fontos: a mezők mérete általában csak növelhető! ALTER TABLE Autó ADD Tulaj varchar(35); RENAME táblanév TO új_táblanév Tábla átnevezése 66/20
Tábla módosítása create table személy( id number(4), név varchar2(30) ); ALTER TABLE személy ADD szülév number(4); ALTER TABLE személy RENAME COLUMN szülév TO szüldátum; ALTER TABLE személy MODIFY szüldátum date; ALTER TABLE személy MODIFY id primary key; DESC személy; ALTER TABLE személy DROP primary key; ALTER TABLE személy DROP COLUMN szüldátum; RENAME személy TO person; 66/21
Tábla módosítása comment on column person.id is '100 és 300 közötti adatok'; alter table person modify név default 'Kis Béla'; alter table person modify név default null; 66/22
Tábla módosítása: megszorítások Javaslat ALTER TABLE person ADD CONSTRAINT cn1 PRIMARY KEY(id); ALTER TABLE person ADD CONSTRAINT cn2 UNIQUE (név); ALTER TABLE person ADD CONSTRAINT cn3 CHECK (id > 200); create table department( dpno int, dpname varchar2(30) ); ALTER TABLE department ADD CONSTRAINT cn4 primary key(dpno); ALTER TABLE person ADD dp int; ALTER TABLE person ADD CONSTRAINT cn5 FOREIGN KEY (dp) REFERENCES department(dpno); ALTER TABLE person DROP CONSTRAINT cn1; 66/23
Megszorítások listázása SELECT * FROM user_constraints WHERE table_name = 'PERSON' 66/24 C check constraint on a table P primary key U unique key R referential integrity V with check option, on a view O with read only, on a view Csupa nagybetű!
Tábla törlése DROP TABLE táblanév; DROP TABLE Autó; Azok a táblák amelyekre más tábla hivatkozik, nem törölhetők! 66/25
Vedd észre! Táblák létrehozási sorrendje 1. Először azokat a táblákat kell létrehozni, amelyekből nem hivatkozunk más táblákra 2. Azután azokat, amelyekből hivatkozunk más táblákra 1 Kategoria Termek 2 Kkod Nev Kategoria Tkod Nev Ar Leiras Vasarlas Tkod Sorszam Idopont Darab VID 5 4 Vasarlo VID Nev Cim Fizmod FizModok Fkod Leiras 3 66/26
Vedd észre! Táblák törlési sorrendje 1. Először azokat a táblákat lehet törölni, amelyekből hivatkozunk más táblákra 2. Azután azokat, amelyekből nem hivatkozunk más táblákra 5 Kategoria Termek 4 Kkod Nev Kategoria Tkod Nev Ar Leiras Vasarlas Tkod Sorszam Idopont Darab VID 1 2 Vasarlo VID Nev Cim Fizmod FizModok Fkod Leiras 3 66/27
Lehetőségek Tábla létrehozása másolással (új táblanévvel) CREATE TABLE Személyek AS SELECT * FROM Person; Person ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Személyek ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Üres tábla létrehozása másolással Create table Személyek as select * from Person WHERE 1=0; Person ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Személyek ID Név Dp 66/28
Lehetőségek Üres tábla létrehozása másolással, eltérő szerkezettel CREATE TABLE Személyek AS SELECT id, név FROM Person WHERE 1=0; Person ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Személyek ID Név 66/29
Lehetőségek Tábla létrehozása több táblából create table Személyek as select ID, Név as NAME, DPNAME from Person join Department on dp=dpno Person ID 1 2 3 Név Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 Department DpNo 10 11 DpName Designer Programmer 66/30 Személyek ID Name DpName 1 2 3 Kis Béla Kő Dezső Hó Jenő Designer Programmer Designer
Nézettáblák VIEW Olyan "virtuális" tábla, mely fizikailag nem létezik, csak a létrehozó utasítását tárolja a rendszer ( letárolt lekérdezés) Normál táblaként viselkedik, így pl. lekérdezhető a tartalma A rendszer akkor állítja elő a tartalmát, amikor egy parancs hivatkozik rá, így a tartalom mindig friss, aktuális adatokból áll Nem tárol adatokat, feldolgozás után azonnal megszűnik Feldolgozása lassabb, mint a normál tábláké Bizonyos körülmények között módosítható a tartalma, természetesen ekkor a nézettáblán keresztül az eredeti táblák tartalma módosul Lehet csak olvashatóvá tenni Lehet "materizálni", vagyis tényleges fizikai táblaként létrehozni 66/31
Nézettáblák VIEW CREATE [OR REPLACE] [MATRERIALIZED] VIEW nézettáblanév [(A1, A2, An)] AS SELECT [WITH READ ONLY] OR REPLACE Felülírja a meglévő táblát MATERIALIZED Fizikailag is létrejön a tábla (pillanatfelvétel!) (A1,A2, An) Alias nevek adhatók a mezőknek WITH READ ONLY Csak olvasható adattartalom Ember Ekód Név Város 114 Kis Géza Eger 178 Jó Éva Miskolc Telefon 20-9555666 30-8765432 E_VW1 ID Name 114 Kis Géza 178 Jó Éva CREATE VIEW e_vw1 (id, name) AS SELECT Ekód, Név from Ember where cím='miskolc' 66/32 select * from e_vw1;
Nézettáblák VIEW Módosítható nézettáblák 66/33 A mögöttük lévő valódi táblák tartalma módosul Minden olyan nézettábla alapértelmezésként módosítható, ahol az adatok forrása egyértelműen beazonosítható. Ehhez a létrehozó CREATE parancsban be kell tartani bizonyos feltételeket: Nem lehet benne DISTINCT, ORDER BY, GROUP BY kulcsszó Nem lehet benne összesítő függvény Nem lehet benne al-lekérdezés Nem lehet benne halmazművelet (union, minus, intersect) Nem módosíthatók azok az oszlopok, amelyek sorfüggvények használatával jöttek létre, pl. címből kiemelt város név Több táblából származó nézettábla esetén a módosítás egyszerre csak egy táblát érinthet
Nézettáblák VIEW Ember Ekód Név Város 114 Kis Géza Eger 178 Jó Éva Miskolc Telefon 20-9555666 30-8765432 E_VW1 ID Name 114 Kis Géza 178 Jó Éva City Eger Miskolc CREATE OR REPLACE VIEW e_vw1 (id, name, city) AS SELECT Ekód, Név, Város from Ember; update e_vw1 set city='miskolc' where id=114 select * from e_vw1; select * from Ember; E_VW1 ID Name 114 Kis Géza 178 Jó Éva City Miskolc Miskolc Ember Ekód Név Város 114 Kis Géza Miskolc 66/34 178 Jó Éva Miskolc Telefon 20-9555666 30-8765432 Természetesen, ha az Ember táblát frissítjük, és utána kiíratjuk az e_vw1 nézettábla tartalmát, akkor abban is benne lesznek a frissítések.
Nézettáblák VIEW Beszúrás nézettáblába: A beszúrás a nézettáblán keresztül közvetlenül az alaptáblába történik Csak azok azoknak az alaptábla mezőknek adhatunk értéket, amelyek szerepelnek a nézettáblában Csak akkor oldható meg, ha elég mező van a nézettáblában: Az alaptábla kulcsmezőjének szerepelnie kell, kivéve, ha automatikus sorszámozású Valamennyi not null mezőnek szerepelnie kell, kivéve ha van default értékük Törlés nézettáblából: Közvetlenül az alaptáblára hat Csak a látható rekordok törölhetők 66/35
Nézettáblák VIEW Ember Ekód Név Város 114 Kis Géza Miskolc 178 Jó Éva Miskolc Telefon 20-9555666 30-8765432 E_VW1 ID Name 114 Kis Géza 178 Jó Éva City Miskolc Miskolc CREATE OR REPLACE VIEW e_vw1 (id, name, city) AS SELECT Ekód,Név,Város from Ember where város='miskolc'; insert into e_vw1 values(200, 'Hó Jenő', 'Eger'; Beszúródik a rekord az Ember táblába, de ha listázzuk az e_vw1 nézettáblát, nem lesz benne, mert a város nem miskolc! insert into e_vw1 values(222, 'Kő Kata', 'Miskolc'; select * from e_vw1; 66/36 E_VW1 ID 114 Name Kis Géza City Miskolc 178 Jó Éva 222 Kő Kata Miskolc Miskolc
Nézettáblák VIEW Ember Ekód Név Város 114 Kis Géza Miskolc 178 Jó Éva Miskolc Telefon 20-9555666 30-8765432 200 Hó Jenő Eger 222 Kő Kata Miskolc E_VW1 ID 114 Name Kis Géza City Miskolc 178 Jó Éva Miskolc 222 Kő Kata Miskolc CREATE OR REPLACE VIEW e_vw1 (id, name, city) AS SELECT Ekód,Név,Város from Ember where város='miskolc'; delete from e_vw1 where id=222; delete from e_vw1 where id=200; 1 row(s) deleted 0 row(s) deleted A 200-as ID-jű rekordot nem tudjuk a nézettáblából törölni, mert nem látható benne (nem miskolci)! 66/37
Nézettáblák VIEW Ember Ekód Név Város 114 Kis Géza Miskolc 178 Jó Éva Miskolc Telefon 20-9555666 30-8765432 200 Hó Jenő Eger 222 Kő Kata Város Miskolc Eger - E_VW1 Lakók száma 2 1 1 CREATE OR REPLACE VIEW e_vw1 AS SELECT Város, count(*) from Ember group by Város; Must name this expression with a column alias! CREATE OR REPLACE VIEW e_vw1 AS SELECT Város, count(*) "Lakók száma" from Ember group by Város; update e_vw1 set Város='Győr' where város is null Data manipulation operation not legal on this view! 66/38
Nézettáblák VIEW Nézettábla módosítása: A create parancsot az or replace paranccsal kiegészítve egyszerűen felülírjuk a view létrehozó parancsát Nézettáblák listázása: select * from user_views Nézettábla törlése: DROP VIEW nézettáblanév Az adatok nem törlődnek, hiszen azok az alaptáblákban vannak! DROP VIEW e_vw1 66/39
Nézettáblák VIEW Mire használjuk a nézettáblákat? 66/40 Ha nem akarjuk, hogy egy felhasználó egy (vagy több) tábla teljes tartalmát lássa, készítsünk egy nézettáblát, és arra adjunk neki jogosultságot. Pl. ha kiadjuk a select * from user_tables parancsot, csak a saját tábláinkat látjuk, ugyanis a user_tables tábla egy számunkra leszűrt nézettábla. Egyszerűsíthető velük a munka: Ha több táblából készítünk egy nézettáblát, sokkal egyszerűbb lekérdezni, nem kell az összekapcsolásokkal foglalkozni. Pl. ha készítünk egy nézettáblát a where sysdate-készítés <=7 feltétellel, bármikor kilistázzuk, az elmúlt hét adatai lesznek benne Függetlenítik az alkalmazásokat az alaptábláktól: Ha változik egy alaptábla szerkezete, a belőle készült nézettábla általában változtatás nélkül tovább használható
Indexek Az index a táblához kapcsolódó, gyors keresést lehetővé tevő táblázat. Az index tartalmazza, hogy a tábla rekordjai -egy vagy több oszlop alapján- sorba rendezve hogyan következnek egymás után. Fontos: az index csak egy mutató, amely hivatkozik a táblára. Az indexek szerkezete általában B-fa, ami nagyon gyors keresést tesz lehetővé, a soros, "minden rekordot egymás után megvizsgálunk" kereséshez képest. Az indexek létrehozása jelentősen növeli az adatbázis hatékonyságát, de a méretét is. Egy általános adatbázisban az indexek helyfoglalása körülbelül ugyanakkora, mint az adatoké. 66/41
Indexek Ha egy adathalmaznak nincs indexe (logikai sorrendje), akkor a legrosszabb esetben az összes rekordot be kell olvasni a fizikai tárolóhelyről, miközben keresünk egy konkrét adatok. Ez nagy adatmenynyiségek (> 1000) esetén sok erőforrást igényel, és rendkívül lassú is lehet. Olyan ez, mint amikor egy dobozba bedobáljuk 1000 ember névjegykártyáját, és egyesével kiemelve keressük a vízvezetékszerelő telefonszámát. (idő idő idő ) Ha a dobozban név szerint vannak sorba rendezve a névjegykártyák (elsődleges kulcs!), ez akkor sem könnyíti meg a keresést, ehhez ugyanis tudni kellene az illető nevét. Akkor lehet rendkívül eredményes a keresés, ha egy másik dobozt is létrehozunk, amibe szakmák szerint rendezzük a névjegykártyákat (index), és abban keresünk. Ha vízvezetékszerelőt keresünk, nyilván a rendezett lista végén keresgélünk, és nagyon hamar meg is találjuk a mestert. 66/42
B-fa (bináris keresőfa) Az Oracle általában B-fa szerkezetet használ az indexek tárolására. A B-fa tartományokra osztott adatok rendezett listája 0.. 40 41.. 80... 160..200 Ágak: kereséshez 0.. 10 11.. 17... 32.. 40 41.. 48 49.. 55... 75.. 80 160..172 173..177... 193..200 0,rowid 1,rowid... 10,rowid 11,rowid 12,rowid... 17,rowid Levelek: adatok eléréséhez... 160,rowid 161,rowid... 172,rowid 173,rowid 174,rowid... 177,rowid 66/43
B-fa (bináris keresőfa) A teljes fa egy önkiegyensúlyozó bináris keresőfa, melyet a rendszer az adatok számának, eloszlásának megfelelően, DML műveletek esetén (beszúrás, törlés, módosítás) folyamatosan alakít, karbantart A szintek száma minden csomópont részfáiban megegyezik, így a gyökértől a levelekig eljutni minden esetben ugyanannyi lépésben lehet, vagyis minden adatot ugyanannyi idő alatt lehet megtalálni A szintek száma egyben meghatározza egy adat elérési sebességét Annyi I/O művelet (és logikai vizsgálat) szükséges egy adat betöltéséhez, ahány szint van a keresőfában Ha egy SQL utasítás csak indexelt oszlopokat használ, a rendszer az adatokat közvetlenül az indexekből, és nem a táblából olvassa ki Ha egy utasításban nem indexelt adatok is vannak, akkor azokat a levélben, az indexelt érték mellett lévő rowid (link, egyedi rekord azonosító) alapján olvassa be a rendszer 66/44
B-fa (bináris keresőfa) Ágak: A gyökér olyan információkat tartalmaz, amely alsóbb szintű ágakra mutat, csak keresési funkciót lát el Az ágak szintjeinek a száma az adatok mennyiségétől függ A legutolsó szintű ágak a levelekre mutatnak Levelek: Annyi levél van, ahány indexelt adat Minden levélben van egy index kulcs, és az Oracle-ben rowidnek nevezett link (egyedi rekord azonosító), ami az indexhez tartozó rekordra mutat A leveleket linkek kapcsolják a bal és jobb oldali szomszédaikhoz, megkönnyítve ezzel egy adott sorrendben történő bejárásukat 66/45
Indexek Oracle index típusok: 66/46 Egyoszlopos (single) Lehet Unique, vagy Non-Unique A legtöbbször ezt használjuk Automatikusan létrejön primary key és unique oszlopokra Többoszlopos (concatenated) Több mező alapján jön létre, pl. (vezetéknév, keresztnév) Csak akkor hasznos, ha az oszlopok szerepelnek az utasítás (select, update, delete) where részében Unique: Biztosítja az adatok egyediségét az oszlopban Compute Statistics: a rendszer statisztikát készít az index létrehozásakor, melyet felhasznál a parancsok végrehajtásának optimalizálásához A primary key és az unique megszorítás automatikusan létrehoz egy unique típusú indexet a megadott oszlopra!
Indexek Index létrehozása CREATE [UNIQUE] INDEX indexnév ON táblanév (mezőnév, mezőnév ) [COMPUTE STATISTICS]; Person ID 1 2 3 Name Dp Kis Béla 10 Kő Dezső 11 Hó Jenő 10 CREATE INDEX p_id1 ON Person (Name); CREATE UNIQUE INDEX p_id2 ON Person (Dp, Name); CREATE Table person( ID int primary key, Name char(40) unique,... Automatikusan létrejön index az ID és a Name mezőre! A táblára kiadott insert, delete, update parancsok után automatikusan módosul az index! 66/47
Indexek Adott táblához tartozó indexek listázása: select * from user_indexes where table_name='person' Index törlése DROP INDEX indexnév; DROP INDEX p_id1; 66/48
Szekvenciák (sorozatok) Sequence Tábláktól (objektumoktól) független adatbázis objektum, mely segítségével sorozatokat (egyedi egész számokat) generálhatunk Mindig egész (integer) típusú Több felhasználó is használhatja egyszerre, több táblához is használható egyszerre Általában elsődleges kulcsok értékének előállítására használjuk Létrehozása: 66/49 CREATE SEQUENCE sorozatnév [START WITH m] [INCREMENT BY n] START WITH Kezdőérték INCREMENT BY Növekedés CREATE SEQUENCE sn;
Szekvenciák (sorozatok) Sequence Használata: Aktuális értékét a sorozatnév.currval függvény adja vissza A következő értékét a sorozatnév.nextval függvénnyel lehet lekérdezni insert into person values(sn.nextval,...; Törlése: DROP SEQUENCE sorozatnév 66/50
Szekvenciák (sorozatok) Sequence Speciális lehetőség: értékek generálása ciklusban, alsó- és felső határ között: 66/51 CREATE SEQUENCE snprb start with 10 increment by 3 minvalue 10 maxvalue 20 cycle cache 3; Az eredmények láttán úgy érzem, ez kb. annyira hasznos, mint az egyszer használható, eldobható usb pendrive :-) Az ID-t állította elő a sorozat, a Data-t én adtam meg! 10-ről indul, 3-asával növekszik, 10 és 20 között ciklusban működik, egyszerre 3 értéket állít elő
Nyomkövetési feladat 66/52
Órai feladat (1) Kövesd a parancsokat! CREATE TABLE dolgozo ( nev VARCHAR2(40), kor NUMBER, munkakor VARCHAR2(60) ); dolgozo nev vc2(40) kor N munkakor vc2(60) ALTER TABLE dolgozo ADD szuletesiev NUMBER(4) NOT NULL; Születési év mező hozzáadása, kötelező megadással ALTER TABLE dolgozo DROP COLUMN kor; A kor mező törlése a szerkezetből ALTER TABLE dolgozo ADD szemelyiszam NUMBER(13); Személyiszám mező hozzáadása ALTER TABLE dolgozo MODIFY szemelyiszam PRIMARY KEY; 65/53 Elsődleges kulcs kialakítása a személyiszám mezőből Helytelen adatok esetén nem megoldható!
Órai feladat (2) ALTER TABLE dolgozo DROP PRIMARY KEY; Elsődleges kulcs megszorítás törlése ALTER TABLE dolgozo ADD id NUMBER(4) PRIMARY KEY; ID mező hozzáadása elsődleges kulcsként ALTER TABLE dolgozo RENAME COLUMN munkakor TO mkor; Munkakör nevű mező átnevezése mkor-re ALTER TABLE dolgozo RENAME COLUMN szuletesiev To szulido; Születésiév nevű mező átnevezése szuülidő-re ALTER TABLE dolgozo RENAME COLUMN szemelyiszam TO szemsz; Személyiszám nevű mező átnevezése szemsz-re ALTER TABLE dolgozo MODIFY szulido date; Szülidő mező típusának módosítása dátumra 65/54, Column to be modified must be empty to change datatype! ALTER TABLE dolgozo MODIFY szemsz char(13); Szemsz nevű mező típusának módosítása karakteresre
Órai feladat (2.5) Add meg azt a CREATE parancsot, amivel a fenti parancsok hatására kialakult táblaszerkezetet létre lehet hozni! dolgozo id N(4) nev vc(40) mkor vc(60) szulido D szemsz c(13) create table dolgozo( id number(4) primary key, nev varchar2(40), mkor varchar2(60), szulido date, szemsz char(13) ); 65/55
Órai feladat (3) Kövesd tovább a parancsokat! CREATE TABLE telefonszam ( id NUMBER(4) NOT NULL, mobil char(9) UNIQUE ); telefonszam id mobil N(4) c(9) dolgozo id nev N(4) vc(40) mkor vc(60) szulido D szemsz c(13) ALTER TABLE telefonszam ADD FOREIGN KEY(id) REFERENCES dolgozo(id); 65/56
Órai feladat (4) Kövesd tovább a parancsokat! CREATE TABLE fonok ( ); fonokid NUMBER(4), idkinek NUMBER(4), PRIMARY KEY (fonokid, idkinek), fonok fonokid N(4) idkinek N(4) CONSTRAINT c1 FOREIGN KEY (fonokid) REFERENCES dolgozo(id), CONSTRAINT c2 FOREIGN KEY (idkinek) REFERENCES dolgozo(id) Rajzold meg mindhárom tábla relációs modelljét a köztük lévő kapcsolatokkal együtt! 66/57
Órai feladat (4.5) Rajzold meg mindhárom tábla relációs modelljét a köztük lévő kapcsolatokkal együtt! dolgozo id nev N(4) vc(40) mkor vc(60) szulido D szemsz c(13) telefonszam id mobil N(4) c(9) fonok fonokid N(4) idkinek N(4) 66/58
Egyéni feladat B 66/59 IT MAN
Egyéni feladat (1) Készítsen egy táblát: Neve legyen Melós, Legyen benne MID numerikus mező, max. 4 számjeggyel, Legyen benne Név mező, 30 karakterrel. Készítse el a következő módosításokat: MID legyen elsődleges kulcs Szúrjon be egy Születés nevű, dátum típusú mezőt A Név alapértéke legyen Kiss Robi A Születés ne lehessen üres A Születés alapértéke legyen 1990.01.01 66/60
Egyéni feladat (1) Melos tábla elkészítése create table melos( mid number(4), nev varchar2(30) ); MID legyen elsődleges kulcs alter table melos modify mid primary key Szúrjon be egy Születés nevű, dátum típusú mezőt alter table melos add szuletes date A Név alapértéke legyen Kiss Robi alter table melos modify (nev default 'Kiss Robi') 66/61
Egyéni feladat (1) A Születés ne lehessen üres alter table melos add constraint szul_nn check (szuletes is not null); A Születés alapértéke legyen 1990.01.01 select sysdate from dual -> 10/30/2018 alter table melos modify (szuletes default '01/01/1990') 66/62
Egyéni feladat (2) Készítsen egy másik táblát: Neve legyen Munkakör Legyen MAZ nevű, numerikus mezője, max. 4 számjeggyel Legyen MkNév nevű mezője, max. 30 karakter Készítse el a következő módosításokat: MAZ legyen elsődleges kulcs MkNév ne lehessen üres Szúrjon be egy Kereset nevű numerikus mezőt (7 számjegy!) Szúrjon be egy ellenőrzést, a Kereset ne lehessen 200-nál kevesebb! 66/63
Egyéni feladat (2) Munkakör tábla elkészítése create table munkakor( maz number(4), mknev varchar2(30) ); MAZ legyen elsődleges kulcs alter table munkakor modify maz primary key MkNév ne lehessen üres alter table munkakor add constraint mknev_nn check (mknev is not null); 66/64
Egyéni feladat (2) Szúrjon be egy Kereset nevű numerikus mezőt (7 számjegy!) alter table munkakor add kereset number(7) Szúrjon be egy ellenőrzést, a Kereset ne lehessen 200-nál kevesebb! alter table munkakor add constraint ker_ch check (kereset > 200); 66/65
Egyéni feladat (3) Készítse el a következő módosításokat: Szúrjon be egy Mkör nevű numerikus mezőt a Melós táblába, (4 számjegy) Az Mkör mezőből készítsen idegen kulcsmezőt, mely a Munkakör táblával tartja a kapcsolatot! Írassa ki a táblák szerkezetét, ellenőrizze a megoldást! Törölje le a két táblát! 66/66
Egyéni feladat (3) Szúrjon be egy Mkör nevű numerikus mezőt a Melós táblába, (4 számjegy) alter table melos add mkor number(4) Az Mkör mezőből készítsen idegen kulcsmezőt, mely a Munkakör táblával tartja a kapcsolatot! alter table melos add constraint melos_fk foreign key (mkor) references munkakor(maz) Írassa ki a táblák szerkezetét desc melos; desc munkakor; Írassa ki az összes megszorítást, megkötést select * from all_constraints where table_name='melos' 66/67
Egyéni feladat (3) Törölje le a két táblát drop table melos drop table munkakor 66/68
Csá! 66/69
VÉGE VÉGE 66/70