adatbázisok / sql v 2.1 viczián gergely (eredeti: török jános 2004)

Post on 25-Jan-2016

31 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

TRANSCRIPT

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)

Ú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

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

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)

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

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

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!

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

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

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

Ö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

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

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

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

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!

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

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

<?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...

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

top related