You are on page 1of 8

SQL Adatbzis I.

flv ismtls
Az SQL nyelvet (Structured Query Language, strukturlt lekrdeznyelv) hasznlhatjuk a relcis adatbzisok, gy pldul a Microsoft Access, SQL-Server adatbzisok lekrdezsre, frisstsre s karbantartsra. A lentebb rszletezett SQL utastsok trgyalsakor nem trekedtem azok teljes bemutatsra.

I. SQL - adatlekrdezs
SELECT Mezk megadsa tblanv.meznv alakban. Tbb tbla hasznlatakor meznv egyezs esetn hasznlhat a tblanv, egybknt elhagyhat.
SELECT Tbla1.Nv, Tbla1.Szletett

SELECT DISTINCT Ismtldsek megszntetse, ne szerepeljen ugyanaz a sor ktszer


SELECT DISTINCT Beoszts FROM Tbla1

FROM ORDER BY ORDER BY DESC WHERE

Tblk megadsa, pl. FROM Tbla1, Tbla2 Sorbarendezs megadott mez alapjn, pl. ORDER BY Tbla1.Fizets Sorbarendezs cskken sorrendben, pl. ORDER BY Tbla1.Szletett DESC Felttel megadsval a tbla sorainak rszhalmazt kapjuk meg.
WHERE Tbla1.Fizets>100000 WHERE Hzas=Yes OR Fizets<80000 WHERE Nv Like K* WHERE Szletett<#1970.01.01# WHERE Szin IN (piros, zld, kk) WHERE Fizets BETWEEN 100000 AND 150000 (ugyanez: Fizets>=100000 AND Fizets<=150000) WHERE Not Beoszts=2 (ugyanez: Beoszts<>2) WHERE Lakcim is Null (A Lakcim mez nem tartalmaz rtket)

GROUP BY HAVING

Csoportosts megadott mez alapjn, pl. GROUP BY Tbla1.Hzas Felttel megadsa a GROUP BY hasznlatakor, a felttel mr a kiszmolt, csoportostott rtkre vonatkozik, nem az eredeti rekordhalmazra.
HAVING Tbla1.Hzas

TOP 5

Az els 5 rekord jelenjen meg.


SELECT TOP 5 Tbla1.Nv, Tbla1.Szletett, Tbla1.Fizets, Tbla1.Hzas

Tblk sszekapcsolsa INNER JOIN Kt tbla kztti szoros kapcsolat megadsa, csak a kapcsolt mezk szerinti felttelnek megfelel rekordok jelennek meg.
FROM Dolgoz INNER JOIN Kikldets ON Dolgoz.DolgozAZ=Kikldets.DolgozAZ

LEFT JOIN

A felttelben megadott bal oldali tbla sszes rekordja, amg a jobb oldali tblbl csak a kapcsolt mezk feltteleinek megfelel rekordok jelennek meg.
FROM Dolgoz LEFT JOIN Kikldets ON Dolgoz.DolgozAZ=Kikldets.DolgozA Z Megjelenik az sszes dolgoz, de csak azok a kikldetsek, amik kapcsoldnak valamelyik dolgozhoz.

RIGHT JOIN

A felttelben megadott jobb oldali tbla sszes rekordja, amg a bal oldali tblbl csak a kapcsolt mezk feltteleinek megfelel rekordok jelennek meg.
FROM Dolgoz RIGHT JOIN Kikldets ON Dolgoz.DolgozAZ=Kikldets.DolgozAZ Megjelenik az sszes kikldets, de csak azok a dolgozk, amik kapcsoldnak valamelyik kikldetshez.

Rendszerfejlesztsi technolgik - Marjn Balzs

II. SQL - adatmdosts


INSERT INTO j adatokat visz be egy tblba. Nem ktelez a tbla sszes mezjt megadni, - de azoknak mindenkppen rtket kell adni, amiket a tblanv mgtt zrjelben felsoroltunk- kihagyott mezket Null rtkkel tlti fel az adott rekordban. Ha azonban egy olyan meznek nem adunk rtket, aminek a kitltse ktelez, akkor hibazenetet kapunk. Egy sor beszrsa a Dolgozk tblba:
INSERT INTO Dolgozk (Nv, Vros, Fizets) VALUE (Ferenc, Pcs, 240000)

Tbb sor beszrsa (partners tbla sszes pcsi rekordja) a Dolgozk tblba:
INSERT INTO Dolgozk (Nv, Vros, Fizets) SELECT name, city, money FROM partners WHERE city=Pcs

UPDATE

Mdost a tblban egy ltez rekordot.


UPDATE Dolgozk SET Fizets=210000, Vros=Koml WHERE Nv=Ferenc

DELETE

Rekordot (-kat) trl egy tblbl. Figyelem nem tblt, hanem adatokat trl!
DELETE FROM Dolgozk WHERE DolgozkID>110

III. SQL - gyakorls


Pldk 1 tbla felhasznlsval Adott egy tbla:

Fizets alapjn nvekv sorrendben rendezve:


SELECT Nv, Szletett, Fizets, Hzas FROM Tbla1 ORDER BY Fizets;

Szletsi dtum alapjn cskken sorrendben rendezve:


SELECT Nv, Szletett, Fizets, Hzas FROM Tbla1 ORDER BY Szletett DESC;

Rendszerfejlesztsi technolgik - Marjn Balzs

Azok a dolgozk, akiknek 100.000 Ft fltt van a fizetsk:


SELECT Nv, Szletett, Fizets, Hzas FROM Tbla1 WHERE Fizets>100000;

A hzasok:
SELECT Nv, Szletett, Fizets, Hzas FROM Tbla1 WHERE Hzas=1;

A nevek s a 15%-al megemelt fizetseik:

SELECT Nv, Fizets*1.15 AS [Emelet fizets] FROM Tbla1;

ABC sorrendben az els kt dolgoz:


SELECT TOP 2 Nv, Szletett, Fizets, Hzas FROM Tbla1 ORDER BY Nv;

Lekrdezsek 2 tbla felhasznlsval Adott 2 tbla:

Nevek listzsa:
SELECT Nv, BeosztsNv FROM Tbla1, Beoszts WHERE Tbla1.Beoszts=Beoszts.BeosztsKd; vagy: SELECT Nv, BeosztsNv FROM Tbla1 INNER JOIN Beoszts ON Tbla1.Beoszts= Beoszts.BeosztsKd;

beosztsok

tlagfizets Beoszts alapjn csoportostva:


SELECT BeosztsNv, Avg(Fizets) FROM Tbla1 INNER JOIN Beoszts ON BeosztsKd = Beoszts GROUP BY BeosztsNv;

Rendszerfejlesztsi technolgik - Marjn Balzs

Osztlyonknt sszesti a fizetst s kiszmolja fizetsek arnyt a teljes fizetshez kpest:


SELECT dolgozk.OSZTLY, Sum(dolgozk.FIZETS) AS ssz, ssz*100/(SELECT Sum(dolgozk.FIZETS) FROM dolgozk) AS Arny FROM dolgozk GROUP BY dolgozk.OSZTLY OSZTLY 10 20 30 ssz 8750 12875 9400 Arny 28,2030620467365 41,4987912973409 30,2981466559226

IV. Specilis logikai kifejezsek


x IS NULL: x BETWEEN a AND b: x IN halmaz: igaz, ha az x mez rtke NULL. igaz, ha a x b. igaz, ha x megegyezik a megadott halmaz egy elemvel. A halmazt explicit mdon vagy lekrdezssel lehet megadni. Plda: vros IN ('Szeged','Szolnok','Pcs')

x relcijel ALL halmaz: igaz, ha x a halmaz minden elemvel a megadott relciban van. Plda: fizets < ALL (81000, 136000, 118000) x relcijel ANY halmaz: igaz, ha a halmaznak van olyan eleme, amellyel x a megadott relciban van. Plda: vros = ANY ('Szeged','Szolnok','Pcs') EXISTS halmaz: igaz, ha a halmaz nem res. Pldul egy EXISTS lekrdezs kifejezs rtke igaz, ha a lekrdezs legalbb egy elemet ad vissza. igaz, ha az x karaktersorozat megfelel a megadott mintnak. Ha a mintban % illetve _ jel szerepel, az tetszleges karaktersorozatot illetve tetszleges karaktert jelent. Plda: lakcm LIKE '%Vr u.%' igaz minden olyan lakcmre, amelyben szerepel a Vr u. rszlet.

x LIKE minta:

A fentiekben ltalban a NOT is hasznlhat, pldul x IS NOT NULL, x NOT IN halmaz, stb.

Rendszerfejlesztsi technolgik - Marjn Balzs

V. sszest fggvnyek
Egy oszlop rtkeibl egyetlen rtket hoznak ltre (pldul tlag). ltalnos alakjuk: fggvnynv ( [DISTINCT] oszlopnv ) Ha DISTINCT szerepel, akkor az oszlopban szerepl azonos rtkeket csak egyszer kell figyelembe venni. A szmtsnl a NULL rtkek figyelmen kvl maradnak. Az egyes fggvnyek: AVG SUM MAX MIN :tlagrtk. :sszeg. :maximlis rtk. :minimlis rtk.

COUNT:elemek szma. Ennl a fggvnynl oszlopnv helyre * is rhat. Pldk: SELECT AVG(fizets) FROM Dolgoz: az eredmnytbla egyetlen elembl ll, amely az tlagfizetst adja. SELECT SUM(fizets) FROM Dolgoz: a fizetsek sszege. SELECT COUNT(*) FROM Dolgoz: a Dolgoz tbla sorainak szma, vagyis a dolgozk szma. SELECT COUNT(DISTINCT osztkd) FROM Dolgoz: az osztlyok szma.

Csoportosts (GROUP BY, HAVING) Ha a tbla sorait csoportonknt szeretnnk sszesteni, akkor a SELECT utasts a GROUP BY oszloplista alparanccsal bvtend. Egy csoportba azok a sorok tartoznak, melyeknl oszloplista rtke azonos. Az eredmnytblban egy csoportbl egy rekord lesz. Az sszest fggvnyek csoportonknt hajtdnak vgre. 1. Plda. A DOLGOZ tblbl osztlyonknt az tlagfizetst szmoljuk:
SELECT osztkd, AVG(fizets) FROM Dolgoz GROUP BY osztkd;

2. Plda. A PROJORA (dolgoz, projekt, ra) tblbl dolgoznknti..


SELECT dolgoz, SUM(ra) FROM Projra GROUP BY dolgoz;

..s projektenknti raszm sszegzs


SELECT projekt, SUM(ra) FROM Projra GROUP BY projekt;

A SELECT utn sszest fggvnyen kvl csak olyan oszlopnv feltntetsnek van rtelme, amely a GROUP BY-ban is szerepel. De mondhatjuk fordtva is, ha a SELECT utn szerepeltettnk egy nem sszest fgv hasznlatval egy oszlopnevet (mint a fenti pldban a projekt) akkor azt szerepeltetni KELL az GROUP BY-ban is. Ha egy felhasznl lekrdezst fogalmaz meg neknk, akkor ha azt mondja, hogy dolgozokknt, akkor mr tudhatjuk, hogy a GROUP BY -t kell hasznlnunk. Jegyezzk meg: -knt = GROUP BY

Rendszerfejlesztsi technolgik - Marjn Balzs

A GROUP BY ltal kpezett csoportok kzl vlogathatunk a HAVING felttel alparancs segtsgvel: csak a felttelnek eleget tev csoportok kerlnek sszestsre az eredmnytblba. 3. Plda. Azon osztlyok listja, ahol az tlagfizets > 80000 Ft:
SELECT osztkd, AVG(fizets) FROM Dolgoz GROUP BY osztkd HAVING AVG(fizets) > 80000;

VI. Az eredmnytbla rendezse


Br a relcis modell nem definilja a rekordok sorrendjt, a gyakorlatban rendszerint valamilyen rendezettsgben kvnjuk ltni az eredmnyt. Erre szolgl az ORDER BY oszlopnv [DESC], ..., oszlopnv [DESC] alparancs, amely a SELECT utasts vgre helyezhet, s az eredmnytblnak a megadott oszlopok szerinti rendezst rja el. Alaprtelmezs szerint a rendezs nvekv sorrendben trtnik, ha fordtva kvnjuk, a DESC (descending) kulcssz rand a megfelel oszlopnv utn. 4. Plda. Dolgozk s fizetseik listja az osztlykdok nvekv, ezen bell a fizetsek cskken sorrendjben:
SELECT osztkd, nv, fizets FROM Dolgoz ORDER BY osztkd, fizets DESC;

Gyakorls
sszestett fizets Hzas/Nem hzas csoportostsban:
SELECT Hzas, Sum(Fizets) FROM Tbla1 GROUP BY Hzas;

A Hzasok tlagfizetse:
SELECT Hzas, Avg(Fizets) FROM Tbla1 GROUP BY Hzas HAVING Hzas=1;

Rendszerfejlesztsi technolgik - Marjn Balzs

VII. A SELECT utasts ltalnos alakja


s most mr sszefoglalva: A SELECT utasts az albbi alparancsokbl llhat: SELECT [DISTINCT] oszloplista FROM tblanvlista [WHERE felttel] [GROUP BY oszloplista] [HAVING felttel] [ORDER BY oszloplista]; MIT HONNAN szelekci csoportosts csoport-felttel rendezs

Az egyes alparancsok megadsi sorrendje az angol nyelv szablyait kveti (lsd fent a mintautastst), vgrehajtsi sorrendjk viszont az albbi: 1. FROM 2. WHERE 3. GROUP BY 4. HAVING 5. SELECT 6. ORDER BY HONNAN szelekci csoportosts csoport-szelekci MIT rendezs

VIII. Al-lekrdezsek
Az SQL nyelv ismertetsnek elejn lttunk halmazokat tartalmaz logikai kifejezseket. Egy ilyen halmaz SELECT utastssal is elllthat, pldul a
'Tth Pl' IN (SELECT nv FROM Dolgoz WHERE osztlykd='015')

logikai kifejezs akkor igaz, ha Tth Pl a 015 kd osztly dolgozja, vagy


EXISTS (SELECT * FROM Dolgoz WHERE fizets < 60000)

akkor igaz, ha van 60000 Ft-nl kisebb fizets dolgoz. Ha egy SELECT utasts WHERE vagy HAVING felttelben olyan logikai kifejezs szerepel, amely SELECT utastst tartalmaz, ezt al-lekrdezsnek vagy bels SELECT-nek is nevezik. 5. Plda. Az albbi utasts azon dolgozk listjt adja, amelyek fizetse kisebb, mint az tlagfizets:
SELECT nv, fizets FROM Dolgoz WHERE fizets < ( SELECT AVG(fizets) FROM dolgoz );

Ebben a pldban az al-lekrdezst elg csak egyszer kirtkelni, hiszen a Dolgoz tbla minden egyes sorra ugyanazt az eredmnyt kapjuk. Ha viszont a bels SELECT-ben a kls SELECT-beli tblk oszlopnevei szerepelnek, (mint ahogy a 6. plda is mutatja) akkor a kls SELECT minden egyes rekordjra kirtkeldik a bels SELECT. Egy kirtkels sorn a kls vltoznevek konstansnak tekintendk.
Rendszerfejlesztsi technolgik - Marjn Balzs

6. Plda. A DOLGOZ(nv, cm, osztlykd, fizets) tblbl azon dolgozk listjt krjk, akiknek az osztlyon bell a legnagyobb a fizetse (ha tbb ilyen van, mindegyiket ki kell listzni). A DOLGOZ tbla kt pldnyt a D1 s D2 alias nevek klnbztetik meg:
SELECT osztlykd, nv, fizets FROM Dolgoz AS D1 WHERE fizets = ( SELECT MAX(fizets) FROM Dolgoz AS D2 WHERE D1.osztlykd = D2.osztlykd );

7. Plda. Bizonyos esetekben az al-lekrdezs, join-mveletet helyettest, (de vgrehajtsi sebessgk klnbz) pldul az albbi kt lekrdezs egyarnt a pcsi olvask ltal kiklcsnztt knyvek listjt adja:
SELECT szerz, cm FROM Knyv WHERE olvasszm IN (SELECT olvasszm FROM Olvas WHERE lakcm LIKE '%Pcs%'); Eredmnye ugyan az, mint a: SELECT szerz, cm FROM Knyv INNER JOIN Olvas ON Knyv.olvasszm = Olvas.olvasszm WHERE lakcm LIKE '%Pcs%');

A JOIN ebben az esetben gyorsabb. Termszetesen nem csak SELECT utastsban alkalmazhat az al-lekrdezs: 8. Plda. Tekintsk a kvetkez tblkat (a tblk az adszmon keresztl kapcsoldnak): DOLGOZO (adszm, nv, fizets) PROJEKT (adszm, pkd, raszm) Az albbi utasts 10e Ft-os fizetsemelst hajt vgre az A12-es projekt dolgozinl:
UPDATE Dolgoz SET fizets=fizets+10000 WHERE adszm IN ( SELECT adszm FROM Projekt WHERE pkd='A12' );

Emlkezznk! Nem csak a logikai kifejezs tartalmazhat al-lekrdezst, hanem az INSERT utasts is: INSERT INTO tblanv [(oszloplista)] SELECT ... ; A SELECT annyi oszlopot kell, hogy kivlasszon, amennyit oszloplista tartalmaz. A tbbi oszlop NULL rtket vesz fel. 9. Plda. Tegyk fel, hogy a Raktr (cikkszm, nv, egysgr, mennyisg) tbla adatait felhasznlva a Kszlet (ru, rtk) tblba szeretnnk adatokat ltrehozni, amely az ruflesg megnevezst s az aktulisan trolt mennyisg rtkt tartalmazza. Ez a kvetkezkpp lehetsges:
INSERT INTO Kszlet SELECT nv, egysgr*mennyisg FROM Raktr;

Rendszerfejlesztsi technolgik - Marjn Balzs

You might also like