„SQL” változatai közötti eltérés
[nem ellenőrzött változat] | [nem ellenőrzött változat] |
Tartalom törölve Tartalom hozzáadva
152. sor:
az összes beteg-kezelés párost adja. Amelyik betegnek nem volt kezelése, azt nem írja ki, amelyiknek több volt, azt annyiszor, ahány kezelésen átesett.
LEFT esetén: az első tábla adatai akkor is szerepelnek, ha nincs illeszkedő adat a másodikban (azaz a fenti példában megmutatja azokat a betegeket is, akinek soha nem volt kezelése)
294 ⟶ 292 sor:
=== Egyéb utasítások ===
==== JOIN ====
Az összekapcsolás lényege, hogy két vagy több táblában tárolt adatokat tudunk lekérdezni az alapján, hogy hol egyezik a megadott mezőérték.
Példatáblák: az alábbi két táblán (gepjarmu és javitasok) összekapcsolások segítségével tudjuk meghatározni, hogy pl milyen rendszámú autón milyen javítás szükséges vagy adott javításhoz melyik gépjárműhöz tartozik.<syntaxhighlight lang="sql">
SELECT * FROM gepjarmu;
car_azonosito rendszam
--------------- ----------
1001 ZQL-556
1002 WPT-444
1003 ZRM-555
SELECT * FROM javitasok;
car_ID alkatresz
------------- ------------
1001 váltó
1001 kerék
1002 kerék
1004 futómű
</syntaxhighlight>Általában a két táblában lévő azonosító oszlop elnevezése megegyezik (pl. car_azonosito lenne a javitasok táblában is), de ez nem szükséges, ezért szerepel kétfajta elnevezés a két táblában.
===== '''Cartesian-join, Descartes-szorzat''' =====
A ''feltétel nélküli'' összekapcsolás. Ez az összekapcsolás a két tábla minden sorát összekapcsolja. Az inner join ennek részhalmaza (az a where feltétel, amikor egyezik a két táblában az azonositó)<syntaxhighlight lang="sql">
select * from gepjarmu, javitasok
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1001 ZQL-556 1002 kerék
1001 ZQL-556 1002 váltó
1001 ZQL-556 1004 futómű
1002 WPD-444 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
1002 WPD-444 1004 futómű
1003 ZRM-555 1001 váltó
1003 ZRM-555 1002 kerék
1003 ZRM-555 1002 váltó
1003 ZRM-555 1004 futómű
</syntaxhighlight>A cartesian join sorainak száma ''a két tábla sorainak számának szorzata''. A példában: 3 • 4 = 12
===== '''Inner join, belső összekapcsolás, metszet''' =====
A két tábla metszete, azaz azok a sorok, amelyek ''mindkét táblában megtalálhatóak''.<syntaxhighlight lang="sql">
select * from gepjarmu, javitasok
where gepjarmu.car_azonosito = javitasok.car_ID
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
</syntaxhighlight>Ebben a select-ben csak azok a sorok jelennek meg, amelyek mindkét táblában megtalálhatóak (1001 és 1002 azonosítójú autók) és annyiszor ahány sorban megjelenik az azonosító (az 1002-es azonosítójú gépjármű kétszer, mert a javitasok táblában kétszer szerepel.)
A where feltételben megadott inner join jól mutatja, hogy az inner join a cartesian join (minden-mindennel) azon részhalmaza, ahol egyezik az azonosító. Az inner join másfajta felírása (eredménye ugyanaz mint a where feltételben megadott összekapcsolás)<syntaxhighlight lang="sql">
select * from gepjarmu
inner join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
</syntaxhighlight>Az „inner” szó elhagyható, az önállóan feltüntetett „join” is ugyanúgy az inner join-t adja.
===== '''Left join''' =====
Baloldali kapcsolás. A kapcsolás alapját (értelmezési tartományát, gepjarmu tábla) adó tábla összes sorához történik hozzárendelés.<syntaxhighlight lang="sql">
select * from gepjarmu
left join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID;
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
1003 ZRM-555 (null) (null)
</syntaxhighlight>
- ha szerepel a másik táblában érték akkor azt rendeli hozzá (pl. 1001-es gépjárműhöz ’váltó’)
- ha többször szerepel a másik táblában érték, akkor annyiszor kerül feltüntetésre, ahány sorban megtalálható a másik táblában (pl. az 1002-es gépjármű kétszer szerepel, mert két sorban is megjelenik a javitasok táblában: ’kerék’ és ’váltó’)
- ha nem található meg a második táblában akkor NULL érték kerül hozzárendelésre (pl az 1003-as gépjármű nincs benne a javitasok táblában)
Használatos a left join helyett a left outer join parancs, amely tartalmilag megegyezik.
===== '''Right join''' =====
Jobboldali kapcsolás. A kapcsolt (második, javitasok tábla) minden eleméhez elvégzi a hozzákapcsolást.<syntaxhighlight lang="sql">
select * from gepjarmu
right join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID;
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
(null) (null) 1004 futómű
</syntaxhighlight>- ha szerepel az első táblában érték, akkor azt rendeli hozzá (pl. 1001-es car_ID gépjárműhöz található rendszám)
- ha többször szerepel a táblában akkor annyiszor kerül felsorolásra, ahány ilyen sor van (pl. az 1002-es gépjármű kétszer szerepel, ezért két sorban kapjuk eredményül)
- ha a második táblában szerepel, de az elsőben nem, akkor is megjelenik a lekérdezésben, de NULL értékkel (például az 1004-es gépjármű csak a javitasok táblában található, a gepjarmu táblában nem)
Használatos a right join helyett a right outer join parancs, amely tartalmilag megegyezik.
===== '''Full join''' =====
Mindkét oldalról elvégzi az összekapcsolást, azaz az előző három join uniója:
- inner join
- right join
- left join<syntaxhighlight lang="sql">
select * from gepjarmu
full join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID;
car_azonosito rendszam car_ID alkatresz
--------------- --------------- --------------- ---------------
1001 ZQL-556 1001 váltó
1002 WPD-444 1002 kerék
1002 WPD-444 1002 váltó
1003 ZRM-555 (null) (null)
(null) (null) 1004 futómű
</syntaxhighlight>Tehát a left join, right join és inner join megfogalmazható úgy is, hogy ezek a full join részhalmazai. Az inner join a full join olyan részhalmaza, amely sorban nem szerepelnek (null) értékek.
Mivel a full join a három join uniója, ezért helyettesíthető az alábbi paranccsal:<syntaxhighlight lang="sql">
select * from gepjarmu
inner join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
union
select * from gepjarmu
left join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
union
select * from gepjarmu
right join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
</syntaxhighlight>A full join szerepel az ''Oracle, ProstgreSQL'' és ''MS SQL Server'' verziókban, de <u>nem</u> szerepel a ''MySQL'', ''SQLite'' típusokban – ez utóbbi esetekben az előző union paranccsal tudjuk létrehozni.
A full join és cartesian join kapcsolata: két tábla cartesian join (minden adat mindegyikkel kapcsolva) és full join halmazainak metszete a két tábla inner join-ja.
Használatos a full join helyett a full outer join parancs, amely tartalmilag megegyezik.
===== '''Self-join és tábla alias''' =====
Érdemes használni a tábla nevekre a lekérdezésekben aliast, mert megkönnyíti a hivatkozást:<syntaxhighlight lang="sql">
select * from gepjarmu a, javitasok b
where a.car_azonosito = b.car_ID
</syntaxhighlight>Szükséges lehet önmagával kapcsolni a táblát (self-join). Ebben az esetben a két táblát alias-szal tudjuk megkülönböztetni. A következő példában szeretnénk kigyűjteni a dolgozo táblából minden dolgozóhoz a nálánál kevesebbet keresőket.<syntaxhighlight lang="sql">
select * from dolgozo
name sal
---------- ----------
Nagy 7500
Balogh 7600
Kovács 7700
Szabó 7800
</syntaxhighlight><syntaxhighlight lang="sql">
select * from dolgozo x, dolgozo y
where x.sal < y.sal
name sal name sal
---------- ---------- ---------- ----------
Nagy 7500 Balogh 7600
Nagy 7500 Kovács 7700
Balogh 7600 Kovács 7700
Nagy 7500 Szabó 7800
Balogh 7600 Szabó 7800
Kovács 7700 Szabó 7800
</syntaxhighlight>
==== Változók, elágazások, ciklusok ====
Az SQL-t az idők során kiegészítették olyan tulajdonságokkal, hogy a programozók képesek legyenek benne bonyolult algoritmusokat is írni. Ez akkor válhat szükségessé, ha például komoly adatkezelési feladatokat szeretnénk az ügyféloldalról a kiszolgálóoldalra áthelyezni, az ott elérhető sokkal nagyobb teljesítmény miatt. De az is lehet, hogy csak egyszerűsíteni akarjuk a programozást felhasználói függvények létrehozásával (például szükségünk lenne egy olyan függvényre, ami a tajszámból kiszedi a szóközöket).
327 ⟶ 504 sor:
=== Adattípusok ===
* Az [[Oracle]] nem támogatja a VARCHAR-t, helyette a VARCHAR2-t javasolja
* Az [[Oracle]] nem támogatja a LONG VARCHAR-t, helyette a CLOB-ot javasolja
334 ⟶ 510 sor:
* Némelyik rendszerben létezik a SMALLINT vagy az INTEGER típus is, mint szabványon kívüli elemek
* Van olyan rendszer, amiben a BOOL típust is megvalósították
=== Keresés ===
|