[]-----------------------[]
 | 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

count(*)
1024

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;
nev beldat fiz

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