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