_[G]M[K]_Sh1ft_

Adatbázis kezelés SQL nyelven

12 hozzászólás ebben a témában

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”

[table]

[tr]

[td]név[/td]

[td]

neme  [/td]

[td]

szuletesi_ev  [/td]

[td]

azonositoja[/td]

[/tr]

[tr]

[td]Kiss Virag[/td]

[td]nő[/td]

[td]1999[/td]

[td]12631[/td]

[/tr]

[tr]

[td]Nagy Máté[/td]

[td]férfi[/td]

[td]1995[/td]

[td]69069[/td]

[/tr]

[tr]

[td]Horváth Péter  [/td]

[td]férfi[/td]

[td]1996[/td]

[td]44050[/td]

[/tr]

[tr]

[td]Szabó Emese[/td]

[td]nő[/td]

[td]1994[/td]

[td]23145[/td]

[/tr]

[tr]

[td]Kala Pál[/td]

[td]férfi[/td]

[td]1997[/td]

[td]23965[/td]

[/tr]

[tr]

[td]Bajuk Petra[/td]

[td]nő[/td]

[td]1999[/td]

[td]78940[/td]

[/tr]

[/table]

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:

[table]

  [tr]

    [td]név[/td]

  [/tr]

  [tr]

    [td]Kiss Virag[/td]

  [/tr]

  [tr]

    [td]Nagy Máté[/td]

  [/tr]

  [tr]

    [td]Horváth Péter[/td]

  [/tr]

  [tr]

    [td]Szabó Emese[/td]

  [/tr]

  [tr]

    [td]Kala Pál[/td]

  [/tr]

  [tr]

    [td]Bajuk Petra[/td]

  [/tr]

[/table]

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:

[table]

  [tr]

    [td]név[/td]

    [td]szuletesi_ev[/td]

  [/tr]

  [tr]

    [td]Kiss Virag[/td]

    [td]1999[/td]

  [/tr]

  [tr]

    [td]Nagy Máté[/td]

    [td]1995[/td]

  [/tr]

  [tr]

    [td]Horváth Péter  [/td]

    [td]1996[/td]

  [/tr]

  [tr]

    [td]Szabó Emese[/td]

    [td]1994[/td]

  [/tr]

  [tr]

    [td]Kala Pál[/td]

    [td]1997[/td]

  [/tr]

  [tr]

    [td]Bajuk Petra[/td]

    [td]1999[/td]

  [/tr]

[/table]

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.

[table]

  [tr]

    [td]Művelet[/td]

    [td]Leírása[/td]

  [/tr]

  [tr]

    [td]=[/td]

    [td]egyenlő[/td]

  [/tr]

  [tr]

    [td]<>[/td]

    [td]nem egyenlő[br][/td]

  [/tr]

  [tr]

    [td]<[/td]

    [td]kisebb, mint ...[br][/td]

  [/tr]

  [tr]

    [td]>[/td]

    [td]nagyobb, mint ...[br][/td]

  [/tr]

  [tr]

    [td]<=[/td]

    [td]kisebb vagy egyenlő, mint ...[br][/td]

  [/tr]

  [tr]

    [td]>=[/td]

    [td]nagyobb vagy egyenlő, mint ...[br][/td]

  [/tr]

  [tr]

    [td][br]LIKE[/td]

    [td][br]keresési minta alapján keres[br][br]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.[br][br]Példa:[br]'A%' : A betűvel kezdődik a szöveg[br]'%A' : A betűvel végződik a szöveg[br]'A%Z' : A betűvel kezdődik és Z betűvel végződik a szöveg[br]'%CIA%' : minden olyan szöveg, amely tartalmazza a CIA karaktereket.[br]'A_C' : A betűvel kezdődik és C-vel végződik és 3 karakterből áll a szöveg[br][br]Például: SELECT nev FROM betegek WHERE szuletesi_hely LIKE 'G%';[br]Eredmény: Kidobja neked az összes olyan beteg nevét, akiknek a születési helyük G-vel,kezdődik.[br][/td]

  [/tr]

  [tr]

    [td][br]BETWEEN[/td]

    [td][br]egy keresési intervallumot adhatunk meg[br][br]Pl: SELECT nev FROM betegek WHERE szuletesi_ev BETWEEN 1950 and 2000;[br]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![br]MySQL-ben így néz ki: eredménytábla elemei = 1950 vagy nagyobb de nem lehet nagyobb mint 2000[/td]

  [/tr]

  [tr]

    [td][br]IS NULL[/td]

    [td][br]mikor egy bizonyos mezőnek nincs értéke, tehát üres[br][br]Pl: SELECT nev FROM dolgozok WHERE szuletesi_ev IS NULL;[br]Eredmény: Ki adja azoknak a dolgozóknak a neveit, akiknél nincs megadva a születési év.[/td]

  [/tr]

  [tr]

    [td][br]IS NOT NULL  [/td]

    [td][br]mikor egy bizonyos mezőnek van értéke, tehát nem üres[br][br]Pl: SELECT nev FROM dolgozok WHERE szuletesi_ev IS NOT NULL;[br]Eredmény: Ki adja azoknak a dolgozóknak a neveit, akiknél meg van adva a születési év.[/td]

  [/tr]

[/table]

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:

[table]

[tr]

[td]nev[/td]

[td]neme  [/td]

[td]szuletesi_ev  [/td]

[td]azonositoja[/td]

[/tr]

[tr]

[td]Kiss Virág[/td]

[td]nő[/td]

[td]1999[/td]

[td]12631[/td]

[/tr]

[tr]

[td]Szabó Emese  [/td]

[td]nő[/td]

[td]1994[/td]

[td]23145[/td]

[/tr]

[tr]

[td]Bajuk Petra[/td]

[td]nő[/td]

[td]1999[/td]

[td]78940[/td]

[/tr]

[/table]

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:

[table]

[tr]

[td]nev[/td]

[td]neme  [/td]

[td]szuletesi_ev  [/td]

[td]azonositoja[/td]

[/tr]

[tr]

[td]Kiss Virág  [/td]

[td]nő[/td]

[td]1999[/td]

[td]12631[/td]

[/tr]

[/table]

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:

[table]

[tr]

[td]név[/td]

[td]

neme  [/td]

[td]

szuletesi_ev  [/td]

[td]

azonositoja[/td]

[/tr]

[tr]

[td]Kiss Virag[/td]

[td]nő[/td]

[td]1999[/td]

[td]12631[/td]

[/tr]

[tr]

[td]Horváth Péter  [/td]

[td]férfi[/td]

[td]1996[/td]

[td]44050[/td]

[/tr]

[tr]

[td]Kala Pál[/td]

[td]férfi[/td]

[td]1997[/td]

[td]23965[/td]

[/tr]

[tr]

[td]Bajuk Petra[/td]

[td]nő[/td]

[td]1999[/td]

[td]78940[/td]

[/tr]

[/table]

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:

[table][tr][td]név[/td]

[td]

neme  [/td]

[td]

szuletesi_ev  [/td]

[td]

azonositoja[/td]

[/tr]

[tr]

[td]Kiss Virag[/td]

[td]nő[/td]

[td]1999[/td]

[td]12631[/td]

[/tr]

[tr]

[td]Nagy Máté[/td]

[td]férfi[/td]

[td]1995[/td]

[td]69069[/td]

[/tr]

[tr]

[td]Horváth Péter  [/td]

[td]férfi[/td]

[td]1996[/td]

[td]44050[/td]

[/tr]

[tr]

[td]Kala Pál[/td]

[td]férfi[/td]

[td]1997[/td]

[td]23965[/td]

[/tr]

[tr]

[td]Bajuk Petra[/td]

[td]nő[/td]

[td]1999[/td]

[td]78940[/td]

[/tr]

[/table]

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:

[table]

[tr]

[td]név[/td]

[td]

neme  [/td]

[td]

szuletesi_ev  [/td]

[td]

azonositoja[/td]

[/tr]

[tr]

[td]Kiss Virag[/td]

[td]nő[/td]

[td]1999[/td]

[td]12631[/td]

[/tr]

[tr]

[td]Horváth Péter  [/td]

[td]férfi[/td]

[td]1996[/td]

[td]44050[/td]

[/tr]

[tr]

[td]Kala Pál[/td]

[td]férfi[/td]

[td]1997[/td]

[td]23965[/td]

[/tr]

[tr]

[td]Bajuk Petra[/td]

[td]nő[/td]

[td]1999[/td]

[td]78940[/td]

[/tr]

[/table]

(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:

[table]

  [tr]

    [td]nev[/td]

    [td]neme    [/td]

    [td]szuletesi_ev  [/td]

    [td]azonositoja[/td]

  [/tr]

  [tr]

    [td]Kiss Virág[/td]

    [td]nő[/td]

    [td]1999[/td]

    [td]12631[/td]

  [/tr]

  [tr]

    [td]Horváth Péter  [/td]

    [td]férfi[/td]

    [td]1996[/td]

    [td]44050[/td]

  [/tr]

  [tr]

    [td]Bajuk Petra[/td]

    [td]nő[/td]

    [td]1999[/td]

    [td]78940[/td]

  [/tr]

[/table]

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:

[table]

[tr]

[td]név[/td]

[td]

neme  [/td]

[td]

szuletesi_ev  [/td]

[td]

azonositoja[/td]

[/tr]

[tr]

[td]Nagy Máté[/td]

[td]férfi[/td]

[td]1995[/td]

[td]69069[/td]

[/tr]

[tr]

[td]Szabó Emese  [/td]

[td]nő[/td]

[td]1994[/td]

[td]23145[/td]

[/tr]

[/table]

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:

[table]

[tr]

[td]név[/td]

[td]

neme  [/td]

[td]

szuletesi_ev  [/td]

[td]

azonositoja[/td]

[/tr]

[tr]

[td]Kiss Virag[/td]

[td]nő[/td]

[td]1999[/td]

[td]12631[/td]

[/tr]

[tr]

[td]Nagy Máté[/td]

[td]férfi[/td]

[td]1995[/td]

[td]69069[/td]

[/tr]

[tr]

[td]Horváth Péter  [/td]

[td]férfi[/td]

[td]1996[/td]

[td]44050[/td]

[/tr]

[tr]

[td]Szabó Emese[/td]

[td]nő[/td]

[td]1994[/td]

[td]23145[/td]

[/tr]

[tr]

[td]Kala Pál[/td]

[td]férfi[/td]

[td]1997[/td]

[td]23965[/td]

[/tr]

[tr]

[td]Bajuk Petra[/td]

[td]nő[/td]

[td]1999[/td]

[td]78940[/td]

[/tr]

[tr]

[td]Nagy Judit[/td]

[td]nő[/td]

[td] [/td]

[td]99921[/td]

[/tr]

[/table]

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:

[table]

[tr]

[td]név[/td]

[td]

neme  [/td]

[td]

szuletesi_ev  [/td]

[td]

azonositoja[/td]

[/tr]

[tr]

[td]Kiss Virag[/td]

[td]nő[/td]

[td]1999[/td]

[td]12631[/td]

[/tr]

[tr]

[td]Nagy Máté[/td]

[td]férfi[/td]

[td]1995[/td]

[td]69069[/td]

[/tr]

[tr]

[td]Horváth Péter  [/td]

[td]férfi[/td]

[td]1996[/td]

[td]44050[/td]

[/tr]

[tr]

[td]Szabó Emese[/td]

[td]nő[/td]

[td]1994[/td]

[td]23145[/td]

[/tr]

[tr]

[td]Kala Pál[/td]

[td]férfi[/td]

[td]1997[/td]

[td]23965[/td]

[/tr]

[tr]

[td]Bajuk Petra[/td]

[td]nő[/td]

[td]1999[/td]

[td]78940[/td]

[/tr]

[tr]

[td]Nagy Judit[/td]

[td]nő[/td]

[td]1996[/td]

[td]99921[/td]

[/tr]

[/table]

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:

[table]

  [tr]

    [td]nev[/td]

    [td]szuletesi_ev  [/td]

    [td]eletkor[/td]

  [/tr]

  [tr]

    [td]Nagy Lili[/td]

    [td]1995[/td]

    [td]19[/td]

  [/tr]

  [tr]

    [td]Horváth Imre  [/td]

    [td]1996[/td]

    [td]18[/td]

  [/tr]

  [tr]

    [td]Nagy Ferenc[/td]

    [td]1991[/td]

    [td]23[/td]

  [/tr]

  [tr]

    [td]Vass Albert[/td]

    [td]1993[/td]

    [td]20[/td]

  [/tr]

[/table]

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ő:

[table]

  [tr]

    [td]Name[/td]

    [td]Birthdate[/td]

  [/tr]

  [tr]

    [td]Nagy Lili[/td]

    [td]1999[/td]

  [/tr]

  [tr]

    [td]Horváth Imre  [/td]

    [td]1997[/td]

  [/tr]

  [tr]

    [td]Nagy Ferenc[/td]

    [td]1991[/td]

  [/tr]

  [tr]

    [td]Vass Albert[/td]

    [td]1993[/td]

  [/tr]

[/table]

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:

[table]

  [tr]

    [td]azonosito  [/td]

    [td]nev[/td]

    [td]lakhely[/td]

  [/tr]

  [tr]

    [td]690[/td]

    [td]Nagy Lili[/td]

    [td]Budapest[/td]

  [/tr]

  [tr]

    [td]692[/td]

    [td]Horváth Imre  [/td]

    [td]Győr[/td]

  [/tr]

  [tr]

    [td]693[/td]

    [td]Nagy Ferenc[/td]

    [td]Debrecen[/td]

  [/tr]

  [tr]

    [td]701[/td]

    [td]Vass Albert[/td]

    [td]Pécs[/td]

  [/tr]

[/table]

Rendelesek nevű táblázatunk:

[table]

  [tr]

    [td]rendelesID  [/td]

    [td]vevoID  [/td]

    [td]elado_neve  [/td]

    [td]szallito[/td]

  [/tr]

  [tr]

    [td]2760[/td]

    [td]505[/td]

    [td]Németh Zoltán  [/td]

    [td]FastTrans ltd.[/td]

  [/tr]

  [tr]

    [td]2761[/td]

    [td]692[/td]

    [td]Nagy István[/td]

    [td]HT kft.[/td]

  [/tr]

  [tr]

    [td]2762[/td]

    [td]696[/td]

    [td]Nagy István[/td]

    [td]HunLand kft.[/td]

  [/tr]

  [tr]

    [td]2763[/td]

    [td]692[/td]

    [td]Nagy Péter[/td]

    [td]HT kft.[/td]

  [/tr]

[/table]

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:

[table]

  [tr]

    [td]rendelesID  [/td]

    [td]elado_neve  [/td]

    [td]Vasarlo Neve[/td]

  [/tr]

  [tr]

    [td]2761[/td]

    [td]Nagy István[/td]

    [td]Horváth Imre[/td]

  [/tr]

  [tr]

    [td]2763[/td]

    [td]Nagy Péter[/td]

    [td]Horváth Imre[/td]

  [/tr]

[/table]

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:

[table]

  [tr]

    [td]azonosito  [/td]

    [td]nev[/td]

    [td]osztaly  [/td]

    [td]eletkor[/td]

  [/tr]

  [tr]

    [td]31[/td]

    [td]Tóth Márton[/td]

    [td]9.A[/td]

    [td]15[/td]

  [/tr]

  [tr]

    [td]32[/td]

    [td]Tóth András[/td]

    [td]9.A[/td]

    [td]16[/td]

  [/tr]

  [tr]

    [td]63[/td]

    [td]Szélesi Vivien  [/td]

    [td]10.C[/td]

    [td]16[/td]

  [/tr]

  [tr]

    [td]109[/td]

    [td]Szabó Szilvia[/td]

    [td]12.Ny[/td]

    [td]18[/td]

  [/tr]

  [tr]

    [td]86[/td]

    [td]Kovács Luca[/td]

    [td]11.B[/td]

    [td]17[/td]

  [/tr]

[/table]

tanarok nevű táblázatunk:

[table]

  [tr]

    [td]nev[/td]

    [td]szak[/td]

    [td]osztalyfonok[/td]

  [/tr]

  [tr]

    [td]Nagy Máté[/td]

    [td]Történelem  [/td]

    [td]10.A[/td]

  [/tr]

  [tr]

    [td]Földesi Laura[/td]

    [td]Magyar[/td]

    [td]9.A[/td]

  [/tr]

  [tr]

    [td]Kovács Károly[/td]

    [td]Angol[/td]

    [td]12.Ny[/td]

  [/tr]

  [tr]

    [td]Szalai Magdolna  [/td]

    [td]Matek[/td]

    [td]10.C[/td]

  [/tr]

  [tr]

    [td]Tóth Edina[/td]

    [td]Fizika[/td]

    [td]11.B[/td]

  [/tr]

  [tr]

    [td]Fejér Zsófia[/td]

    [td]Német[/td]

    [td]NULL[/td]

  [/tr]

  [tr]

    [td]Bozsik Klára[/td]

    [td]Kémia[/td]

    [td]13.Ny[/td]

  [/tr]

[/table]

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:

[table]

  [tr]

    [td]diak[/td]

    [td]osztaly  [/td]

    [td]osztalyfonok[/td]

  [/tr]

  [tr]

    [td]Tóth Márton[/td]

    [td]9.A[/td]

    [td]Földesi Laura[/td]

  [/tr]

  [tr]

    [td]Tóth András[/td]

    [td]9.A[/td]

    [td]Földesi Laura[/td]

  [/tr]

  [tr]

    [td]Szélesi Vivien[/td]

    [td]10.C[/td]

    [td]Szalai Magdolna[/td]

  [/tr]

  [tr]

    [td]Szabó Szilvia[/td]

    [td]12.Ny[/td]

    [td]Kovács Károly[/td]

  [/tr]

  [tr]

    [td]Kovács Luca[/td]

    [td]11.B[/td]

    [td]Tóth Edina[/td]

  [/tr]

[/table]

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:

[table]

  [tr]

    [td]diak[/td]

    [td]osztaly  [/td]

    [td]osztalyfonok[/td]

  [/tr]

  [tr]

    [td]Velkei Tamás[/td]

    [td]7.A[/td]

    [td]Földesi Eszter[/td]

  [/tr]

  [tr]

    [td]Nagy Dénes[/td]

    [td]6.B[/td]

    [td]Nagy Ferenc[/td]

  [/tr]

  [tr]

    [td]Szabó Máté[/td]

    [td]5.C[/td]

    [td]NULL[/td]

  [/tr]

  [tr]

    [td]Szarvas Ákos[/td]

    [td]8.A[/td]

    [td]Nyitrai Tünde[/td]

  [/tr]

[/table]

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:

[table]

  [tr]

    [td]diak[/td]

    [td]osztaly  [/td]

    [td]osztalyfonok[/td]

  [/tr]

  [tr]

    [td]Velkei Tamás[/td]

    [td]7.A[/td]

    [td]Földesi Eszter[/td]

  [/tr]

  [tr]

    [td]Südi Barbara[/td]

    [td]6.D[/td]

    [td]Nagy Ágnes[/td]

  [/tr]

  [tr]

    [td]NULL[/td]

    [td]NULL[/td]

    [td]Szolojov Zsuzsanna[/td]

  [/tr]

  [tr]

    [td]Lipták László[/td]

    [td]8.A[/td]

    [td]Nyitrai Tünde[/td]

  [/tr]

[/table]

*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

9 emberek kedveli ezt

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

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!

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

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! :)

1 személy kedveli ezt

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

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:

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

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 ;)

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

Szép "kis" leírás minden tekintetben! Bátorkodtam átolvasni, mivel eddig nem nagyon foglalkoztam SQL-el. Ment a +! :)

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

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 :)

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

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.

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

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.

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.

Megosztás


Megosztás link alapján
Megosztás egy közösségi oldalon

Regisztrálj vagy jelentkezz be, hogy válaszolhass

Csak felhasználóként kommentelhetsz.

Regisztrálj

Légy közösségünk tagja még ma! Csak fél perc.


Regisztrálok

Jelentkezz be

Már van felhasználód? Lépj be!


Bejelentkezek