20
Adatbáziso Adatbáziso k k / / SQL SQL v 2.1 v 2.1 Viczián Gergely Viczián Gergely (eredeti: Török János (eredeti: Török János 2004) 2004)

Adatbázisok / SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

  • Upload
    afric

  • View
    31

  • Download
    0

Embed Size (px)

DESCRIPTION

Adatbázisok / SQL v 2.1 Viczián Gergely (eredeti: Török János 2004). Útiterv az első 45 percre. Egy kis adatbázis történelem Relációs Adatbázis-kezelők Mi az SQL? SQL alapjai parancsok lekérdezés lekérdezési terv variációk (Lotus, Access) Közkívánatra: XML Adatbiztonság. - PowerPoint PPT Presentation

Citation preview

Page 1: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

AdatbázisokAdatbázisok/ / SQLSQL v 2.1v 2.1

Viczián GergelyViczián Gergely

(eredeti: Török János 2004)(eredeti: Török János 2004)

Page 2: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

Útiterv az első 45 percreÚtiterv az első 45 percre Egy kis adatbázis történelemEgy kis adatbázis történelem Relációs Adatbázis-kezelőkRelációs Adatbázis-kezelők Mi az SQL?Mi az SQL? SQL alapjaiSQL alapjai

parancsokparancsok lekérdezés lekérdezés lekérdezési tervlekérdezési terv variációk (Lotus, Access)variációk (Lotus, Access)

Közkívánatra: XMLKözkívánatra: XML AdatbiztonságAdatbiztonság

Page 3: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

Az adatbázisok történeteAz adatbázisok története

„„data base” 1963 (~data bank)data base” 1963 (~data bank) Charles Bachman – szekv. feldolg. felváltásaCharles Bachman – szekv. feldolg. felváltása 19719700 E. F. Codd 12 szabálya relációs model E. F. Codd 12 szabálya relációs model 1978 CP/M 1978 CP/M →MsDOS→MsDOS (Vulcan (Vulcan →→ dBASE) dBASE) 1979 Oracle 2 (RDBMS)1979 Oracle 2 (RDBMS) 1981 Tate és Lashlee dBASE-II PC assembly1981 Tate és Lashlee dBASE-II PC assembly 1984 dBASE-III (89 / 92 / 99 modosítások)1984 dBASE-III (89 / 92 / 99 modosítások) 1986 SQL ANSI és ISO szabvány lesz1986 SQL ANSI és ISO szabvány lesz XML ~ adatbázisXML ~ adatbázis

Page 4: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

Relációs adatbáziskezelők Relációs adatbáziskezelők „RDBMS”„RDBMS”

Edgar Frank „Tedd” Codd szabályai Edgar Frank „Tedd” Codd szabályai 00.. Reláció kizárólag csak kezelésreReláció kizárólag csak kezelésre1.1. Az egységes megjelenésű információ szabálya Az egységes megjelenésű információ szabálya (tábla)(tábla)2.2. Garantált lokalizálhatóság szabálya Garantált lokalizálhatóság szabálya (tábla, oszlop, sor/kulcs)(tábla, oszlop, sor/kulcs)3.3. A NULL értékek egységes kezelése A NULL értékek egységes kezelése (mező lehessen "üres")(mező lehessen "üres")4.4. Dinamikus szerkezetleírás Dinamikus szerkezetleírás (maga a séma is adatbázis)(maga a séma is adatbázis)5.5. A teljeskörű „adatnyelv” szabálya A teljeskörű „adatnyelv” szabálya (lineáris, interaktív, adat: SQL)(lineáris, interaktív, adat: SQL)6.6. A nézetek frissítésének szabálya A nézetek frissítésének szabálya (valósidejű manipulálás: nincs)(valósidejű manipulálás: nincs)7.7. Magas szintű beszúrás, frissítés és törlés Magas szintű beszúrás, frissítés és törlés (sok adat egyidejűleg)(sok adat egyidejűleg)8.8. Fizikai szintű adatfüggetlenségFizikai szintű adatfüggetlenség9.9. Logikai szintű adatfüggetlenség Logikai szintű adatfüggetlenség (nehéz megvalósítani)(nehéz megvalósítani)10.10.Jóság (integritás) függetlenség Jóság (integritás) függetlenség (adatkorlát, jóság kezelése)(adatkorlát, jóság kezelése)11.11.Elosztástól való függetlenség Elosztástól való függetlenség (változások, lekérdezések)(változások, lekérdezések)12.12.Megkerülhetetlenség szabálya Megkerülhetetlenség szabálya (alacsony szintű megkerülés)(alacsony szintű megkerülés)

Page 5: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

dBASEdBASE

USE bertabla USE bertabla REPLACE ALL fizetes WITH fizetes * 1.1 FOR vezeto > 0 REPLACE ALL fizetes WITH fizetes * 1.1 FOR vezeto > 0 LIST ALL nev, beosztas, fizetes TO PRINT LIST ALL nev, beosztas, fizetes TO PRINT

Page 6: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

Relációs adatbázisRelációs adatbázis Relációs adatmodell (Codd szabályok) Relációs adatmodell (Codd szabályok)

alapján létrehozott adatbázisalapján létrehozott adatbázisrészei:részei:

Felhasználók, jogosultsági rendszerekFelhasználók, jogosultsági rendszerek TáblákTáblák NézetekNézetek Indexek Indexek (bináris fa)(bináris fa) MegszorításokMegszorítások Eljárások, függvényekEljárások, függvények TriggerekTriggerek

Azonos szerkezetű rekordok:

•táblázat•minden oszlop rögzített

típusú•alap, vagy null érték

Automatikus programok•változások véglegesítése•üres mezők kitöltése•integritás biztosítása•indexek létrehozása

dialektus, más programnyelv

Page 7: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

SQLSQL Structured Query LanguageStructured Query Language Általános leíró nyelv adatbázis elérésére, Általános leíró nyelv adatbázis elérésére,

módosításáramódosítására Relációs adatbázis kezelők elterjedt nyelveRelációs adatbázis kezelők elterjedt nyelve ANSI szabvány…ANSI szabvány… Sokféle programtámogatás:Sokféle programtámogatás:

Visual Basic (MsSQL)Visual Basic (MsSQL) JavaJava PL/SQLPL/SQL ACCESSACCESS php (MySQL)php (MySQL) A dBASE nem SQL!

Page 8: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

Az SQL alapjai 1.Az SQL alapjai 1. LekérdezésLekérdezés

(CREATE VIEW)(CREATE VIEW) SELECT SELECT

AdatmanipulációAdatmanipuláció UPDATEUPDATE DELETEDELETE INSERT INTOINSERT INTO

AdatleírásAdatleírás CREATE TABLECREATE TABLE ALTER TABLEALTER TABLE DROP TABLEDROP TABLE CREATE INDEXCREATE INDEX DROP INDEXDROP INDEX

Az olvashatóság miatt írjuk nagybetűvel a parancsokat

COMMIT/ROLLBACK

Page 9: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

AZ SQL alapjai 2.AZ SQL alapjai 2. LekérdezésLekérdezésSELECTSELECT [ [any/distinct any/distinct all/distinct/top/distinctrowall/distinct/top/distinctrow] ] { { oszlopokoszlopok } }

[[ASAS alias1, alias2,…] alias1, alias2,…]

FROMFROM táblakifejezés táblakifejezés [,…] [[,…] [ININ külső adatbáziskülső adatbázis]]

[INNER/LEFT/RIGHT JOIN …][INNER/LEFT/RIGHT JOIN …]

[[WHEREWHERE ….] ….]

[[GROUP BYGROUP BY …] …]

[[HAVINGHAVING…]…]

[[ORDER BYORDER BY…]…]

[[WITH OWNERACCESS OPTIONWITH OWNERACCESS OPTION]]

nincs/van ismétlődés

van/nincs ismétlődés/első n/nincs dupla sor

Amire kíváncsiakvagyunk

Megjelenített táblázatfejléccíme

Lehet az oszlopok utánis írni

Táblázat/okCsak ACCESS, avizuális összekapcsolásmiattSzűrési feltétel

Csoportosítás (összeg, átlag)

Csoportosítás utániszűrési feltételAz eredmény rendezését

adja meg

Page 10: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

PéldaPélda

SELECTSELECT Fokonyv_2K4.Sorsz, Fokonyv_2K4.Sorsz, Fokonyv_2K4.Datum, Fokonyv_2K4.Fokonyv_2K4.Datum, Fokonyv_2K4.[Brutto(Tart)], Fokonyv_2K4.[Brutto(Kov)], [Brutto(Tart)], Fokonyv_2K4.[Brutto(Kov)], Fokonyv_2K4.[KP/Bank], Fokonyv_2K4.[KP/Bank],

[Brutto(Tart)]-[Brutto(Kov)] AS akt[Brutto(Tart)]-[Brutto(Kov)] AS akt

FROMFROM Fokonyv_2K4 Fokonyv_2K4

WHEREWHERE (((Fokonyv_2K4.Datum)<=[vegnap])); (((Fokonyv_2K4.Datum)<=[vegnap]));

Page 11: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

Összetettebb példa Összetettebb példa SELECT SQL_CALC_FOUND_ROWS base.actiroleID AS col0, actiID, SELECT SQL_CALC_FOUND_ROWS base.actiroleID AS col0, actiID,

actiName AS col1, actiState AS col3, wbseID, wbseName AS col4, flowID, actiName AS col1, actiState AS col3, wbseID, wbseName AS col4, flowID, flowName AS col6, actiPriority AS col8, atypAbr AS col9, actiID AS col10, flowName AS col6, actiPriority AS col8, atypAbr AS col9, actiID AS col10, IF(ISNULL(actiRealStart) OR actiRealStart='0000-00-IF(ISNULL(actiRealStart) OR actiRealStart='0000-00-00',actiPlannedStart,actiRealStart) AS col11, actiPlannedEnd AS col12, 00',actiPlannedStart,actiRealStart) AS col11, actiPlannedEnd AS col12, IF(ISNULL(actiPlannedEnd) OR actiPlannedEnd='0000-00-IF(ISNULL(actiPlannedEnd) OR actiPlannedEnd='0000-00-00','',IF((ISNULL(actiRealEnd) OR actiRealEnd='0000-00-00') AND 00','',IF((ISNULL(actiRealEnd) OR actiRealEnd='0000-00-00') AND actiPlannedEnd>=CURRENT_DATE,'',TO_DAYS(IF(ISNULL(actiRealEnd) actiPlannedEnd>=CURRENT_DATE,'',TO_DAYS(IF(ISNULL(actiRealEnd) OR actiRealEnd='0000-00-00',CURRENT_DATE,actiRealEnd))-OR actiRealEnd='0000-00-00',CURRENT_DATE,actiRealEnd))-TO_DAYS(actiPlannedEnd))) AS col13 TO_DAYS(actiPlannedEnd))) AS col13

FROM TQactirole as base FROM TQactirole as base left join TQacti AS acti on (actiID=base.actiroleActiID) left join TQacti AS acti on (actiID=base.actiroleActiID) left join TQwbse AS wbse on (wbseID=actiWbseID) left join TQwbse AS wbse on (wbseID=actiWbseID) left join TQflow AS flow on (wbseFlowID=flowID) left join TQflow AS flow on (wbseFlowID=flowID) left join TQatyp AS atyp on (atypID=actiATypID) left join TQatyp AS atyp on (atypID=actiATypID) WHERE actiWbseID>-1 and (flowFCatID<1 or ISNULL(flowFCatID)) AND WHERE actiWbseID>-1 and (flowFCatID<1 or ISNULL(flowFCatID)) AND

(base.actiroleRoleID IN ('22')) AND (ISNULL(actiPlannedEnd) OR (base.actiroleRoleID IN ('22')) AND (ISNULL(actiPlannedEnd) OR actiPlannedEnd<=CURDATE()+INTERVAL 7 DAY) AND (actiState='3' OR actiPlannedEnd<=CURDATE()+INTERVAL 7 DAY) AND (actiState='3' OR (3=3 AND actiState<>2) OR (3=4 AND actiState<>0)) (3=3 AND actiState<>2) OR (3=4 AND actiState<>0))

GROUP BY actiID GROUP BY actiID ORDER BY col12 asc ORDER BY col12 asc LIMIT 0,30 LIMIT 0,30

Page 12: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

SQL hátrányai...SQL hátrányai...

Nem igazi relációs adatbázis modellNem igazi relációs adatbázis modell A szintaxis komplikáltA szintaxis komplikált Sokszor igen hosszú parancsok születnek, Sokszor igen hosszú parancsok születnek,

amelyek nehezen törhetők darabokraamelyek nehezen törhetők darabokra A különböző implementációk kicsit A különböző implementációk kicsit

eltérnek egymástól (pl. Oracle és Access)eltérnek egymástól (pl. Oracle és Access) Ékezetes problémák bizonyos Ékezetes problémák bizonyos

megvalósításokbanmegvalósításokban

Page 13: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

Lekérdezési tervLekérdezési terv

A keresés végeredményét általában A keresés végeredményét általában tovább analizáljuktovább analizáljuk

Lekérdezési tervLekérdezési terv A kapott halmazt (eredmények különböző A kapott halmazt (eredmények különböző

táblákból) egy táblákból) egy kurzorkurzor segítségével tudjuk segítségével tudjuk tovább olvasnitovább olvasni

Page 14: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)
Page 15: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

Fontosabb különbségekFontosabb különbségek AdattípusokAdattípusok

NUMERIC-NUMBERNUMERIC-NUMBER DATE DATE Oracle-ben dátum és idő is, máshol Oracle-ben dátum és idő is, máshol

csak dátumcsak dátum időnként van nem standard típus isidőnként van nem standard típus is

Gyors keresésnél néha csak pontos találat Gyors keresésnél néha csak pontos találat lehetséges, míg máshol nemlehetséges, míg máshol nem

Helyettesítések Helyettesítések (%(%_ _ (Oracle) (Oracle) *?#[a-z]*?#[a-z](Access)(Access)))

Programozási kiterjesztésekProgramozási kiterjesztések

Page 16: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

ProgramozásProgramozás

Visual Basic for ACCESSVisual Basic for ACCESS

Sub test()Sub test()

Dim s As StringDim s As String

s=s=”SELECT ….””SELECT ….”

DoCmd.RunSQL DoCmd.RunSQL ss

End SubEnd Sub

Flexibilis lekérdezések formokkal!Flexibilis lekérdezések formokkal!

Page 17: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

PHPPHP@ $db = mysql_pconnect('localhost', 'root', '');@ $db = mysql_pconnect('localhost', 'root', '');

if (!$db)if (!$db){{ echo 'Nem konnektál!';echo 'Nem konnektál!';

exit;exit;}}mysql_select_db('gergo');mysql_select_db('gergo');$q = "SELECT tartuser.userid as uid, tartuser.nev, sum( tartitem.osszeg ) $q = "SELECT tartuser.userid as uid, tartuser.nev, sum( tartitem.osszeg )

as ossz , max( tartitem.datum ) as utolso"as ossz , max( tartitem.datum ) as utolso"." FROM tartuser, tartitem"." FROM tartuser, tartitem"." WHERE tartitem.userid = tartuser.userid"." WHERE tartitem.userid = tartuser.userid"." GROUP BY tartitem.userid"." GROUP BY tartitem.userid"." ORDER BY ossz desc";." ORDER BY ossz desc";

$res = mysql_query($q);$res = mysql_query($q);$n = mysql_num_rows($res);$n = mysql_num_rows($res);$ossz=0;$ossz=0;echo '<table border=1>'; echo '<table border=1>';

echo ‘<tr><td>Név</td>';echo ‘<tr><td>Név</td>';echo '<td>Tart</td>';echo '<td>Tart</td>';echo '<td>Utsó</td>'; echo '<td>Utsó</td>'; echo '</tr>';echo '</tr>';

for ($i=0;$i<$n; $i++) {for ($i=0;$i<$n; $i++) {$row = mysql_fetch_array($res);$row = mysql_fetch_array($res);if($row['ossz']!=0) {if($row['ossz']!=0) {

echo '<tr>'; echo '<tr>'; echo '<td><a href=user.php?id='.$row['uid'].'&wr=1>'.$row['nev']‘;echo '<td><a href=user.php?id='.$row['uid'].'&wr=1>'.$row['nev']‘;echo ‘</a></td>';echo ‘</a></td>';echo '<td>'.$row['ossz'].'</td>';echo '<td>'.$row['ossz'].'</td>';$ossz+=$row['ossz'];$ossz+=$row['ossz'];echo '<td>'.substr($row['utolso'],5).'</td></tr>';echo '<td>'.substr($row['utolso'],5).'</td></tr>';

}}}}echo "<tr><td>Összesen:</td><td>$ossz</td><td></td></tr>";echo "<tr><td>Összesen:</td><td>$ossz</td><td></td></tr>";

Page 18: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

XML XML = eXtensible Markup Language= eXtensible Markup Language

no; surname; firstnameno; surname; firstname1; Goulson; Phil1; Goulson; Phil2; Pooley; Joanna2; Pooley; Joanna3; Jack; Angus3; Jack; Angus4; Parsons-Hann; Wendy4; Parsons-Hann; Wendy5; Jenkinson; Debra5; Jenkinson; Debra6; Jenkinson; Jon6; Jenkinson; Jon7; Wintringham; Ben7; Wintringham; Ben8; Scott; Steve8; Scott; Steve

<?xml version="1.0"?><department><staff no="1">

<surname>Goulson</surname><firstname>Phil</firstname>

</staff><staff no="2">

<surname>Pooley</surname><firstname>Joanna</firstname>

</staff><staff no="3">

<surname>Jack</surname><firstname>Angus</firstname>

</staff>::

<staff no="8"><surname>Scott</surname><firstname>Steve</firstname>

</staff></department>

•Elemek

•Kezdő "tag"

•Tartalom

•Záró "tag"

•Attribútumok

•Név

•Érték

Page 19: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

<?xml version="1.0" encoding="UTF-8"?>

<recept nev="kenyer" keszites="5 perc" sutes="3 ora">

<cim>Egyszeru kenyer</cim>

<osszetevo menny="3" egys="csesze">Liszt</osszetevo> <osszetevo menny="15" egys="gramm">Eleszto</osszetevo> <osszetevo menny="2" egys="csesze" allapot="meleg">Viz</osszetevo> <osszetevo menny="1" egys="kanal">So</osszetevo>

<utasitasok> <lepes>Gyúrd össze az összetevőket egyenletesen</lepes> <lepes>Takard le ruhával és hagyd kelni egy órán keresztül</lepes> <lepes>Gyúrd át újra majd tegyed forró sütőbe két órára</lepes> </utasitasok>

</recept>

•DOMDOM=Document Object Model (bejárható)=Document Object Model (bejárható)

•SAXSAX=Simple API for XML (eseményvezérelt)=Simple API for XML (eseményvezérelt)

Mire jó?Mire jó? RSS, INI, kis adatbázis, oldalleírás, adatcsere...

Page 20: Adatbázisok /  SQL v 2.1 Viczián Gergely (eredeti: Török János 2004)

AdatbiztonságAdatbiztonság

Az adatbázis feladataAz adatbázis feladata minden esemény naplózásaminden esemény naplózása összeomlás után automatikus helyreállásösszeomlás után automatikus helyreállás hibás adatok kiszűrésehibás adatok kiszűrése

Rendszergazda/főnök feladataRendszergazda/főnök feladata biztonsági másolat készítésebiztonsági másolat készítése jogosultságok beállítása/ellenőrzésejogosultságok beállítása/ellenőrzése biztonsági frissítések figyelése, különösen webes biztonsági frissítések figyelése, különösen webes

alkalmazásnálalkalmazásnál auditálásauditálás