41
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

Adatbáziskezelés - SQL

Embed Size (px)

Citation preview

Page 1: Adatbáziskezelés - SQL

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

Page 2: Adatbáziskezelés - SQL

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

Page 3: Adatbáziskezelés - SQL

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

Page 4: Adatbáziskezelés - SQL

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

Page 5: Adatbáziskezelés - SQL

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

Page 6: Adatbáziskezelés - SQL

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

Page 7: Adatbáziskezelés - SQL

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]

Page 8: Adatbáziskezelés - SQL

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)

Page 9: Adatbáziskezelés - SQL

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:

Page 10: Adatbáziskezelés - SQL

• 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

Page 11: Adatbáziskezelés - SQL

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

Page 12: Adatbáziskezelés - SQL

• 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

Page 13: Adatbáziskezelés - SQL

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)

Page 14: Adatbáziskezelés - SQL

Kiépítés sorrendje

1. Egyedek meghatározása2. Egyedek közötti kapcsolatok3. Kulcstulajdonság 4. Egyéb tulajdonság

Page 15: Adatbáziskezelés - SQL

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

Page 16: Adatbáziskezelés - SQL

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

Page 17: Adatbáziskezelés - SQL

Konvertálás elvei

• Teljesség

• Integritás

• Konzisztencia

• Redundancia elkerülése

• Könnyű karbantartás

Page 18: Adatbáziskezelés - SQL

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

Page 19: Adatbáziskezelés - SQL

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

Page 20: Adatbáziskezelés - SQL

Példa I.CIKKCSOPORT

LeirasNevCikkcsoport_id

CIKKFAJTAMin_keszlet Max_keszlet Cikkcsoport_idCikknevCikk_id

Elsődleges kulcs

Idegen kulcs

Page 21: Adatbáziskezelés - SQL

Példa II.CIKKCSOPORT

LeirasNevCikkcsoport_id

TeremMax_hely Szabad_helyTeremnevTerem_id

ElhelyezLehetTerem_idCikkcsoport_id

Page 22: Adatbáziskezelés - SQL

Adatbázis létrehozása, belépés

• CREATE DATABASE <adatbázisnév>;• CREATE DATABASE raktar;

• USE <adatbázisnév>;• USE raktar;

Page 23: Adatbáziskezelés - SQL

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);

Page 24: Adatbáziskezelés - SQL

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”…)

Page 25: Adatbáziskezelés - SQL

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

Page 26: Adatbáziskezelés - SQL

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

Page 27: Adatbáziskezelés - SQL

Indító batch fájl szerkesztése

cd\mysql\binmysqld –-removemysqld --installnet start mysqlmysql –u root

Page 28: Adatbáziskezelés - SQL

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;

Page 29: Adatbáziskezelés - SQL

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

Page 30: Adatbáziskezelés - SQL

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>’;

Page 31: Adatbáziskezelés - SQL

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)

Page 32: Adatbáziskezelés - SQL

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

Page 33: Adatbáziskezelés - SQL

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

Page 34: Adatbáziskezelés - SQL

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

Page 35: Adatbáziskezelés - SQL

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

Page 36: Adatbáziskezelés - SQL

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ó

Page 37: Adatbáziskezelés - SQL

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;

Page 38: Adatbáziskezelés - SQL

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%';

Page 39: Adatbáziskezelés - SQL

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;

Page 40: Adatbáziskezelés - SQL

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;

Page 41: Adatbáziskezelés - SQL

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';