[[oktatas:adatbázis-kezelés|< Adatbázis-kezelés]] ====== Feladatok és megoldások ====== * **Szerző:** Sallai András * Copyright (c) 2019, Sallai András * Szerkesztve: 2019, 2021 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Egytáblás lekérdezések ===== ==== Feladat 001 ==== === Adatok === * Adatbázis: tanker create database tanker character set utf8 collate utf8_hungarian_ci; use tanker; create table szemelyek ( az int not null primary key auto_increment, nev varchar(50), telepules varchar(50), cim varchar(50), belepes date ); insert into szemelyek (nev, telepules, cim, belepes) values ('Nagy József', 'Szolnok', 'Nyár u. 3.', '2010-03-17'), ('Pár Elek', 'Debrecen', 'Tél u. 3.', '2005-01-01'), ('Tér Ferenc', 'Szolnok', 'Kossuth u. 5.', '2000-02-01'), ('Dolog Károly', 'Szeged', 'Almás tér 2', '2007-05-01'), ('Tronf Mihály', 'Debrecen', 'Lát u. 45.', '2005-02-01'), ('Ab Béla', 'Szolnok', 'Bach u. 91', '2000-07-01'); Egy cég a dolgozóit a "szemelyek" nevű táblában tartja nyilván. A táblában minden dolgozónak van egy azonosítója, nyilván van tartva a neve, a település és cím ahol lakik, és mikor lépett be a céghez. ^ szemelyek ^^^^^ ^ az ^ nev ^ telepules ^ cim ^ belepes ^ | 1 | Nagy József | Szolnok | Nyár u. 3. | 2010.03.17 | | 2 | Pár Elek | Debrecen | Tél u. 3 | 2005.01.01 | | 3 | Tér Ferenc | Szolnok | Kossuth u. 5. | 2000.02.01 | | 4 | Dolog Károly | Szeged | Almás tér 2. | 2007.05.01 | | 5 | Tronf Mihály | Debrecen | Lát u. 45. | 2005.02.01 | | 6 | Ab Béla | Szolnok | Bach u. 91. | 2000.07.01 | === Feladatok === Jelenítse meg azokat a dolgozókat, amelyek Szolnokon laknak. --> Megoldás # SELECT nev FROM szemelyek WHERE telepules="Szolnok"; <-- Számolja meg, összesen, hány személy van a szemelyek táblában. --> Megoldás # SELECT count(az) AS Összesen FROM szemelyek; <-- Számolja meg, hány szolnoki személy van. --> Megoldás # SELECT Count(az) FROM szemelyek WHERE telepules="Szolnok"; <-- Számolja meg, Pár Elek hány napja van a cégnél. --> Megoldás # SELECT now() - belepes AS "Napok száma" FROM szemelyek WHERE nev="Pár Elek"; <-- Jelenítse meg, azoknak a nevét, akik februárban léptek be. --> Megoldás # SELECT nev FROM szemelyek WHERE month(belepes)=2; <-- Jelenítse meg, milyen települések vannak. Egy település csak egyszer szerepeljen. --> Megoldás # SELECT telepules FROM szemelyek GROUP BY telepules; <-- Jelenítse meg, azok nevét, akik 2003 előtt léptek be. --> Megoldás # MySQL és MariaDB: SELECT nev FROM szemelyek WHERE belepes<"2003-1-1"; MS Access: SELECT nev FROM szemelyek WHERE belepes<#1/1/2003#; <-- Jelenítse meg, a szegedi és szolnoki dolgozók közül azokat, akik 2005 után jöttek a céghez. --> Megoldás # MySQL és Mariadb: SELECT nev, telepules, belepes FROM szemelyek WHERE (telepules = "Szeged" OR telepules = "Szolnok") AND belepes > "2005-12-31"; MS Access SELECT nev, telepules, belepes FROM szemelyek WHERE (telepules = "Szeged" OR telepules = "Szolnok") AND belepes > #31/12/2005#; <-- A MS Access megoldás az MS Access 2007-es szintaktikája. ==== Feladat 002 ==== Adott a következő pácienseket tartalmazó "Személy" nevű tábla: ^ szemelyek ^^^^^^ ^ id ^ nev ^ telepules ^ szuletes ^ ar ^ tuszuras ^ | 1 | Nagy Emese | Szolnok | 1978.05.11 | 6500 | igen | | 2 | Kis Géza | Nyíregyháza | 1982.07.01 | 10000 | nem | | 3 | Danka Béla | Szolnok | 1984.02.05 | 12000 | nem | create table szemelyek ( id int not null primary key auto_increment, nev varchar(50), telepules varchar(50), szuletes date, ar double, tuszuras boolean ); insert into szemelyek (nev, telepules, szuletes, ar, tuszuras) values ('Nagy Emese', 'Szolnok','1978-05-11', 6500,1), ('Kis Géza', 'Nyíregyháza','1982-07-01', 10000,1), ('Danka Béla', 'Szolnok','1984-02-05', 12000,1); A táblázatban tároljuk a páciens azonosítóját (id), a nevét (név, a települést ahol lakik (telepules), az árat, amit legutóbb fizetett (ar), és lehet-e tűszúrással kezelni (tuszuras) Készítse el, a következő lekérdezéseket: Jelenítse meg, az összes mezőt, az összes rekorddal: --> Megoldás # SELECT * FROM szemelyek; <-- Jelenítse meg, csak a nevek és a település mezőket: --> Megoldás # SELECT nev, telepules FROM szemelyek; <-- Jelenítse meg, csak a település és az ár mezőket: --> Megoldás # SELECT telepules, ar FROM szemelyek; <-- Jelenítse meg, a szolnokiak neveit: --> Megoldás # SELECT nev FROM szemelyek WHERE telepules="Szolnok"; <-- Jelenítse meg, azok neveit és települését, akik többet fizetnek mint 10000: --> Megoldás # SELECT nev, telepules FROM szemelyek WHERE ar>10000; <-- Jelenítse meg, ki hány éves? --> Megoldás # SELECT nev, year(now()) - year(szuletes) FROM szemelyek; <-- Jelenítse meg, a mai dátumot: --> Megoldás # SELECT now(); <-- Jelenítse meg, a mai dátum év részét: --> Megoldás # SELECT year(now()); <-- Mai dátum hónap része: --> Megoldás # SELECT month(now()); <-- A mai dátum nap része: --> Megoldás # SELECT day(now()); <-- Jelenítése meg, mindenki nevét és életkorát: --> Megoldás # SELECT nev, year(now()) - year(szuletes) FROM szemelyek; <-- Számolja meg, hány páciens van: --> Megoldás # SELECT count(az) FROM szemelyek; <-- Számolja meg, hány páciens van Szolnokról: --> Megoldás # SELECT count(az) FROM szemelyek WHERE telepules="Szolnok"; <-- Hány embert lehet tűszúrással gyógyítani? --> Megoldás # SELECT count(az) FROM szemelyek WHERE tuszuras=true; <-- Mennyi volt a bevétel, a páciensektől eddig összesen? --> Megoldás # SELECT sum(ar) FROM szemelyek; <-- Mennyi volt a bevétel, a páciensektől eddig összesen? A fejléc "Összbevétel" legyen! --> Megoldás # SELECT sum(ar) as Összbevétel FROM szemelyek; <-- Mennyi, az átlagbevétel Budapestről? --> Megoldás # SELECT avg(ar) FROM szemelyek WHERE telepules="Budapest"; <-- Mennyi, az átlagbevétel Budapestről? A fejléc "Budapesti átlagbevétel" legyen! --> Megoldás # SELECT avg(ar) as "Budapesti átlagbevétel" FROM szemelyek WHERE telepules="Budapest"; <-- Jelenítse meg, azok neveit, akik Szolnokról valók és tűszúrással gyógyíthatók! --> Megoldás # SELECT nev FROM szemelyek WHERE telepules="Szolnok" and tuszuras=true; <-- Jelenítse meg, milyen településekről vannak páciensek. Egy név csak egyszer szerepeljen. --> Megoldás # SELECT telepules FROM szemelyek GROUP BY telepules; Csoportosítjuk település szerint az eredményt. <-- Jelenítse meg, a 1970 előtt születettek neveit és településüket. --> Megoldás # MySQL, Mariadb: SELECT nev, telepules FROM szemelyek WHERE személy.szuletes< "1970-01-01"; MS Access: SELECT nev, telepules FROM szemelyek WHERE személy.szuletes<#1/1/1970#; <-- ==== Feladat 003 ==== Adott az alábbi adatbázis. create database surubt; use surubt; create table dolgozok ( az int not null primary key auto_increment, nev varchar(30), telepules varchar(30), cim varchar(30), szuletes date, belepes date, fizetes double, diploma boolean ); insert into dolgozok (nev, telepules, cim, szuletes, belepes, fizetes, diploma) values ("Nagy József", "Szolnok", "Tél u. 23.", "1975-08-25", "2004-03-01", 570000, 1), ("Pék Réka", "Miskolc", "Árny u. 29", "1977-02-03", "2006-04-01", 389000, 1), ("Kis Mária", "Debrecen", "Vértes u. 20.", "1981-04-01", "2005-03-27", 680000, 1), ("Érdek Júlia", "Szeged", "Bíró u. 25.", "1982-03-08", "2008-09-01", 190000, 0), ("Boros Evelin", "Szolnok", "Barát u. 78.", "1988-02-22", "2001-01-01", 850000, 0), ("Lórem Kinga", "Szeged", "Pilisi út 17.", "1973-08-02", "2000-01-01", 878000, 1), ("Fix Béla", "Szolnok", "Burkus u. 80.", "1991-11-05", "2008-01-01", 351000, 1); Hozza létre az adatbázist. ^ dolgozok ^^^^^^^^ ^ az ^ nev ^ telepules ^ cim ^ szuletes ^ belepes ^ fizetes ^ diploma ^ | 1 | Nagy József | Szolnok | Tél u. 23. | 1975-08-25 | 2004-03-01 | 570000 | 1 | | 2 | Pék Réka | Miskolc | Árny u. 29. | 1977-02-03 | 2006-04-01 | 389000 | 1 | | 3 | Kis Mária | Debrecen | Vértes u. 20. | 1981-04-01 | 2005-03-27 | 680000 | 1 | | 4 | Érdek Júlia | Szeged | Bíró u. 25. | 1982-03-08 | 2008-09-01 | 190000 | 0 | | 5 | Boros Evelin | Szolnok | Barát u. 78. | 1988-02-22 | 2001-01-01 | 850000 | 0 | | 6 | Lórem Kinga | Szeged | Pilisi út 17. | 1973-08-02 | 2000-01-01 | 878000 | 1 | | 7 | Fix Béla | Szolnok | Burkus u. 80. | 1991-11-05 | 2008-01-01 | 351000 | 1 | Írassa ki, a legkésőbb belépett, szolnoki dolgozó nevét. --> Megoldás # select nev from dolgozok where belepes = ( select max(belepes) from dolgozok where telepules="Szolnok") select nev from dolgozok where telepules = "Szolnok" order by belepes desc limit 1; <-- ==== Feladat 004 ==== Adott a következő dolgozók nevű tábla. ^ Dolgozók ^^^^^^^^^ ^ Az ^ Név ^ Anyja neve ^ Település ^ Lakcím ^ Születés ^ Belépés ^ Fizetés ^ Jutalom ^ | 1 | Nagy József | Marsh Eszter | Szolnok | Tél u. 23. | 1975-08-25 | 2004-03-01 | 570000 | 5000 | | 2 | Pék Réka | Sargéj Tímea | Miskolc | Árny u. 29. | 1977-02-03 | 2006-04-01 | 389000 | 10000 | | 3 | Kis Mária | Immell Márta | Debrecen | Vértes u. 20. | 1981-04-01 | 2005-03-27 | 680000 | 5000 | | 4 | Érdek Júlia | Haller Fruzsina | Szeged | Bíró u. 25. | 1982-03-08 | 2008-09-01 | 190000 | 15000 | | 5 | Boros Evelin | Csömöri Nikolett | Szolnok | Barát u. 78. | 1988-02-22 | 2001-01-01 | 850000 | 5000 | | 6 | Lórem Kinga | Gory Nikolett | Szeged | Pilisi út 17. | 1973-08-02 | 2000-01-01 | 878000 | 15000 | | 7 | Fix Béla | Pritchard Lili | Szolnok | Burkus u. 80. | 1991-11-05 | 2008-01-01 | 351000 | 5000 | create table Dolgozók ( Az int not null primary key auto_increment, Név varchar(50), Anyja_neve varchar(50), Település varchar(50), Lakcím varchar(50), Születés date, Belépés date, Fizetés double, Jutalom double ); insert into Dolgozók (Név, Anyja_neve, Település, Lakcím, Születés, Belépés, Fizetés, Jutalom) values ('Nagy József', 'Marsh Eszter', 'Szolnok', 'Tél u. 23.', '1975-08-25', '2004-03-01', 570000, 5000), ('Pék Réka', 'Sargéj Tímea', 'Miskolc', 'Árny u. 29.', '1977-02-03', '2006-04-01', 389000, 10000), ('Kis Mária', 'Immell Márta', 'Debrecen', 'Vértes u. 20', '1981-04-01', '2005-03-27', 680000, 5000), ('Érdek Júlia', 'Haller Fruzsina', 'Szeged', 'Bíró u. 25.', '1982-03-08', '2008-09-01', 190000, 15000), ('Boros Evelin', 'Csömöri Nikolett', 'Szolnok', 'Barát u. 78.', '1988-02-22', '2001-01-01', 850000, 5000), ('Lórem Kinga', 'Gory Nikolett', 'Szeged', 'Pilisi út 17.', '1973-08-02', '2000-01-01', 878000, 15000), ('Fix Béla', 'Pritchard Lili', 'Szolnok', 'Burkus u. 80.', '1991-11-05', '2008-01-01', 351000, 5000); Kérdezzük le a települések neveit: --> Megoldás # SELECT Település FROM Dolgozók GROUP BY Település vagy SELECT DISTINCT Település FROM Dolgozók <-- Számoljuk meg hány település van. --> Megoldás # SELECT count(*) AS "Települések száma" FROM (SELECT DISTINCT Település FROM Dolgozók) AS alap vagy: SELECT count(*) AS "Települések száma" FROM (SELECT Település FROM Dolgozók GROUP BY Település) AS alap <-- Hány éves az első dolgozó? --> Megoldás # select year(now()) - year(születés) from Dolgozók where Az = 1 <-- Hány éves a legfiatalabb dolgozó? --> Megoldás # select year(now()) - year(max(születés)) from Dolgozók <-- ==== Feladat 005 ==== Adott a következő dolgozók nevű tábla. ^ Szemelyek ^^^^^^^^ ^ az ^ nev ^ telepules ^ lakcim ^ szuletes ^ belepes ^ fizetes ^ jutalom ^ | 1 | Perkel Ibolya | Miskolc | Tornyosi út 75. | 1989-07-12 | 2013-02-01 | 1800000 | 560000 | | 2 | Talon Ferenc | Hatvan | Árkos utca 43. | 1995-03-02 | 2015-01-01 | 1540000 | 560000 | Válaszoljon az alábbi kérdésekre. 1.) Mennyi jutalmat kapnak az adonyi és keceli dolgozók? Összesen. --> Megoldás # select sum(jutalom) from Szemelyek where telepules="Adony" or telepules="Kecel" <-- 2.) Mennyi jutalmat és fizetést kapnak battonyai, mátészalkai és csorvási dolgozok, összesen? A jutalom és fizetés is legyen összesítve, egyetlen lekérdezésben. --> Megoldás # select sum(fizetes+jutalom) from Szemelyek where telepules="Battonya" or telepules="Mátészalka" or telepules="Csorvás" <-- 3.) Mennyi jutalmat és fizetést kapnak nagyatádi, nyírábrányi és kenderesi dolgozok, településenként összesen? --> Megoldás # select telepules, sum(jutalom+fizetes) as "Összes LÓVÉ" from Szemelyek where telepules="Nagyatád" or telepules="Nyírábrány" or telepuels="Kenderes" group by telepules <-- 4.) Mi az életkorok átlaga az összes dolgozóknak? Évre? --> Megoldás # select now() select year(now()) select year(szuletes) from Szemelyek select year(now())-year(szuletes) from Szemelyek select avg(year(now())-year(szuletes)) as "Születések átlag" from Szemelyek <-- 5.) Írass ki azoknak a hatvani dolgozóknak a nevét fizetését és jutalmát, akik idősebbek 60 évnél. --> Megoldás # select nev, fizetes, jutalom from Szemelyek where telepules = "Hatvan" and year(now())-year(szuletes) > 60 <-- ===== Kéttáblás lekérdezés ===== ==== 101 feladat ==== {{:oktatas:adatbazis-kezeles:zeneszamokeloadok.png|}} Jelenítse meg az összes zeneszámot és előadót. --> Megoldás # select zeneszamok.cim from zeneszamok inner join eloadok on zeneszamok.eloadoAz=eloadok.az; A művelethez a két táblát össze kell kapcsolni. A "**from zeneszamok inner join eloadok**" rész azt mondja, hogy a **zeneszamok** táblát összekapcsolom az "eloadok" táblával. Az "**on zeneszamok.eloadoAz=eloadok.az;**" rész azt mondja meg, hogy melyik két mezőt kapcsolom össze a két táblában. A **zeneszamok** táblában az "**eloadoAz**" idegen kulcs. Az "**eloadok**" táblában az "**az**" mező elsődleges kulcs. Ezeket kapcsoljuk össze. <-- ==== 102 feladat ==== {{:oktatas:adatbazis-kezeles:arpakiado.png|}} Kérdezze le a "Lovas" című könyv szerzőjének telefonszámát. --> Megoldás # select telefon from konyvek inner join szerzok on konyvek.szerzoAz = szerzok.az where cim="Lovas" <-- Jelenítse meg azon könyvek szerzőinek nevét, akiknek a könyvcímükben szerepel a "lovas" szó. --> Megoldás # select szerzo.nev from szerzok inner join konyvek on konyvek.szerzoAz = szerzok.az where konyvek.cim like "%lovas%"; <-- Jelenítse meg a 2000 Ft-nál drágább könyvek címeit, és szerzőjük nevét. --> Megoldás # select konyvek.cim, szerzo.nev from szerzok inner join konyvek on konyvek.szerzoAz = szerzok.az where konyvek.ar > 2000; <-- Jelenítse meg hány darab 2000 Ft-nál drágább könyvek van. Az eredmény felirata "Drága könyvek" legyen. --> Megoldás # select count(konyvek.cim) as "Drága könyvek" from konyvek where ar > 2000; <-- Jelenítse meg, mennyi a könyvek átlagára. Az eredményben a 'Átlag' szerepeljen. --> Megoldás # select avg(ar) as "Átlag" from konyvek; <-- Szúrjon be egy új szerzőt a következő adatokkal: Pere János, 30-384124, pere@vhol.hu --> Megoldás # insert into szerzok (nev, telefon, email) values ("Pere János", "30-384124", "pere@vhol.hu"); <-- Szúrjon be egy új könyvet a következő adatokkal: cím: Valami ár: 3000 szerző: 3 Az ISBN-t nem kell megadni. --> Megoldás # insert into konyvek (cim, ar, szerzoAz) values ("Valami", 3000, 3); <-- Szúrjon be egy új könyvet a következő adatokkal: * cím: Valami * ár: 3000 * szerző: 3 * ISBN: ismeretlen --> Megoldás # insert into konyvek (cim, ar, szerzoAz, isbn) values ("Valami", 3000, 3, null); <-- ==== 103 feladat ==== {{:oktatas:adatbazis-kezeles:ingatlannyilvantartas.png|}} Kérdezze le "Barna Ferenc" nevű tulajdonosnak, hány darab ingatlana van. --> Megoldás # select count(*) from ingatlanok inner join szemelyek on ingatlanok.szemelyAz = szemelyek.az where nev="Barna Ferenc" <-- ===== Három táblás ===== ==== 201 feladat ==== Adott a következő adatbázis: {{:oktatas:adatbázis-kezelés:kektrt.png?|}} Kérdezze le Szabó János milyen projektekben vesz részt. --> Megoldás # select projektek.nev, projektek.leiras from (dolgozok inner join dolgozokProjektek on dologozok.az = dolgozokProjektek.dolgozoAz) inner join projektek on dolgozokProjektek.projektekAz = projektek.az where dolgozok.nev = "Szabó József" Az on direktívában a táblanevek rövidíthetők, ha a inner join előtt és után megadunk egy álnevet: select projektek.nev, projektek.leiras from (dolgozok a inner join dolgozokProjektek b on a.az = b.dolgozoAz) inner join projektek c on b.projektekAz = c.az where dolgozok.nev = "Szabó József" <-- ==== 202 feladat ==== {{:oktatas:adatbazis-kezeles:rendelorecepttel.png|}} Milyen beteghez tartozik a 35 számú recept? --> Megoldás # select nev from paciensek a inner join kezelesek b on a.az = b.paciensekAz inner join receptek c on b.az = c.kezelesAz where receptek.az = 35; <--