Professional Documents
Culture Documents
SQL Jegyzet2006
SQL Jegyzet2006
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
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
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.
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
DELETE
Rekordot (-kat) trl egy tblbl. Figyelem nem tblt, hanem adatokat trl!
DELETE FROM Dolgozk WHERE DolgozkID>110
A hzasok:
SELECT Nv, Szletett, Fizets, Hzas FROM Tbla1 WHERE Hzas=1;
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
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.
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;
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
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;
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;
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')
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;