Upload
hoangxuyen
View
229
Download
2
Embed Size (px)
Citation preview
Adatbáziskezelés - SQL
Forrás: dr. Kovács László: Adatbázisok tervezésének és kezelésének módszertana
Computerbooks 2004www.mysql.com
Miért fontos az adatbáziskezelés a kontrollernek?
• Bonyolultabb kapcsolatú és/vagy nagyobb adattömeg nem kezelhető az Excellel
• Vállalati alapadatok számítógépes rendszerekben adatbázisokban vannak tárolva
• Grafikus kezelőfelületek nem mindig teszik lehetővé az igények szerinti lekérdezést
• Gyorsan kell az adat, nem lehet várni az informatikusra
SQL jellemzői• SQL – (structured english query language)• struktúrált – kötött szintakszis• angol – az utasításai angol nyelvűek• (nemcsak) lekérdező nyelv
• kevés parancs• nincsenek vezérlő elemek• nincs input-, output kezelés• nincs grafikus kezelőfelület
Miért SQL?
• Minden jelentősebb RDMS ezt használja (MS Sql, Oracle, PostgreSqL, MySQL)
• Aki nem ezt használja, az is megérti (MS Foxpro, MSAccess)
• SQL szabvány (’92), helyi nyelvek kiegészítik
Miért MySQL?• Ingyenes, letölthető www.mysql.com –ról• Majdnem mindent tud, amit a „nagyok”
– tranzakciókezelés– tárolt eljárások– triggerek– van hozzá saját OLAP (MAXDB)
• A WEB alkalmazások uralkodó adatbázisa (a webkiszolgálók 60%-a Unix/Linux – Apache –Php – MySql architektúrájú)
• PC-n is jól fut, de skálázási problémák• gyors
SQL utasításai• Adatdefiníciós
– CREATE – létrehoz– DROP – megszüntet– ALTER – módosítás
• Adatkezelő– INSERT – beszúr– DELETE – törlés– UPDATE – módosítás
• Lekérdező– SELECT – kiválaszt
• Adatvezérlő– GRANT/REVOKE – jogot ad/elvon– COMMIT/ROLLLBACK – jóváhagy/visszagörget
Mivel fogunk foglalkozni?
• Adatbázis-tervezés– Követelményanalízis– Adatmodell alkotás (EER)– Relációs adatbázis kialakítása (UML)
• Adatbázis-lekérdezés– SELECT mezőnév, kifejezés FROM táblanév
WHERE szűrőfeltétel [GROUP BY csoportosítás [ASC | DESC]], [HAVING alszűrés] [ORDER BY sorbarendez]
Adatbázis-tervezés -Követelményanalízis
• Célunk egy logisztikai raktárbázis nyilvántartásának elkészítése, amely a következőket tudja:– le tudjuk kérdezni belőle minden cikkfajta
darabszámát, az egyes cikkek jellemzőit (darab/egységcsomag, térfogat, kezelés)
– az egyes egységcsomagok raktáron belüli helyét (a raktáron belül 8 terem van), beérkezési idejét, a bekerülési nettó egységárát, áfa kulcsát
– az egyes termek specialitásait (3 hűtőház, 2 teremnek csak teteje van)
Adatmodell tervezés 1.(EER modell részei)
• Egyed: a külvilág többi részétől egyértelműen megkülönböztethető dolog– Normál egyed: rendelkezik olyan tulajdonsággal,
amely egyértelműen azonosítja
Jele:
– Gyenge egyed: más egyedhez fűződő kapcsolata szükséges az azonosításához
Jele:
• Tulajdonság: egyed jellemzője– egyszerű tulajdonság
– összetett tulajdonság
– kulcs tulajdonság
– többértékű tulajdonság
– leszármaztatott tulajdonság
Adatmodell tervezés 1.(EER modell részei)
kulcs
Adatmodell tervezés 3.(EER modell részei)
• Kapcsolat: egyedek közötti viszony– 1:1 kapcsolat
– 1:N kapcsolat
– N:M kapcsolat
– N-ed fokú kapcsolat
• Tartalmazás: egyik egyed minden előfordulása tartalmazza a másik egyed előfordulását
• Specializáció: Ha A minden tulajdonsága megvan B-ben és A előfordulásai közébeletartoznak B előfordulásai is
Adatmodell tervezés 4.(EER modell részei)
is_a
has_a
Irányvonal EER alkotáshoz
• Egyed – meghatározó dolog (főnév)• Kapcsolat – egyedek között fellépő reláció
(ige) • Tulajdonság – meghatározó dolog
valamilyen jellemzője (melléknév, birtoka az egyednek)
Kiépítés sorrendje
1. Egyedek meghatározása2. Egyedek közötti kapcsolatok3. Kulcstulajdonság 4. Egyéb tulajdonság
Raktári nyilvántartás EER modellje
cikkfajta
cikk_id
cikknev
térfogat
cikkcsoport
cikkcsop_id
nev
egységcsomag
cikke
egység_id darabmin/max készlet
nettó egységár
ÁFA kulcsegységcsomagja
érk_dátum
romlott
zárolt
terem
terem_id
teremnév
max helyszabad_hely
hol van?
sor_id
oszlop_id
hol lehet
igen/nem
leiras
Relációs adatmodell részei• Adatbázis – egymással kapcsolatban lévő,
integrált relációk rendszere – relációk összekapcsolása kulcstulajdonságok alapján
• Reláció – azonos szerkezetű rekord előfordulások névvel ellátott halmaza
• Rekord – logikailag összetartozó mezők összessége
• Mező – elemi adattárolási egység• Domain – mező által felvehető értékek halmaza
Konvertálás elvei
• Teljesség
• Integritás
• Konzisztencia
• Redundancia elkerülése
• Könnyű karbantartás
EER modell konvertálása relációs adatmodellé I.
EgyedEgyszerű tulajdonságÖsszetett tulajdonságLeszármaztatott tul.Kulcstulajdonság
Gyenge egyedTöbbértékű tulajdonság
Reláció (tábla)MezőTöbb mezőIntegritás megőrzés Indexelt mező (elsődleges
kulcs, idegen kulcs)Külön reláció, aminek
elsődleges kulcsa idegen kulcs
EER modell konvertálása relációs adatmodellé II.
• 1:1 kapcsolat• 1:N kapcsolat• N:M kapcsolat• N-ed fokú kapcsolat• Tartalmazás /
Specializáció
Elsődleges, idegen kulcsElsődleges, idegen kulcsÚj reláció két idegen kulccsal Új reláció N idegen kulccsal Elsődleges, idegen kulcs
Példa I.CIKKCSOPORT
LeirasNevCikkcsoport_id
CIKKFAJTAMin_keszlet Max_keszlet Cikkcsoport_idCikknevCikk_id
Elsődleges kulcs
Idegen kulcs
Példa II.CIKKCSOPORT
LeirasNevCikkcsoport_id
TeremMax_hely Szabad_helyTeremnevTerem_id
ElhelyezLehetTerem_idCikkcsoport_id
Adatbázis létrehozása, belépés
• CREATE DATABASE <adatbázisnév>;• CREATE DATABASE raktar;
• USE <adatbázisnév>;• USE raktar;
Táblák létrehozása• CREATE TABLE <táblázatnév> (<mezőnév1>
<típusnév> <integritási feltétel, <mezőnév2> <típusnév> <integritási feltétel….);
• CREATE TABLE cikkfajta (cikk_id int unsignednot null auto_increment, cikknev varchar(45) notnull, min_keszlet int(20) unsigned, max_keszletint(30) unsigned, PRIMARY KEY (cikk_id, cikkcsoport_id), FOREIGN KEY (cikkcsoport_id) REFERENCES cikkcsoport);
Mezőtípusok• Numerikus típusok
– Egészek (Bit, tinyint, smallint, mediumint, int, integer, bigint)
– Lebegőpontos (float, decimal, double)• Dátum típusok
– Dátum (date, datetime)– Időpecsét (timestamp)
• Szöveg típusok– Rögzített hosszú (char, blob)– Változó hosszú (varchar, varblob)
• Felhasználó által definiált értékkészletű– Csak egy értéke lehet ENUM(„érték1”, „érték2”…)– Több lehetséges értéke lehet („érték1”, „érték2”…)
Leggyakoribb integritási feltételek
• UNSIGNED – előjel nélküli• NOT NULL – mezőt mindig kötelező kitölteni• DEFAULT <érték> - alapértelmezett érték• AUTO_INCREMENT – új rekord beszúrásakor
növeli az értéket (azonosító)• UNIQUE – minden mezőértéknek különbözőnek
kell lennie• CHECK <kifejezés> - ellenőrizze, hogy teljesül-e
a beírt értékekre• PRIMARY KEY (<mezőnév>) – elsődleges kulcs• FOREIGN KEY (<mezőnév>) REFERENCES
<táblanév> - idegen kulcs
MySQL installálása• Mysql zip fájl kitömörítése a
munkakönyvtárba• My.ini fájl betöltése a
c:\windows\system32 alkönyvtárba és beállítások módosítása
• DOS prompt behívása és a következőparancs kiadása
cd\mysql\binmysqld ––console• Gép újraindítása
Indító batch fájl szerkesztése
cd\mysql\binmysqld –-removemysqld --installnet start mysqlmysql –u root
Jogosultság megadása/megvonása/jelszóváltás
• Rendszergazda neve: root
• Jogosultság megadásaGRANT <művelet> ON <táblanév> TO <felhasználó> [IDENTIFIED BY
<jelszó>] [WITH GRANT OPTION];
• Jogosultság megvonásaREVOKE <művelet> ON <táblanév> FROM <felhasználó>;
• Jelszó módosításaSET PASSWORD ‘<felhasználónév>’@’<hosztnév>’ =
PASSWORD(‘<új jelszó>’);
• Változások jóváhagyásaFLUSH PRIVILEGES;
Fontosabb műveletek
• All – mindenre megvan a joga• Create – táblát készíthet• Insert – táblába adatokat felvihet• Update – adatokat táblában módosíthat• Drop – táblát törölhet• Delete – adatokat törölhet táblából• Select – lekérdezhet adatokat• File – fájlból betölthet, fájlba írhat adatot
Táblák adatokkal való feltöltése• Közvetlen SQL paranccsalINSERT INTO <táblanév> VALUES (<mezőérték1>,
<mezőérték2>, ….);• Batch fájl alkalmazásávalPrompt> mysql –h <hosztnév> -u <usernév> -p <jelszó> <
<batchfájlnév.sql>• Külső adatok importálásával
– ODBC kapcsolat (más adatbázisból)– Szövegfájlból
LOAD DATA LOCAL INFILE ‘<fájlnév elérési úttal>’ INTO TABLE <táblanév> TERMINATED BY ‘<rekord vége jel>’;
Adatbázis lekérdezés
• Egy parancsot kell kiadni angol nyelven• A parancsot pontosvesszővel kell lezárni• Az eredmény szöveges fájlba át lehet
irányítani• Több tábla adataiból is lehet adatokat
lekérdezni• Gyakran előforduló lekérdezéseket el lehet
tárolni (SQL script, VIEW, SNAPSHOT)
Lekérdezés szintaktikája (leglényegesebb elemek)
SELECT - lekérdező parancs[ALL | DISTINCT | DISTINCTROW ] - mindet/csak különböző mezőket/sorokat<mezőnevek> [INTO OUTFILE <fájlnév> ] - lekérdezést fájlba menthetiFROM <táblanév(ek)> - táblanév vagy nevek[WHERE <szűrőfeltételek] [GROUP BY <mezőnév [ASC | DESC] - csoportosítva mezőértékek szerint [HAVING <csoportosítás szűrőfeltétele>] [ORDER BY <mezőnév> [ASC | DESC] , ...] - mezőnév szerint sorrendbe rak[LIMIT <mettől>, <mennyit>] - hány darabot mutasson
Logikai kifejezések<felt1> AND <felt2> – és, mindkét feltétel teljesül<felt1> OR <felt2> – egyik vagy mindkettő feltétel teljesülNOT <felt> - feltétel nem teljesül<mező>=<kifejezés> - mező egyenlő kifejezéssel<mező>><kifejezés> - mező nagyobb, mint a kifejezés<mező><<kifejezés> - mező kisebb, mint a kifejezés<mező>>=<kifejezés> - mező nagyobb, vagy egyenlő, mint a kifejezés<mező><=<kifejezés> - mező kisebb, vagy egyenlő, mint a kifejezés<mező> BETWEEN <érték1> AND <érték2> - mező értéke a két érték
között (2 érték benne van)<mező> IN (<érték1>, [<érték2>], [<érték3>]) – mező értéke a felsorolt
értékek valamelyikével megegyezik<mező> LIKE ‘<minta>’ – mező értékében benne van-e az adott minta
% - tetszőleges karaktersorozatot helyettesít a mintában_ - egyetlenegy karaktert helyettesít a mintában^ - escape szekvenciapl. ‘%fűrdő^_’ – illeszkedik az összes olyan mintára, aminek a vége fűrdő_.
<mező> IS NULL – mező értéke üres
Lekérdezésre példák (alapadatbázis)
SZALLITOKHazszamUtcaszallito_id TelefonVarosSzallito_nev
CIKKFAJTAMin_keszlet
Max_keszlet
Tipus (alapanyag, segedanyagkarb.anyag, felkesztermek, kesztermek)
Cikknevcikk_id
ARAKEgyseg_darab
Afa_kulcs
szallito_id Teljes_netto_ar
Nettó_egyseg_ar
Cikk_id
Fontosabb lekérdezési műveletek
• Szelekció – bizonyos rekordokat keresünk• Projekció – bizonyos mezőket keresünk• Kiterjesztés – mezők kapcsolatából új
mező születik• Aggregáció – műveletek (általában
csoportképzés alapján)• Join – több tábla egyesítése
Műveletek általános sorrendje
1. Elemi (adott táblára vonatkozó) szelekció2. Descartes szorzat képzése3. Összetett szelekció4. Csoportképzés5. Aggregáció6. Sorba rendezés7. Projekció
Feladatok (1)• Listázzuk ki a szallito táblát!SELECT * FROM szallito;• Listázzuk ki a szállítók nevét és városát!SELECT szallito_nev, varos FROM szallito;• Listázzuk ki azokat a termékek nevét, és azonosítóját, ahol a
minimális készlet nagyobb, mint 1000 darab!SELECT cikk_id, cikknev FROM szallito WHERE min_keszlet >
100;• Rakjuk maximális készletszint szerint növekvő sorrendbe a
cikkfajtákat és listázzuk ki a nevüket!SELECT cikknev FROM szallito ORDER BY max_keszlet ASC;
Feladatok (2)• Listázzuk ki csökkenő sorrend szerint a 8-as cikk nettó
egységárait és szállítói azonosítóit!SELECT szallito_id, nettó_egyseg_ar FROM arak WHERE
nettó_egyseg_ar = 8 ORDER BY nettó_egyseg_arDESC;
• Listázzuk ki a félkész és késztermékeink nevét!SELECT cikknev FROM cikkfajta WHERE tipus LIKE
‘%termek%’;• Listázzuk ki az M betűvel kezdődő városban lakó
szállítók nevét, címét és telefonszámát!SELECT szallito_nev, varos, utca, hazszam, telefon FROM
szallito WHERE varos LIKE 'm%';
Feladatok(3)• Listázzuk ki a legkedvezőbb ajánlatot adó szállítók
azonosítóját, a cikkazonosítót és az árajánlatot termékenként!
SELECT szallito_id, cikk_id, MIN(nettó_egyseg_ar) FROM arak GROUP BY cikk_id;
• Listázzuk ki a cikkek átlagárát és a cikkazonosítót cikkenként!
SELECT AVG(nettó_egyseg_ar), cikk_id FROM arakGROUP BY cikk_id;
• Listázzuk ki azon cikkek azonosítóját, ahol háromnál kevesebb ajánlatunk van!
SELECT cikk_id FROM arak GROUP BY cikk_id HAVING COUNT(*)<3;
Feladatok(4)• Listázzuk ki a legkedvezőbb ajánlatot adó szállítók nevét,
a cikkek nevét és az árajánlatot termékenként!SELECT szallito.szallito_nev, cikkfajta.cikknev,
MIN(arak.netto_egyseg_ar) FROM szallito, cikkfajta, arakWHERE arak.szallito_id=szallito.szallito_id AND arak.cikk_id=cikkfajta.cikk_id GROUP BY arak.cikk_id;
• Listázzuk ki azon cikkek nevét, ahol háromnál kevesebb ajánlatunk van!
SELECT cikkfajta.cikknev FROM cikkfajta, arak WHERE arak.cikk_id=cikkfajta.cikk_id GROUP BY arak.cikk_idHAVING COUNT(*)<3;
Feladatok (5)• Listázzuk ki azon cikkek nevét, ahol háromnál kevesebb
ajánlatunk van, továbbá az ajánlatok számát egy Excel által is olvasható szövegfájlba!
SELECT cikkfajta.cikknev, count(*) FROM cikkfajta, arakWHERE arak.cikk_id=cikkfajta.cikk_id GROUP BY arak.cikk_id HAVING COUNT(*)<3 INTO OUTFILE ‘c:/mysql/kimenet.txt’ FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';