2020. április 20., hétfő

FELKÉSZÜLÉS A VIZSGÁRA SQL MINTAFELADATOK GYAKORLÁSA!

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


Nincsenek megjegyzések:

Megjegyzés küldése