Download as pdf or txt
Download as pdf or txt
You are on page 1of 18

SQL gyakorlat

SQL gyakorlat
Az Access SQL felletnek ismertetse:
Indtsuk el az Access programot! A Fjl/File men Megnyits/Open menpontjval
nyissuk meg a Vevosgyak adatbzist! Az adatbzis ablakban kattintsunk a
Lekrdezsek/Queries flre, majd a jobb oldali nyomgombok kzl az j/New
nyomgombra!
Az adatbzis-kezel rendszer ltal megjelentett ablakban vlasszuk a Tervez
nzet/Design View lista elemet s kattintsunk az OK nyomgombra!
A Tbla hozzadsa/Add Table ablakot zrjuk be, ezt kveten a kpernyn az
interaktv lekrdezs ablaka marad.
A Nzet/View men, vagy az eszkzsoron az SQL kombinlt lista segtsgvel
vlthatunk t az interaktv SQL felletre. Ugyancsak itt tudunk visszavltani az eredmnyeket
megjelent Adatlap/Datasheet nzetrl az SQL felletre.
A gyakorlat sorn mindvgig ezen a felleten dolgozunk. Nemcsak lekrdezseket,
hanem adatdefincis s feljtst vgz utastsokat is ezen a felleten keresztl adhatunk
meg.
Az ablak egy szvegszerkeszt, az utastsokat begpelni, javtani, trlni, a
szvegszerkesztkben megszokott mdon lehet. A begpelt utasts vgrehajtst krni a
Lekrdezs/Query Futtats/Execute menelemvel, vagy az eszkzsor neki megfelel, piros
felkiltjel ikonjval lehet.
A vgrehajtott s jnak tlt utastst elmenthetjk a Fjl/File men ments msknt
funkcij, Ments(Save)/Export menpontjval a kvnt knyvtrba, a kvnt nven. Ezt
kveten ne lpjnk ki az SQL felletrl, hanem trljk a kperny tartalmt s folytassuk a
munkt.
Nzet vlts

Utasts vgrehajts

Adatbzis ablak

SQL fellet

SQL gyakorlat
Egyszerre csak egy utastst tud begpelni s vgrehajtatni. Az utasts vgre a
pontosvessz elhelyezse nem ktelez. Magyarz szveg elhelyezsre s mentsre nincs
lehetsg.
A Fjl/File men Bezrs/Close menpontjval tudjuk az ablakot s az adatbzist
bezrni, a Kilps/Exit menpontjval pedig kilphetnk a rendszerbl.

Feladat lers
Egy lelmiszereket trol raktr vevinek megrendelseit kell trolnunk. A vevk a
megrendelseknl feltntetik, hogy milyen szlltsi hatridvel krik a termkek
kiszlltst, gy egy megrendelsen ugyanaz a termk tbb klnbz szlltsi hatridvel is
megjelenhet. A rendelseket egyedi rendelsszmmal azonostjk a raktrban. A
megrendelsek mellett a vevk s a termkek adatait is trolni kell, ez utbbiaknl az aktulis
kszletet s a szksges minimlis kszletet is.
Felttelek:
A vevkd a vevk krben egyedi azonost.
A cikkszm a termkek krben egyedi azonost.
A rendelsszm a megrendelsek krben egyedi azonost.
Egy vevnek tbb rendelse is lehet, de egy rendels pontosan egy vevhz tartozik.
Egy megrendelsen ugyanaz a termk tbb klnbz szlltsi hatridvel is
megjelenhet.

Adatbzis adatainak lersa


CIKKSZAM:
MEGNEVEZES:
MEGYSEG:
VTSZ:
AFAKULCS:
TERMELOIAR:
ELADASIAR:
KESZLET:
MKESZLET:
VEVOKOD:
VEVONEV:
IRANYITOSZAM:
VAROS:
UTCAHAZ:
BANKJEL:
SZAMLASZAM:
RENDELESSZAM:
DATUM:
HATARIDO:
MENNYISEG:
TDATUM:
TELJESITVE:
2

a termk cikkszma ,
a termk megnevezse,
a termkek mennyisgi egysge,
a termk vmtarifaszma,
a termk fakulcsa,
fa nlkli termeli r,
fa nlkli eladsi r,
a termkbl raktron lv kszlet,
a troland minimlis kszlet,
a vev kdja,
a vev neve ,
a vev telephelynek irnytszma,
a vev telephelye mely vrosban tallhat,
a vev telephelynek utca s hzszm adatai,
annak a banknak a jele, amelyik a vev szmljt vezeti,
a vev bankszmlaszma,
megrendels szma,
a megrendels dtuma,
az egyes termkek szlltsi hatrideje,
a szlltand mennyisg,
teljests dtuma,
rtke igaz, ha a termket kiszlltottk, klnben hamis.

SQL gyakorlat

Adatmodell
CIKK (CIKKSZAM, MEGNEVEZES, MEGYSEG, VTSZ, AFAKULCS, TERMELOIAR, ELADASIAR,
KESZLET, MKESZLET)
VEVO (VEVOKOD, VEVONEV, IRANYITOSZAM, VAROS, UTCAHAZ, BANKJEL, SZAMLASZAM)
RENDELES (RENDELESSZAM, DATUM, VEVOKOD)
RTETEL (RENDELESSZAM, CIKKSZAM, HATARIDO, MENNYISEG, TELJESITVE, TDATUM)

Az alhzssal jellt oszlopok a tblzatok elsdleges kulcsai, a dlt bettpussal rt oszlopok


pedig idegen kulcsok.

Adatbzis tblzat oszlopainak adattpusa


A tblzatokban az alhzssal jellt oszlopok elsdleges kulcsok, a dlt bettpussal rt
oszlopok pedig idegen kulcsok.
RENDELES

CIKK
CIKKSZAM
MEGNEVEZES
MEGYSEG
VTSZ
AFAKULCS

Szveg(8)
Szveg (30)
Szveg (6)
Szveg (10)
Szm

VEVO
VEVOKOD
VEVONEV
IRANYITOSZAM
VAROS
UTCAHAZ
BANKJEL
SZAMLASZAM

RENDELESSZAM
DATUM
VEVOKOD

Szveg (10)
Dtum
Szveg (10)

RTETEL
Szveg (10)
Szveg (30)
Szveg (4)
Szveg (15)
Szveg (20)
Szveg (3)
Szveg (12)

RENDELESSZAM
CIKKSZAM
HATARIDO
MENNYISEG
TELJESITVE
TDATUM

Szveg (10)
Szveg (8)
Dtum
Szm
Igen/Nem
Dtum

Lekrdezsek egy tblzatbl


1. plda: rassuk ki a rendels tblzat sszes adatt!
SELECT *
FROM rendeles;

Ez a SELECT utasts legegyszerbb formja. Eredmnyeknt a kijellt tblzat minden


sora s oszlopa, az oszlopok tblzatbeli sorrendjben megjelenik a kpernyn.

SQL gyakorlat
2. plda: rassuk ki a teljestett rendelsi tteleket!
SELECT *
FROM rtetel
WHERE teljesitve;

3. plda: rassuk ki az 1998.03.07 eltti rendelsek rendelsszmait!


SELECT rendelesszam
FROM rendeles
WHERE datum<#03/07/1998#

4. plda: Krdezzk le az 1998. mrcius msodik felben rkezett megrendelsek dtumt s


rendelsszmt! Az eredmnyt a dtumok, illetve azon bell a rendelsszmok szerinti
nvekv sorrendben jelentsk meg!
SELECT datum,rendelesszam
FROM rendeles
WHERE datum>=#03/15/1998# AND datum<=#03/31/1998#
ORDER BY rendelesszam ASC,datum ASC;

Az utasts a kvetkez formban is kiadhat, amelyben a WHERE zradkban a


BETWEEN prediktumot, az ORDER BY zradkban pedig a kifejezslistra hivatkoz
sorszmot hasznljuk. Az utbbi zradkban az ASC kulcsszt, alaprtelmezett volta miatt,
elhagytuk.
SELECT datum,rendelesszam
FROM rendeles
WHERE datum BETWEEN #03/15/1998# AND #03/30/1998#
ORDER BY 2,1;

5. plda: rassuk ki a darab mennyisgi egysg, 0% vagy 25% fakulcs termkek


cikkszmt, aktulis raktrkszlett, mennyisgi egysgt s fakulcst! Az fakulcshoz
fzzk hozz a % FA karaktersorozatot!
SELECT cikkszam, keszlet, megyseg, afakulcs&'% FA'
FROM cikk
WHERE (afakulcs=0 OR afakulcs=25) AND UCASE(megyseg)='DARAB';

Mivel nem tudhatjuk, hogy a mennyisgi egysgek kisbets, nagybets vagy kevert
formban lettek-e megadva, az UCASE fggvnnyel a trolt adatokat nagybetsre
konvertljuk az sszehasonlts idejre. Ez a konverzi az alaptblzat adatait nem vltoztatja
meg. Az utasts az IN prediktummal a kvetkez formj:
SELECT cikkszam, keszlet, megyseg, afakulcs&'% FA'
FROM cikk
WHERE afakulcs IN (0,25) AND UCASE(megyseg)='DARAB';

SQL gyakorlat
6. plda: rassuk ki az 50 s 100 forint kztti fs eladsi r termkek cikkszmt,
megnevezst s fs eladsi rt! Az adatokat az fs eladsi rak szerinti cskken
sorrendben jelentsk meg!
SELECT cikkszam,megnevezes, (1+ afakulcs/100)*eladasiar AS [fs eladsi r]
FROM cikk
WHERE (1+ afakulcs/100)*eladasiar between 50 AND 100
ORDER BY 3 DESC;

Az utasts kifejezslistjban a harmadik elemhez, az eredmny megjelentsekor


hasznland, fs eladsi r nevet rendeltk. A nevet, mint azonostt szgletes
zrjelprba kellett helyezni, mert szkzt is tartalmaz.
7. plda: Milyen klnbz mennyisgi egysg termkeket trolnak a raktrban?
SELECT DISTINCT megyseg
FROM cikk;

8. plda: Milyen klnbz vidki vrosokban vannak a vevk telephelyei? A nem


budapestiek lekrdezsnl a fvros nevnek szoksos rvidtseit is vegyk figyelembe!
SELECT DISTINCT varos
FROM vevo
WHERE varos NOT LIKE '*BUDAPEST*' AND
varos NOT LIKE '*BPEST*' AND
varos NOT LIKE '*BP*';

Az utols kt pldban a DISTINCT kulcsszval rtk el, hogy az ismtld


adatrtkek kzl csak egy jelenjen meg. A 8. plda lekrdezsben a fvros nevnek kt
szoksos rvidtst is megvizsgltuk.
9. plda: Vannak-e olyan vevk, akiknl sem a bankszmlaszma, sem a szmlt vezet bank
jele nincs megadva?
SELECT vevokod, vevonev
FROM vevo
WHERE bankjel IS NULL AND szamlaszam IS NULL;

A lekrdezs eredmnye egyetlen res sor, ami azt jelenti, hogy egyetlen sor sem kerlt
a WHERE zradkban kivlasztsra, azaz nincs ilyen vev.
A kvetkez pldk az aggregt fggvnyek teljes tblzatra vonatkoz hasznlatt
mutatjk be. A szabvny szerint a SELECT zradk kifejezslistja ilyenkor csak aggregt
fggvnyeket tartalmazhat.
10. plda: rassuk ki a nem teljestett ttelsorokbl a legrgebbi s a legjabb szlltsi
hatridt!
SELECT MIN(hatarido) AS legrgebbi, MAX(hatarido) AS legjabb
FROM rtetel Where not Teljesitve;

SQL gyakorlat
11. plda: Hny darab csokold van a raktrban? A csokoldk vmtarifaszma 87-71-el
kezddik.
SELECT SUM(keszlet) AS Darab
FROM cikk
WHERE vtsz like '87-71*';

12. plda: Hnyfle, klnbz termk van a raktrban?


SELECT COUNT(*) AS [Sorok szma], COUNT(cikkszam) AS [Termkek szma]
FROM cikk;

A kt COUNT fggvny ugyanazt az eredmnyt adja, fggetlenl attl, hogy az


argumentumaik klnbzek. Az els a sorokat, a msodik a Cikkszam oszlop NULL rtktl
klnbz rtkeit szmolja meg. Mivel a Cikk tblzatban a Cikkszam elsdleges kulcs,
ezrt nem tartalmazhat NULL rtket, teht a kt rtk megegyezik. Tovbb mivel a
Cikkszam csak egyedi rtkeket tartalmazhat, valban a klnbz termkek szmt kapjuk
meg.
13. plda: Hny klnbz termket rendeltek a 8/98-as szm megrendelsben?
SELECT COUNT(cikkszam) AS [Ttelsorok szma]
FROM rtetel
WHERE rendelesszam='8/98';

A lekrdezs eredmnye nem a klnbz megrendelt termkek szmt adja meg,


hanem azt, hogy hny ttelt rendeltek az adott megrendelsben. Mivel egy megrendelsben
ugyanazt a termket klnbz szlltsi hatridvel lehet megrendelni, az eredmnyben
lehetnek ismtld cikkszmok. Ezt az ismtldst nyomn el a tbb adatbzis-kezelben
hasznlhat, a paramterlistban elhelyezend DISTINCT kulcssz, de ennek hasznlatt az
Access nem teszi lehetv, ezrt kt lekrdezssel jutunk a kvnt eredmnyhez.
Krdezzk le elszr a 8/98-as megrendels klnbz cikkszmait!
SELECT DISTINCT cikkszam
FROM rtetel
WHERE rendelesszam='8/98';

Mentsk el az eredmnyt 13B nven, majd az elmentett lekrdezs sorainak szmt


szmoltassuk meg! gy a kvnt eredmnyt kapjuk.
SELECT COUNT(*) AS [Klnbz termkek szma]
FROM 13B;

14. plda: Mennyi a raktr aktulis kszletnek rtke fs eladsi rral szmolva?
SELECT SUM((1+afakulcs/100)*eladasiar*keszlet) AS rtk
FROM cikk;

SQL gyakorlat
Az albbi pldk a csoportosts, azon bell az alcsoportok kpzsnek, illetve a
csoportokbl trtn kivlasztsnak a hasznlatt mutatjk be.
15. plda: Az egyes bankok hny vevnek vezetik a szmljt?
SELECT bankjel, COUNT(szamlaszam) AS gyflszm
FROM vevo
GROUP BY bankjel;

Ha a COUNT fggvnyt a kifejezslistbl elhagynnk, a lekrdezs azt adn meg,


hogy milyen klnbz bankok vezetik a vevk szmlit. A COUNT aggregt fggvny a
csoportbeli rtkek szmt szmolja meg.
16. plda: Melyek azok a bankok, amelyek kettnl tbb vevnek vezetik a szmljt?
SELECT bankjel
FROM vevo
GROUP BY bankjel
HAVING COUNT(szamlaszam)>2;

A HAVING zradkkal azokat a csoportokat, azaz bankokat vlasztjuk ki, amelyek


kettnl tbb vevnek vezetik a szmljt.
17. plda: Melyek azok a bankok, amelyek egynl tbb budapesti vevnek vezetik a
szmljt? A vezetett szmlk darabszmt is jelentsk meg, s az eredmny a bankjel s a
darabszm szerint is nvekven rendezett legyen!
SELECT bankjel,COUNT(szamlaszam) AS [budapesti gyfelek szma]
FROM vevo
WHERE varos LIKE '*BUDAPEST*' AND
varos NOT LIKE '*BPEST*' AND
varos NOT LIKE '*BP*'
GROUP BY bankjel
HAVING COUNT(szamlaszam)>1
ORDER BY 1,2;

Az utastsban elszr kivlasztjuk a budapesti vevket ler sorokat, majd az


eredmnyt csoportostjuk s kivlasztjuk a felttelnek eleget tev csoportokat, vgl
rendezzk az eredmnyt.
18. plda: Melyek azok a vrosok, ahol egy-egy bank csak egy vevnek vezeti a szmljt?
SELECT varos,bankjel,COUNT(szamlaszam) AS [gyfelek szma]
FROM vevo
GROUP BY varos,bankjel
HAVING COUNT(szamlaszam)=1;

SQL gyakorlat
19. plda: Vannak-e olyan termkek, amelyek vmtarifaszma s az fakulcsa is
megegyezik? rassuk ki, hogy csoportonknt hny ilyen termket tallunk! Az eredmnyt
rendezzk az fakulcsra s a darabszmra nvekven!
SELECT vtsz,afakulcs,COUNT(cikkszam)
FROM cikk
GROUP BY vtsz,afakulcs
HAVING COUNT(*)>1
ORDER BY 2, 3;

Azokat a csoportokat kell kivlasztanunk, amelyekben a sorok szma legalbb kett, ez


jelenti ugyanis, hogy azok az adatok, amelyek alapjn csoportostottunk, tbb sorban is
megegyeznek.

sszekapcsolsi mveletek
20. plda: rassuk ki a megrendelsek adatait a ttelsorok nlkl! A vevk kdja mellett a
vevk sszes adata is jelenjen meg!
SELECT r.*,v.*
FROM rendeles r, vevo v;

A fenti lekrdezs a Rendeles s a Vevo tblzatok Descartes szorzatt lltja el.


Mindkt tblzat minden oszlopt megjelentjk. Ezt a tpus lekrdezst nagyon ritkn
hasznljuk. Azrt mutattuk meg mgis, mert ez az alapja a termszetes sszekapcsols
mveletnek.
A kt tblzatnak van kzs oszlopa, a Vevokod. Ez az oszlop a Vevo tblzatban
elsdleges kulcs, a Rendeles tblzatban idegen kulcs. A valsgnak megfelel kapcsolat
azok kztt a sorok kztt van, amelyekben a Vevokod oszlopok rtkei megegyeznek. Az
azonos rtk oszlopok kzl elgsges az egyiket megjelenteni. Ezt a termszetes
sszekapcsols mveletvel rjk el.
SELECT r.*,v.*
FROM rendeles r, vevo v
WHERE r.vevokod=v.vevokod;

Ugyancsak a termszetes sszekapcsols mvelett eredmnyezi a kvetkez, INNER JOIN


mveletet alkalmaz lekrdezs.
SELECT r.*,vevonev
FROM rendeles r INNER JOIN

vevo v ON r.vevokod=v.vevokod;

Mindkt utastsban ideiglenes msodnevet hasznltunk. Az utastsokban a Vevokod


oszlopok minstse ktelez, mivel mindkt tblzatban szerepelnek.
Mivel a JOIN mvelet nem minden szmtgpes megvalstsban ismert, a
tovbbiakban az els megoldst hasznljuk a termszetes sszekapcsols megvalstsra.
Felhvjuk a figyelmet arra, hogy a termszetes sszekapcsolsnl fontos, hogy
valamennyi felttelt megadjunk a WHERE zradkban, amely a logikailag szetartoz sorok

SQL gyakorlat
sszekapcsolshoz szksges! Ha brmelyik elmarad, a megfelel tblzatok Descartes
szorzata szerepel az eredmnyben, gy az eredmny sorainak szma megnvekszik!
21. plda: rassuk ki a rendelsek ttelsorait! Minden ttelsorban jelenjen meg a vev kdja, a
vev neve s a termk megnevezse!
SELECT v.vevokod, vevonev, t.rendelesszam, t.cikkszam, megnevezes, mennyiseg,
hatarido, teljesitve
FROM rtetel t, rendeles r, vevo v, cikk c
WHERE r.vevokod=v.vevokod AND
c.cikkszam=t.cikkszam AND
r.rendelesszam=t.rendelesszam;

Mivel a vev neve csak a Vevo tblzatban szerepel, az Rtetel tblzathoz a Rendeles
tblzatot is hozz kell kapcsolni, mivel csak gy kapjuk meg, hogy az egyes rendelsi ttelek
melyik vevhz tartoznak. Ennek eredmnyekppen a ttelsorokhoz mg csak a Vevokod lett
hozzrendelve, teht a Vevo tblzatot is ssze kell kapcsolni az elz kt tblzat
sszekapcsolsval keletkez tblzathoz. A ttelsorok gy mr tartalmazzk a rendelsek s a
vevk megfelel adatait, de mg nem tartalmazzk a termkek megnevezst. Az eredmny
tblzatot teht sszekapcsoljuk a Cikk tblzattal is. A FROM zradkban a tblzatok
felsorolsi sorrendje nem befolysolja az eredmnyt. A WHERE zradkkal vlasztjuk ki a
vals kapcsolatokat ler sorokat, azaz amelyekben az idegen kulcsok rtkei rendre
megegyeznek a hivatkozott elsdleges kulcsok rtkeivel.
A SELECT zradkban a minsts ott szksges, ahol valamely oszlop tbb
tblzatban is szerepel. Ha elhagyjuk, a rendszer hibajelzst kld. Nem hiba, ha valamennyi
oszlopot minstjk.
Az sszekapcsolsok eredmnyekppen add tblzattal mindazokat a mveleteket
elvgezhetjk, amelyeket az elz alfejezetben bemutattunk.
22. plda: rassuk ki azoknak a vevknek a kdjt s nevt, akiknek 25% fakulcs
termkbl, az sszes megrendelseiket tekintve, 10 ttelnl kevesebbet szlltottak ki! Az
eredmny a vevk neve szerint legyen abc sorrendbe rendezve!
SELECT v.vevokod, vevonev
FROM rendeles r, vevo v, rtetel t, cikk c
WHERE r.vevokod=v.vevokod AND
c.cikkszam=t.cikkszam AND
r.rendelesszam=t.rendelesszam AND
afakulcs=25 AND
teljesitve
GROUP BY v.vevokod, vevonev
HAVING COUNT(teljesitve)<10
ORDER BY vevonev;

23. plda: rassuk ki termkenknt, hogy mennyit rendeltek tlagosan a vevk az egyes
termkekbl! A cikkszm mellett a termk megnevezse is jelenjen meg, az eredmny a
megnevezs szerint nvekv sorrendbe legyen rendezett!

SQL gyakorlat
SELECT t.cikkszam, megnevezes, AVG(mennyiseg)
FROM rtetel t, cikk c
WHERE c.cikkszam=t.cikkszam
GROUP BY t.cikkszam, megnevezes
ORDER BY megnevezes;

A lekrdezsben kt oszlopra csoportostottunk, de a Megnevezes szerinti csoportosts


nem jelenti valjban j alcsoportok kpzst, hiszen a Cikkszam szerint kpzett csoportokat
vltozatlanul hagyja. Ennek oka, hogy a Cikkszam szerint kpzett csoportokon bell a
termkek Megnevezes adatai megegyeznek, mivel a Cikkszam a Cikk tblzatban elsdleges
kulcs. A SELECT oszloplistjban a termkek sszes adatt kirathatnnk. Termszetesen
minden oszlopot a GROUP BY zradkban is fel kellene tntetni, de egyik sem vltoztatna a
Cikkszam szerint kpzett csoportokon.
24. plda: A bels s a kls sszekapcsolsok kztti klnbsg rzkelsre kapcsoljuk
ssze mindhrom lehetsges mdon a Rendeles s az Rtetel tblzatokat!
SELECT r.*, t.*
FROM rendeles r INNER JOIN rtetel t ON r.rendelesszam=t.rendelesszam;
SELECT rendeles.*, rtetel.*
FROM rendeles LEFT JOIN rtetel on rendeles.rendelesszam = rtetel.rendelesszam;
SELECT rendeles.*, rtetel.*
FROM rendeles RIGHT JOIN rtetel on rendeles.rendelesszam = rtetel.rendelesszam;

A Rendeles tblzatban van olyan megrendels, a 17/98-as, amelyhez egyetlen egy


ttel sem tartozik, az Rtetel tblzatban viszont minden sorhoz tartozik egy sor a Rendeles
tblzatban. A hrom eredmnyknt kapott tblzat rszben klnbz lesz. Az els (INNER
JOIN) s harmadik (RIGHT JOIN) lekrdezs eredmnye megegyezik, mivel az Rtetel
tblzat soraihoz mindig tartozik egy sor a Rendeles tblzat soraibl. A kzps lekrdezs
(LEFT JOIN) az elzknl eggyel tbb sort eredmnyez, a 17/98-as Rendelesszammal
rendelkez sort, ahol az Rtetel tblzathoz tartoz oszlopok kitltetlenek maradnak.
25. plda: Tegyk fel, hogy a 88-22-vel kezdd vmtarifaszm termkek helyettesthetik
egymst. rassuk ki, hogy melyik termk mivel helyettesthet. A cikkszmok s a termkek
nevei is jelenjenek meg!
SELECT c1.cikkszam, c1.megnevezes, c2.cikkszam, c2.megnevezes
FROM cikk c1, cikk c2
WHERE c1.cikkszam<>c2.cikkszam AND
c1.vtsz LIKE '88-22*' AND
c2.vtsz LIKE '88-22*';

A lekrdezs egyrszt egy tblzat nmagval val sszekapcsolsra, az gynevezett


SELF JOIN-ra, msrszt pedig egy olyan a thta sszekapcsolsra mutat pldt, amikor a
thta opertorok kzl nem az egyenlsget hasznljuk.

10

SQL gyakorlat

Alkrdsek
26. plda: rassuk ki a 87-71 szmsorral kezdd vmtarifaszm termkek kzl a
termkcsoport tlagos raktrkszletnl nagyobb kszlet termkek cikkszmt s nevt!
SELECT cikkszam, megnevezes
FROM cikk
WHERE keszlet>(SELECT AVG(keszlet) FROM cikk WHERE Vtsz like *87-71*)
And Vtsz like *87-71*;

Az alkrdst a WHERE zradk tartalmazza, mely fajtjt tekintve egyetlen rtket


eredmnyez egyszer alkrds. A kt cikk tblzat fggetlen egymstl a kirtkels rendje
miatt, msodnevek hasznlata nem szksges.
A lekrdezst sszekapcsolssal nem tudnnk megoldani, mivel a Cikkszam s
Megnevezes mellett, az aggregt fggvny hasznlata megkveteln az oszlopok szerinti
csoportostst is. Ez egy-egy sorbl ll csoportokat eredmnyezne, az aggregt fggvny
ezeken a sorokon tlagolna, a tblzat kijellt rtkein elvgzend mvelet helyett.
27. plda: rassuk ki azon megrendelsek rendelsszmait, amelyeket Kovcs nev vev
rendelt!
SELECT rendelesszam
FROM rendeles
WHERE vevokod IN (SELECT vevokod FROM vevo
WHERE vevonev LIKE '*Kovcs *');

A lekrdezs az albbi sszekapcsolsi mvelettel is megvalsthat!


SELECT rendelesszam
FROM rendeles r, vevo v
WHERE r.vevokod=v.vevokod and
vevonev LIKE '*Kovcs *';

28. plda: rassuk ki azon megrendelsek rendelsszmait, melyeket a Julius Meinl cg vagy
valamelyik zlete rendelt!
SELECT rendelesszam
FROM rendeles
WHERE vevokod IN (SELECT vevokod FROM vevo
WHERE vevonev LIKE '*JULIUS MEINL*');

A 26. pldban az alkrds eredmnye egyetlen rtk volt. A 27. pldban s a jelenlegi
lekrdezsben a vevkdok egy halmazt kapjuk. A WHERE zradkban egy vevkdot kell
sszevetni egy rtkhalmazzal. Ez nem trtnhet sszehasonlt mvelet segtsgvel,
mindenkppen valamelyik alkrdssel hasznlatos prediktum alkalmazsra van szksg.
Pldnkban ez lehet az IN mellett az ANY is, melyet az = jelnek kell megelznie.

11

SQL gyakorlat
SELECT rendelesszam
FROM rendeles
WHERE vevokod=ANY(SELECT vevokod FROM vevo
WHERE vevonev LIKE '*JULIUS MEINL*');

29. plda: rassuk ki azoknak a vevknek az adatait, akik nem rendeltek semmit!
SELECT *
FROM vevo
WHERE vevokod<>ALL(SELECT DISTINCT vevokod FROM rendeles);

Az alkrds azon vevk kdjainak halmazt eredmnyezi, akiknek van legalbb egy
megrendelsk. A vev tblzatbl ezt kveten elgsges azoknak a soroknak a kivlasztsa,
amelyekben a Vevokod az alkrds ltal ellltott vevkd halmaz egyetlen elemvel sem
azonos.
Az ALL prediktum helyett a NOT IN forma is hasznlhat!
30. plda: rassuk ki a kilogramm mennyisgi egysg termkek aktulis kszletei kzl a
legnagyobb kszletet!
SELECT MAX(keszlet)
FROM cikk
WHERE megyseg=KG;

vagy
SELECT DISTINCT keszlet
FROM cikk
WHERE megyseg=KG AND keszlet>=ALL
(SELECT keszlet FROM cikk WHERE megyseg=KG)

A lekrdezs els formjt mr trgyaltuk. A msodik forma azon alapul, hogy egy
halmaz legnagyobb eleme minden egyb elemnl nagyobb, vagy legfeljebb egyenl
valamelyik elemmel. Ennl a lekrdezsnl az els az egyszerbb megolds. A msodik
formnak fontos szerepe van az olyan lekrdezsekben, amikor csoportostunk, s kt
aggregt fggvnyt kellene egymsba gyazni, ami nem megengedett. Ezt az esetet mutatja be
a kvetkez plda.
31. plda: Melyik kilogramm mennyisgi egysg termkbl rendeltk a legtbbet?
SELECT r.cikkszam, SUM(mennyiseg)
FROM rtetel r, cikk c
WHERE megyseg=KG AND r.cikkszam=c.cikkszam
GROUP BY r.cikkszam
HAVING SUM(mennyiseg)>=ALL(SELECT SUM(mennyiseg)
FROM rtetel r, cikk c
WHERE megyseg=KG AND r.cikkszam=c.cikkszam
GROUP BY r.cikkszam);

12

SQL gyakorlat
Az alkrds adja az egyes termkekbl sszesen rendelt mennyisgeket. Az alkrdst
tartalmaz utastsban, a kls krdsben, mg egyszer ellltjuk ezeket az rtkeket, majd a
HAVING zradkkal vlasztjuk ki a legnagyobbat.
A kvetkez mintapldk a korrellt alkrdsekre mutatnak pldt!
32. plda: rassuk ki azon vevk adatait, nevk szerint nvekv sorrendbe rendezve, akik
azonos nvvel rendelkeznek!
SELECT *
FROM vevo v1
WHERE v1.vevonev=(SELECT v2.vevonev
FROM vevo v2
WHERE v2.vevonev=v1.vevonev
GROUP BY v2.vevonev
HAVING COUNT(*)>1)
ORDER BY v1.vevonev;

A kls krdsben kivlasztjuk az els sorbl a vev nevt. A bels krdsben a Vevo
tblzatbl kivlasztjuk mindazokat a sorokat, ahol a nv megegyezik a kls krdsben
kivlasztott nvvel. A tblzatot e nv alapjn csoportostjuk. Mivel a nv minden sorban
azonos, az eredmny egyetlen csoport lesz. A bels krds HAVING zradkval azt
vizsgljuk meg, hogy a csoport eleminek szma nagyobb-e, mint egy, azaz tbben is viselneke azonos nevet. Ha igen, akkor az alkrds lnyegben visszaadja ugyanazt a nevet, amit a
kls krdssel az els sorbl kivlasztottunk, teht a kt nv egyenl lesz, a WHERE
zradk kivlasztsi felttele igaz rtket eredmnyez, gy az els sor adatai megjelennek az
eredmnyben. A lert eljrs a kls krdsbeli Vevo tblzat minden sorra vgrehajtdik.
33. plda: Oldjuk meg a 29. pldt korrellt alkrdssel!
SELECT *
FROM vevo v
WHERE NOT EXISTS (SELECT *
FROM rendeles r
WHERE r.vevokod=v.vevokod);

A kirtkelsi eljrs, hasonl, mint az elz pldban, csak az alkrds sorok halmazt
adja vissza.
A tblzatok sszekapcsolsa helyett hasznlhatunk egyszer alkrdseket is. Van
amikor csak az sszekapcsolsok egy rszt, van amikor valamennyit ki tudjuk vltani
alkrdssel. Az alkrdssel megoldott lekrdezsek egy rsze, de nem minden alkrdst
tartalmaz lekrdezs, sszekapcsolssal is megoldhat. A kvetkez hrom pldval ezt
kvnjuk szemlltetni.
34. plda: rassuk ki azon megrendelshez tartoz vev kdjt s a vev nevt, amelyben
megrendeltk azt a termket, melyet a legrgebben kellett volna kiszlltani s a kiszllts
mg nem trtnt meg!

13

SQL gyakorlat
SELECT DISTINCT vevokod, vevonev
FROM vevo
WHERE vevokod IN
(SELECT vevokod
FROM rendeles
WHERE rendelesszam IN
(SELECT rendelesszam
FROM rtetel
WHERE hatarido=
(SELECT MIN(hatarido)
FROM rtetel
WHERE NOT teljesitve)
AND NOT teljesitve ));

Egy vevnek tbb, a megfogalmazott felttelnek eleget tev rendelse lehet. A


DISTINCT kulcsszt azrt hasznltuk, mert egy vev tbb megrendelse ltal is kivlasztsra
kerlhet, az adatait viszont elg egyszer ltni az eredmnyben.
SELECT v.vevokod, vevonev
FROM rendeles r, vevo v, rtetel t
WHERE r.vevokod=v.vevokod AND
r.rendelesszam=t.rendelesszam AND
hatarido=(SELECT MIN(hatarido) FROM rtetel WHERE NOT teljesitve)
AND NOT teljesitve
GROUP BY v.vevokod, vevonev
HAVING COUNT(teljesitve)<10
ORDER BY 2;

Nzznk egy msik megoldst is, ahol az Rtetel tblzatot a vevk szerint
csoportostottuk. A WHERE zradk alkrdse nem helyettesthet sszekapcsolssal, mivel
akkor az aggregt fggvny nem a teljes tblzaton, hanem a csoportokon vgezn el a
vizsglatot.
35. plda: A 22. pldt oldjuk meg gy, hogy ahol lehet, a tblzatok sszekapcsolsa helyett
hasznljunk egyszer alkrdst!
SELECT vevokod, vevonev FROM vevo
WHERE vevokod IN ( SELECT r.vevokod
FROM rendeles r, rtetel t
WHERE teljesitve AND
cikkszam IN ( SELECT cikkszam
FROM cikk
WHERE afakulcs=25 ) AND
r.rendelesszam=t.rendelesszam
GROUP BY r.vevokod
HAVING COUNT(*)<10)
ORDER BY 2;

14

SQL gyakorlat
Mivel ebben az esetben is vevk szerint csoportostva kell vizsglnunk az Rtetel
tblzatot, a kzps szint SELECT utastsban szksg van az Rtetel s a Rendeles
tblzatok sszekapcsolsra, amely utn a csoportosts a Vevokod szerint elvgezhet.
36. plda: Hny ttelt rendeltek sszesen azok a vevk, akik a Budapest Banknl (BB)
vezetik a szmljukat?
SELECT COUNT(*)
FROM rtetel
WHERE rendelesszam IN
(SELECT rendelesszam
FROM rendeles
WHERE vevokod IN
(SELECT vevokod
FROM vevo
WHERE bankjel=BB));

vagy
SELECT COUNT(*)
FROM rtetel t,rendeles r, vevo v
WHERE t.rendelesszam=r.rendelesszam AND
r.vevokod=v.vevokod AND
bankjel='BB';

Mint ltjuk, ennl a krdsnl lehetsg van a csak alkrdseket, illetve a csak
sszekapcsolsi mveleteket tartalmaz megoldsra is. Megjegyezzk, hogy a 27. s a 28.
pldk is megoldhatk csak az sszekapcsolsi mvelet alkalmazsval.
Az alkrdsek trgyalsnl vgl nzzk meg, hogyan tudnnk ellenrizni az
integritsi knyszereket, ha az adatbzis kezel-rendszer ezt nem vgezn el automatikusan?
37. plda: Ellenrizzk a Cikk tblzatban az elsdleges kulcsra vonatkoz integritsi
knyszert! rassuk ki azokat a cikkszmokat, melyet nem tesznek eleget a felttelnek!
SELECT DISTINCT cikkszam
FROM cikk
WHERE cikkszam IS NULL
UNION
SELECT cikkszam
FROM cikk
WHERE cikkszam IS NOT NULL
GROUP BY cikkszam
HAVING count(cikkszam)>1;

38. plda: Ellenrizzk az Rtetel tblzat Cikkszam oszlopra, mint a Cikk tblzat Cikkszam
oszlopra hivatkoz idegen kulcsra vonatkozan az integritsi knyszer teljeslst! rassuk
ki azokat a cikkszmokat, melyet nem tesznek eleget a felttelnek!

15

SQL gyakorlat
SELECT cikkszam
FROM rtetel
WHERE cikkszam IS NOT NULL AND
cikkszam NOT IN (SELECT cikkszam
FROM cikk);

Halmazmveletek
A kvetkezkben egy-egy pldt mutatunk arra, hogy az egyests, a metszet s a
klnbsgkpzs miknt valsthat meg az Access adatbzis-kezel rendszerben. Br a
metszetre s klnbsgkpzsre nincs nll mvelet, alkrdsek alkalmazsval mindkt
mveletet megvalsthajuk.
39. plda: rassuk ki az 1/98-as s a 7/98-as rendelsszm rendelsek legalbb egyikben
megrendelt termkek cikkszmait! Minden cikkszm csak egyszer jelenjen meg, s az
eredmny cikkszm szerint nvekv sorrend legyen!
SELECT DISTINCT cikkszam
FROM rtetel
WHERE rendelesszam IN ('1/98' ,'7/98')
ORDER BY 1;

40. plda: rassuk ki azon termkek cikkszmait, melyeket mind az 1/98-as, mind a 7/98as rendelsszm megrendelsekben megrendeltek! Minden cikkszm csak egyszer jelenjen
meg, s az eredmny cikkszm szerint nvekv sorrend legyen!
SELECT DISTINCT cikkszam FROM rtetel
WHERE rendelesszam='1/98' AND
cikkszam IN (SELECT cikkszam FROM rtetel
WHERE rendelesszam='7/98' )
ORDER BY cikkszam;

41. plda: rassuk ki azon termkek cikkszmait, melyeket az 1/98-as rendelsszm


megrendeltek, de a 7/98-as megrendelsben nem! Minden cikkszm csak egyszer jelenjen
meg, s az eredmny cikkszm szerint nvekv sorrend legyen!
SELECT DISTINCT cikkszam
FROM rtetel
WHERE rendelesszam='1/98' AND
cikkszam NOT IN (SELECT cikkszam
FROM rtetel
WHERE rendelesszam='7/98' )
ORDER BY 1;

16

SQL gyakorlat

Paramteres lekrdezsek
42. plda: rassuk ki az egyes megrendelsekhez tartoz, mg ki nem szlltott rendelsi
tteleket! A rendelsszmot a lekrdezs vgrehajtsakor lehessen megadni, a rendelsszm
maga a ttelsorokban ne jelenjen meg. rassuk ki, viszont a termkek megnevezst! Az
eredmny cikkszm, illetve azon bell a szlltsi hatrid szerint nvekv sorrendbe
rendezett legyen!
PARAMETERS rszam char;
SELECT t.cikkszam, megnevezes, mennyiseg, hatarido
FROM rtetel t, cikk c
WHERE t.cikkszam=c.cikkszam AND NOT teljesitve AND rendelesszam=rszam
ORDER BY 1,4;

Kereszttbls lekrdezsek
43. plda: Ksztsnk kereszttbls lekrdezst, melynek sor fejlce a rendelsszmokat,
oszlop fejlce a cikkszmokat tartalmazza, a tblzat adatmeziben pedig az szerepel, hogy az
egyes rendelsekben az egyes termkekbl sszesen mennyit rendeltek!
TRANSFORM SUM(mennyiseg)
SELECT rendelesszam FROM rtetel GROUP BY rendelesszam
PIVOT cikkszam;

Adatdefincis s feljtsi mveletek


44. plda: A 25. pldban volt mr arrl sz, hogy bizonyos termkek helyettesthetk
egymssal. Hozzunk ltre Potol nvvel egy tblzatot, amely tartalmilag azt rja le, hogy egy
adott cikkszm termk milyen cikkszm termkekkel helyettesthet! Egy termk tbb ms
termkkel is helyettesthet, teht a tblzat elsdleges kulcsknt a kt cikkszmot egytt kell
hasznlnunk. Mindkt cikkszm a Cikk tblzat Cikkszam oszlopra hivatkoz idegen kulcs.
CREATE TABLE potol
( cikkszam CHAR(8) CONSTRAINT cikk1 REFERENCES cikk ,
pcikkszam CHAR(8)

CONSTRAINT cikk2 REFERENCES cikk,

CONSTRAINT cikk3 PRIMARY KEY (cikkszam, pcikkszam) );

Az idegen kulcsokat az egy oszlopos, az elsdleges kulcsot a tbb oszlopos


CONSTRAINT zradkkal definiltuk.
45. plda: Bvtsk a Potol tblzatot egy Engedelyezett logikai tpus oszloppal!
ALTER TABLE potol ADD COLUMN engedelyezett BIT;

46. plda: Hozzunk ltre a Potol tblzathoz egy indexet! Az index a Cikkszam, Pcikkszam
oszlopokbl kpzett indexkulcs legyen, sorrendben nvekv rendezettsggel! A NULL
rtkeket tartalmaz sorokat hagyjuk ki az indexbl.

17

SQL gyakorlat
CREATE INDEX pind ON potol (Cikkszam, Pcikkszam) WITH IGNORE NULL;

A NULL rtkek kihagyst a WITH IGNORE NULL zradkkal rtk el.


47. plda: Tltsk fel a tblzatot tudva, hogy a 88-22-vel kezdd vmtarifaszm
termkek helyettesthetik egymst.
INSERT INTO potol
SELECT c1.cikkszam AS cikkszam, c2.cikkszam AS pcikkszam
FROM cikk c1, cikk c2
WHERE c1.cikkszam<>c2.cikkszam AND
c1.vtsz LIKE '88-22*' AND
c2.vtsz LIKE '88-22*';

Az adatokat egy SELECT utastssal lltottuk el a Cikk tblzatbl. A SELECT


utasts eredmnyeknt tbb sor kerlt kivlasztsra, az INSERT utasts valamennyit beviszi
j sorknt a Potol tblzatba.
48. plda: A bevitt sorokban lltsuk az Engedelyezett oszlop rtkeit igazra, jelezve, hogy a
kiszlltsoknl a helyettests engedlyezett!
UPDATE potol SET engedelyezett=TRUE;

A WHERE zradkot elhagytuk, mivel a tblzat minden sort javtani kvntuk.


49. plda: A helyettestst a 11111112 s a 11111111 cikkszm termkek kztt is
megengedjk. Vigyk fel az adatokat ennek megfelelen a Potol tblzatba!
INSERT INTO potol (cikkszam, pcikkszam, engedelyezett) VALUES (11111111,
11111112, TRUE);

vagy
INSERT INTO potol VALUES (11111112, 11111111, TRUE);

A msodik utastsban elhagyhattuk az oszloplistt, mivel a tblzat minden oszlopba


vittnk be adatot. Mindkt utasts csak egy j sort visz be a Potol tblzatba. Az rtkeket
most konstansokbl ll rtklistval adtuk meg.
50. plda: Trljk a Potol tblzat sorait! A Potol tblzathoz ltrehoztuk a Pind nev
indexet. Trljk az indexet, majd a Potol tblzatot is!
DELETE FROM Potol;
DROP INDEX pind ON potol;
DROP TABLE potol;

A Potol tblzatot trl utasts az sszes hozz ltrehozott indexet trli, teht a Pind
egyedi trlse valjban felesleges volt. Azrt tettk meg mgis, hogy megmutassuk az
utasts hasznlatt.

18

You might also like