Adatbázisrendszerek Tervezése Közgazdászoknak Munkapéldány
Illyés László 2014
Bevezető: Ez az írott anyag azt a jegyzetet szeretné helyettesíteni, amelyik a Kolozsvári Sapientia Csíkszeredai Közgazdasági- és Humántudományok karán tantárgyként létező (Gazdálkodási) Adatbázis Rendszerek Tervezése tantárgynál tanított elméleti- és gyakorlati problémákat taglalja. A tananyag nagyrészt az Ullman, Widom [1] könyvre épül, sajátosan tárgyalva a könyvelési problémákat is. Ez a jegyzet fordítva közelíti meg a dolgokat. Adatbázisokat építünk fel és töltünk fel azért, hogy a lekérdezéseket minél hamarabb meg tudjuk fogalmazni, mert egy gazdasági szakembert elsősorban ez érdekel. Azután foglalkozunk az adatbázis felépítésének nehezebb műveletéről, amelyik már egy magasabb szintű gondolkodást igényel. Előbb lesz a gyakorlat, s utána az elmélet. Remélhetőleg ezen megközelítés könyebb megértéshez vezet. Minden előadáshoz megpróbálok kisebb quiz – eket megadni, amely a tanulást segíti, na meg házi feladatot, amelyik a tananyag elmélyítését szolgálja. A könyvelőknek mindig a legújabb ACCESS-en keresztül próbálom tanítani az adatbázis kezelést, a gazdasági informatika szaknak pedig a MySQL adatbázis motorral. A példákban törekszem arra, hogy adatbázisfüggetlenek legyenek. Az olvasónak érdemes kinyomtatni az adatbázis sémáját (grafikus vagy szöveges formában), s a feladatok megoldásánál használni. Azon táblák megjelenítése is segíthet, amelyek az adatbázisban vannak. Ezek is a gyakorlatiasabb lecke elején meg fognak jelenni. Akinek nagyobb képernyője van, vagy két képernyőt használ egyszerre, az nem kell kinyomtassa, hanem egyik ablakban megnyitja az adatbázist ábrázoló oldalt, a másik ablakban a kért feladatot.
1. A relációs adatmodell. Műveletek a relációs modellben 1.1. Bevezetés Legelterjedtebb modell Egyszerű deklaratív nyelvvel rendelkezik az adatok kezelésére Értékorientált A relációs modellben az adatok egyszerűen reprezentálhatók: kétdimenziós táblákban, u.n. Relációkban Attribútumok: a reláció fejrészében találhatók A reláció-attribútumok a reláció oszlopnevei Általában megadják az oszlopban szereplő adatok jelentését Az ábrán levő attribútumok: cím, év, hossz, műfaj Cím
Év
Hossz
műfaj
Csillagok háborúja
1977
124
sci-fi
Elfújta a szél
1939
231
dráma
Wayne világa
1992
95
vígjáték
1.2. A relációs algebra A relációs algebra műveleteket négy osztályba soroljuk A hagyományos halmazműveletek ( egyesítés, metszet, különbség) Egyes részeket tartunk meg (kiválasztás, vetítés) Relációk kombinálása ( Descartes-i szorzat, összekapcsolás) Átnevezés 1.3. 1.4. 1.5. 1.6.
Műveletek a relációs modellben Relációkra vonatkozó megszorítások Multihalmazokon értelmezett műveletek A relációs modell további kiterjesztései
2. Az SQL adatbázisnyelv 2.1. Az SQL története 2.2. Az SQL felépítése 2.3. Adattipusok 2.4. SQL utasítások
3. Egytáblás lekérdezések Ha egy lekérdezés 1 tábláról szól, akkor elhagyhatjuk a tábla nevét. Viszont azért, hogy konszekvensek legyünk, próbáljuk meg használni a tábla nevét is a lekérdezés attribútumai között.
Valamennyire általánosan felírva egy lekérdezés a következő képpen néz ki: SELECT attribútum(ok) FROM tábla WHERE feltételek; A feltételek is tartalmazhatnak attribútumokat, általában tartalmaznak is. Az, amiről a kérdés szól, az kerül a SELECT után. A számítógép adatbázis a következő képpen néz ki: Termek(gyarto, modell, tipus)
pl. (‘A’,1001,’pc’)
pc(modell, sebesseg, memoria,merevlemez,ar)
pl. (1001,2.66,1024,250,$2114.00)
laptop(modell,sebesseg,memoria,merevlemez,kepernyo,ar) nyomtato(modell, szines, tipus, ar)
(2001,2,2048,240,20.1,$3676.00)
(3001, TRUE, ’tintasugaras’, $99)
Csak a termék tábla felhasználásával válaszoljunk a következő kérdésekre: 1. Ki gyártja a 2001-es modellt? SELECT gyarto FROM termek WHERE modell=2001; 2. Mi a tipusa a 3006-os modellnek? SELECT tipus FROM termek WHERE modell=3006; 3. Milyen modelleket gyárt az A gyártó? SELECT modell FROM termek WHERE gyarto='A'; 4. Milyen modelleket gyárt a B gyártó? SELECT modell FROM termek WHERE gyarto='B'; 5. Milyen modelleket gyárt a C gyártó?
6. Milyen modelleket gyárt a D gyártó? 7. Milyen modelleket gyárt a E gyártó? 8. Milyen modelleket gyárt a F gyártó? 9. Milyen modelleket gyárt a H gyártó? 10. Milyen géptipustokat gyárt a B gyártó? SELECT DISTINCT tipus FROM termek WHERE gyarto='B'; 11. Kik gyártanak laptopokat? SELECT DISTINCT gyarto FROM termek WHERE tipus='laptop' ORDER BY gyarto DESC; 12. Kik gyártanak pc-ket? SELECT DISTINCT gyarto FROM termek WHERE tipus='pc'; 13. Kik gyártanak nyomtatókat? SELECT gyarto FROM termek WHERE tipus='nyomtato' ORDER BY gyarto DESC; 14. Milyen tipusúak az 1000-es modellek? SELECT DISTINCT termek.tipus FROM termek WHERE termek.modell<2000; 15. Milyen tipusúak a 3000-es modellek? SELECT DISTINCT termek.tipus FROM termek WHERE termek.modell>=3000; 16. Milyen tipusúak a 2000-es modellek. SELECT DISTINCT termek.tipus FROM termek WHERE termek.modell>1999 AND termek.modell<3000; Felhasználva a PC táblában levő információkat adjunk választ a következő kérdésekre: 1. Mennyi a sebessége az 1008-as PC-nek?
SELECT pc.sebesseg FROM pc WHERE pc.modell=1008; 2. Mennyi a memóriája az 1003-as PC-nek? SELECT pc.memoria FROM pc WHERE pc.modell=1003; 3. Mekkora merevlemez tartozik az 1006-os PC-hez? SELECT pc.merevlemez FROM pc WHERE pc.modell=1006; 4. Mennyi az ára az 1010-es PC-nek? SELECT pc.ar FROM pc WHERE pc.modell=1010; 5. Melyik modellhez milyen sebesség tartozik? SELECT pc.modell,pc.sebesseg FROM pc; 6. Melyik modellhez mennyi memória tartozik? SELECT pc.modell,pc.memoria FROM pc WHERE TRUE; 7. Melyik modellhez milyen merevlemez tartozik? SELECT pc.modell, pc.merevlemez FROM pc ORDER BY pc.merevlemez; 8. Melyik modell milyen árba kerül? SELECT pc.modell, pc.ar FROM pc ORDER BY pc.ar DESC; 9. Melyik sebességhez milyen memória tartozik? SELECT pc.sebesseg,pc.memoria FROM pc; 10. Melyik memóriához milyen merevlemez tartozik? SELECT pc.memoria,pc.merevlemez FROM pc; 11. Melyik modellhez milyen sebesség és merevlemez tartozik? SELECT pc.modell, pc.sebesseg,pc.merevlemez FROM pc; 12. Melyik modelleknek a sebessége 3.2?
SELECT pc.modell FROM pc WHERE pc.sebesseg=3.2; 13. Mely modellek memóriája 1024? SELECT pc.modell FROM pc WHERE pc.memoria=1024; 14. Mely modellek rendelkeznek legtöbb 250 GB merevlemezzel? SELECT pc.modell FROM pc WHERE pc.merevlemez=250; 15. Mely modellek ára 649$? SELECT pc.modell FROM pc WHERE pc.ar=649; 16. Mely modellek ára nagyobb, mint 1000$? SELECT pc.modell FROM pc WHERE pc.ar>1000; 17. Mely modellek ára kisebb, mint 1000$? SELECT pc.modell FROM pc WHERE pc.ar<1000;
4. Több táblás lekérdezések. Halmazműveletek. Alkérdések. 1. Melyek azok a számítógépek (PC+Laptop), amelyeknek a gyártója A. SELECT termek.modell FROM termek WHERE termek.gyarto='A' AND (termek.tipus='pc' OR termek.tipus='laptop'); (SELECT pc.modell FROM pc,termek WHERE pc.modell=termek.modell AND termek.gyarto='A' )UNION (SELECT laptop.modell FROM laptop,termek WHERE laptop.modell=tarmek.modell AND termek.gyarto='A' ); 2. Adjuk meg minden modellhez a megfelelő árat egy eredményben. (SELECT pc.modell,pc.ar FROM pc )UNION (SELECT laptop.modell,laptop.ar FROM laptop )UNION (SELECT nyomtato.ar,nyomtato.modell FROM nyomtato ); 3. Kik a gyártói azon pc-knek, amelyek segessége 2.2? SELECT termek.gyarto FROM termek,pc WHERE termek.modell=pc.modell AND pc.sebesseg=2.2; 4. Kik a gyártói azon pc-knek, amelyek sebessége 2 és 3 között van? SELECT termek.gyarto FROM termek,pc WHERE termek.modell=pc.modell AND pc.sebesseg>=2 AND pc.sebesseg<=3; 5. Kik a gyártói azon pc-knek, amelyeknek merevlemeze nagyobb, mint 160 és memóriája legfeljebb 1024? SELECT termek.gyarto FROM termek,pc
WHERE termek.modell=pc.modell AND pc.merevlemez>160 AND pc.memoria<=1024; 6. Mely gyártók gyártanak pc-ket? (Használjuk a termék táblát.) SELECT Termek.gyarto FROM termek WHERE termek.tipus='pc'; 7. Mely gyártók gyártanak pc-ket? (Használjuk a 2 tábla összekötését) SELECT termek.gyarto FROM termek,pc WHERE termek.modell=pc.modell; 8. Kik a gyártói a színes nyomtatóknak? SELECT termek.gyarto FROM termek,nyomtato WHERE termek.modell=nyomtato.modell AND nyomtato.szines=TRUE; 9. Kik a gyártói a lézer nyomtatóknak? SELECT termek.gyarto FROM termek, nyomtato WHERE termek.modell=nyomtato.modell AND nyomtato.tipus='lézer'; 10. Kik a gyártói a színes lézer nyomtatóknak? SELECT termek.gyarto FROM termek, nyomtato WHERE termek.modell=nyomtato.modell AND nyomtato.tipus='lézer' AND nyomtato.szines; 11. Kik a gyártói a tintasugaras fekete-fehér nyomtatóknak? SELECT termek.gyarto FROM termek, nyomtato WHERE termek.modell=nyomtato.modell AND nyomtato.tipus='tintasugaras' AND NOT(nyomtato.szines); 12. Kik a gyártói a 120 dollárnál drágább nyomtatóknak? SELECT termek.gyarto FROM termek,nyomtato WHERE termek.modell=nyomtato.modell AND nyomtato.ar>120; 13. Melyek azok a PC-modellek, amelyek sebessége legalább 3.00? SELECT pc.modell FROM pc WHERE pc.sebesseg>=3; 14. Mely gyártók készítenek legalább száz gigabájt méretű merevlemezzel rendelkező laptopot?
SELECT termek.gyarto FROM termek,laptop WHERE termek.modell=laptop.modell AND laptop.merevlemez >=100 ORDER BY termek.gyarto DESC; 15. Adjuk meg a B gyártó által gyártott összes termék modellszámát és árát, típustól függetlenül. (SELECT pc.modell,pc.ar FROM pc,termek WHERE pc.modell=termek.modell AND termek.gyarto='B' )UNION (SELECT laptop.modell,laptop.ar FROM laptop,termek WHERE laptop.modell=termek.modell AND termek.gyarto='B' )UNION (SELECT nyomtato.modell,nyomtato.ar FROM nyomtato,termek WHERE nyomtato.modell=termek.modell AND termek.gyarto='B' ); 16. Adjuk meg valamennyi színes nyomtató modellszámát. SELECT nyomtato.modell FROM nyomtato WHERE nyomtato.szines; 17. Melyek azok a gyártók, amelyek laptopot árulnak, pc-t viszont nem? SELECT termek.gyarto FROM termek WHERE termek.tipus='laptop' AND termek.gyarto NOT IN (SELECT termek.gyarto FROM termek WHERE termek.tipus='pc'); 18. Melyek azo a merevlemezméretek, amelyek legalább két pc-ben megtalálhatók? SELECT pc.merevlemez FROM pc, pc AS pc_1 WHERE pc.merevlemez=pc_1.merevlemez AND pc.modell<>pc_1.modell; 19. Adjuk meg azon pc-modell párokat, amelyek ugyanolyan gyorsak és a memóriájuk is ugyanakkora. Egy pár csak egyszer jelenjen meg, azaz, ha (i,j) már szerepel, akkor (j,i) ne jelenjen meg. SELECT pc.modell,pc_1.modell FROM pc,pc AS pc_1
WHERE pc.sebesseg=pc_1.sebesseg AND pc.memoria=pc_1.memoria AND pc.modell>pc_1.modell; 20. Melyek azok a gyártók, amelyek gyártanak legalább két, egymástól különböző, legalább 2.80 gigahertzen működő számítógépet (PC-t vagy laptopot)? L20A=(SELECT termek.gyarto,laptop.modell FROM termek,laptop WHERE termek.modell=laptop.modell AND laptop.sebesseg>=2.8 )UNION (SELECT termek.gyarto,pc.modell FROM termek,pc WHERE termek.modell=pc.modell AND pc.sebesseg>=2.8 ); SELECT L20a.gyarto FROM L20a, L20a AS L20a_1 WHERE L20a.modell>L20a_1.modell; 21. Melyik gyártó gyártja a leggyorsabb számítógépet (PC-t vagy laptopot)? (SELECT termek.gyarto,pc.sebesseg FROM termek,pc WHERE termek.modell=pc.modell )UNION (SELECT termek.gyarto,laptop.sebesseg FROM termek,laptop WHERE termek.modell=laptop.modell ); SELECT L21a.gyarto FROM L21a WHERE L21a.sebesseg= (SELECT MAX(L21a.sebesseg) FROM L21a); 22. Melyik gyártó gyárt legalább három, különböző sebességű PC-t? L22a=SELECT termek.gyarto,pc.sebesseg FROM termek,pc WHERE termek.modell=pc.modell; SELECT L22a.gyarto FROM L22a,L22a AS L22a_1,L22a L22a_2 WHERE L22a.gyarto=L22a_1.gyarto AND L22a.gyarto=L22a_2.gyarto AND L22a.sebesseg<>L22a_1.sebesseg AND L22a.sebesseg<>L22a_2.sebesseg ANd L22a_1.sebesseg <>L22a_2.sebesseg;
SELECT L22a.gyarto FROM L22a GROUP BY(L22a.gyarto,L22a.sebesseg) HAVING COUNT(*)>=3; 23. Melyek azok a gyártók, amelyek pontosan három típusú PC-t forgalmaznak? SELECT termek.gyarto FROM termek WHERE termek.tipus='pc' GROUP BY termek.gyarto HAVING COUNT(*)=3; 24. Az olyan pc-ket, amelyek processzorának sebessége kisebb, mint 2.00, nem árulhatják 500$- nál drágábban. 25. A 15.4 hüvelyknél kisebb képernyőjű laptopoknak a merevlemeze legalább 100GB-os kell legyen, ellenkező esetben csak 1000$-nál olcsóbban árulhatják. 26. Pc-gyártók nem gyárthatnak laptopot 27. Ha egy gyártó készít pc-t, akkor készítenie kell olyan laptopot is, amelynek a sebessége legalább akkora, mint a PC sebessége. 28. Ha egy laptopnak nagyobb memóriája van, mint egy PC-nek, akkor a laptop drágább kell legyen, mint a PC. 29. Keressük meg a modellszámát, sebességét, merevlemez-kapacitását azoknak a pc-knek, amelyek ára 1000$ alatt van. SELECT PC.MODELL,PC.SEBESSEG,PC.MEREVLEMEZ FROM pc WHERE pc.ar<1000; 30. Ugyanaz, mint az előző pontban, de nevezzük át a sebesség oszlopot gigahertz-re, a merevlemez oszlopot pedig gigabájt-ra. SELECT PC.MODELL,PC.SEBESSEG AS gigahertz,PC.MEREVLEMEZ AS gigabajt FROM pc WHERE pc.ar<1000; 31. Keressük meg a nyomtatók gyártóit. SELECT DISTINCT termek.gyarto FROM termek WHERE termek.tipus='nyomtato'; 32. Keressük meg azon laptopok modellszámát, memóriakapacitását és képernyőnagyságát, melyek több, mint 1500-ba kerülnek.
33. Keressük meg a nyomtató reláció azon sorait, melyek a színes nyomtatókra vonatkoznak. Vegyük figyelembe, hogy a színes attribútum logikai típusú.
34. Keressük meg azon PC-k modellszámát és merevlemezméretét, amelyek sebessége 3.2 éd 2000nél olcsóbbak.
35. Keressük meg azon laptopok gyártóit és sebességét, amelyeknek legalább harminc gigabájtos merevlemeze van. SELECT termek.gyarto, laptop.sebesseg FROM termek,laptop WHERE termek.modell=laptop.modell AND laptop.merevlemez>=30; 36. Keressük meg a B gyártó által készített bármilyen típusú termékek számát és árát. (SELECT pc.modell,pc.ar FROM pc,termek WHERE termek.modell=pc.modell AND termek.gyarto='B')UNION (SELECT laptop.modell,laptop.ar FROM termek,laptop WHERE termek.modell=laptop.modell AND termek.gyarto='B' )UNION (SELECT nyomtato.modell,nyomtato.ar FROM termek,nyomtato WHERE termek.modell=nyomtato.modell AND termek.gyarto='B' ); 37. Keressük meg azon gyártókat, akik laptopokat gyártanak, PC-ket viszont nem. SELECT DISTINCT termek.gyarto FROM termek WHERE termek.tipus='laptop' AND termek.gyarto NOT IN (SELECT termek.gyarto FROM termek WHERE termek.tipus='pc'); 38. Keressük meg azokat a merevlemezméreteket, amelyek legalább két PC-ben előfordulnak. SELECT pc.merevlemez FROM pc,pc AS pc_1 WHERE pc.modell>pc_1.modell AND pc.merevlemez=pc_1.merevlemez; SELECT pc.merevlemez
FROM pc GROUP BY pc.merevlemez HAVING COUNT(*)>=2; 39. Keressük meg azon PC-modellpárokat, amelyeknek ugyanakkora a sebességük és a memóriájuk. Egy párt csak egyszer listázzunk ki, azaz, ha (i,j) az eredményben van, akkor (j,i), ne kerüljön bele.
40. Keressük meg azokat a gyártókat, akik legalább két különböző, 3.0-nál nagyobb sebességű számítógépet gyártanak (PC-t vagy laptopot) L40A=(SELECT termek.gyarto,pc.modell FROM termek,pc WHERE termek.modell=pc.modell AND pc.sebesseg>3) UNION (SELECT termek.gyarto,laptop.modell FROM termek,laptop WHERE termek.modell=laptop.modell ); SELECT L40A.gyarto FROM L40A GROUP BY L40A.gyarto HAVING COUNT(*)>=2; 41. Keressük meg a legalább 3.0 sebességű PC-k gyártóit. SELECT termek.gyarto FROM termek, pc WHERE termek.modell=pc.modell AND pc.sebesseg>3; 42. Keressük meg a legdrágább nyomtatókat. SELECT nyomtato.modell FROM nyomtato WHERE nyomtato.ar= (SELECT MAX(nyomtato.ar) FROM nyomtato); 43. Keressük meg azokat a laptopokat, amelyek minden pc-nél lasúbbak. SELECT laptop.modell FROM laptop WHERE laptop.sebesseg
(SELECT pc.modell,pc.ar FROM pc) UNION (SELECT laptop.modell,laptop.ar FROM laptop) UNION (SELECT nyomtato.modell,nyomtato.ar FROM nyomtato); SELECT L44a.modell FROM L44a WHERE L44a.ar= (SELECT MAX(ar) FROM L44a); 45. Keressük meg a legolcsóbb színes nyomtató gyártóját. SELECT termek.gyarto FROM termek,nyomtato WHERE termek.modell=nyomtato.modell AND nyomtato.szines AND nyomtato.ar= 46. (SELECT MIN(nyomtato.ar) FROM nyomtato WHERE szines);Keressük meg az olyan PC-k gyártóit, amelyek a leggyorsabbak a legkisebb memóriával rendelkező PC-k között. 47. Keressük meg a PC-k átlagos sebességét. SELECT AVG(pc.sebesseg) FROM pc; 48. Keressük meg az 1000-nél drágább laptopok átlagos sebességét. SELECT AVG(laptop.sebesseg) AS atlagseb1000DOLLAR FROM laptop WHERE laptop.ar>1000; 49. Keressük meg az A gyártó által gyártott PC-k átlagos árát. SELECT termek.gyarto, AVG(pc.ar) AS atlagar FROM termek,pc WHERE termek.modell=pc.modell AND termek.gyarto='A' GROUP BY termek.gyarto; 50. Keressük meg a D gyártó által gyártott PC-k és laptopok átlagos árát. (SELECT pc.ar FROM termek,pc WHERE termek.modell=pc.modell AND termek.gyarto='D')UNION ALL (SELECT laptop.ar FROM laptop,termek WHERE termek.modell=laptop.modell AND termek.gyarto='D' ); SELECT AVG(ar) AS atlagar FROM L50a; 51. Keressük meg minden egyes pc sebességéhez az ilyen sebességű pc-k átlagos árát. SELECT pc.sebesseg,AVG(pc.ar) AS atlagar FROM pc
GROUP BY pc.sebesseg; 52. Keressük meg minden gyártó esetén a laptopok átlagos képernyőméretét. SELECT termek.gyarto, AVG(laptop.kepernyo) AS atlgkep FROM termek,laptop WHERE termek.modell=laptop.modell GROUP BY termek.gyarto; 53. Keressük meg azokat a gyártókat, akik legalább háromfajta PC-t gyártanak. SELECT termek.gyarto FROM termek WHERE termek.tipus='pc' GROUP BY termek.gyarto HAVING COUNT(*)>=3; 54. Keressük meg minden gyártó esetén a maximális PC-árat. SELECT termek.gyarto, MAX(pc.ar) AS maxpcar FROM termek, pc WHERE termek.modell=pc.modell GROUP BY termek.gyarto; 55. Keressük meg a 2.0-nál nagyobb sebességű PC-k átlagos árát. SELECT AVG(pc.ar) AS pcatlag FROM pc WHERE pc.sebesseg>2; 56. Keressük meg minden olyan gyártóhoz, akik nyomtatót gyártanak, a PC-k átlagos merevlemezméretét. SELECT termek.gyarto, AVG(pc.merevlemez) AS atlaglemez FROM termek,pc WHERE termek.modell=pc.modell AND termek.gyarto IN (SELECT termek.gyarto FROM termek WHERE termek.tipus='nyomtato'); 57. Két INSERT utasítás segítségével tároljuk az adatbázisban azt a tényt, hogy az 1100-as PC-modellt a C gyártó gyártja, 3.2 a sebessége, a memóriája 1024, merevlemeze 180 és az ára 2499$. 58. Szúrjuk be az adatbázisba azt, hogy minden egyes PC esetén létezik egy vele megegyező gyártójú, sebességű, memóriájú, merevlemezű laptop, amelynek 17 hüvelykes képernyője van, modellszáma 1100-al nagyobb és 500$-al drágább. 59. Töröljük ki a 100 gigabájtnál kisebb merevlemezű Pcket. 60. Töröljük ki az összes olyan laptopot, amelyeket olyan cég gyárt, amely nem gyárt nyuomtatókat. 61. Az A cég megveszi a B céget. Módosítsuk a B által gyártott termékeket olyan módon, hogy az A gyártja őket.
62. Minden eyges PC esetén kétszerezzük meg a memória nagyságát, és adjunk 60 gigabájtot a merevlemez méretéhez. (ne feledjük, hogy egyetlen UPDATE segítségével több attribútum is módosítható) 63. A B cég által gyártott laptopok esetén adjunk eyg hüvelyket a képernyő méretéhez és vonjunk ki 100$-t az árból.
Könyvészet: [1] Jeffrey D. Ullman, Jennifer Widom; Adatbázisrendszerek – Alapvetés, Panem, Budapest, 2009