Szerző Téma: Adatbázis kezelés SQL nyelven  (Megtekintve 3049 alkalommal)

Adatbázis kezelés SQL nyelven
« Dátum: 2015. Október 30. - 17:21:20 »
+9
Adatbázis kezelés SQL nyelven
 

Bevezető
 
 Az SQL (Structured Query Language - Strukturált Lekérdező Nyelv) relációs adatbázisok kezelésére alkalmas, szabványos lekérdező nyelv, amelynek fejlesztése az 1970-es években kezdődött az IBM keretein belül, igaz ekkor még SEQUEL-nek nevezték. (Structured English QUEry Language) Tehát az SQL nyelv adatbázisok kezelésére szolgál.
Egy relációs adatbázisban az adattárolás alapjait a táblák jelentik. Egy adatbázis általában több táblából áll. A táblák a logikailag összetartozó adatok sorokból és oszlopokból álló elrendezése. A táblák sorait adatrekordoknak, oszlopait rekordmezőknek nevezzük.
SQL-en belül vannak olyan műveletek melyek nem túl fontosak számunkra, amikkel táblákat tudunk létrehozni vagy törölni, mivel ezeket nem „kódokon” keresztül szoktuk csinálni, hanem a phpMyAdmin-ban vagy valamilyen hasonló grafikus felületű programban. A gyakran elvégzett műveletek túlnyomó részt az alábbi négy alapműveletre korlátozódnak:
-   SELECT: tábla sorainak beolvasása
-   INSERT: sorok beillesztése a táblába
-   UPDATE: tábla sorainak módosítása
-   DELETE: tábla sorainak törlése
Pár nyelvtani szabály:
   A nyelvben az utasításokat mindig pontosvessző választja el egymástól.
   Az olvashatóság és az eligazgatóság érdekében a kulcsszavakat általában nagybetűvel szokás írni, bár az utasítások értelmezésénél nem tesz különbséget. (kulcsszavak = pl: a fent említett select, insert, update, delete)
   A táblák és oszlopok neveit a biztonság érdekében rakjuk tick-ek közé (pl. `username`)! Hogy miért? Mert ha esetleg véletlenül egy kulcsszavat használunk oszlop vagy tábla névnek, akkor a tick-ek nélkül hibás lesz a kód. (` = tick = ALT GR + 7)
   A karakterláncokat aposztrófok közé kell írni. Ha egy karakterláncban aposztróf szerepel, azt ( \\ ) escape karakterrel (ALT GR + Q) írhatjuk bele. Pl: \\’ A számokat természetesen nem muszáj aposztróf közé írni.
 
Táblázatok kezelése
 
Mint említettem egy adatbázisban több táblát is létrehozhatunk pl: felhasználók, adminok, lányok, fiúk, diákok, osztályok, állatok, növények stb…
Vegyünk is alapul egy egyszerű példát! Mondjuk az alábbi tábla neve „versenyzok”
névneme   szuletesi_ev   azonositoja
Kiss Virag199912631
Nagy Mátéférfi199569069
Horváth Péter   férfi199644050
Szabó Emese199423145
Kala Pálférfi199723965
Bajuk Petra199978940

A SELECT utasítás
 
A SELECT utasítással a táblázatból válogathatunk ki adatokat pl:
 
SELECT nev FROM versenyzok;

 
Eredményül egy ún. eredménytáblát kapunk. Lásd:
                                                       
név
Kiss Virag
Nagy Máté
Horváth Péter
Szabó Emese
Kala Pál
Bajuk Petra
Ez az eredménytábla hasonlíthat az adattáblához, de csak ideiglenesen jött létre a lekérdezés lefutatásakor.
Használata: SELECT oszlop_nevek FROM tábla_neve;
Miért írtam, hogy oszlop nevek? Mert nem csak egy oszlopot kérdezhetünk le egyszerre, hanem többet is, amit vesszővel kell elválasztani
pl: SELECT nev, szuletesi_ev FROM versenyzok;
Az eredmény:
                                                                                   
névszuletesi_ev
Kiss Virag1999
Nagy Máté1995
Horváth Péter   1996
Szabó Emese1994
Kala Pál1997
Bajuk Petra1999
Ha netán az összes mező értékét szeretnénk kérdezni, akkor nem szükséges felsorolni az összes oszlop nevét, hanem elég, ha csak a * karaktert használjuk. Lásd:
 
SELECT * FROM versenyzok;

 
Ezzel a lekérdezéssel az összes „rekord” (6) tartalmát megtudtuk. Az eredménytáblánk most azonos az „alap” tábláéval.
 
Lekérdezés eredményének szűkítése(WHERE)
 
A WHERE kulcsszó után feltételeket adhatunk meg a sorokra vonatkozóan. Az eredménytáblába csak azok a sorok fognak bekerülni, amelyek teljesítik a feltételeket.
Ha például azt akarjuk, hogy akik 1998 után születtek azok kerülhessenek be eme szent táblázatba, akkor a feltétel: `szuletesi_ev` > 1998. Ahhoz, hogy összetettebb feltételeket tudjunk írni, nemsokára megismerkedünk a fontosabb operátorokkal.
Használata:
 
SELECT oszlop_nevek FROM tábla_neve WHERE oszlopra vonatkozó feltétel;

 
Jelen esetben a példánk:
 
SELECT nev FROM versenyzok WHERE szuletesi_ev > 1998;

 
Eredményül csak Kiss Virág és Bajuk Petra fog szerepelni
Példa(2):
 
SELECT nev FROM versenyzok WHERE szuletesi_ev = 1999;

 
Eredményül, most szintén csak Kiss Virág és Bajuk Petra neve fog szerepelni.
Példa(3):
 
SELECT nev FROM versenyzok WHERE neme = ’nő’;

 
Eredményül, most értelem szerűen csak azoknak a nevét fogja ki listázni akinek a neme nő.
!!FIGYELEM!!!
Ha szöveg alapján szeretnéd szűkíteni a keresésedet akkor használj aposztrófot! Mint a hármas példánál tettem.
 
Műveleti jelek/Operátorok a WHERE feltételben
 
A WHERE kulcsszó után feltételeket adhatunk meg a sorokra vonatkozóan.
                                                                                                                                   
MűveletLeírása
=egyenlő
<>nem egyenlő
<kisebb, mint ...
>nagyobb, mint ...
<=kisebb vagy egyenlő, mint ...
>=nagyobb vagy egyenlő, mint ...

LIKE

keresési minta alapján keres

A minta megadásánál használhatod a % karaktert, amely több karakter helyettesítésére szolgál. Egy karakter helyettesítésére a _ mintát használhatod.

Példa:
\'A%\' : A betűvel kezdődik a szöveg
\'%A\' : A betűvel végződik a szöveg
\'A%Z\' : A betűvel kezdődik és Z betűvel végződik a szöveg
\'%CIA%\' : minden olyan szöveg, amely tartalmazza a CIA karaktereket.
\'A_C\' : A betűvel kezdődik és C-vel végződik és 3 karakterből áll a szöveg

Például: SELECT nev FROM betegek WHERE szuletesi_hely LIKE \'G%\';
Eredmény: Kidobja neked az összes olyan beteg nevét, akiknek a születési helyük G-vel,kezdődik.

BETWEEN

egy keresési intervallumot adhatunk meg

Pl: SELECT nev FROM betegek WHERE szuletesi_ev BETWEEN 1950 and 2000;
Eredmény: Most szépen kidobja azoknak a betegeknek a nevét akik 1950 és 2000 közt születtek. Egyes rendszerekben az eredmény eltérő lehet!
MySQL-ben így néz ki: eredménytábla elemei = 1950 vagy nagyobb de nem lehet nagyobb mint 2000

IS NULL

mikor egy bizonyos mezőnek nincs értéke, tehát üres

Pl: SELECT nev FROM dolgozok WHERE szuletesi_ev IS NULL;
Eredmény: Ki adja azoknak a dolgozóknak a neveit, akiknél nincs megadva a születési év.

IS NOT NULL   

mikor egy bizonyos mezőnek van értéke, tehát nem üres

Pl: SELECT nev FROM dolgozok WHERE szuletesi_ev IS NOT NULL;
Eredmény: Ki adja azoknak a dolgozóknak a neveit, akiknél meg van adva a születési év.

A WHERE feltételek összekapcsolása
 
Emlékezzünk, hogy a WHERE kulcsszó után megadhattunk egy feltételt, amely alapján szűrtük az eredményhalmazt. Lásd:
 
SELECT nev FROM versenyzok WHERE szuletesi_ev = 1994;

 
Azonban e feltételeket össze is tudjuk kapcsolni különböző ún. logikai műveletekkel. Például AND (és), illetve OR (vagy).
 
Az OR (vagy) és AND (és) műveletek
 
Használatuk:
OR
 
SELECT oszlop_nevek FROM tábla_neve WHERE oszlop_neve műveleti_jel érték OR oszlop_neve műveleti_jel érték;

 
AND
 
SELECT oszlop_nevek FROM tábla_neve WHERE oszlop_neve műveleti_jel érték AND oszlop_neve műveleti_jel érték;

 
Példa (OR művelet)
 
SELECT * FROM versenyzok WHERE szuletesi_ev=1994 OR szuletesi_ev=1999;

 
Eredményül most megkaptuk azoknak a versenyzoknek az adatait akik 1994ben vagy 1999ben születtek.
Lásd:
nevneme   szuletesi_ev   azonositoja
Kiss Virág199912631
Szabó Emese   199423145
Bajuk Petra199978940
Példa (AND művelet 1)
 
SELECT * FROM versenyzok WHERE nev LIKE \'Kiss%\' AND szuletesi_ev >= 1990;

 
Eredményül most megkaptuk azoknak a versenyzoknek az adatait, akiknek a vezetéknevük (fogalmazzunk most így) Kiss-sel kezdődik és a születési évük 1990 vagy nagyobb. Ugye e szerint a táblázatunk most így nézne ki a gyakorlatban:
nevneme   szuletesi_ev   azonositoja
Kiss Virág   199912631
Hát igen elég szegényes minta táblát adtam meg. Sebaj ez lehetőséget ad egy kis ön ellenőrzésre/gyakorlásra. A feltételünk/kérésünk adott, nem változott.
Első kérdésem: Ha szerepelne a táblázatomban egy Kis Márk nevű versenyző, aki 1991ben született, akkor az szerepelhet-e az eredménytáblázatomban?


NEM. Miért? Mivel a LIKE ’Kiss%’ kifejezés azt jelenti, hogy a Kiss kifejezés után bármi állhat, de csak azután! A mi esetünkben a Kis Márk nevű versenyző egy s-sel írja a nevét, ami után egy szóköz áll, már itt buktuk a feltétel teljesülését, hiába teljesül az a feltételünk hogy a születési éve 1990 vagy nagyobb.
 
Második kérdésem: Ha szerepelne a táblázatomban egy Kissert József nevű versenyző, aki 1989ben született, akkor az szerepelhet-e az eredménytáblázatomban?


NEM. Miért? Nézzük csak a lájkos feltételünk teljesült, mert azt adtuk meg, hogy a Kiss után bármi lehet. Értelem szerűen akkor most a második feltételünk nem teljesült. Miért? Mert akárhogy számolom a 1989 nem nagyobb, mint 1990…
 
Harmadik kérdésem: Ha szerepelne a táblázatomban egy Kiss Ferenc nevű versenyző, aki 2005ben született, akkor az szerepelhet-e az eredménytáblázatomban?


IGEN. Miért? A \"lájkolós\" és a második feltételünk is teljesült.
 
Negyedik kérdésem: Ha a harmadik kérdésem teljesült akkor kinek vagy kiknek az adatait kaptuk meg?


Kiss Virág és Kiss Ferenc
 
Példa (AND művelet 2)
 
SELECT * FROM versenyzok WHERE azonositoja <> 69069 AND szuletesi_ev > 1994;

 
Eredményül most megkaptuk azoknak a versenyzőknek az adatait, akiknek az azonosítójuk nem egyenlő 69069-cel és születési évük nagyobb, mint 1994.
Lásd:
névneme   szuletesi_ev   azonositoja
Kiss Virag199912631
Horváth Péter   férfi199644050
Kala Pálférfi199723965
Bajuk Petra199978940
Most ha jól tudom kiesett Szabó Emese és Nagy Máté. Miért? Emese sajnos 1994ben született, ezért a második feltétel hibádzik. (mivel nagyobbnak kell lennie, mint 1994) Mátéval akkor most mi a helyzet? Rá pedig teljesült a második feltétel mert ő 1995ös, csak sajnos az a fránya első feltétel az mondja ki hogy az azonosító nem lehet 69069.
 
BETWEEN ... AND művelet
 
Ez ismerős már nem? „Műveleti jelek/Operátorok a WHERE feltételben” című résznél már találkozhattunk vele.
A BETWEEN … AND műveletet akkor használjuk, ha egy intervallum alapján akarjuk szűkíteni a feltételt.
Használata:
 
SELECT oszlop_nevek FROM tábla_neve WHERE oszlop_neve BETWEEN érték1 AND érték2;

 
Példa (1)
 
SELECT * FROM versenyzok WHERE szuletesi_ev BETWEEN 1996 AND 1999;

 
Eredményünk:
névneme   szuletesi_ev   azonositoja
Kiss Virag199912631
Nagy Mátéférfi199569069
Horváth Péter   férfi199644050
Kala Pálférfi199723965
Bajuk Petra199978940
Példa (2)
Ez a művelet azonban nem csak számok esetén működik, akár kilistázhatjuk azon versenyzők nevét is, akik ábécésorrendben Bajuk Petra és Kiss Virág között helyezkednek el, a következő módon:
 
SELECT * FROM diakok WHERE nev BETWEEN \'Bajuk Petra\' AND \'Kiss Virág\';

 
Eredményünk:
névneme   szuletesi_ev   azonositoja
Kiss Virag199912631
Horváth Péter   férfi199644050
Kala Pálférfi199723965
Bajuk Petra199978940
(Vigyázzunk arra, - mint már felhívtam erre a figyelmet - hogy ez a funkció más-más eredményt adhat, az eltérő adatbázis kezelő rendszerekben. Van ahol csak a két érték között ad ki eredményt, valahol a két értéket is beleszámítja (azaz amivel/be most dolgozunk). És még más variációk is vannak)
Bár nem hiszem, hogy ez a probléma bárkit is veszélyeztetne, ugyanis mi mind értelmes lények vagyunk, és előbb gondolkodunk, aztán cselekszünk. Vagyis előbb tesztelünk, és csak utána nyomjuk élesbe, ha minden jó.
 
Az IN művelet
 
Az IN műveletet akkor használjuk, ha az alapján szeretnénk szűkíteni a keresésünket, hogy a mező értéke egy adott felsoroláshalmazba tartozik-e.
Használata
 
SELECT oszlop_nevek FROM tábla_neve WHERE oszlop_neve IN (érték1,érték2,érték3, ...)

 
*Az érték lehet egy szöveg is illetve szám is. !Ne felejtsd el, hogy a szöveget aposztrófok közé kell rakni!
Nem tudom, hogy észrevetted a hasonlóságot, de majdnem olyan mint az OR művelet, csak itt több értéket is megadhatunk.
Példa
 
SELECT * FROM versenyzok WHERE szuletesi_ev IN (1996,1999);

 
Eredményül most megkaptuk azoknak a versenyzőknek az adatait akik 1996ban illetve 1999ben születtek.
Lásd:
                                                                               
nevneme    szuletesi_ev   azonositoja
Kiss Virág199912631
Horváth Péter   férfi199644050
Bajuk Petra199978940

A NOT feltétel
 
A NOT feltételt akkor használjuk, ha arra az eredménytáblára vagy halmazra van szükségünk, amelyt a feltétel tagadásával kapnánk.
Használata
 
SELECT oszlop_nevek FROM tábla_neve WHERE oszlop_neve NOT művelet;

 
Példa
 
SELECT * FROM versenyzok WHERE szuletesi_ev NOT BETWEEN 1996 AND 2000;

 
Eredményül most megkaptuk azoknak a versenyzőnek az adatait akiknek a születési évük nem tehető 1996 és 2000 közé. Lásd:
névneme   szuletesi_ev   azonositoja
Nagy Mátéférfi199569069
Szabó Emese   199423145
Ha most bekavartalak volna azzal, hogy: \"születési évük nem tehető 1996 és 2000 közé\" és én mégis kihagytam Horváth Péter-t (aki 1996ban született), akkor most figyelj ide!
Először is, mint említettem a rendszer amivel dolgozunk MySQL alapú, ezért a BETWEEN ... AND művelete intervalluma zárt. (matematikai jele: [x;y] )
Ez azt jelenti, hogy az első érték és az utolsó érték is még beletartozik az intervallumunkba.
Tehát azok a versenyzők adatai nem szerepelhetnek az eredménytáblázatba akik 1996, 1997, 1998, 1999, 2000-ben születtek.
 
Az INSERT INTO utasítás
 
Az INSERT INTO utasítást akkor használjuk, ha egy meglévő táblához szeretnénk adatokat hozzáadni.
Használata
 
INSERT INTO tábla_neve (oszlop_neve1,oszlop_neve2,oszlop_neve3, ...) VALUES (érték1, érték2, ...);

 
Megjegyés: Ha mindenen mezőbe szeretnénk értékeket megadni, akkor nem szükséges felsorolni az összes oszlop nevét.
 
INSERT INTO tábla_neve VALUES (érték1, érték2, érték3, érték4, ...);

 
Példa (1)
Elvileg van nekünk egy \'versenyzok\' nevű táblánk, és mondjuk még csatlakozni szeretne 2 ember.
Adataik a következők:
Név: Molnár Zoltán
Neme: férfi
Születési év: 1999
Azonosítója: 81721
Név: Tóth Edina
Neme:
Születési év: 1997
Azonosítója: 92853
Rendben most ezeket az adatokat szépen felvisszük az adatbázisunkba és a megfelelő táblázatunkba.
 
INSERT INTO versenyzok (nev,neme,szuletesi_ev,azonositoja) VALUES (\'Molnár Zoltán\',\'férfi\',1999,81721);

 
A következő versenyző adatait vagy az előzőt is feltölthetjük a következő példa alapján, mivel az összes mező értékét megadtuk.
 
INSERT INTO versenyzok VALUES (\'Tóth Edina\',\'nő\',1997,92853);

 
Példa (2)
Mi van akkor, ha hiányzik egy adat? Nem kell pánikba esni, hiszen ettől még feltölthetjük az adatbázisba amit szeretnénk.
Lásd:
Név: Nagy Judit
Neme:
Azonosítója: 99921
Kódunk:
 
INSERT INTO versenyzok (nev,neme,azonositoja) VALUES (\'Nagy Judit\',\'nő\',99921);

 
Most a táblázatunk valalhogy így nézne ki:
névneme   szuletesi_ev   azonositoja
Kiss Virag199912631
Nagy Mátéférfi199569069
Horváth Péter   férfi199644050
Szabó Emese199423145
Kala Pálférfi199723965
Bajuk Petra199978940
Nagy Judit 99921

Az UPDATE utasítás
 
Az UPDATE utasítást akkor használjuk, ha szeretnénk módosítani a táblázatunk egyes rekordjainak a tartalmát.
Használata
 
UPDATE tábla_neve SET oszlop_neve1=új_érték1, oszlop_neve2=új_érték2, ... WHERE oszlop_neve=érték;

 
Példa
Ebben a példánkban most szeretnénk megadni Nagy Judit születési évét (amit nem sikerült megtudnunk az előzőekben)
 
UPDATE versenyzok SET szuletesi_ev=1996 WHERE azonositoja=99921;

 
Most a táblázatunk valalhogy így nézne ki:
névneme   szuletesi_ev   azonositoja
Kiss Virag199912631
Nagy Mátéférfi199569069
Horváth Péter   férfi199644050
Szabó Emese199423145
Kala Pálférfi199723965
Bajuk Petra199978940
Nagy Judit199699921
Az UPDATE utasítást akkor is használhatjuk, ha törölöni szeretnénk egy mező értékét.
Lásd:
 
UPDATE tábla_neve SET oszlop_neve = NULL WHERE oszlop_neve=érték

 
Amikre figyelni kell:
- Figyeljünk arra, ha a feltételünknek több rekord is megfelel, akkor a módosítás mindegyikken végrehajtódik.
- Figyeljünk arra, hogy mindig adjunk meg feltételt, mert ha nem akkor az egész oszlopnuk értékei megváltozhatnak.
 
A DELETE utasítás
 
A DELETE utasítást akkor használjuk, ha egy tábla tartalmát vagy rekordot/kat szeretnénk törölni.
Használata
 
DELETE FROM tábla_neve WHERE oszlop_nev = érték);

 
Megjegyés: Ha a tábla teljes tartalmát szeretnénk törölni akkor elég csak a következőeket használni:
 
DELETE FROM tábla_neve;

 
Példa
 
DELETE FROM versenyzok WHERE azonositoja = 23965);

 
Eredményül, most törölve lett az a versenyző összes adata akinek az azonosítója 23965 volt.
 
Az ALIAS használata
 
Ha az eredménytáblában nem az eredeti (tábla/)oszlopneveket szeretnénk látni, akkor használhatunk helyettük úgynevezett aliasokat, vagyis állneveket is.
Használata(oszlopnevek megváltoztatásához):
 
SELECT oszlop_neve1 AS álnév1, oszlop_neve2 AS alnév2 FROM tábla_neve

 
Példa
A táblázatunk mondjuk legyen:
                                                                               
nevszuletesi_ev   eletkor
Nagy Lili199519
Horváth Imre   199618
Nagy Ferenc199123
Vass Albert199320
Mit tehetünk akkor, ha olyan eredményhalmazra van szükségünk amely csak a nev, és szuletesi_ev oszlopokat tartalmazza, és az oszlopok neve angolul szerepeljen?
 
SELECT nev AS Name, szuletesi_ev AS Birthdate FROM tabla;

 
Az eredményünk a következő:
                                                           
NameBirthdate
Nagy Lili1999
Horváth Imre   1997
Nagy Ferenc1991
Vass Albert1993
Megjegyzés: Ha az álnév szóközt tartalmazna, akkor használj idéző vagy szögletes zárójeleket.
Lásd:
 
SELECT nev AS [Teljes neve], szuletesi_ev AS \'Szuletesi ev\' FROM tabla;

 
Alias használata(táblanevek megváltoztatásához):
 
SELECT oszlop_neve(i) FROM tábla_neve AS álnev;

 
Példa
Figyelem! - Az alábbi példa két táblázatot is összekapcsol (JOIN), melyről lentebb olvashatsz!



Varsalok nevű táblázatunk:
                                                                               
azonosito  nevlakhely
690Nagy LiliBudapest
692Horváth Imre   Győr
693Nagy FerencDebrecen
701Vass AlbertPécs
Rendelesek nevű táblázatunk:
                                                                                                   
rendelesID   vevoID   elado_neve   szallito
2760505Németh Zoltán  FastTrans ltd.
2761692Nagy IstvánHT kft.
2762696Nagy IstvánHunLand kft.
2763692Nagy PéterHT kft.
Most azt szeretnénk, hogy az eredményhalmazunként megkapjuk az összes olyan leadott rendelést, mely Horváth Imrétől származik.
Parancsunk:
 
SELECT r.rendelesID, r.elado_neve, v.nev AS \'Vasarlo Neve\' FROM Vasarlok AS v, Rendelesek AS r WHERE v.nev=\"Horváth Imre\" AND v.azonosito=r.vevoID;

 
Eredményünk:
                                               
rendelesID   elado_neve   Vasarlo Neve
2761Nagy IstvánHorváth Imre
2763Nagy PéterHorváth Imre


Táblák összekapcsolása(JOIN)
 
   Az adatbáziskezelés egyik leggyakrabban használt műveletei között mindenképpen meg kell említeni az összekapcsolás műveletét is. E művelet fontosságának egyik legfőbb oka az, hogy az adatbázis tervezése során, az információkat (az átláthatóság szempontjából) több táblára is szét bontjuk.  (lásd előző példa) Egy összetettebb lekérdezéshez szükséges információk több táblában szétszórva helyezkednek el, így a lekérdezés során össze kell gyűjteni ezen adatokat a különböző táblákból, ahol az összetartozás bizonyos mezők értékeinek kapcsolatán alapszik. Azt a folyamatot, amikor több táblából származó adatokból állítunk elő egy újabb eredménytáblázatot, összekapcsolásnak, egyesítésnek vagy join-nak nevezzük.
Négy ismert fajtája/típusa van:
-   INNER JOIN: Azokat a sorokat kérdezi le ami mindkét táblában létezik.
-   LEFT JOIN: Visszatér a bal oldali tábla minden rekordjával és a hozzá tartozó jobb oldali tábla rekordjával ha létezik, különben NULL(üres).
-   RIGHT JOIN: A LEFT JOIN ellenkezője, a jobb oldali tábla minden sorát visszaadja és a hozzájuk tartozó bal oldali tábla sorát ha van.
-   FULL OUTER JOIN: Az előző két típus kombinálása, mindkét táblából visszaadja az összes sort.
   Tudnunk kell azt is hogy az összekapcsoláskor megadhatunk az ON paraméter után egy feltételt is, ami alapján összeválogatja a sorokat. Ha viszont nem adunk meg ilyen feltételt, akkor minden sort minden sorral össze fog párosítani, ez két kétsoros táblánál 4 sort, két háromsoros táblánál 9 sort, egy három és négy soros táblánál 12 sort ad vissza. Tehát a sorok száma a két tábla sorainak a számának a szorzatával egyezik meg. (ez az ún. Descartes szorzat)
   Gondoljunk bele, hogy egy 100 és egy 200 soros táblánál, 20000 sort kapunk vissza, míg ha használjuk a ON feltételét átlagban jóval kebesebb sorról beszélhetünk. (hamarosan kitérünk erre is)
   Tehát az SQL-ben két táblázat egyesítésének legegyszerűbb formája, amikor a két táblázat Descartes szorzatát képezzük. Két táblázat Descartes szorzatának előállításához a következő (egy nagyon bonyolult) SQL utasítást kell kiadni:
 
SELECT * FROM tabla1, tabla2;

 
Persze a most létrehozott ereménytáblázatot tetszőlegesen tovább lehet alakítani, mert nagyon ritka azaz eset mikor szükségünk is van mind két táblázat rekordjainak teljes Descartes szorzatára.
 
SELECT tabla1.oszlop_neve, tabla2.oszlop_neve FROM tabla1, tabla2 WHERE feltétel;

 
Példa
Ebben a példában most szeretnénk egy listát készíteni arról, hogy egy iskolában melyik diák, melyik osztályba jár, és ki az osztályfőnöke.
diakok nevű táblázatunk:
                                                                                                                       
azonosito   nevosztaly   eletkor
31Tóth Márton9.A15
32Tóth András9.A16
63Szélesi Vivien   10.C16
109Szabó Szilvia12.Ny18
86Kovács Luca11.B17
tanarok nevű táblázatunk:
                                                                                                                               
nevszakosztalyfonok
Nagy MátéTörténelem   10.A
Földesi LauraMagyar9.A
Kovács KárolyAngol12.Ny
Szalai Magdolna   Matek10.C
Tóth EdinaFizika11.B
Fejér ZsófiaNémetNULL
Bozsik KláraKémia13.Ny
Lássuk is a kódunkat:
 
SELECT diakok.nev, diakok.osztaly, tanarok.nev FROM diakok, tanarok WHERE diakok.osztaly=tanarok.osztalyfonok; 

 
Ez vajon jó lesz lekünk? :nono:
Persze a kóddal nincs semmi baj de az átláthatóság miatt jobb lenne ha az eredményhalmazunkban, nem lenne két \"nev\" nevű oszlop. Szóval használjuk a már korábban megismert ALIAST-t:
 
SELECT diakok.nev AS diak, diakok.osztaly, tanarok.nev AS osztalyfonok FROM diakok, tanarok WHERE diakok.osztaly=tanarok.osztalyfonok;

 
Íme az eredményünk:
                                                                                               
diakosztaly   osztalyfonok
Tóth Márton9.AFöldesi Laura
Tóth András9.AFöldesi Laura
Szélesi Vivien10.CSzalai Magdolna
Szabó Szilvia12.NyKovács Károly
Kovács Luca11.BTóth Edina
A fenti módszer lényege, hogy a táblák közötti kapcsolatot a WHERE záradékban adjuk meg.
Van ennek egy másik módja is: mégpedig a JOIN.
Megjegyzés: Ez a példa hasonló azzal a példával, ami az Aliasba is szerepelt. (rendelesek,vasarlok)
 
INNER JOIN
 
Az INNER JOIN használatával, a lekérdezés eredményébe nem kerülnek bele azon tabla1-beli elemek, amelyeknek nincs megfelelőjük a tabla2 nevű táblában.
Használata nagyon egyszerű:
 
SELECT oszlop_neve(i) FROM tabla1 INNER JOIN tabla2 ON tabla1.oszlop=tabla2.oszlop;

 
Vagy:
 
SELECT oszlop_neve(i) FROM tabla1 JOIN tabla2 ON tabla1.oszlop=tabla2.oszlop;

 
(Jótudni! - Az INNER JOIN hasonlóan(ugyanúgy) működik, mint a JOIN. Ennek ellenére a rendezett, átláthatósághoz javaslom az INNER JOIN használatát.)
 
\"img_innerjoin.gif\"
 
Példa
 
SELECT diakok.nev AS diak, diakok.osztaly, tanarok.nev as osztalyfonok FROM diakok INNER JOIN tanarok ON diakok.osztaly=tanarok.osztalyfonok;

 
BUMM! Az eredményünk ugyanaz lesz, mint az eggyel korábbi esetben. Az INNER JOIN használata annyival jobb a táblák WHERE záradékon keresztül történő (össze)kapcsolásánál, hogy így külön helyen szerepelnek a kapcsolatokat leíró feltételek és a lekérdezés eredményét szűkítő feltételek, és ezáltal a lekérdezés SQL kódja áttekinthetőbb lesz.
 
LEFT JOIN
 
Ez annyiban különbözik az INNER JOIN-tól, hogy amikor összekapcsolunk két táblát és ha nincsen megfelelő érték az első helyen lévő táblába a második helyen lévő táblához, akkor kiegészíti azokat NILL értékekkel. Ez akkor kelhet, amikor minden sornak szerepelni kell az eredményben, még akkor is, ha nem tartozik hozzá érték.
Használata:
 
SELECT oszlop_neve(i) FROM tabla1 LEFT JOIN tabla2 ON tabla1.oszlop=tabla2.oszlop;

 
Vagy:
 
SELECT oszlop_neve(i) FROM tabla1 LEFT OUTER JOIN tabla2 ON tabla1.oszlop=tabla2.oszlop;

 
(Jótudni! - Néhány adatbázisnál a LEFT JOIN helyett LEFT OUTER JOIN-t kell használni)
 
\"img_leftjoin.gif\"
 
Példa
Tegyük fel van egy diakok és egy tanarok nevű táblázatunk, viszont a tanárok nevű táblázatban nem szerepel egy ember. (Aki éppen a 5.C osztályfőnöke)
Kódunk:
 
SELECT diakok.nev AS diak, diakok.osztaly, tanarok.nev AS osztalyfonok FROM diakok LEFT JOIN tanarok ON diakok.osztaly=tanarok.osztalyfonok;

 
Eredményünk:
                                                                               
diakosztaly   osztalyfonok
Velkei Tamás7.AFöldesi Eszter
Nagy Dénes6.BNagy Ferenc
Szabó Máté5.CNULL
Szarvas Ákos8.ANyitrai Tünde

RIGHT JOIN
 
A RIGHT JOIN pedig pont azt teszi lehetővé, hogy a második táblában lévő összes adatot jelenítsük meg, függetlenül attól, hogy az első táblában van-e hozzátartozó mező. (ergo: ellentétesen viselkedik mint a left)
Használata:
 
SELECT oszlop_neve(i) FROM tabla1 RIGHT JOIN tabla2 ON tabla1.oszlop=tabla2.oszlop;

 
Vagy:
 
SELECT oszlop_neve(i) FROM tabla1 RIGHT OUTER JOIN tabla2 ON tabla1.oszlop=tabla2.oszlop;

 
(Jótudni! - Néhány adatbázisnál a RIGHT JOIN helyett RIGHT OUTER JOIN-t kell használni)
 
\"img_rightjoin.gif\"
 
Példa
Tegyük fel van egy diakok és egy tanarok nevű táblázatunk, viszont a tanárok nevű táblázatban van olyan tanár amelynek nincs osztálya.
Kódunk:
 
SELECT diakok.nev AS diak, diakok.osztaly, tanarok.nev AS osztalyfonok FROM diakok RIGHT JOIN tanarok ON diakok.osztaly=tanarok.osztalyfonok;

 
Eredményünk:
                                                                               
diakosztaly   osztalyfonok
Velkei Tamás7.AFöldesi Eszter
Südi Barbara6.DNagy Ágnes
NULLNULLSzolojov Zsuzsanna
Lipták László8.ANyitrai Tünde
*Zárás ként, remélem nem hagytam le semmi fontosat, és segíteni fog ez valamit valakinek az sql nyelv használatában. Természetesen ebben a topikban nem volt szó az összes utasításról/záradékokról/függvényekről. Csak a legfontosabbakat emeltem ki.
Ajánlott link: https://sampforum.hu/index.php?topic=9285.0
Forrásaim:
http://www.w3schools.com/
http://php.webprog.biz
http://aries.ektf.hu
http://sql.misi.eu
http://www.beregszaszi-debr.sulinet.hu
http://www.sqlcourse.com
https://hu.wikipedia.org/wiki/SQL
Gondolkodási módom: Kell az alap mielőtt nekikezdenénk a programjaink megírásának. Természetesen ezeket az információkat bárki elérheti más oldalakon, akinek jó barátja a kereső mező :D
« Utoljára szerkesztve: 2016. Február 14. - 17:20:45 írta _[G]M[K]_Sh1ft_ »

Nem elérhető Kovacs_Richard

  • 1743
  • HRP Fejlesztő
  • Discord: Kovacs_Richard#0321
    • Profil megtekintése
    • Hun Role Play Web
Adatbázis kezelés SQL nyelven
« Válasz #1 Dátum: 2015. November 01. - 06:54:27 »
0
a színezéssel kezdj valamit, mert sötét designal a fekete betűk csak kijelölve olvashatóak
Régóta nem tevékenykedem, mint SA-MP scripter.
HRP Fejlesztő.

Adatbázis kezelés SQL nyelven
« Válasz #2 Dátum: 2015. November 01. - 08:52:39 »
0
Szia!
Köszönöm a jelzésedet, rajta vagyok.  :thumbsup:
Kis türelmet kérek :)
E: Módosítottam, most már könnyebben olvasható a fekete designnal is!
« Utoljára szerkesztve: 2015. November 01. - 09:34:10 írta _[G]M[K]_Sh1ft_ »

ᗩωєѕσмє

  • Vendég
Adatbázis kezelés SQL nyelven
« Válasz #3 Dátum: 2015. November 01. - 09:35:23 »
0
Szép, tartalmas leírás lett. Időbe telik majd elolvasni.

Adatbázis kezelés SQL nyelven
« Válasz #4 Dátum: 2015. November 01. - 09:38:07 »
+1
Idézetet írta: zιтяσиє date=1446366923\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"58298\" data-ipsquote-contentclass=\"forums_Topic
Szép, tartalmas leírás lett. Időbe telik majd elolvasni.
 
Köszönöm, de még nincs kész. Még folytatni fogom! :)

Adatbázis kezelés SQL nyelven
« Válasz #5 Dátum: 2015. November 03. - 17:51:41 »
0
Téma befejezésre került. Észrevételeiteket bátran jelezzétek, komentben!

Adatbázis kezelés SQL nyelven
« Válasz #6 Dátum: 2015. November 06. - 07:51:23 »
0
Istenem annyira hálás vagyok,hogy ezt megcsináltad,ha tudnék adnék pluszt,de még nincsen 50 hsz-em,ellenben viszont nagyon szépen szeretném neked megköszönni íly módon ezt,mert most iszonyatosan sokat segítettél nekem mysql terén,végre egy olyan tut-amit fel is tudtam fogni 100%-osan. :)  :thumbsup:

Adatbázis kezelés SQL nyelven
« Válasz #7 Dátum: 2015. November 10. - 17:04:46 »
0
Idézetet írta: florone date=1446792683\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"58298\" data-ipsquote-contentclass=\"forums_Topic
Istenem annyira hálás vagyok,hogy ezt megcsináltad,ha tudnék adnék pluszt,de még nincsen 50 hsz-em,ellenben viszont nagyon szépen szeretném neked megköszönni íly módon ezt,mert most iszonyatosan sokat segítettél nekem mysql terén,végre egy olyan tut-amit fel is tudtam fogni 100%-osan. :)  :thumbsup:
 
Szívesen, nincs mit ;)

Adatbázis kezelés SQL nyelven
« Válasz #8 Dátum: 2015. November 10. - 17:34:26 »
0
Szép \"kis\" leírás minden tekintetben! Bátorkodtam átolvasni, mivel eddig nem nagyon foglalkoztam SQL-el. Ment a +! :)

Nem elérhető Kovacs_Richard

  • 1743
  • HRP Fejlesztő
  • Discord: Kovacs_Richard#0321
    • Profil megtekintése
    • Hun Role Play Web
Adatbázis kezelés SQL nyelven
« Válasz #9 Dátum: 2016. Február 11. - 08:29:33 »
0
ránéztem a topicra ismét, hátha van benne valami új számomra és észrevettem egy fontos dolgot amit hiányolok...
szerintem bele kellene írni a JOIN-olást is, nem tudom ki mennyire van meg nélküle, de én nem nagyon tudom nélkülözni...
szerintem sokak hasznára válna :)
Régóta nem tevékenykedem, mint SA-MP scripter.
HRP Fejlesztő.

Adatbázis kezelés SQL nyelven
« Válasz #10 Dátum: 2016. Február 11. - 16:32:35 »
0
Idézetet írta: Kovacs_Richard date=1455175773\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"58298\" data-ipsquote-contentclass=\"forums_Topic
ránéztem a topicra ismét, hátha van benne valami új számomra és észrevettem egy fontos dolgot amit hiányolok...
szerintem bele kellene írni a JOIN-olást is, nem tudom ki mennyire van meg nélküle, de én nem nagyon tudom nélkülözni...
szerintem sokak hasznára válna :)
 
Megoldható, hamarosan frissítésre kerül.

Adatbázis kezelés SQL nyelven
« Válasz #11 Dátum: 2016. Február 14. - 17:23:27 »
0

ránéztem a topicra ismét, hátha van benne valami új számomra és észrevettem egy fontos dolgot amit hiányolok...
szerintem bele kellene írni a JOIN-olást is, nem tudom ki mennyire van meg nélküle, de én nem nagyon tudom nélkülözni...
szerintem sokak hasznára válna :)
Megoldható, hamarosan frissítésre kerül.
 
[/quote]
A téma sikeresen frissítésre került! @ 2016.02.14 17:15 (Vasárnap)
-Ki lett bővítve az ALIAS és a JOIN(ok) használatával, ha esetleg valami nem lenne egyértelmű nyugodtan jelezzétek.
« Utoljára szerkesztve: 2016. Február 14. - 17:25:42 írta _[G]M[K]_Sh1ft_ »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal