Adatbáziskezelés - SQL Forrás: dr. Kovács László: Adatbázisok tervezésének és kezelésének módszertana Computerbooks 2004 www.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:
Adatmodell tervezés 1. (EER modell részei) Tulajdonság: egyed jellemzője egyszerű tulajdonság összetett tulajdonság kulcs tulajdonság kulcs többértékű tulajdonság leszármaztatott tulajdonság
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
Adatmodell tervezés 4. (EER modell részei) Tartalmazás: egyik egyed minden előfordulása tartalmazza a másik egyed előfordulását has_a Specializáció: Ha A minden tulajdonsága megvan B-ben és A előfordulásai közé beletartoznak B előfordulásai is is_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ása 2. Egyedek közötti kapcsolatok 3. Kulcstulajdonság 4. Egyéb tulajdonság
Raktári nyilvántartás EER modellje cikknev min/max készlet egység_id darab nettó egységár cikk_id romlott cikkfajta egységcsomagja egységcsomag ÁFA kulcs leiras térfogat érk_dátum cikke zárolt cikkcsop_id sor_id hol van? oszlop_id cikkcsoport terem_id nev hol lehet terem teremnév igen/nem szabad_hely max hely
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. Egyed Egyszerű tulajdonság Összetett tulajdonság Leszármaztatott tul. Kulcstulajdonság Gyenge egyed Tö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 kulcs Elsődleges, idegen kulcs Új reláció két idegen kulccsal Új reláció N idegen kulccsal Elsődleges, idegen kulcs
Példa I. CIKKCSOPORT Cikkcsoport_id Elsődleges kulcs Nev Leiras CIKKFAJTA Cikk_id Cikknev Idegen kulcs Min_keszlet Max_keszlet Cikkcsoport_id
Példa II. CIKKCSOPORT Cikkcsoport_id Nev Leiras Terem Terem_id Teremnev Max_hely Szabad_hely Elhelyez Cikkcsoport_id Terem_id Lehet
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 unsigned not null auto_increment, cikknev varchar(45) not null, min_keszlet int(20) unsigned, max_keszlet int(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\bin mysqld console Gép újraindítása
Indító batch fájl szerkesztése cd\mysql\bin mysqld -remove mysqld --install net start mysql mysql u root
Jogosultság megadása/megvonása/jelszóváltás Rendszergazda neve: root Jogosultság megadása GRANT <művelet> ON <táblanév> TO <felhasználó> [IDENTIFIED BY <jelszó>] [WITH GRANT OPTION]; Jogosultság megvonása REVOKE <művelet> ON <táblanév> FROM <felhasználó>; Jelszó módosítása SET PASSWORD <felhasználónév> @ <hosztnév> = PASSWORD( <új jelszó> ); Változások jóváhagyása FLUSH 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 paranccsal INSERT INTO <táblanév> VALUES (<mezőérték1>, <mezőérték2>,.); Batch fájl alkalmazásával Prompt> 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 mentheti FROM <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ül NOT <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 szekvencia pl. %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) SZALLITOK szallito_id Szallito_nev Varos Utca Hazszam Telefon CIKKFAJTA cikk_id Cikknev Min_ keszl et Max_ keszle t Tipus (alapanyag, segedanyag karb.anyag, felkesztermek, kesztermek) ARAK szallito_id Cikk_id Nettó_ egyseg _ar Afa_ kulcs Egyseg_d arab Teljes_netto_ ar
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ése 3. Összetett szelekció 4. Csoportképzés 5. Aggregáció 6. Sorba rendezés 7. 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_ar DESC; 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 arak GROUP 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, arak WHERE 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_id HAVING 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, arak WHERE 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';