„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
Diaphol (vitalap | szerkesztései)
Diaphol (vitalap | szerkesztései)
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.
 
az INNER általában elhagyható, vagy írható helyette LEFT, RIGHT, FULL OUTER, CROSS is.
 
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]] rendszereiben nincs NUMERIC, helyette a NUMBER-t kell használni
* 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
 
=== Összekapcsolás ===
 
Az SQL kiszolgálók egy része támogatja a SELECT-FROM szakaszba írt összekapcsolási utasításokat, mások csak a SELECT-WHERE szakaszban fogadják el:
 
Összekapcsolás a SELECT-FROM-ban:
<source lang="sql">
SELECT *
FROM Beteg KEY JOIN Lelet
</source>
Összekapcsolás a WHERE-ben:
<source lang="sql">
SELECT *
FROM Beteg, Lelet
WHERE Beteg.ID = Lelet.BetegID
</source>
 
=== Keresés ===
A lap eredeti címe: „https://hu.wikipedia.org/wiki/SQL