[]-----------------------[]
| MySQL feladatsor F |
[]-----------------------[]
Indítsa saját gépén a MySQL szervert, majd a kliens programot is!
A kliens programot használva végezze el a következő feladatokat...
Futtassa le a következő SQL utasítást az aktuális adatbázison:
CREATE TABLE dolg (
nev varchar(50),
beldat date,
fiz int);
desc dolg;
select *from dolg;
a) Vigye fel a dolg táblába SQL utasításokkal a következő dolgozókat:
Gipsz Jakab, 2010.12.01, 300000 Ft
Sándor Pál, 2011.01.13
Tó Vazul, 210000 Ft
Szepesi, 2009.12.11, 190000 Ft
INSERT INTO dolg (nev, beldat, fiz) VALUES ('Gipsz Jakab', '2010.12.01', 300000);
INSERT INTO dolg (nev, beldat) VALUES ('Sándor Pál', '2011.01.13');
INSERT INTO dolg (nev, fiz) VALUES ('Tó Vazul', 210000);
INSERT INTO dolg (nev, beldat, fiz) VALUES ('Szepesi', '2009.12.11', 190000);
SELECT * FROM dolg;
vagy
INSERT INTO dolg (nev, beldat, fiz) VALUES
('Gipsz Jakab', '2010.12.01', 300000),
('Sándor Pál', '2011.01.13',NULL),
('Tó Vazul',NULL,210000),
('Szepesi','2009.12.11',190000);
SELECT * FROM dolg;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
|
| Tó Vazul |
|
210000 |
| Szepesi |
2009-12-11 |
190000 |
b) Módosítsa a dolg tábla adatait a következők szerint:
Sándor Pál keresete: 333000 Ft
Tó Vazul a céghez 2013.03.05-én érkezett
Szepesi nevű dolgozónk keresztneve: Gábor
UPDATE dolg SET fiz = 333000 WHERE nev = 'Sándor Pál';
UPDATE dolg SET beldat = '2013.03.05' WHERE nev = 'Tó Vazul';
UPDATE dolg SET nev = 'Szepesi Gábor' WHERE nev = 'Szepesi';
SELECT * FROM dolg;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
333000 |
| Tó Vazul |
2013-03-05 |
210000 |
| Szepesi Gábor |
2009-12-11 |
190000 |
c) Készítsen a dolg tábla jelenlegi tartalmáról egy mentést dolg_save1 néven!
CREATE TABLE dolg_save1 SELECT * FROM dolg;
SELECT * FROM dolg_save1;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
333000 |
| Tó Vazul |
2013-03-05 |
210000 |
| Szepesi Gábor |
2009-12-11 |
190000 |
d) A dolg táblában már tárolt adatokat felhasználva többszörözze meg a dolg táblában lévő rekordok számát úgy, hogy a tábla rekordszáma haladja meg az ezer rekordot!
DROP PROCEDURE IF EXISTS insertRows;
DELIMITER //
CREATE PROCEDURE insertRows()
BEGIN
DECLARE i INT DEFAULT 4;
WHILE (i <= 1001) DO
INSERT INTO dolg SELECT * FROM dolg WHERE nev = 'Gipsz Jakab' LIMIT 1;
INSERT INTO dolg SELECT * FROM dolg WHERE nev = 'Sándor Pál' LIMIT 1;
INSERT INTO dolg SELECT * FROM dolg WHERE nev = 'Tó Vazul' LIMIT 1;
INSERT INTO dolg SELECT * FROM dolg WHERE nev = 'Szepesi Gábor' LIMIT 1;
SET i = i + 4;
END WHILE;
END;
//
DELIMITER ;
CALL insertRows();
A fenti utasítássorozatot egyszer lefuttatva 250-szer beilleszti még be a meglévő 4 rekordot. Így egészen pontosan 1004 db lesz táblában lévő rekordok száma. (ha csak 249-szer tenné, akkor ugye 1000db lenne, ami eléri ugyan az kívánt számot, de nam haladja azt meg)
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
333000 |
| Tó Vazul |
2013-03-05 |
210000 |
| Szepesi Gábor |
2009-12-11 |
190000 |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
333000 |
| Tó Vazul |
2013-03-05 |
210000 |
| Szepesi Gábor |
2009-12-11 |
190000 |
| Gipsz Jakab |
2010-12-01 |
300000 |
| ... |
... |
... |
| stb. |
INSERT INTO dolg
SELECT * FROM dolg;
SELECT COUNT(*) FROM dolg;
A megadott példakódot, nyolcszor kell lefuttatni, így rendre a rekordok száma:
első futás után: 8 db rekord
második futás után: 16 db rekord
harmadik futás után: 32 db rekord
negyedik futás után: 64 db rekord
ötödik futás után: 128 db rekord
hatodik futás után: 256 db rekord
hetedik futás után: 512 db rekord
nyolcadik futás után: 1024 db rekord
e) Törölje ki a dolg táblából a legalacsonyabb keresetű dolgozó összes rekordját!
Sajnos ez nem működik, pedig szerintem egy tök logikus parancs :) :
DELETE FROM dolg WHERE fiz = MIN(fiz);
Ezért ez lett, még ha bonyolultabb is:
DELETE FROM dolg WHERE fiz IN(select MIN(fiz) FROM dolg);
SELECT * FROM dolg;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
333000 |
| Tó Vazul |
2013-03-05 |
210000 |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
333000 |
| Tó Vazul |
2013-03-05 |
210000 |
| Gipsz Jakab |
2010-12-01 |
300000 |
| ... |
... |
... |
| stb... |
A feladatban megadott megoldás nem automatikus, előbb lekérdezzük melyik a legkisebb kereset, majd egy újabb utasítással töröljük az ilyen fiz értéket tartalmazó rekordokat:
SELECT MIN(fiz) FROM dolg;
DELETE FROM dolg WHERE fiz = 190000;
f) Emelje meg a legkisebb és legnagyobb keresetű dolgozó(k) fizetését 20, illetve 10 százalékkal!
(A legkisebb fizetésű 20%, a legnagyobb 10% emelést kapjon…)
UPDATE dolg SET fiz = fiz + fiz/100 * 20 WHERE fiz IN(select MIN(fiz) FROM dolg);
UPDATE dolg SET fiz = fiz + fiz/100 * 10 WHERE fiz IN(select MAX(fiz) FROM dolg);
SELECT * FROM dolg;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
366300 |
| Tó Vazul |
2013-03-05 |
252000 |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
366300 |
| Tó Vazul |
2013-03-05 |
252000 |
| ... |
... |
... |
| Stb. |
A feladatban megadott megoldások szintén nem automatikusak, ott előbb lekérdezzük mindkét esetben a legkisebb és legnagyobb fizetések értékét, majd újabb utasításokkal módosítjuk azokat:
SELECT MIN(fiz) FROM dolg;
UPDATE dolg SET fiz = fiz*1.2 WHERE fiz = 210000;
SELECT MAX(fiz) FROM dolg;
UPDATE dolg SET fiz = fiz*1.1 WHERE fiz = 333000;
g) Állítsa be a legnagyobb keresetű dolgozó nevét úgy, hogy annak név mezője kitöltetlen legyen! (NULL)
UPDATE dolg SET nev = NULL WHERE fiz IN(SELECT MAX(fiz) FROM dolg);
SELECT * FROM dolg;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
|
2011-01-13 |
366300 |
| Tó Vazul |
2013-03-05 |
252000 |
| Gipsz Jakab |
2010-12-01 |
300000 |
|
2011-01-13 |
366300 |
| Tó Vazul |
2013-03-05 |
252000 |
| ... |
... |
... |
| stb. |
A feladatban megadott megoldás pedig:
SELECT nev FROM dolg ORDER BY fiz DESC LIMIT 1;
UPDATE dolg SET nev = NULL WHERE nev = 'Sándor Pál';
SELECT * FROM dolg;
h) A dolg tábla üres nev mezőinek tartalmát módosítsa úgy, hogy az az Ön nevét tartalmazza!
UPDATE dolg SET nev = 'Tóth Attila' WHERE nev IS NULL;
SELECT * FROM dolg;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Tóth Attila |
2011-01-13 |
366300 |
| Tó Vazul |
2013-03-05 |
252000 |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Tóth Attila |
2011-01-13 |
366300 |
| Tó Vazul |
2013-03-05 |
252000 |
| ... |
... |
... |
| stb. |
i) Készítsen a dolg tábla jelenlegi tartalmáról egy mentést dolg_save2 néven!
CREATE TABLE dolg_save2 SELECT * FROM dolg;
j) Törölje ki a dolg tábla összes rekordját!
DELETE FROM dolg;
SELECT * FROM dolg;
k) Állítsa helyre a dolg tábla tartalmát a dolg_save1 tábla felhasználásával!
INSERT INTO dolg SELECT * FROM dolg_save1;
SELECT * FROM dolg;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
333000 |
| Tó Vazul |
2013-03-05 |
210000 |
| Szepesi Gábor |
2009-12-11 |
190000 |
l) Törölje ki a dolg_save1 és dolg_save2 táblákat!
DROP TABLE dolg_save1, dolg_save2;
m) Oldja meg, hogy a dolg táblában a rekordok Név szerint növekvő sorrendben szerepeljenek!
ALTER TABLE dolg ORDER BY nev ASC;
SELECT * FROM dolg;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
333000 |
| Szepesi Gábor |
2009-12-11 |
190000 |
| Tó Vazul |
2013-03-05 |
210000 |
A feladatban szereplő megoldás előbb készít egy másik (ideiglenes) táblát a dolg tábláról, úgy hogy az már a "nev" oszlop szerint lesz rendezve.
Az egyik lehetséges következő lépés az lehetne, hogy erről az ideiglenes és név szerint rendezett táblából visszatöltjük a rendezett adatokat a dolg táblába, persze előtte annak tartalmát töröljük.
Megtehetnénk azt is, hogy eldobjuk a dolg táblát és előállítjuk azt az ideiglenes tábla alapján.
Vagy egy harmadik lehetőség, hogy szintén eldobatjuk a dolg táblát és az ideiglenes táblát nevezzük át dolg táblára:
CREATE TABLE ideiglenes SELECT * FROM dolg ORDER BY nev;
DROP TABLE dolg;
RENAME TABLE ideiglenes TO dolg;
SELECT * FROM dolg;
| nev |
beldat |
fiz |
| Gipsz Jakab |
2010-12-01 |
300000 |
| Sándor Pál |
2011-01-13 |
333000 |
| Szepesi Gábor |
2009-12-11 |
190000 |
| Tó Vazul |
2013-03-05 |
210000 |
n) Szüntesse meg a dolg táblában a rekordok többszörös tárolását!
(Minden név csak egyszer szerepeljen!)
Nem igazán értem a feladatot. A dolg_save1 tábla a "c" feladatban lett létrehozva a dolg táblából, amikor is még az csak 4 különböző nevet tartalmazott.
A "k" feladatban ebből a táblából (4 rekord) állítjuk helyre a dolg táblát. Majd az "l" feladatban töröljük a dolg_save1-et a dolg_save2-vel együtt.
Így most a dolg táblában minden név eleve csak egyszer szerepel. Na de tételezzük fel, hogy nem így van és akkor:
CREATE TABLE ideiglenes SELECT DISTINCT(nev), beldat, fiz FROM dolg ORDER BY nev;
DROP TABLE dolg;
RENAME TABLE ideiglenes TO dolg;
SELECT * FROM dolg;
Az előző feladat logikáját felhasználva készítettem egy ideiglenes táblát a dolg táblából úgy, hogy minden név csak egyszer szerepeljen és rendezve legyen a tábla nev szerint. Majd eldobattam a dolg táblát és az ideiglenes táblát neveztem át dolg-ra.
Valami hasonló logikával van a feladat eredeti megoldása is:
INSERT INTO dolg SELECT * from dolg; -- megduplázzuk a tábla rekordjait
SELECT count(*) FROM dolg; -- majd megszámoljuk
/* SELECT TABLE tmp SELECT DISTINCT nev,beldat,fiz FROM dolg;
gondolom létrehozzuk az ideiglenes tmp táblát? de azt a create záradékkal
majd úgy hogy a nev csak egyszer szerepeljen,
a SELECT már csak azért sem jó mert még nincs mit (tmp), tehát:*/
CREATE TABLE tmp SELECT DISTINCT nev,beldat,fiz FROM dolg;
SELECT * FROM tmp; -- kilistázzuk a tmp táblát
TRUNCATE TABLE dolg; -- töröljük a dolg tábla tartalmát
SELECT * FROM dolg; -- kilistázzuk a dolg táblát, hogy valóban törlöltük???
SELECT * FROM tmp; -- kilistázzuk a tmp táblát, megint???
INSERT INTO dolg SELECT * FROM tmp;
-- beillesztjük a tmp rekordjait a dolg táblába
DROP TABLE tmp; -- eldobjuk a tmp táblát
-- DROP TABLE dolg; -- eldobjuk a dolg táblát???
-- itt hiányolok előtte még egy listázást:
SELECT * FROM dolg;
/* a DROP TABLE dolg; utasítást megjegyzésbe tettem inkább,
ha egyből eldobjuk, nem látjuk mit is csináltunk előtte
most viszont már megszabadulhatunk tőle */
DROP TABLE dolg;
generated 2023-01-06 21:24:37 by HeidiSQL 10.2.0.5723