Tartalomjegyzék

< Adatbázis-kezelés

Feladatok és megoldások

Egytáblás lekérdezések

Feladat 001

Adatok

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

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

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:

Megoldás
insert into konyvek
(cim, ar, szerzoAz, isbn)
values
("Valami", 3000, 3, null);

103 feladat

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:

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

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;