SQL órai anyagok
ELMÉLET
https://szabolaszloistvan.blogspot.com/2020/03/adattarolas-sql-ben.html
https://szabolaszloistvan.blogspot.com/2020/03/adatbazis-tabla-vagy-mar-letezo.html
https://szabolaszloistvan.blogspot.com/2020/03/uj-tabla-letrehozasa-sql-ben.html
https://szabolaszloistvan.blogspot.com/2020/02/adatbazis-letrehozasa-tablakkal.html
https://szabolaszloistvan.blogspot.com/2020/03/select-utasitas-alkalmazasa.html
https://szabolaszloistvan.blogspot.com/2020/03/inner-join-muvelet-alkalmazasa-sql.html
https://szabolaszloistvan.blogspot.com/2014/12/rovid-sql-osszefoglalo.html
https://regi.tankonyvtar.hu/hu/tartalom/tamop425/0046_plsql_programozas/adatok.html
https://szabolaszloistvan.blogspot.com/2020/04/az-sql-leironyelv-alapjai.html
https://szabolaszloistvan.blogspot.com/2020/03/mysql-parancsok.html
https://szabolaszloistvan.blogspot.com/2020/03/mysql-adatbazis-alapok.html
https://szabolaszloistvan.blogspot.com/2020/03/blog-post_11.html
https://szabolaszloistvan.blogspot.com/2020/03/szuresi-feltetel-select-beteg-kezeles.html
https://szabolaszloistvan.blogspot.com/2020/03/tablak-osszekapcsolasa-sql-ben.html
GYAKORLÁS!
Egyszerű lekérdezés szintaxisa;
SELECT [ALL|DISTINCT] * | <oszlopnévlista> FROM <táblanév>
Szűrési feltétel
SELECT *
FROM Beteg, Kezeles
WHERE Beteg.ID = Kezeles.BetegID AND Kezeles.Datum = CURRENT DATE
A tábla vízszintes sorát rekordnak nevezzük, összetartozó adatokat láthatunk!
A tábla függőleges részét oszlopoknak nevezzük, azonos típusu adatokat tartalmaz!
Nem mindegy hogy válogatás vagy szűrés!
Nézzük a példákat
Egyes sorokat csoportosítva irat ki
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
Csoprtositás utáni eredményhalmaz
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
HAVING COUNT(*) > 1
Rendezés
SELECT *
FROM Beteg
ORDER BY Szuletes DESC
Logikai szürés
CASE WHEN logikai vizsgálat THEN kifejezés ha igaz .. ELSE kifejezés ha az előzőekre nem illeszkedik END
Adat hozzáadása a táblához
INSERT INTO Szamla (Szamlaszam, Tulajdonos, Nyitas, Allapot)
VALUES (123456, 'H. Kovács Géza', '1996.05.14.', 'N');
Módosítás
UPDATE Szamla SET Allapot = 'D' WHERE Szamlaszam = 123456;
Törlés a táblából
DELETE FROM Beteg WHERE TAJ = '123 456 789';
grant select on egy_tabla to user1;
Ezzel a user1 felhasználó tud select-tet végrehajtani az egy_tabla-n.
grant create table to user1;
Ezzel a user1 felhasználó tud táblát létrehozni.
REVOKE
Ezzel tudunk meglévő jogosultságot visszavonni.
revoke create table from user1;
revoke select on egy_tabla from user1;
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.
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ű
Á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.
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ó)
select * from gepjarmu
cross join 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ű
Amennyiben feltétel nélkül select-tet adunk meg két táblával, akkor a cross join-nak megfelelő eredményt kapjuk:
select * from gepjarmu, javitasok
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.
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ó
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)
select * from gepjarmu
inner join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
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.
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)
- 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.
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ű
- 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)
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
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ű
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:
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
ELMÉLET
https://szabolaszloistvan.blogspot.com/2020/03/adattarolas-sql-ben.html
https://szabolaszloistvan.blogspot.com/2020/03/adatbazis-tabla-vagy-mar-letezo.html
https://szabolaszloistvan.blogspot.com/2020/03/uj-tabla-letrehozasa-sql-ben.html
https://szabolaszloistvan.blogspot.com/2020/02/adatbazis-letrehozasa-tablakkal.html
https://szabolaszloistvan.blogspot.com/2020/03/select-utasitas-alkalmazasa.html
https://szabolaszloistvan.blogspot.com/2020/03/inner-join-muvelet-alkalmazasa-sql.html
https://szabolaszloistvan.blogspot.com/2014/12/rovid-sql-osszefoglalo.html
https://regi.tankonyvtar.hu/hu/tartalom/tamop425/0046_plsql_programozas/adatok.html
https://szabolaszloistvan.blogspot.com/2020/04/az-sql-leironyelv-alapjai.html
https://szabolaszloistvan.blogspot.com/2020/03/mysql-parancsok.html
https://szabolaszloistvan.blogspot.com/2020/03/mysql-adatbazis-alapok.html
https://szabolaszloistvan.blogspot.com/2020/03/blog-post_11.html
https://szabolaszloistvan.blogspot.com/2020/03/szuresi-feltetel-select-beteg-kezeles.html
https://szabolaszloistvan.blogspot.com/2020/03/tablak-osszekapcsolasa-sql-ben.html
GYAKORLÁS!
Egyszerű lekérdezés szintaxisa;
SELECT [ALL|DISTINCT] * | <oszlopnévlista> FROM <táblanév>
Szűrési feltétel
SELECT *
FROM Beteg, Kezeles
WHERE Beteg.ID = Kezeles.BetegID AND Kezeles.Datum = CURRENT DATE
A tábla vízszintes sorát rekordnak nevezzük, összetartozó adatokat láthatunk!
A tábla függőleges részét oszlopoknak nevezzük, azonos típusu adatokat tartalmaz!
Nem mindegy hogy válogatás vagy szűrés!
Nézzük a példákat
Egyes sorokat csoportosítva irat ki
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
Csoprtositás utáni eredményhalmaz
SELECT COUNT(*), Tulajdonos
FROM Szamla
WHERE Allapot = 'N'
GROUP BY Tulajdonos
HAVING COUNT(*) > 1
Rendezés
SELECT *
FROM Beteg
ORDER BY Szuletes DESC
Logikai szürés
CASE WHEN logikai vizsgálat THEN kifejezés ha igaz .. ELSE kifejezés ha az előzőekre nem illeszkedik END
Adat hozzáadása a táblához
INSERT INTO Szamla (Szamlaszam, Tulajdonos, Nyitas, Allapot)
VALUES (123456, 'H. Kovács Géza', '1996.05.14.', 'N');
Módosítás
UPDATE Szamla SET Allapot = 'D' WHERE Szamlaszam = 123456;
Törlés a táblából
DELETE FROM Beteg WHERE TAJ = '123 456 789';
grant select on egy_tabla to user1;
Ezzel a user1 felhasználó tud select-tet végrehajtani az egy_tabla-n.
grant create table to user1;
Ezzel a user1 felhasználó tud táblát létrehozni.
REVOKE
Ezzel tudunk meglévő jogosultságot visszavonni.
revoke create table from user1;
revoke select on egy_tabla from user1;
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.
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ű
Á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.
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ó)
select * from gepjarmu
cross join 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ű
Amennyiben feltétel nélkül select-tet adunk meg két táblával, akkor a cross join-nak megfelelő eredményt kapjuk:
select * from gepjarmu, javitasok
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.
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ó
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)
select * from gepjarmu
inner join javitasok
on gepjarmu.car_azonosito = javitasok.car_ID
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.
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)
- 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.
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ű
- 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)
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
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ű
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:
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
Nincsenek megjegyzések:
Megjegyzés küldése