[]-----------------------[]
 | MySQL feladatsor G |
[]-----------------------[]

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...
a) Lépjen be olyan felhasználói névvel a kliens programba, hogy legyen jogosultsága adatbázis létrehozására, majd hozza létre a gyakorlo nevű adatbázist! Tegye aktuálissá az új (gyakorlo) adatbázist!

CREATE DATABASE gyakorlo;
USE gyakorlo;
SELECT DATABASE();
SHOW DATABASES;

b) Készítsen másolatot az sqlguru adatbázisban található _cimek tábláról a gyakorlo adatbázis cimek táblájába!

CREATE TABLE cimek SELECT * FROM sqlguru._cimek;
SHOW TABLES;
SELECT * FROM cimek;

c) Állítsa elő a cimek2 táblát úgy, hogy annak szerkezete megegyezzen a cimek tábla szerkezetével, de az új táblában ne legyenek rekordok!

CREATE TABLE cimek2 LIKE cimek;
SHOW TABLES;
DESCRIBE cimek2;
Tables_in_gyakorlo
cimek
cimek2

Field Type Null Key Default Extra
nev varchar(255) YES
irsz varchar(4) YES
varos varchar(255) YES
cim varchar(255) YES

d) A cimek2 táblába az INSERT utasítást használva vigyen fel egy rekordot!
A felvitt rekordban saját, személyes adatait szerepeltesse!

INSERT INTO cimek2 (nev, irsz, varos, cim) VALUES
('Tóth Attila', 2740, 'Abony', 'Névtelen út 23/b');
SELECT * FROM cimek2;
nev irsz varos cim
Tóth Attila 2740 Abony Névtelen út 23/b

e) A cimek2 táblában szereplő rekordot egy SQL utasítás végrehajtásával duplázza meg, azaz két saját rekord legyen a táblában!
FONTOS: A d) feladat utasítását nem használhatja!

INSERT INTO cimek2 SELECT * FROM cimek2;
SELECT * FROM cimek2;
nev irsz varos cim
Tóth Attila 2740 Abony Névtelen út 23/b
Tóth Attila 2740 Abony Névtelen út 23/b

f) A cimek2 tábla rekordjait bővítse a cimek táblában található pécsi rekordokkal de úgy, hogy az újonnan beillesztett rekordok sorrendje névsor szerint emelkedő legyen!

INSERT INTO cimek2 SELECT * FROM cimek WHERE varos = 'Pécs' ORDER BY nev;
SELECT * FROM cimek2;
nev irsz varos cim
Tóth Attila 2740 Abony Névtelen út 23/b
Tóth Attila 2740 Abony Névtelen út 23/b
ABLONCZY ANNA 7629 PÉCS KERTEKALJA U.7.
ABONYI DÁVID 7626 PÉCS HAJNAL U. 16.
ABONYINÉ CSŐRE KATALIN 7621 PÉCS SZABADSÁG UTCA 38.
... ... ... ...
stb.

g) A cimek2 táblába vigye fel a cimek tábla nem pécsi rekordjait is fizikai sorrendben!

SELECT COUNT(*) FROM cimek2;
INSERT INTO cimek2 SELECT * FROM cimek WHERE varos <> 'Pécs';
SELECT COUNT(*) FROM cimek2;

Használhatjuk a

!= vagy <>
operátorokat is a lekérdezésben, mivel a kettő technikailag azonos, de én inkább a <>-t használom, mivel az SQL-92 szabvány.

COUNT(*)
Beillesztés előtt: 6 108
Beillesztés után: 339 239

h) A cimek2 táblában található pécsi lakosokat – akiknek a neve bárhol „k” betűt tartalmaz – költöztesse Kaposvárra úgy, hogy a várost és az irányítószámot egy SQL utasítást használva változtassa meg!
A pécsi lakosok közül, akinek neve „k” betűt nem, de „t” betűt tartalmaz, költöztesse Tatára!

-- megszámolom előtte a városok lakosainak számát
SELECT COUNT(*) AS 'Kaposvár (Ir.sz: 7400) lakóinak száma' FROM cimek2 WHERE varos = 'Kaposvár';
SELECT COUNT(*) AS 'Tata (Ir.sz: 2890) lakóinak száma' FROM cimek2 WHERE varos = 'Tata';
SELECT COUNT(*) AS 'Pécs lakóinak száma' FROM cimek2 WHERE varos = 'Pécs';

UPDATE cimek2 SET irsz = 7400, varos = 'Kaposvar' 
WHERE varos = 'Pécs' AND nev LIKE '%k%';

UPDATE cimek2 SET irsz = 2890, varos = 'Tata' 
WHERE varos = 'Pécs' AND nev NOT LIKE '%k%' AND nev LIKE '%t%';

-- és megszámolom utána is
SELECT COUNT(*) AS 'Kaposvár (Ir.sz: 7400) lakóinak száma' FROM cimek2 WHERE varos = 'Kaposvár';
SELECT COUNT(*) AS 'Tata (Ir.sz: 2890) lakóinak száma' FROM cimek2 WHERE varos = 'Tata';
SELECT COUNT(*) AS 'Pécs lakóinak száma' FROM cimek2 WHERE varos = 'Pécs';
Város Előtte Utána
Kaposvár lakóinak száma 2990 5508
Tata lakóinak száma 669 2587
Pécs lakóinak száma 6106 1670

i) A cimek2 táblából törölje ki azokat a rekordokat, ahol a cím mező bárhol tartalmaz „x” karaktert!

Előtte és utána is megszámolom a táblában található rekordok számát.

SELECT COUNT(*) AS 'db előtte' FROM cimek2;

DELETE FROM cimek2 WHERE cim LIKE '%x%';

SELECT COUNT(*) AS 'db utána' FROM cimek2;
cimek2 tábla rekordjainak száma
Előtte Utána
339 239 335 842

A feladat megadott megoldásában elírás van, hiszen az egy lekérdezés, és nem törlés:

select *
from cimek2
where cim like '%x%';

j) Minden Budapesti rekordban cserélje ki a Budapest szót „Bp.” rövidítésre!

UPDATE cimek2 SET varos = 'Bp.' WHERE varos LIKE '%Budapest%';

k) Minden budapesti lakos nevének első két karakterét cserélje meg és tegye meg ugyanezt a nevek utolsó két karakterével is, majd cserélje meg a név új első karakterét az új utolsó helyen álló karakterrel!
Segítség:
left(nev,1),substring(nev,2,1),left(right(nev,2),1),right(nev,1),substring(nev,3,length(nev)-4)

Na, ezt felfogni is nehézkes volt, ezért két lépcsőben oldottam meg:

UPDATE cimek2 SET 
nev = CONCAT(
SUBSTRING(nev,2,1),LEFT(nev,1),         -- a név 2. majd 1. karaktere
SUBSTRING(nev,3,LENGTH(nev)-4),         -- a név 3. karakterétől végig, kivéve az utolsó 2
RIGHT(nev,1),left(RIGHT(nev,2),1)       -- az utolsó majd utolsó előtti karakter
) 
WHERE varos LIKE '%Bp%';

UPDATE cimek2 SET
nev = CONCAT(
RIGHT(nev,1),                           -- a név új utolsó karaktere
SUBSTRING(nev,2,LENGTH(nev)-2),         -- a 2. karaktertől az utolsó előttiig
LEFT(nev,1))                            -- a név új első karaktere
WHERE varos LIKE '%Bp%';
SELECT * FROM cimek2 WHERE varos LIKE '%Bp%';
nev irsz varos cim
NBTÁNOVICS KRISZTINANA 1025 Bp. PÉTER UTCA 40.
VBRO ÉVAVI 1011 Bp. HUNYADI J. UTCA 4.
RRDVÁNYI RÓBERTTRA 1021 Bp. ETELE ÚT 41. VII.24.
LKRÁLY ZSOLTLI 1204 Bp. BÉRKERT UTCA 48.
KNMES ERIAE 1204 Bp. GÉPÉSZ UTCA 11.
... ... ... ...
stb.

A megadott megoldás egy lépésben oldja meg:

select	left(nev,1) '1. betű',
	substring(nev,2,1) '2. betű',
	left(right(nev,2),1) 'utolsó előtti',
	right(nev,1) 'utolsó',
	substring(nev,3,length(nev)-4) 'közepe'
from cimek2
limit 1;

ut.el.	1.kar	kozepe	utolso	2.kar

update cimek2
set nev=concat(	
	left(right(nev,2),1),
	left(nev,1),
	substring(nev,3,length(nev)-4),
	right(nev,1),
	substring(nev,2,1)
	)
where varos='Bp.'

select nev from cimek2
where varos ='Bp.'

l) A cimek2 táblában azon mezők tartalmát cserélje kitöltetlenre, ahol eredetileg Pécs vagy Szekszárd szerepel!

SELECT COUNT(*) FROM cimek2 WHERE varos LIKE '%Pécs%';
SELECT COUNT(*) FROM cimek2 WHERE varos LIKE '%Szekszárd%';
SELECT COUNT(*) FROM cimek2 WHERE varos IS NULL;

UPDATE cimek2 SET 
varos = NULL 
WHERE varos LIKE '%Pécs%' OR varos LIKE '%Szekszárd%';

SELECT COUNT(*) FROM cimek2 WHERE varos LIKE '%Pécs%';
SELECT COUNT(*) FROM cimek2 WHERE varos LIKE '%Szekszárd%';
SELECT COUNT(*) FROM cimek2 WHERE varos IS NULL;
lakosok száma
Város Előtte Utána
Pécs 1 883 0
Szekszárd 1 753 0
"NULL" 0 3 636

Példa megoldása:

update cimek2
set varos= null
where varos=in('Pécs','Szekszárd');

m) A cimek2 tábla kitöltetlen mezőt tartalmazó rekordjait "helyezze át" a cimek_null táblába!

CREATE TABLE cimek_null LIKE cimek2;
INSERT INTO cimek_null
SELECT * FROM cimek2 WHERE nev IS NULL OR irsz IS NULL OR varos IS NULL OR cim IS NULL;
SELECT * FROM cimek_null;
DELETE FROM cimek2 WHERE varos IS NULL;
nev irsz varos cim
ABLONCZY ANNA 7629 KERTEKALJA U.7.
ABONYI DÁVID 7626 HAJNAL U. 16.
ABORDÁN ANNAMÁRIA 7621 SZENT LÁSZLÓ U. 178. I/6.
ÁBRAHÁM IMRÉNÉ 7632 RÓNA U. 139. FSZ. 6.
ÁBRÁNYINÉ BALOGH ILONA 7632 ÁRPÁD U.12.7/3.
... ... ... ...
stb.

Példa megoldása:

create table cimek_null select * from cimek2
where varos is null;

delete from cimek2 where varos is null;

n) A cimek_null tábla varos mezőit töltse ki a PÉCS, illetve SZEKSZÁRD városnevekkel a rekordokban szereplő irányítószámok alapján!

Ez egy igen komplikált feladat, mert hogy Pécsnek több irányítószáma is van. A feladat megoldásában a feltétel az irányítószám első 2 karakterét vizsgálja meg. Ha az '76' vagyis a hétezerhatszázas számok bármelyike, akkor az Pécs. Ez így nem igaz, mert vannak (jellemzően Pécs környéki települések) melyeknek szintén 76-tal kezdődik az irányítószámuk. Nem keresgetem meg mindegyiket, de pl Orfű: 7677
Ugyanez igaz Szekszárdra is, nem minden 71-gyel kezdődő irányítószám szekszárdi.
De nem is ez a fő probléma. Az eredeti táblázatot listázva vannak olyan pécsi lakosok, akiknek hibásan hibásan lett rögzítve az adataik:

nev irsz varos cim
TÁRSASHÁZ RIVERSIDE APARTMANOK 76 PÉCS BAGOLY U. 9/A
SPISJÁK JÁNOSNÉ 762 PÉCS PETŐFI S. U. 19.
KISS JÁNOSNÉ 7027 PÉCS ALKOTMÁNY ÚT 19 1/4
MIHÁLY DÁNIEL 7131 PÉCS CSÍKSOMLYÓ UTVA 6.A.ÉPÜLET 4/19.
KISPÁL RÓBERT JÁNOSNÉ 7363 PÉCS RITSMAN PÁL UTCA 52.B.ÉP.2.EM.1.
HOVÁTH KÁLMÁN JÁNOSNÉ 7434 PÉCS RÓZSA U. 23-25. 1/14
BOTRÁGYINÉ BESENYEI RITA 7524 PÉCS LIGET U.25.

Szerencsére ezen lakosok legtöbbje ugye tatai, vagy kaposvári lett, de ott van pl. Mihály Dániel, aki maradt pécsi lakos, majd ezért került városának null értékre állítása után a cimek_null táblába. Éppen ő lesz az aki a parancsot lefuttatva pécsi lakos létére a hibásan megadott irányítószám miatt szekszárdi lesz!
Lehetnek ilyenek még mások is, illetve szekszárdiak esetében szintén.
Ötletem nem lett rá, vagyis meg lehet oldani, de ha pontosan akarnánk eljárni, akkor az nagyon hosszas munkát igényelne, ami nem célja ennek a feladatnak.
Most itt elárulom, a feladatokat úgy oldottam meg, hogy annak megjelenítő ablakát keskenyre állítva, egy-egy sort görgetve, mindig csak a feladatot olvastam el (a segítségig vagy a megoldásig nem görgettem), csak így láttam értelmét. Mert így kényszerítettem magam a gondolkodásra. Próbálgattam ötleteimet, ha meg abszolut lövésem sem volt, akkor a google-ban kerestem segítséget. Majd ha meg volt a feladat megoldása, akkor hasonlítottam össze a feladatban megadott segítséggel. Most itt nem tudtam mire gondoljak, hogy viszonyítsam a városokat az irányítószámokhoz? (Korábban is előfordult, valamelyik feladatsorban, akkor a Ferencekkel volt probléma, vagyis inkább ezen nevek női viselőivel.)
Így most én is a feladat segítségénel megadott logikát követem, bár tudva azt hogy nem teljesen helyes:

UPDATE cimek_null SET varos = 'Pécs' WHERE LEFT(irsz,2) = '76';
UPDATE cimek_null SET varos = 'Szekszárd' WHERE LEFT(irsz,2) = '71';
SELECT * FROM cimek_null WHERE varos IS NULL;

Lefuttatva kaptunk is egy szép listát (102 db címmel), azokkal a címekkel, amiknek nem tudott városnevet adni.

nev irsz varos cim
DR KANYÓNÉ MOLNÁR REGINA 7720 CSALITOS ÚT 51.
DÓRÁNÉ PASLER ELVIRA TAMARA 710 KAKUKK UTCA 54.
FAGUSS ERDÉSZETI KORLÁTOLT FELELŐSS 7720 KLAPKA U. 23.
FRANCIA VIKTÓRIA 7762 SZIRTES ÚT 28/A. II/6.
FRIEDMAN ALEXANDER 7720 PF. 737.
FUCHS LÍVIA 7720 FELSZABADULÁS U. 49.
... ... ... ...
stb.

o) Törölje ki a gyakorlo adatbázis minden tábláját egyetlen SQL utasítással!

DROP TABLE cimek, cimek2, cimek_null;

p) Törölje ki a gyakorlo adatbázist!

DROP DATABASE gyakorlo;

generated 2023-01-08 11:12:31 by HeidiSQL 10.2.0.5723