You are on page 1of 21

1

Abonyi-Tth Andor:
ADATBZISKEZELS SQL NYELVEN
(Cikksorozat a www.sulinet.hu portlrl. tszerkesztette s kiegsztette: Szentendrey Pter)
TARTALOM
Bevezet ......................................................................................................................................................... 1
Ismerkeds az SQL-el................................................................................................................................. 1
Az SQL utastsok fajti............................................................................................................................. 2
A SELECT utasts......................................................................................................................................... 2
A DISTINCT opci .................................................................................................................................... 3
Lekrdezs eredmnynek szktse (WHERE) ........................................................................................ 4
Mveleti jelek a WHERE felttelben......................................................................................................... 5
Az eredmnyhalmaz rendezse ...................................................................................................................... 7
A TOP opci............................................................................................................................................... 9
A WHERE felttelek sszekapcsolsa ........................................................................................................... 9
Az OR (vagy) s AND (s) mveletek..................................................................................................... 10
Az IN mvelet .......................................................................................................................................... 10
BETWEEN ... AND mvelet ................................................................................................................... 11
Tagads (NOT)......................................................................................................................................... 12
Az ALIAS hasznlata................................................................................................................................... 12
Szmtott mezk ltrehozsa ........................................................................................................................ 13
sszest (Aggregl) fggvnyek .............................................................................................................. 13
Csoportkpzs A GROUP BY zradk ..................................................................................................... 14
A HAVING zradk..................................................................................................................................... 15
Tblk sszekapcsolsa (JOIN).................................................................................................................... 15
INNER JOIN............................................................................................................................................ 17
LEFT JOIN............................................................................................................................................... 17
RIGHT JOIN............................................................................................................................................ 17
nilleszts ................................................................................................................................................ 18
Begyazott lekrdezs (allekrdezs)........................................................................................................... 18
A SELECT INTO utasts............................................................................................................................ 18
Az INSERT INTO utasts........................................................................................................................... 19
Az UPDATE utasts.................................................................................................................................... 20
A DELETE utasts ...................................................................................................................................... 21

BEVEZET
Az SQL (Structured Query Language - Strukturlt Lekrdez nyelv) relcis adatbzisok kezelsre alkalmas,
szabvnyos lekrdez nyelv, amelynek fejlesztse az 1970-es vekben kezddtt az IBM berkein bell, igaz
akkor mg SEQUEL-nek neveztk. (Structured English QUEry Language) Ksbb ms cgek termkeiben is
megjelent a lekrdez nyelv (pl. Oracle, Microsoft), 1987-tl pedig ANSI szabvny lett, amelyet manapsg
(nhny mdostssal) csaknem minden relcis adatbziskezel rendszer alkalmaz.
ISMERKEDS AZ SQL-EL
Egy relcis adatbzisban az adattrols alapjait a tblk jelentik. Egy adatbzis ltalban tbb tblbl ll. A
tblk a logikailag sszetartoz adatok sorokbl s oszlopokbl ll elrendezse. A tblk sorait
adatrekordoknak, oszlopait rekordmezknek nevezzk. Az adatbzist alkot egyedek a tblzat soraiban, az
egyedtulajdonsgok pedig az oszlopaiban tallhatk.
2
A klnbz tblknak egyedi neve van. (pldul tanarok, diakok)
(az kezetes betk hasznlatt kerljk!)
Nzznk egy egyszer pldt. Az albbi tbla neve legyen: diakok
nev szuletesi_hely szuletesi_ev
Kiss Irma Budapest 1991
Horvth Bla Kisvrda 1990
Jeney va Karcag 1988
Turn Lajos Abony 1990
A fenti tblzat 4 rekordot (szemlyenknt egyet) tartalmaz, amelynek 3 mezje van. (Nv, szletsi hely,
szletsi v)
Hogyan tudjuk lekrdezni SQL nyelven a diakok tblban tallhat neveket?
SELECT nev FROM diakok;
A lekrdezs eredmnye a kvetkez lenne:
nev
Kiss Irma
Horvth Bla
Jeney va
Turn Lajos
AZ SQL UTASTSOK FAJTI
Az SQL utastsokat csoportosthatjuk a cljuk szerint. Mi az albbi kategrikba tartoz, leggyakrabban
hasznlt utastsokat tekintjk t.
Lekrdez utastsok (DQL, vagyis DATA QUERY LANGUAGE)
o az adatbzisbl trtn lekrdezseket teszi lehetv
Adatler utastsok (DDL, vagyis Data Definition Language)
o ezekkel tudunk pldul klnbz tblkat (s ms objektumokat) ltrehozni, mdostani,
trlni...
Adatmdost utastsok (DML, vagyis Data Manipulation Language)
o ezek szolglnak az adatok bersra, mdostsra s trlsre
A SELECT UTASTS
Az elzekben mr hasznlt SELECT utastssal a tblzatbl szelektlhatunk (vlogathatunk) ki adatokat,
eredmnyl egy n. eredmnytblt kapunk. Az eredmnytbla hasonlt az adattblkhoz, de csak ideiglenesen
jn ltre a lekrdezs futtatsakor s nem troldik az adatbzisban. Az eredmnytblt a SELECT utasts n.
zradkaival szrhetjk, rendezhetjk, csoportosthatjuk, vagy akr jabb lekrdezst is vgezhetnk rajta
(begyazott-, avagy allekrdezsek).
Hasznlata:
SELECT oszlop_nevek FROM tbla_neve;
3
Megjegyzs: az SQL nyelv parancsaiban a kis- s nagybetk nincsenek megklnbztetve. A jobb tlthatsg
rdekben mi csupa nagy betvel rjuk a nyelv alapszavait.
Az oszlopneveket vesszvel kell elvlasztani. A fenti pldnl maradva:
SELECT nev,szuletesi_hely FROM diakok;
Az eredmny:
nev szuletesi_hely
Kiss Irma Budapest
Horvth Bla Kisvrda
Jeney va Karcag
Turn Lajos Abony
Ha az sszes mez rtkt le szeretnnk krdezni, akkor nem szksges felsorolni az sszes oszlop nevt,
hasznlhatjuk a * karaktert is.
SELECT * FROM diakok;
A fenti lekrdezssel az sszes rekord tartalmt le tudjuk krdezni. Az eredmny:
nev szuletesi_hely szuletesi_ev
Kiss Irma Budapest 1991
Horvth Bla Kisvrda 1990
Jeney va Karcag 1988
Turn Lajos Abony 1990
Az itt lthat eredmnyhalmazban trtn navigcihoz a klnbz rendszerek felknlnak olyan
lehetsgeket, amelyekkel pldul az els, elz, kvetkez, vagy utols rekordra "llhatunk", illetve
kinyerhetjk az egyes mezk tartalmt.
A DISTINCT OPCI
Mi a helyzet akkor, ha neknk csak arrl kell kimutats, hogy a dikok mely vben szlettek, s az mellkes,
hogy egy adott vben tbb dik is szletett. Erre is van lehetsg, de ekkor a
SELECT DISTINCT oszlop_nevek FROM tbla_neve;
lekrdezst kell hasznlnunk. A mi pldnkban:
SELECT DISTINCT szuletesi_ev FROM
diakok;
Az eredmny:
szuletesi_ev
1991
4
1990
1988
Lthat, hogy az eredmnyhalmaz minden szletsi vet tartalmaz, de csak egyszer.
A DISTINCT hatsra a rendszer az eredmnytblbl elhagyja azokat a rekordokat, amelyek tbbszrs
adatokat tartalmaznak a kivlasztott mezkben. Ahhoz, hogy a lekrdezs eredmnyben szerepeljenek, a
SELECT utastsban felsorolt mezkben lv rtkeknek egyedieknek kell lennik. Pldul az Employees tbla
tbb azonos vezetknev szemly adatait is tartalmazhatja. Ha kt olyan rekord is van, amelynl a LastName
(vezetknv) mez tartalma Kovcs, az albbi SQL-utasts ezek kzl csak egyet fog visszaadni:
SELECT DISTINCT
LastName
FROM Employees;
Ha a DISTINCT kijelentst elhagyjuk, a lekrdezs mindkt Kovcs vezetknevet tartalmaz rekordot
visszaadja.
Ha a SELECT DISTINCT utasts egynl tbb mezt tartalmaz, akkor az sszes mezben tallhat rtkek
kombincijnak kell egyedinek lennie egy rekord esetben ahhoz, hogy a rekord szerepeljen az eredmnyben.
LEKRDEZS EREDMNYNEK SZKTSE (WHERE)
J lenne, ha tovbb tudnnk szkteni a lekrdezsek eredmnyt. Termszetesen van r lehetsg, de ehhez
egy tovbbi felttellel kell kiegszteni a lekrdezst, amelyet a WHERE kulcssz utn kell rni.
SELECT oszlop_nevek FROM tbla_neve WHERE oszlopra vonatkoz felttel;
Hogy vilgos legyen, nzznk meg egy pldt.
SELECT nev FROM diakok WHERE szuletesi_ev=1990;
A fenti lekrdezs eredmnyeknt az 1990-ben szletett dikok nevt kapjuk meg.
nev
Horvth Bla
Turn Lajos
Nzznk egy msik pldt!
SELECT nev FROM diakok WHERE
szuletesi_hely='Abony';
Az eredmny:
nev
Turn Lajos
szrevetted a kt lekrdezs kzti klnbsget? Amikor szveget runk a felttelbe, azt aposztrf jelek (') kz
kell tenni. Nmelyik rendszer (Pl. Access) azt is elfogadja, ha idzjelet (") hasznlunk.
5
Persze az egyenlsgjel csak egy lehetsges mveleti jel, az albbiakat is hasznlhatjuk.
MVELETI JELEK A WHERE FELTTELBEN
Mvelet Lers
= egyenl
Plda SELECT nev FROM diakok WHERE
szuletesi_hely='Abony';
Eredmny
nev
Turn Lajos

<> nem egyenl
Plda SELECT nev FROM diakok WHERE
szuletesi_hely<>'Abony';
Eredmny
nev
Kiss Irma
Horvth Bla
Jeney va

< kisebb, mint ....
Plda SELECT nev FROM diakok WHERE
szuletesi_ev<1990;
Eredmny
nev
Kiss Irma

> nagyobb, mint ...
Plda SELECT nev FROM diakok WHERE
szuletesi_ev>1990;
Eredmny
nev
Jeney va

<= kisebb vagy egyenl, mint ...
Plda SELECT nev FROM diakok WHERE
szuletesi_ev<=1990;
Eredmny
nev
Kiss Irma
Horvth Bla
Turn Lajos

>= nagyobb vagy egyenl, mint ...
Plda SELECT nev FROM diakok WHERE
szuletesi_ev>=1990;
Eredmny
nev
Horvth Bla
6
Turn Lajos

LIKE egy keressi minta alapjn keres
A minta megadsnl hasznlhatod a % karaktert,
amely tbb karakter helyettestsre szolgl. Egy
karakter helyettestsre a _ mintt hasznlhatod.
Plda:
'K%' : K betvel kezdd szveg
'%A' : A betvel vgzd szveg
'A%U' : A betvel kezdd, U betvel vgzd
szveg
'%MA%' : minden olyan szveg, amely tartalmazza
a MA karaktereket.
'K_A' : K betvel kezdd s A-val vgzd, 3
karakterbl ll szveg
Plda SELECT nev FROM diakok WHERE szuletesi_hely
LIKE 'K%';
Eredmny
nev
Horvth Bla
Jeney va

BETWEEN egy keressi intervallumot adhatunk meg
Plda SELECT nev FROM diakok WHERE szuletesi_ev
BETWEEN 1988 and 1990;
Eredmny
(a mySQL
krnyezetben)
nev
Horvth Bla
Jeney va
Turn Lajos

Vigyzz! Ezt a funkcit az egyes adatbziskezel
rendszerek eltren valsthatjk meg. Van amelyik
a kt megadott rtket is megjelenti az
eredmnyhalmazban, de van amelyik csak a kztk
lv rtket, st ms kombinci is lehet. Felttlenl
meg kell bizonyosodnod errl az ltalad hasznlt
rendszerben.
FIGYELEM!
Az Access adatbziskezelben a Windows hagyomnyoknak megfelelen a ? s a * helyettest karaktereket
hasznlhatjuk!
7

A kvetkez tblzat sszefoglalja, hogy a Like mvelettel miknt vizsglhatunk klnbz mintkra
vonatkoz kifejezseket:
Helyettestend Minta Megfelel
(True rtket ad
vissza)
Nem felel meg
(False rtket ad vissza)
Tbb karakter a*a aa, aBa, aBBBa aBC
*ab* abc, AABB, Xab aZb, bac
Specilis karakter a[*]a a*a aaa
Tbb karakter ab* abcdefg, abc cab, aab
Egyetlen karakter a?a aaa, a3a, aBa aBBBa
Egyetlen szmjegy a#a a0a, a1a, a2a aaa, a10a
Karaktertartomny [a-z] f, p, j 2, &
Tartomnyon
kvli
[!a-z] 9, &, % b, a
Nem szmjegy [!0-9] A, a, &, ~ 0, 1, 9
Kombinlt a[!b-m]# An9, az0, a99 abc, aj0
Azt, hogy egy rekordban egy bizonyos meznek nincs rtke (res) a kvetkezkpp fogalmazhatjuk meg a
WHERE zradkban:
SELECT mezonev
FROM tablanev
WHERE mezonev IS NULL ;
Azt, hogy egy mez nem res, az IS NOT NULL hasznlatval fejezhetjk ki.
AZ EREDMNYHALMAZ RENDEZSE
8
Gyakorta elfordul, hogy az eredmnyhalmazt valamelyik mez alapjn rendezni szeretnnk. Pldul az
iskolaigazgatnak szksge van a dikok nevre, amelyet bc sorrendben szeretne megkapni.
Hogy tudjuk ezt megvalstani? Az ORDER BY kulcssz utn meg kell adnunk, hogy mely mez (vagy mely
mezk) szerint trtnjen a sorrendbe llts.
SELECT oszlop_nevek FROM tbla_neve ORDER BY oszlop_neve1, ..., oszlop_neven;
Plda: Krdezzk le a nvsort, nv szerint rendezve!
SELECT * FROM diakok ORDER BY nev;
Az eredmny:
nev szuletesi_hely szuletesi_ev
Horvth Bla Budapest 1991
Horvth Bla Kisvrda 1990
Horvth Csilla Kaposvr 1989
Jeney va Karcag 1988
Kassai Tnde Nagykanizsa 1991
Turn Lajos Abony 1990
Ha azt szeretnnk, hogy amellett, hogy a nevek bc sorrendben jelenjenek meg, mg a szletsi dtum szerint
is rendezve legyen az eredmnyhalmaz, tbb mezt is fel kell sorolnunk. (vigyzzunk a mezk sorrendjre!)
SELECT * FROM diakok ORDER BY nev,szuletesi_ev;
Az eredmny:
nev szuletesi_hely szuletesi_ev
Horvth Bla Kisvrda 1990
Horvth Bla Budapest 1991
Horvth Csilla Kaposvr 1989
Jeney va Karcag 1988
Kassai Tnde Nagykanizsa 1991
Turn Lajos Abony 1990
Ltjuk, hogy az eredmnyhalmaz els kt sora felcserldtt, hiszen a Budapesten szletett Horvth Bla nev
tanul korbban szletett, mint az ugyanilyen nev, Kisvrdn szletett trsa.
De mi a helyzet, ha fordtott sorrendben szeretnnk megkapni az adatokat? Erre is van lehetsg:
SELECT oszlop_nevek FROM tbla_neve ORDER BY oszlop_neve1 ASC|DESC, ..., oszlop_neven
ASC|DESC;
Az ASC kulcsszt kell szerepeltetnnk, ha nvekv, illetve a DESC kulcsszt ha cskken sorrendben
szeretnnk az eredmnyt megkapni.
9
Plda:
Az igazgatnak olyan listra van szksge, amely a szletsi dtumok szerint cskken, a nevek szerint viszont
nvekv sorrendbe van rendezve.
SELECT * FROM diakok ORDER BY szuletesi_ev DESC,
nev ASC;
Az eredmny:
nev szuletesi_hely szuletesi_ev
Horvth Bla Budapest 1991
Kassai Tnde Nagykanizsa 1991
Horvth Bla Kisvrda 1990
Turn Lajos Abony 1990
Horvth Csilla Kaposvr 1989
Jeney va Karcag 1988
A TOP OPCI
TOP n [PERCENT] Az ORDER BY zradk segtsgvel fellltott sorrend elejn vagy vgn tallhat,
megadott tartomnyba es rekordokat adja vissza. Tegyk fel, hogy az 1994-es vfolyam els 25 tanuljnak
nevt szeretnnk megkapni:
SELECT TOP 25
FirstName, LastName
FROM Students
WHERE GraduationYear = 1994
ORDER BY GradePointAverage DESC;
Ha az ORDER BY zradkot elhagyjuk, a lekrdezs 25 tetszleges, a WHERE zradk feltteleit kielgt
rekordot ad vissza a Students (tanulk) tblbl.
A TOP kijelents nem vlaszt az egyenl rtkek kzl. Az elbbi pldban, ha a 25. s 26. legmagasabb
tlagos vizsgapontszm egyenl, a lekrdezs 26 rekordot fog visszaadni.
A PERCENT fenntartott sz segtsgvel a rekordok bizonyos szzalkt is lekrdezhetjk az ORDER BY
zradk ltal fellltott sor elejrl vagy vgrl. Tegyk fel, hogy az els 25 tanul helyett az osztly utols 10
szzalkra vagyunk kvncsiak:
SELECT TOP 10 PERCENT
FirstName, LastName
FROM Students
WHERE GraduationYear = 1994
ORDER BY GradePointAverage ASC;
A WHERE FELTTELEK SSZEKAPCSOLSA
Emlkezznk, hogy a WHERE kulcssz utn megadhattunk egy felttelt, amely alapjn szrtk az
eredmnyhalmazt.
10
SELECT nev FROM diakok WHERE szuletesi_ev=1990;
Azonban ezen feltteleket ssze is tudjuk kapcsolni klnbz mveletekkel. Pldul AND (s), illetve OR
(vagy).
AZ OR (VAGY) S AND (S) MVELETEK
A mveletek hasznlati mdja:
SELECT oszlop_nevek FROM tbla_neve WHERE oszlop_neve mveleti_jel rtk AND oszlop_neve
mveleti_jel rtk;

SELECT oszlop_nevek FROM tbla_neve WHERE oszlop_neve mveleti_jel rtk OR oszlop_neve
mveleti_jel rtk;
Plda (AND mvelet)
Ksztsnk egy listt azon dikokrl, akiknek a csaldi neve Horvth s 1990-ban, vagy ksbb szlettek.
SELECT * FROM diakok
WHERE nev LIKE 'Horvth%' AND szuletesi_ev>=1990;
Az eredmny:
nev szuletesi_hely szuletesi_ev
Horvth Csilla Kaposvr 1989
Horvth Bla Kisvrda 1990
Plda (OR mvelet)
Ksztsnk egy listt azon dikokrl, akik 1991-ben vagy 1990-ban szlettek!
SELECT * FROM diakok
WHERE szuletesi_ev=1991 OR szuletesi_ev=1990;
Az eredmny:
nev szuletesi_hely szuletesi_ev
Horvth Bla Kisvrda 1990
Turn Lajos Abony 1990
Horvth Bla Budapest 1991
Kassai Tnde Nagykanizsa 1991

AZ IN MVELET
Ha az alapjn szeretnnk szrni, hogy a mez rtke egy adott felsorolshalmazba tartozik-e, hasznlhatjuk az
IN mveletet.
SELECT oszlop_nevek FROM tbla_neve WHERE oszlop_neve IN (rtk1, rtk2, ...) ;
11
Plda:
Azt szeretnnk megtudni, hogy mely tanulk szlettek Karcagon, illetve Kisvrdn. Ehhez a kvetkez
lekrdezsre van szksg:
SELECT * FROM diakok
WHERE szuletesi_hely IN ('Karcag', 'Kisvrda');
Az eredmny:
nev szuletesi_hely szuletesi_ev
Jeney va Karcag 1988
Horvth Bla Kisvrda 1990
BETWEEN ... AND MVELET
Ha egy intervallum alapjn akarjuk szkteni a felttelt, hasznlhatjuk a BETWEEN ... AND mveleteket is:
SELECT oszlop_nevek FROM tbla_neve WHERE oszlop_neve BETWEEN rtk1 AND rtk2 ;
Ksztsnk egy listt azon dikokrl, akik 1988 s 1990 kztt szlettek.
SELECT * FROM diakok
WHERE szuletesi_ev BETWEEN 1988 AND 1990;
Az eredmny:
nev szuletesi_hely szuletesi_ev
Horvth Bla Kisvrda 1990
Horvth Csilla Kaposvr 1989
Jeney va Karcag 1988
Turn Lajos Abony 1990
Ez a mvelet azonban nem csak szmok esetn mkdik, akr kilistzhatjuk azon tanulk nevt is, akik
bcsorrendben Jeney va s Turn Lajos kztt helyezkednek el.
SELECT * FROM diakok
WHERE nev BETWEEN 'Jeney va' AND 'Turn Lajos';

nev szuletesi_hely szuletesi_ev
Jeney va Karcag 1988
Turn Lajos Abony 1990
Kassai Tnde Nagykanizsa 1991
(Vigyzzunk arra, hogy ez a funkci ms-ms eredmnyt adhat az elr adatbziskezel rendszerekben. Van
ahol csak a kt rtk kztt tallhat eredmnyek lesznek rszei az eredmnyhalmaznak, a hatrrtkek nem,
12
ezrt ezen funkci mkdst nagyon fontos letesztelni az adott rendszerben! Az Access adatbziskezel a
hatrrtkeket is hozzveszi az eredmnyhalmazhoz, teht a BETWEEN 1 AND 20 felttel egyenrtk a >=1
AND <= 20 felttellel.)
TAGADS (NOT)
Amennyiben pont arra a halmazra van szksgnk, amelyet a felttel tagadsval kapnnk, hasznlhatjuk a
NOT szcskt is.
SELECT oszlop_nevek FROM tbla_neve WHERE oszlop_neve NOT BETWEEN rtk1 AND rtk2 ;
Ksztsnk egy listt azon dikokrl, akik NEM 1988 s 1990 kztt szlettek.
SELECT * FROM diakok
WHERE szuletesi_ev NOT BETWEEN 1988 AND 1990;
Az eredmny:
nev szuletesi_hely szuletesi_ev
Horvth Bla Budapest 1991
Kassai Tnde Nagykanizsa 1991
AZ ALIAS HASZNLATA
Ha az eredmnytblban nem az eredeti oszlopneveket szeretnnk viszontltni, hasznlhatunk helyettk
lneveket, vagyis aliasokat is.
SELECT oszlop_neve1 AS oszlop_alias1, oszlop_neve2 AS oszlop_alias2 FROM tbla_neve;
Plda:
A tblzatunk a kvetkez:
nev szuletesi_hely szuletesi_ev
Jeney va Karcag 1988
Horvth Csilla Kaposvr 1989
Horvth Bla Kisvrda 1990
Turn Lajos Abony 1990
Horvth Bla Budapest 1991
Kassai Tnde Nagykanizsa 1991
Mit tehetnk akkor, ha olyan eredmnyhalmazra van szksgnk amely csak a nev, s szuletesi_ev oszlopokat
tartalmazza, s az oszlopok neve angolul szerepel?
SELECT nev AS Name, szuletesi_ev AS Birthdate FROM diakok;
Az eredmny:
Name Birthdate
13
Jeney va 1988
Horvth Csilla 1989
Horvth Bla 1990
Turn Lajos 1990
Horvth Bla 1991
Kassai Tnde 1991
SZMTOTT MEZK LTREHOZSA
Az adatbzisokat clszer gy megtervezni, hogy ne troljunk bennk olyan adatokat, amelyek kiszmthatk a
tbbi trolt adatbl. (Pl. ha troljuk rucikkek nett rt s az FA kulcsot, akkor felesleges trolni a brutt
rat.) Az ilyen, szmtott rtkeket a lekrdezsekben a kvetkezkppen jelenthetjk meg:
SELECT Netto_Ar * AFA / 100 AS Brutt_Ar FROM Termekek ;
SELECT Date ( ) + 10 AS Tiz_Nap_Mulva FROM
SELECT Vezeteknev & & Keresztnev AS Teljes_Nev FROM Szemelyek ;
A szmtsokban alkalmazhatjuk a szoksos matematikai mveleteket, valamint az adatbziskezel rendszer
ltal biztostott klnfle opertorokat s fggvnyeket. (Lsd az adatbziskezel dokumentcijt / sgjt.)
SSZEST (AGGREGL) FGGVNYEK
A lekrdezs eredmnyeknt elll tblk egyes oszlopaiban lv rtkeken vgrehajthatunk bizonyos
sszest mveleteket, amelyek egyetlen rtket lltanak el.
AVG()........................ tlag
SUM()........................ sszeg
COUNT()................... darabszm
MAX() ....................... maximlis rtk
MIN()......................... minimlis rtk
FIRST() / LAST()...... egy lekrdezs eredmnyhalmaznak els vagy utols rekordjbl ad vissza mezrtket.
A Null rtk hatsa numerikus szmtsokra
Ha sszest fggvny segtsgvel szmtunk sszeget, tlagot, darabszmot vagy ms mennyisget mez
rtkein, az abban a mezben Null rtkeket tartalmaz rekordok nem szmtanak bele az eredmnybe. (Ez
akkor is igaz, ha az sszestst a lekrdezs tervezrcsnak sszests sora, az Egyszer lekrdezs Varzsl
vagy egyni kifejezs segtsgvel szmtjuk.) Ha pldul a Count fggvnnyel szmoljuk meg a mez
rtkeinek szmt, ez a nem Null rtk rekordok szmt adja vissza. Ha a Null rtket tartalmazkat is be
szeretnnk venni az eredmnybe, a Count fggvnyt csillag (*) helyettest karakterrel kell hasznlni.
Ha mveleti jel (pldul +, -, *, /) is szerepel a kifejezsben (pldul [Raktron]+[Megrendelve]), s a kifejezs
mezinek egyike Null rtket tartalmaz, az egsz kifejezs eredmnye Null rtk lesz.
Pldk:
Az zletktk tlagfizetse: SELECT AVG (sal) FROM amp WHERE job = SALESMAN;
Hny dolgoz van: SELECT COUNT(*) FROM emp;
Hny klnbz beoszts van: SELECT COUNT(DISTINCT job) FROM emp;
14
Mivel az oszlopfggvny eredmnye egyetlen rtket llt el, az oszlopfggvny mell vagy ms
oszlopfggvnyeket rhatunk, vagy olyan rtket rhatunk, amelyik az sszes kivlasztott sorban azonos.
SELECT job, AVG(sal) FROM emp WHERE job =SELESMAN;
SELECT COUNT (*), AVG(sal) FROM emp;
De hibs a kvetkez:
SELECT COUNT (*), ename FROM emp;
CSOPORTKPZS A GROUP BY ZRADK
A megadott mezlista azonos rtk rekordjait egyetlen rekordcsoportt alaktja. Ha SQL sszest fggvnyt,
pldul Sum vagy Count fggvnyt adunk meg a SELECT utastsban, akkor minden rekordcsoporthoz ltrejn
sszegrtk.
Szintaxis
SELECT mezlista
FROM tbla
WHERE felttel
[GROUP BY mezcsoportlista]
Egy GROUP BY zradkot tartalmaz SELECT utasts a kvetkez rszekbl ll:
Rsz Lers
Mezlista A megjelentend mez vagy mezk neve az alias nevkkel egytt, az SQL sszest
fggvnyek, a kivlaszt kijelentsek (ALL, DISTINCT, TOP) vagy a SELECT utasts
egyb belltsai.
Tbla A rekordok keressekor hasznlni kvnt tbla neve.
Felttel A kivlaszts felttelei. Ha az utasts WHERE zradkot tartalmaz, az
adatbzismotor csak azt kveten csoportostja az rtkeket, hogy a WHERE
zradkban megadott feltteleket mr alkalmazta a rekordokra!
Mezcsoportlista Legfeljebb 10 mez neve, amelyekkel a rekordokat csoportostjuk. A
mezcsoportlistban megadott sorrend hatrozza meg a csoportostsi szinteket, a
legmagasabbtl a legalacsonyabb szintig.
A GROUP BY mezk Null rtkei nem maradnak ki a csoportostsbl. Az SQL sszest fggvnyek azonban
nem veszik figyelembe a Null rtkeket.
A csoportostsbl kizrni kvnt sorokat a WHERE zradkkal hatrozhatjuk meg, csoportosts utn pedig a
HAVING zradkkal szrhetjk a rekordokat.
A SELECT mezlista minden mezjnek szerepelnie kell vagy a GROUP BY zradkban, vagy az SQL
sszest fggvny argumentumai kztt!
Ha pldul a tanulk nevt, osztlykdjt s letkort is tartalmaz TANULOK tblbl ki szeretnnk ratni az
egyes osztlyok tlagletkort, akkor ezt a kvetkez utastssal rhetjk el:
SELECT osztalykod, Avg (eletkor) AS tlagletkor
FROM tanulok
GROUP BY osztalykod ;
15
A HAVING ZRADK
Megadja, hogy mely csoportostott rekordok jelennek meg egy GROUP BY zradkot tartalmaz SELECT
utasts vgrehajtsakor. Miutn a GROUP BY csoportostotta a rekordokat, a HAVING megjelenti a GROUP
BY zradkkal csoportostott sszes olyan rekordot, amely eleget tesz a HAVING zradk feltteleinek.
Szintaxis
SELECT mezlista
FROM tbla
WHERE felttel
GROUP BY csoportmezlista
[HAVING csoportokra vonatkoz felttel]
A HAVING zradkot tartalmaz SELECT utasts rszei:
Rsz Lers
Mezlista A visszakeresend mez vagy mezk neve az alias nevkkel egytt, az SQL
sszest fggvnyek, a kivlaszt kijelentsek (ALL, DISTINCT, TOP) vagy a
SELECT utasts egyb belltsai.
Tbla A rekordok lekrdezshez hasznlni kvnt tbla neve.
Felttel A kivlasztsi felttel. Ha az utasts WHERE zradkot tartalmaz, az
adatbzismotor csak azt kveten csoportostja az rtkeket, hogy a WHERE
zradkban megadott feltteleket alkalmazta a rekordokra.
Mezcsoportlista Legfeljebb 10 mez neve, amelyekkel a rekordokat csoportostjuk. A
mezcsoportlistban megadott sorrend hatrozza meg a csoportostsi szinteket, a
legmagasabbtl a legalacsonyabb szintig.
csoportostsi felttel Kifejezs, amely meghatrozza, hogy a csoportostott rekordok kzl melyek
kerljenek megjelentsre.
A HAVING hasonl a WHERE zradkhoz, de a WHERE a csoportkpzs eltt, az egyes rekordokat szri, a
HAVING pedig a csoportkpzs utn, a csoportokra rvnyest szrfelttelt. Miutn a rekordokat a GROUP
BY zradkkal csoportostottuk, a HAVING zradkkal megadhatjuk, hogy mely rekordok jelenjenek meg. Az
albbi plda azokat az osztlyokat jelenti meg, amelyek tlagletkora nagyobb mint 18:
SELECT osztalykod, Avg (eletkor) AS tlagletkor
FROM tanulok
GROUP BY osztalykod
HAVING Avg (eletkor) > 18 ;
Egy HAVING zradk legfeljebb 40 kifejezst tartalmazhat, amelyek logikai opertorokkal, pldul az And
vagy az Or opertorral kapcsolhatk egymshoz.
TBLK SSZEKAPCSOLSA (JOIN)
Az adatbziskezels leggyakrabban hasznlt mveletei kztt mindenkppen meg kell emlteni az
sszekapcsols mvelett is. E mvelet fontossgnak egyik legfbb oka az, hogy az adatbzis tervezse sorn,
a normalizlssal az informcikat tbb tblra bontjuk szt. Egy sszetettebb lekrdezshez szksges
informcik tbb tblban sztszrva helyezkednek el, gy a lekrdezs sorn ssze kell gyjteni ezen adatokat
a klnbz tblkbl, ahol az sszetartozs bizonyos mezk rtkeinek kapcsolatn alapszik. Azt a
folyamatot, amikor tbb tblbl szrmaz adatokbl lltunk el egy jabb eredmnytblzatot,
sszekapcsolsnak, egyestsnek vagy join-nak nevezzk.
16
Az SQL-ben kt tblzat egyestsnek legegyszerbb formja, amikor a kt tblzat Descartes szorzatt
kpezzk, mely sorn az eredmnytblzat egy rekordja gy ll el, hogy az egyik tblzat rekordjaihoz
hozzfzzk a msik tblzat egy-egy rekordjt, ahol az eredmnytblzat minden lehetsges prostst
tartalmaz. (Ha teht az egyik tblzat 3 rekordot tartalmaz, a msik 4-et, akkor az eredmny 12 rekordbl ll.)
Kt tblzat Descartes szorzatnak ellltshoz a kvetkez SQL utastst kell kiadni:
SELECT * FROM tblzatnv1, tblzatnv2;
Az gy elll egyeststblzatot ezutn tetszlegesen tovbb lehet alaktani a mr megismert zradkokkal.
Erre rendszerint szksg is van, hiszen csak nagyon ritkn van szksg kt tblzat rekordjainak teljes
Descartes szorzatra, legtbbszr csak a Descartes szorzat bizonyos rszhalmazra van szksgnk. A szorzat
tblzat szelekcijval valsthat meg pldul a tblzatok sszekapcsolsra szolgl kulcs s kapcsolkulcs
szerkezet alapjn elll rekord prok kijelzse.
SELECT tbla_neve1.oszlop_neve, tbla_neve2.oszlop_neve
FROM tbla_neve1, tbla_neve2
WHERE felttel;
Plda: Egy listt szeretnnk kszteni arrl, hogy melyik dik melyik osztlyba jr s ki az osztlyfnke.
Megolds:
SELECT diakok.nev, diakok.osztaly, tanarok.nev
FROM diakok, tanarok
WHERE diakok.osztaly=tanarok.osztalyfonok;
Az eredmny:
nev osztaly nev
Horvth Csilla 11.A Kovcs Lajos
Horvth Bla 10.C Kis Tams
Turn Lajos 10.C Kis Tams
Horvth Bla 9.A Szp Bla
Jeney va 12.B Nyers Joln
Persze jobb lenne, ha az eredmnyhalmazban nem lenne kt nv oszlop. Sebaj, a korbban ismertetett ALIAS
hasznlatval orvosolhatjuk a problmt.
SELECT diakok.nev AS diak, diakok.osztaly, tanarok.nev as osztalyfonok
FROM diakok, tanarok
WHERE diakok.osztaly=tanarok.osztalyfonok;
Az eredmny:
diak osztaly osztalyfonok
Horvth Csilla 11.A Kovcs Lajos
Horvth Bla 10.C Kis Tams
17
Turn Lajos 10.C Kis Tams
Horvth Bla 9.A Szp Bla
Jeney va 12.B Nyers Joln
A fenti mdszer lnyege, hogy a tblk kztti kapcsolatot a WHERE zradkban adjuk meg. (A
kapcsolmezk egyenlsgt szabva felttell.) Van ennek egy msik mdja is: hasznlhatjuk a JOIN
kulcsszt.
INNER JOIN
Az INNER JOIN hasznlatval, a lekrdezs eredmnybe nem kerlnek bele azon tbla1-beli elemek,
amelyeknek nincs megfeleljk a tbla2 tblban.
SELECT oszlop_neve1, oszlop_neve2, oszlop_neve3
FROM tbla_neve1 INNER JOIN tbla_neve2 ON tbla_neve1.mez_neve = tbla_neve2.mez_neve;
Plda:
SELECT diakok.nev AS diak, diakok.osztaly, tanarok.nev as osztalyfonok
FROM diakok INNER JOIN tanarok ON diakok.osztaly=tanarok.osztalyfonok;
Az eredmny ugyanaz lesz, mint az eggyel korbbi esetben. Az INNER JOIN hasznlata annyiban jobb a tblk
WHERE zradkon keresztl trtn kapcsolsnl, hogy gy kln helyen szerepelnek a kapcsolatokat ler
felttelek s a lekrdezs eredmnyt szkt felttelek, s ezltal a lekrdezs SQL kdja ttekinthetbb lesz.
LEFT JOIN
Arra is van lehetsgnk, hogy az els tbla minden adatt megjelentsk az eredmnyben, attl fggetlenl,
hogy nincs a felttelben megadott tulajdonsg mez a msodik tblban. Ekkor a LEFT JOIN kulcsszt kell
hasznlni.
SELECT diakok.nev AS diak, diakok.osztaly, tanarok.nev as osztalyfonok
FROM diakok LEFT JOIN tanarok ON diakok.osztaly=tanarok.osztalyfonok;
Az eredmny:
diak osztaly osztalyfonok
Horvth Bla 10.C Kis Tams
Jeney va 12.B Nyers Joln
Turn Lajos 10.C Kis Tams
Horvth Csilla 11.A Kovcs Lajos
Kassai Tnde 9.B NULL
Horvth Bla 9.A Szp Bla
RIGHT JOIN
18
A RIGHT JOIN pedig pont azt teszi lehetv, hogy a msodik tblban lv sszes adatot jelentsk meg,
fggetlenl attl, hogy az els tblban van-e hozztartoz mez.
SELECT diakok.nev AS diak, diakok.osztaly, tanarok.nev as osztalyfonok
FROM diakok RIGHT JOIN tanarok ON diakok.osztaly=tanarok.osztalyfonok;
Az eredmny:
diak osztaly osztalyfonok
Horvth Csilla 11.A Kovcs Lajos
NULL NULL Magyar Zoltn
NULL NULL Nagy Tmea
Horvth Bla 10.C Kis Tams
Turn Lajos 10.C Kis Tams
Horvth Bla 9.A Szp Bla
Jeney va 12.B Nyers Joln
NILLESZTS
Bizonyos esetekben elfordul, hogy egy tblt nmaghoz kell kapcsolnunk. Pldul, ha DIAKOK tblbl
osztlytrs prokat akarunk kiratni. Ekkor a DIAKOK tblt nmaghoz kell kapcsolnunk (illesztennk).
Mivel ilyenkor ugyanaz a tbla kt pldnyban is szerepel a lekrdezsben, ezt a tblhoz kt lnevet is kell
rendelnnk.
SELECT d1.nev, d2.nev
FROM diakok d1, diakok d2
WHERE d1.osztaly=d2.osztaly ;
BEGYAZOTT LEKRDEZS (ALLEKRDEZS)
Tegyk fel, hogy a TANULOK tblban troljuk a tanulk nevt s letkort. Feladatunk az, hogy rassuk ki
azokat a tanulkat, akik idsebbek az tlagnl. Ehhez olyan lekrdezst kell ksztennk, amelynek WHERE
zradkban egy jabb lekrdezs (allekrdezs) segtsgvel hatrozzuk meg az tlagletkort:
SELECT nev, eletkor
FROM tanulok
WHERE eletkor > (SELECT avg (eletkor) FROM tanulok) ;
A SELECT INTO UTASTS
Ez az utasts a lekrdezs eredmnybl egy j tblt hoz ltre. (Az Access szhasznlatban tblakszt
lekrdezst hoz ltre.)
Szintaxis
SELECT mez1 [, mez2 [, ...]] INTO j tbla
FROM forrs
19
A SELECT...INTO utasts a kvetkez rszekbl ll:
Rsz Lers
mez1, mez2 Az j tblba msoland mezk neve.
j tbla A ltrehozand tbla neve. A nvnek kvetnie kell az elnevezsi konvencikat. Ha az j
tbla neve megegyezik egy mr ltez tbla nevvel, akkor elfoghat hiba lp fel.
Forrs Annak a mr meglv tblnak a neve, amelybl a rekordokat kivlasztjuk. A forrs
lehet egy vagy tbb tbla, illetve lekrdezs.
Tblakszt lekrdezssel rekordokat archivlhatunk, biztonsgi msolatokat kszthetnk a tblkrl, vagy
olyan msolatokat llthatunk el, amelyeket msik adatbzisba exportlhatunk, vagy egy adott idszak adatait
tartalmaz jelentsek alapjaknt hasznlhatunk. A Havi eladsok krzetenknt nev jelentst pldul gy is
elllthatjuk, hogy minden hnapban lefuttatjuk ugyanazt a tblakszt lekrdezst.
Az j tblhoz elsdleges kulcsot is definilhatunk. Az j tbla ltrehozsakor annak mezi rklik a
lekrdezs tbliban szerepl mezk adattpust s mezmrett, ms mez- vagy tblatulajdonsgot azonban
nem.
Ha meglv tblhoz szeretnnk adatokat hozzadni, akkor az INSERT INTO utasts hasznlatval hozzfz
lekrdezst kell ltrehoznunk.
Ha a tblakszt lekrdezs futtatsa eltt ltni szeretnnk az j tblba kerl rekordokat, vizsgljuk meg egy
azonos kivlasztsi feltteleket hasznl SELECT utasts eredmnyt.
AZ INSERT INTO UTASTS
Szp, s j, hogy le tudjuk krdezni az adatbzis tartalmt, de hogyan illeszthetnk be j rekordokat?
Erre szolgl az INSERT INTO utasts. Hasznlati mdja:
INSERT INTO tbla_neve (oszlop_neve1,oszlop_neve2,...) VALUES (rtk1, rtk2, ....);
Ha minden mezbe runk adatot, akkor nem szksges felsorolni az sszes oszlop nevt, elg a kvetkezt rni,
termszetesen az rtkek megfelel sorrendjnek betartsval.
INSERT INTO tbla_neve VALUES (rtk1, rtk2, ....);
Plda:
Illessznk be a diakok tblba kt j sort, az albbi adatok alapjn:
Nv: Horvth Csilla
Szletsi hely: Kaposvr
Szletsi v: 1989
Nv: Horvth Bla
Szletsi hely: Budapest
Szletsi v: 1991
Ekkor a kvetkezt kell rnunk:
INSERT INTO diakok (nev, szuletesi_hely, szuletesi_ev)
VALUES ('Horvth Csilla','Kaposvr', 1989);
INSERT INTO diakok (nev, szuletesi_hely, szuletesi_ev)
20
VALUES ('Horvth Bla','Budapest', 1991);
vagy (mivel az sszes mez rtkt megadtuk) elg a kvetkezt rni:
INSERT INTO diakok
VALUES ('Horvth Csilla','Kaposvr', 1989);
INSERT INTO diakok
VALUES ('Horvth Bla','Budapest', 1991);
Tegyk fel, hogy j dik rkezett az iskolba, de nem sikerlt megtudni minden adatt, csak a neve s a
szletsi ve ismert. Ettl mg berhatjuk az adatait az adatbzisba, majd ksbb ptoljuk a hinyz adatokat.
Nv: Kassai Tnde
Szletsi v: 1991
A megfelel SQL utasts az adatok beillesztsre:
INSERT INTO diakok (nev, szuletesi_ev)
VALUES ('Kassai Tnde',1991);
Most a diakok adattbla gy nz ki:
nev szuletesi_hely szuletesi_ev
Kiss Irma Budapest 1991
Horvth Bla Kisvrda 1990
Horvth Bla Budapest 1991
Jeney va Karcag 1988
Turn Lajos Abony 1990
Horvth Csilla Kaposvr 1989
Kassai Tnde 1991
Gyakran elfordul, hogy a tblba illesztend rekordot (rekordokat) egy msik tblbl vlasztjuk ki. Ilyenkor a
kvetkez szerkezetet kell alkalmaznunk:
INSERT INTO tbla_neve SELECT * FROM msik_tbla_neve WHERE szrfelttelek;
AZ UPDATE UTASTS
Idkzben sikerlt kiderteni Tnde szletsi helyt, ami Nagykanizsa. De hogyan illesszk be a mez
tartalmt? Ehhez jabb utastst kell megtanulnunk.
Az UPDATE utasts segtsgvel az egyes rekordok tartalmt mdosthatjuk.
UPDATE tbla_neve SET oszlop_neve = j_rtk WHERE oszlop_neve = rtk;
Ez alapjn illesszk be a hinyz szletsi helyet!
UPDATE diakok
SET szuletesi_hely='Nagykanizsa'
21
WHERE nev='Kassai Tnde';
Vigyzzunk, mert ha a felttelnek tbb rekord is megfelel, a mdosts mindegyikre vgrehajtdik.
Ha pl. az
UPDATE diakok
SET szuletesi_hely='Nagykanizsa'
WHERE szuletesi_ev=1991;
utastst adtuk volna ki, akkor Kassa Tnde s Kiss Irma szletsi helye is megvltozott volna.
Ha trlni szeretnnk egy oszlop (mez) rtkt, akkor a SET oszlop_neve = NULL szerkezetet hasznljuk!
A DELETE UTASTS
Nem csak rekordok mdostsra lehet szksg, hanem pldul trlsre is, amelyhez a DELETE utastst kell
hasznlnunk.
DELETE FROM tbla_neve WHERE oszlopnv = rtk;
Plda: Kiss Irma ms vrosba kltzik, ezrt knytelen ms iskolba folytatni tanulmnyait. Emiatt trljk az
adatbzisbl.
DELETE FROM diakok
WHERE nev='Kiss Irma';
Ezutn a diakok tbla tartalma a kvetkez lesz:
nev szuletesi_hely szuletesi_ev
Horvth Bla Kisvrda 1990
Horvth Bla Budapest 1991
Jeney va Karcag 1988
Turn Lajos Abony 1990
Horvth Csilla Kaposvr 1989
Kassai Tnde Nagykanizsa 1991
Ha egy tblbl mindent trlni akarunk, akkor a DELETE FROM tbla utastst hasznlhatjuk. (Jl
gondoljuk meg, hogy tnyleg ezt akarjuk-e!)
Ha nem teljes rekordokat, csak bizonyos mezk rtkt szeretnnk trlni, akkor az UPDATE utastst kell
hasznlnunk!

You might also like