Adatbázis rendszerek Gy: DQL Lekérdezések

Hasonló dokumentumok
Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály. Adatbázis-kezelés alapjai SQL 2: DQL. v: B IT MAN 169/1

B I T M A N B I v: T M A N

Adatbázis-kezelés, információs-rendszerek

Adatbázis rendszerek Ea: Esqúel. Structured Query Language

Adatbázis rendszerek Ea: Eskúel. Structured Query Language

ADATBÁZISOK gyakorlat: SQL 2. rész SELECT

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Adatbázisok. 9. gyakorlat SQL: SELECT október október 26. Adatbázisok 1 / 14

Adatbázisok I. Az SQL nyelv

Adatbázis-kezelés. 3. Ea: Viszonyított betűszámtan (2013) Relációs algebra alapok (átgondolt verzió) v: Szűcs Miklós - ME, ÁIT. 1.

Adatbázisok I A relációs algebra

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

Adatbázis rendszerek Ea: Viszonyított betűszámtan. Relációs algebra alapok

Adatbázisok I. Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

Adattípusok. Max. 2GByte

AB1 ZH mintafeladatok. 6. Minősítse az állításokat! I-igaz, H-hamis

Adatbázis-kezelés. Harmadik előadás

Keskeny Zoltán 2007/08 SQL. Structured Query Language. (gyakorlat az SQL2 szabvány alapján) Keskeny Zoltán tanév

SQL. Táblák összekapcsolása lekérdezéskor Aliasok Allekérdezések Nézettáblák

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

Adattípusok. Max. 2GByte

SQL parancsok feldolgozása

Lekérdezések az SQL-ben 1.rész

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

Lekérdezések az SQL-ben 1.rész

Adatbázis Rendszerek I. 9. SQL alapok (DDL esettanulmány)

Adatbázisok elmélete 9. előadás

5.előadás: Adatbázisok-I. dr. Hajas Csilla (ELTE IK)

SQL haladó. Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások

Adatbázis rendszerek SQL nyomkövetés

Adatbázisok* tulajdonságai

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE) október október 22. Adatbázisok 1 / 14

Adatbázisok. 2. gyakorlat SQL november november 12. Adatbázisok 1 / 31

Adatbázis rendszerek Ea: Viszonyított betűszámtan. Relációs algebra alapok

Gyakorlás: Hozzunk létre egy Alkalmazottak táblát AZO szám, Részleg szöveg, Munkakör szöveg és BelépésDátuma dátum típussal.

Adatbázisok elmélete 9. előadás

Az SQL nyelv Structured Query Language (Struktúrált lekérdező nyelv)

Adatbázis Rendszerek II. 3. SQL alapok

SQL PÉLDATÁR. készült a PTE TTK Iskolai informatika III. kurzus teljesítésére

B I T M A N B I v: T M A N

SELECT. SELECT(projekció) FROM(forrás) WHERE(szűrés) GROUPBY(csoportosítás) HAVING(csoportok szűrése) ORDERBY(rendezés)

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések

STRUCTURED QUERY LANGUAGE(SQL) - ALAPOK

BEVEZETÉS Az objektum fogalma

LEKÉRDEZÉSEK SQL-BEN. A relációs algebra A SELECT utasítás Összesítés és csoportosítás Speciális feltételek

Adatbázis Rendszerek II. 8. Gyakorló környezet

ADATBÁZISOK I. Az esetleges hibákat kérlek a csongor@csongorbokay.com címen jelezd! Utolsó módosítás: március 20.

Több tábla összekapcsolásán alapuló lekérdezések

Tankönyv példák kidolgozása

Több tábla összekapcsolásán alapuló lekérdezések. Copyright 2004, Oracle. All rights reserved.

WHERE záradék (további lehetıségek) SQL specialitások, nem írhatók át relációs algebrába: LIKE. NULL értékek. Az ismeretlen (unknown) igazságérték

Adatbázisok tavaszi félév Vizsgatételsor

Adatbázis, adatbázis-kezelő

Az SQL nyelv. SQL (Structured Query Language = Strukturált Lekérdező Nyelv).

ADATBÁZIS-KEZELÉS. Relációalgebra, 5NF

Többtáblás lekérdezések megjelenítése

SQL bevezetés. Select-From-Where záradékok Több relációt tartalmazó lekérdezések Alkérdések

Adatbázisok-1 előadás Előadó: dr. Hajas Csilla

7. Gyakorlat A relációs adatmodell műveleti része

Adatbázisok elmélete 10. előadás

Adatbázis kezelés Delphiben. SQL lekérdezések

A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai

Adatbázis Rendszerek

Relációs algebrai lekérdezések átírása SQL SELECT-re (példák)

Adatbázis rendszerek 7. Matematikai rendszer amely foglal magában:

4. Előadás Az SQL adatbázisnyelv

Adatok szűrése, rendezése

Adatbázisok elmélete 9. előadás

Access alapok. Megnevezés Művelet Minta. Új adatbázis létrehozása. Új / Üres adatbázis.. Tábla létrehozása tervező nézetben.

SELECT DISTINCT deptno FROM emp; (distinct) SELECT STATEMENT HASH UNIQUE TABLE ACCESS FULL EMP

Hallgató i Ú tmutató. Beadandó anyag követelményei

BGF. 4. Mi tartozik az adatmodellek szerkezeti elemei

SQL gyakorló feladatok. 6. Adatbázis gyakorlat április 5.

Lekérdezések az SQL SELECT utasítással

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

A RELÁCIÓS ADATMODELL MŰVELETI RÉSZE (RELÁCIÓS ALGEBRA ÉS KALKULUS)

3.előadás: Adatbázisok-I. dr. Hajas Csilla (ELTE IK)

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

Adatbázis használat I. 2. gyakorlat


Adatbázis Rendszerek II. 2. Gyakorló környezet

ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT

Adatbázis használat I. 2. gyakorlat

Adatbázis rendszerek 2. előadás. Relációs algebra

Bevezetés: az SQL-be

Mveletek a relációs modellben. A felhasználónak szinte állandó jelleggel szüksége van az adatbázisban eltárolt adatok egy részére.

GEIAL Kovács László. GEIAL Kovács László

SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

Adatbázisok I A relációs algebra

Készítette: Szabóné Nacsa Rozália

INTEGER egész típusú érték megadása, hozzá hasonló, de számábrázolási tartományában eltérő típus még a SMALLINT, szinonimája a DECIMAL

ADATBÁZISKEZELÉS ADATBÁZIS

ADATBÁZISOK ELMÉLETE 5. ELŐADÁS 3/22. Az F formula: ahol A, B attribútumok, c érték (konstans), θ {<, >, =,,, } Példa:

A SELECT működése. Ttanar tábla: Tdiak tábla:

LOGISZTIKAI ADATBÁZIS RENDSZEREK JOIN, AGGREGÁCIÓ

Lekérdezések I. Egyszerű választó lekérdezések

Adatbáziskezelés. SQL parancsok. Függvények

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Átírás:

Adatbázis rendszerek 1. 11.Gy: DQL Lekérdezések. 70/1 B IT v: 2018.11.24 MAN

DQL utasítások 70/2 Projekció Szelekció Feltételek megfogalmazása Rendezés a lekérdezésben Aggregáció a lekérdezésben Csoportképzés a lekérdezésben Join Halmazműveletek Al-select Értéktől függő kiírt adat

DQL Adat lekérdező utasítás Az SQL nyelvben egyetlen parancs, a SELECT parancs szolgál az adatok lekérdezésére Alkalmas a relációs algebra minden műveletének a leképzésére Feladata: Egy vagy több adattáblából egy eredménytábla előállítása, amely a képernyőn listázásra kerül, vagy más módon használható fel. A parancs általános alakja: SELECT [distinct] mezőlista FROM táblalista [WHERE szelekciós_feltétel] [GROUP BY csoportosító_kifejezés] [HAVING csoportokra_vonatkozó_feltétel] [ORDER BY rendező_mezőlista]; 70/3

Projekció (vetítés) Projekció: csak a kijelölt mezők jelennek meg az eredmény relációban. Jele: mezőlista (r) Megvalósítása: select [distinct] mező_lista from tábla_lista; select Rendszám, Típus from autó; select * from autó; select Típus, Ár/280 As EuroÁr from autó; As: Alias név select distinct szín from autó; *: Minden mező Autó Rendszám Típus Szín GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Fehér Típus Opel Nissan Trabant DISTINCT (különböző): csak az egymástól különböző sorok jelennek meg 70/4az eredménytáblában, így nem lesz két egyforma rekord benne. Ár 1200000 1500000 25000 EuroÁr 4285 5357 89 Szín Fehér Ezüst

Szelekció (kiválasztás) Szelekció: a megadott feltételnek eleget tévő rekordok kerülnek át az eredmény relációba. Jele: felt (r) Megvalósítása: select mezőlista from táblalista WHERE szelekciós_feltétel; select * from autó WHERE Kor < 10; Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 JED-123 Nissan Ezüst 5 Ár 1200000 1500000 70/5

Feltételek megfogalmazása Használható operátorok: Relációs operátorok (=,!=, <, >,!<,!>, <>, <=, >=) Algebrai operátorok (+,-,*,/) Logikai operátorok (AND, OR, NOT) Speciális logikai kifejezések: x IS NULL: igaz, ha az x mező értéke NULL. x BETWEEN a AND b: igaz, ha a x b. x IN halmaz: igaz, ha x megegyezik a megadott halmaz egy elemével. Megfelel több vagy kapcsolatban lévő feltételnek. x LIKE minta: igaz, ha az x karaktersorozat megfelel a megadott mintának. Helyettesítő karakterek: 70/6 _ - egy kötelező karakter, % - tetszőleges számú karakter

NULL érték kezelése Az SQL-ben az egyes mezőkben szerepelhet null érték, ha nincs megadva a mezőre a Not Null megszorítás! A null nem azonos a mezőbe beírt 0 vagy ' ' értékkel! Jelentése: Nem megadott érték (nem tudom az adott telefonszámot) Nem értelmezhető érték (valakinek nincs nyelvismerete) Törölt érték Feltételekben null érték vizsgálatára csak az IS NULL és az IS NOT NULL kifejezések használhatók Egy null értéket bármivel hasonlítunk össze, az eredmény UNKNOWN (ismeretlen) Ha egy üres mezőre a mező=null feltételt adjuk meg, az unknown eredményt ad, vagyis nem lesz igaz! Aggregált értékek kiszámításakor a null értékek kimaradnak Ha egy mezőben null érték van, és a mezőt tartalmazza egy 70/7 számított kifejezés, akkor annak értéke is null érték

Háromértékű logika Az SQL-ben a null érték létéből következő unknown logikai érték miatt ún. háromértékű logika van, az értékek True, False és Unknown lehetnek. Hogyan működnek ilyen esetben a logikai operátorok? Az alábbi módon: x y x AND y x OR y NOT(x) T T T T F T U U T F T F F T F U T U T U U U U U U U F F U U F T F T T 70/8 F U F U T F F F F T

Null-érték függvények NVL(data, expr1) A null értékű adatot a megadott értékkel helyettesíti. Az adat és az érték típusának meg kell egyeznie! Az adattípus lehet karakter, szám, dátum select nvl(osztály, 'Nincs megadva osztály') Osztály from dolgozó; NVL2(data, expr1, expr2) Ha a data nem null, akkor expr1, ha null, akkor expr2 lesz az eredmény select nvl2(to_char(jutalom), 'IGEN', 'NEM') Jutalom from dolgozó; A to_char() karakterré konvertálja a numerikus jutalom értéket, így szöveges helyettesítő értékek adhatók meg 70/9

Példák szelekciós feltételekre Ember Név Cím Szül_Év Kis Géza Eger 1983 Autó Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 Ár 1200000 SELECT * FROM Ember WHERE Szül_Év BETWEEN 1975 AND 1980; SELECT * FROM Ember WHERE Cím IS NULL; SELECT * FROM Ember WHERE Név LIKE 'B%'; SELECT * FROM Ember WHERE Név LIKE % Géza%'; SELECT Rendszám FROM Autó WHERE Szín IN ('piros', 'kék', 'fehér'); SELECT Rendszám,Típus FROM Autó WHERE Ár < 1000000 AND Szín NOT LIKE '%lila%'; SELECT Rendszám FROM Autó WHERE Rendszám LIKE '_ER-6%'; SELECT Rendszám FROM Autó WHERE Rendszám LIKE '%0' OR Rendszám LIKE '%2' OR Rendszám LIKE '%4' OR Rendszám LIKE '%6' OR Rendszám LIKE '%8'; select Rendszám from Autó 70/10 where substr(rendszám, -1, 1) in ('0','2','4','6','8');

Szelekciós függvények Sorfüggvények, melyek minden egyes rekord adataira elvégzik a kért módosítást. ABS(n): abszolút é'rték Példa: ABS(-15) = 15 LOWER(char): konverzió kisbetűsre. Példa: LOWER('Kovács') = 'kovács' UPPER(char): konverzió nagybetűsre. Példa: UPPER('Kovács') = 'KOVÁCS' INITCAP(char): konverzió nagy kezdőbetűsre. Példa: INITCAP('kovács') = 'Kovács' LTRIM(char): balról szóközök eltávolítása. Példa: LTRIM(' alma ') = 'alma ' RTRIM(char): jobbról szóközök eltávolítása. Példa: RTRIM(' alma ') = ' alma' 70/11

Szelekciós függvények 2. SUBSTR(char, m[, n]): a char string m-edik karakterétől n hosszú részstringet ad vissza. (Ha n nem szerepel, akkor a végéig.) Az első karakter 1-es sorszámú. Példa: SUBSTR('ABCDEFG',2,3) = 'BCD' TO_CHAR(n): konverzió numerikusról vagy dátumról karakteresre. Példa: TO_CHAR(123) = '123' TO_DATE(char): konverzió karakteresről dátumra. Példa: TO_DATE('15-JAN-06') TO_NUMBER(char): konverzió karakteresről numerikusra. Példa: TO_NUMBER('123') = 123 SQRT(kifejezés): Négyzetgyök, numerikus kifejezésre vonatkozik. Példa: SQRT(16) = 4 70/12

A függvények kipróbálása select kifejezés from tábla_lista [where ] select upper('kiskutya') from dual KISKUTYA select substr('kiskutya',3,2) from dual sk select to_date('2016.12.31', 'YYYY.MM.DD') from dual 12/31/2016 select sqrt(17) from dual 4.1231056256176605498214098 select power(2, 4) from dual 16 2 4 select power(2.6, 2.4) from dual 70/13 9.9068602139587576142

Aggregáció a lekérdezésben Aggregáció: oszlopfüggvények, melyek egy oszlop adataiból egy konkrét statisztikai értéket számítanak ki. Csak mezőlistában, vagy a Having feltételben szerepelhetnek! Aggregációs függvények: SUM(x) - összeg x: numerikus mező vagy kifejezés értéke AVG(x) - átlagérték MAX(x) legnagyobb érték MIN(x) legkisebb érték COUNT(x) elemek száma Ha x=*: minden rekordot érint select avg(ár) from Autó; select count(*) from Autó; select count(kor) from Autó Where Kor > 10; select 70/14 Sum(Ár), Avg(Kor) from Autó;

Csoportképzés a lekérdezésben select mezőlista from táblalista [where...] GROUP BY csoportosító_kifejezés; Az egyes csoportba azok a rekordok kerülnek, melyeknél a csoportosító kifejezés értéke azonos. Az eredménytáblában egy csoportból egy rekord jelenik meg Az összesítő függvények csoportonként hajtódnak végre. Általában a csoportosító kifejezés szerepel a mezőlistában. select Típus, avg(ár) from Autó GROUP BY Típus; select Típus, count(*) from Autó WHERE Szín='Piros' GROUP BY Típus order by Típus; select Szín, min(ár), max(ár) from Autó GROUP BY Szín; select substr(rendszám,1,1) KB, count(*) DB from autó GROUP BY substr(rendszám,1,1); 70/15 KB C H DB 5 2 B IT JMAN 4

Csoportok szűrése select mezőlista from táblalista [where...] GROUP BY oszloplista HAVING csoportokra_vonatkozó_feltétel; A HAVING a csoportképzés után a csoportokra vonatkozó, aggregációs függvényeket tartalmazó feltétel megadására használható, csak a GROUP BY kifejezéssel együtt! select Típus, avg(ár) from Autó GROUP BY Típus HAVING avg(ár) > 500000; select Típus, count(*) from Autó WHERE Szín='Piros' GROUP BY Típus HAVING count(*) > 3 order by Típus; 70/16

Rendezés a lekérdezésben A mezőlistában szereplő mezők szerint rendezhetjük a rekordokat növekvő (ASC) vagy csökkenő (DESC) sorrendben Mezőnevek helyett használható a mezők száma is, a számozás 1-ről indul! Több mező is megadható Alapértelmezés a növekvő rendezés, ezt nem kell megadni select mezőlista from... [where...] ORDER BY mezőnév [ASC DESC], mezőnév [ASC DESC],...; Autó Rendszám Típus Szín Kor GBC-765 Opel Fehér 6 Ár 1200000 select * from autó ORDER BY Típus, Ár DESC; select * from autó ORDER BY 2, 5 desc; 70/17

A select utasítás általános alakja A parancs egyes elemeinek a sorrendje kötött A mezőlista és a from táblalista kötelező elem A mezőlistában és a táblalistában alias nevek használhatók A parancsból a [ ] zárójelben lévő részek kimaradhatnak A having csak a group by kifejezéssel együtt használható SELECT [distinct] mezőlista FROM táblalista [WHERE szelekciós_feltétel] [GROUP BY csoportosító_kifejezés] [HAVING csoportokra_vonatkozó_feltétel] [ORDER BY rendező_mezőlista]; 70/18

70/19

Join (szorzat, illesztés) Ha az eredménytábla két (vagy több) táblából akarjuk az adatokat megjeleníteni, akkor a táblák összekapcsolására a JOIN parancsot kell használni. SQL-ben a következő típusokat alkalmazhatjuk: Cross join (Descartes szorzat, teljes illesztés) Theta join Feltételes illesztés Equi join Egyenlőségen alapuló illesztés Natural join Természetes illesztés Outer join Külső illesztés, Self join (tábla összekapcsolása önmagával), Félig összekapcsolások (Semi join, Anti semi join). 70/20

Cross join (Descartes szorzat, teljes illesztés) A legegyszerűbb összekapcsolás a keresztszorzat (szorzat) Ebben az összekapcsolásban nem adunk meg feltételt az összekapcsolás módjára, ezért az egyik tábla minden rekordja párosításra kerül a másik tábla minden rekordjával. Kétféle módon is megadható: A from után a táblák felsorolásával (vesszővel elválasztva), A cross join kulcsszóval. Nagy rekordszámok esetén hatalmas eredménytábla keletkezik, ezért használatát lehetőleg kerülni kell! Jele a relációs algebrában: r 1 x r 2 SELECT mezőlista FROM tábla_1, tábla_2; SELECT mezőlista FROM tábla_1 CROSS JOIN tábla_2; 70/21

Cross join 1 2 3 m1 cross join m2 A B C = 1 2 3 1 2 3 1 2 3 m1 m2 A A A B B B C C C 70/22

Cross join (Descartes szorzat, teljes illesztés) Autó Rendszám Típus Szín Ár Tulaj Ember Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst 1200000 1500000 114 178 114 Kis Géza Eger 178 Jó Éva Miskolc 20-9555666 30-8765432 select Név, Típus, Ár from Autó, Ember; select Név, Típus, Ár from Autó cross join Ember; Név Kis Géza Típus Opel Ár 1200000 Jó Éva Opel 1200000 Kis Géza Nissan 1500000 Jó Éva Nissan 1500000 70/23

Feltételes illesztés A keresztszorzat összekapcsolás kiegészíthető a WHERE záradékkal, melyben megadhatjuk az összekapcsolásra vonatkozó, és a rekordok adataira vonatkozó feltételt is. Tetszőleges feltétel megfogalmazható Ha az összekapcsolási feltétel alapja a két táblában lévő adatok egyenlősége, akkor az illesztést Equi joinnak nevezzük. Ha az összekapcsolási feltétel nem az adatok egyenlőségén alapszik, akkor az illesztést Theta joinnak nevezzük. Jele a relációs algebrában: r 1 felt r 2 SELECT mezőlista FROM tábla1, tábla2 WHERE feltétel; 70/24

Theta join 1 2 3 m1 m2 0 2 3 join = 1 1 2 m1 m2 2 3 3 where m1<m2 Equi join 1 2 3 m1 m2 0 2 3 join = m1 m2 2 2 3 3 where m1=m2 70/25

Theta join Feltételes illesztés Autó Rendszám Típus Szín GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Fehér Ár 120000 150000 25000 Ember Ekód Név Összeg 114 Kis Géza 180000 178 Jó Éva 100000 Telefon 20-9555666 30-8765432 A fehér autókat kik tudják megvásárolni? select rendszám, ár, név, összeg from Autó, Ember where összeg > ár and szín='fehér'; select rendszám, ár, név, összeg from Autó cross join Ember where összeg > ár and szín='fehér'; Join feltétel 70/26 Szelekciós feltétel Rendszám GBC-765 Ár 120000 Név Kis Géza Összeg 180000 AKT-392 25000 Kis Géza 180000 AKT-392 25000 Jó Éva 100000

Equi join Egyenlőség alapú illesztés Jele a relációs algebrában: r 1 =felt r 2 Kinek van pontosan annyi pénze, amennyibe egy autó kerül? Autó Rendszám Típus Szín GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Fehér Ár 120000 150000 25000 Ember Ekód Név Összeg 114 Kis Géza 120000 178 Jó Éva 100000 Telefon 20-9555666 30-8765432 select rendszám, ár, név, összeg from Autó cross join Ember where összeg = ár; Join feltétel Rendszám GBC-765 Ár 120000 Név Kis Géza Összeg 120000 70/27

Equi join típusok A legkényelmesebb megoldás, ha a két táblában van egy-egy ugyanolyan nevű (és típusú) oszlop, ez esetben használhatjuk a Natural join-t, mely automatikusan összekapcsolja az azonos nevű oszlopokat: Ha több oszlop neve is megegyezik a táblákban, olyan belső összekapcsolást alkalmazhatunk, ahol egy kulcsszóval megadható a join feltétele: Ha különbözőek az összekapcsolandó mezők nevei, használjuk az on kulcsszót: 70/28 SELECT mezőlista FROM tábla1 NATURAL JOIN tábla2 WHERE szelekciós feltétel; SELECT mezőlista FROM tábla1 INNER JOIN tábla2 USING (mező) WHERE szelekciós feltétel; SELECT mezőlista FROM tábla1 INNER JOIN tábla2 ON join_feltétel WHERE szelekciós feltétel;

Natural join 1 2 3 m1 m2 A B C join = 1 2 m1 m2 A C 70/29

Natural join Természetes illesztés Jele a relációs algebrában: r 1 r 2 vagy r 1 * r 2 SELECT mezőlista FROM tábla1 NATURAL JOIN tábla2 WHERE szelekciós feltétel; A táblákban meg kell egyezniük a kapcsolattartó mezők nevének! Irányíthatatlan a kapcsolat, minden azonos nevű mező kapcsolódik! Rendszám Típus Szín Kor Tulaj Tulaj Név Kor Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 29 14 38 114 178 102 114 Kis Géza 29 178 Jó Éva 41 102 Kék Béla 36 20-9555666 30-8765432 70-3355440 155 Bő Jenő 18 70-6655429 select rendszám, név from autó natural join ember; 70/30 Rendszám GBC-765 Név Kis Géza

Equi join 1 2 3 m1 join using m2 A B C = 1 2 m1 m2 A C 1 2 3 m1 join on m2 A B C = 1 2 m1 m2 A C 70/31

Equi join Egyenlőség alapú illesztés SELECT mezőlista FROM tábla1 INNER JOIN tábla2 USING (mező) WHERE szelekciós feltétel; A táblákban meg kell egyezniük a kapcsolattartó mezők nevének! Irányítható a kapcsolat a megfelelő mezőnevek megadásával! Rendszám Típus Szín Kor Tulaj Tulaj Név Kor Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 29 14 38 114 178 102 114 Kis Géza 29 178 Jó Éva 41 102 Kék Béla 36 20-9555666 30-8765432 70-3355440 155 Bő Jenő 18 70-6655429 select rendszám,név from autó inner join ember using (tulaj); 70/32 Rendszám GBC-765 JED-123 AKT-392 Név Kis Géza Jó Éva Kék Béla

A USING kulcsszó használata select * from autó inner join ember using (tulaj); Autó Rendszám Típus Szín Kor Tulaj Ember Tulaj Név Kor Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 29 14 38 114 178 102 114 Kis Géza 29 178 Jó Éva 41 102 Kék Béla 36 20-9555666 30-8765432 70-3355440 155 Bő Jenő 18 70-6655429 Tulaj 114 178 102 Rendszám GBC-765 JED-123 AKT-392 Típus Opel Nissan Trabant Szín Fehér Ezüst Kék Kor 29 14 38 Név Kis Géza Jó Éva Kék Béla Kor 29 41 36 Telefon 20-9555666 30-8765432 70-3355440 A using kulcsszó használatakor, ha *-al minden mezőt kiíratunk, akkor a közös kapcsolómező az eredménytábla első oszlopaként jelenik meg! 70/33

Equi join Egyenlőség alapú illesztés SELECT mezőlista FROM tábla1 INNER JOIN tábla2 ON t1.mező1=t2.mező2 WHERE szelekciós feltétel; Különválik az összekapcsolási- és a szelekciós feltétel Az on után tetszőleges összekapcsolási feltétel megadható, nemcsak egyenlőség! Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 select rendszám,név from autó inner join ember on tulaj=ekód where ár > 500000; 70/34 Rendszám GBC-765 JED-123 Név Kis Géza Jó Éva

Az ON kulcsszó használata select * from autó inner join ember on autó.tulaj=ember.tulaj Autó Rendszám Típus Szín Kor Tulaj Ember Tulaj Név Kor Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 29 14 38 114 178 102 114 Kis Géza 29 178 Jó Éva 41 102 Kék Béla 36 20-9555666 30-8765432 70-3355440 155 Bő Jenő 18 70-6655429 Rendszám GBC-765 JED-123 AKT-392 Típus Opel Nissan Trabant Szín Fehér Ezüst Kék Kor 29 14 38 Tulaj 114 178 102 Tulaj 114 178 102 Név Kis Géza Jó Éva Kék Béla Kor 29 41 36 Telefon 20-9555666 30-8765432 70-3355440 Az on kulcsszó használatakor, ha a *-al minden mezőt kiíratunk, az azonos nevű kapcsolómező többször is megjelenik a listában. 70/35

Belső és külső összekapcsolás Belső összekapcsolásnak (Inner join) nevezzük azokat az illesztéseket, amelyek a két tábla megegyező soraival térnek vissza. Ha valamelyik táblából a pár nélküli rekordokat is hozzávesszük az eredményhez (üres mezőkkel kiegészítve), akkor külső összekapcsolást (Outer join) kapunk. A külső összekapcsolás lehet: bal oldali (Left outer join), jobb oldali (Right outer join), vagy teljes (Full outer join). 70/36

70/37 Outer join m1 m2 1 2 3 A C null 1 2 3 A B C m1 m2 left join = m1 m2 1 null 2 A B C 1 2 3 A B C m1 m2 right join = m1 m2 1 A 1 2 3 A B C m1 m2 full join = 2 3 C null null B

Outer join (külső illesztés) SELECT FROM tábla1 [LEFT RIGHT FULL] OUTER JOIN tábla2 ON join_feltétel [WHERE szelekciós feltétel] ; Autó Ember Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 199 102 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Minden ózdi ember, és autójuk rendszáma: select Név, Rendszám from Autó RIGHT OUTER JOIN Ember ON Tulaj=Ekód where Cím='Ózd'; 70/38 Név Kék Béla Bő Jenő Rendszám AKT-392 RIGHT: A jobb oldali táblából jönnek a pár nélküli rekordok is, üres értékkel kiegészítve.

Outer join (külső illesztés) SELECT FROM t1, t2 WHERE t1.m1 (+)= t2.m2 A (+)-al azt a mezőt jelöljük meg, ahonnan a null kiegészítést kérjük! Autó Rendszám Típus Szín Ár Tulaj Ember Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 199 102 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Minden ózdi ember, és autójuk rendszáma: select Név, Rendszám from Autó, Ember where tulaj (+)= ekód and Cím='Ózd'; select Név, Rendszám from Autó join Ember ON tulaj (+)= ekód where Cím='Ózd'; 70/39 Név Kék Béla Bő Jenő Rendszám AKT-392

Outer join (külső illesztés) Példa Autó Ember Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Hány darab autója van az egyes embereknek? select Név, count(tulaj) As Darab from Autó RIGHT OUTER JOIN Ember ON Tulaj=Ekód Group By Név; Név Kis Géza Jó Éva Kék Béla Bő Jenő Darab 2 1 1 0 70/40

Self join Olyan speciális összekapcsolás, ahol egy táblát kapcsolunk össze önmagával azért, hogy a tábla egyik oszlopában lévő értékeket hasonlítsuk össze a szintén ugyanebben az oszlopban lévő többi értékkel. A táblát két különböző alias név használatával tudjuk önmagával összekapcsolni. A két különböző alias név miatt a rendszer a táblát két egymástól független táblaként kezeli, megszüntetve ezzel az adatok egyezőségéből adódó mindennemű kapcsolatot, ezért összekapcsoláskor a mezők értékegyezőségére vonatkozó kapcsolatukat is be kell állítani! Az összekapcsolás megvalósítható keresztszorzat (cross join) vagy on kulcsszóval felépített equi join alkalmazásával 70/41

Self join m1 A B A a1 m2 1 2 3 self join m1 A B A a2 m2 1 2 3 = m1 A m2 3 where a1.m1=a2.m1 and a1.m2>a2.m2 70/42

Self join önillesztés :-) select t1.m1, from tábla t1, tábla t2 [where szelekciós feltétel] ; select t1.m1, from tábla t1 join tábla t2 on t1.m=t2.m [where szelekciós feltétel] ; Autó Rendszám Típus Kor GBC-765 Opel 5 JED-123 Nissan 8 HGZ-392 Nissan 7 Ár 1200000 1000000 900000 Tulaj 114 178 102 LOG-416 Opel 6 1300000 115 Azon autók rendszáma, melyek idősebbek, mégis drágábbak saját típustársuknál: select a1.rendszám from autó a1, autó a2 where a1.típus=a2.típus and a1.kor>a2.kor and a1.ár>a2.ár); 70/43 Rendszám JED-123 LOG-416

Félig összekapcsolások A belső és a külső illesztések valódi összekapcsolások, amelyeknél általában minden táblából lesznek adatok a lekérdezésben. Ha a lekérdezés adatai csak az egyik táblából származnak, a másik tábla pedig csak azért szükséges, hogy meg tudjuk fogalmazni a lekérdezés feltételét, akkor olyan látszólagos összekapcsolásról beszélünk, melyet félig összekapcsolásnak nevezünk. Ha a feltétel az, hogy az egyik táblában lévő adatnak létezik párja a másik táblában, akkor az összekapcsolást Semijoin-nak nevezzük. Ha a feltétel az, hogy az egyik táblában lévő adatnak nem létezik párja a másik táblában, akkor az összekapcsolást Anti semi join-nak nevezzük. 70/44

Semi join 1 2 3 m1 semi join m2 A B C = 1 2 m1 70/45

Semijoin select from tábla1 where EXIST (select 1 from tábla2 where tábla1.m1=tábla2.m2) Az EXIST kulcsszó azt vizsgálja, hogy a keletkezett reláció nem üres. Autó Ember Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst 1200000 1500000 114 178 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 20-9555666 30-8765432 155 Bő Jenő Ózd 70-3355440 Azok neve, akiknek van autója: select Név from Ember WHERE EXISTS (select 1 from Autó where Tulaj=EKód); 70/46 Név Kis Géza Jó Éva

Anti semi join 1 2 3 m1 anti semi join m2 A B C = 3 m1 70/47

Anti semi join select from tábla1 where NOT EXIST (select 1 from tábla2 where tábla1.m1=tábla2.m2) A NOT EXIST kulcsszó azt vizsgálja, hogy a keletkezett reláció üres. Autó Ember Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst 1200000 1500000 114 178 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 20-9555666 30-8765432 155 Bő Jenő Ózd 70-3355440 Azok neve, akiknek nincs autója: select Név from Ember WHERE NOT EXISTS (select 1 from Autó where Tulaj=EKód); 70/48 Név Bő Jenő

70/49

Halmazműveletek Unió: Metszet: Különbség: SELECT UNION [ALL] SELECT ; SELECT INTERSECT SELECT ; SELECT MINUS SELECT ; Csak azonos szerkezetű táblák esetén alkalmazhatók! Futók Ekód Név Város Síelők Ekód Név Város F S 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Miskolc 114 Kis Géza Eger 113 Kő Zoli Eger 102 Kék Béla Miskolc Az összes sportoló neve: select Név from Futók UNION select Név from Síelők 70/50 Név Kis Géza Jó Éva Kék Béla Kő Zoli F S

Halmazműveletek Futók Ekód Név Város Síelők Ekód Név Város F S 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Miskolc 114 Kis Géza Eger 113 Kő Zoli Eger 102 Kék Béla Miskolc Azok neve, akiknek mindkét sportot űzik: select Név from Futók INTERSECT select Név from Síelők Név Kis Géza Kék Béla F S Azok a futók, akik nem síelnek: select Név from Futók MINUS select Név from Síelők 70/51 Név Jó Éva A \ B

70/52

AL-SELECT Az SQL támogatja azt a lehetőséget, hogy a szelekciós feltételben nemcsak létező, letárolt adatelemekre hivatkozzunk, hanem számított kifejezéseket is alkalmazhassunk. A számítást egy másik SELECT utasítással tudjuk megadni. Tehát az egyik lekérdezés szelekciós feltételében hivatkozunk egy másik lekérdezés eredményére. Az al-lekérdezést mindig zárójelben kell megadni, hogy elemei elkülönüljenek. Formailag megegyezik a normál SELECT utasítással (kivétel:al-select-ben nem lehet rendezni) 70/53

Az AL-SELECT operátorai Az al-lekérdezés eredményétől függően különböző operátorokat kapcsolhatunk az AL-SELECT-hez: Ha az eredmény egy rekord: skalár operátorok (relációs operátorok) használhatók. Ha az eredmény több rekord: halmazoperátorok (IN, ANY, ALL, EXISTS) használhatók. SELECT FROM WHERE mező IN (al-select); SELECT FROM WHERE mező θ ANY (al-select); SELECT FROM WHERE mező θ ALL (al-select); SELECT FROM WHERE EXISTS (al-select); θ: tetszőleges relációs operátor (<, >, =,!= ) 70/54

Az AL-SELECT operátorai 2. IN: a mező értéke a halmaz bármely elemével megegyezhet (vagylagos multi egyenlőség) ANY: a halmaz minden eleméhez hasonlít, ha egyet talál, akkor igazzal tér vissza ALL: a halmaz minden eleméhez hasonlít, ha akár egyre nem teljesül, akkor hamisat ad vissza EXISTS: az eredményhalmaz üres, vagy sem (ha üres, akkor hamissal tér vissza) 70/55

Példák AL-SELECT-re Autó: Ember: Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Piros JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Az egri tulajdonosok autóinak árát növeljük meg 20%-al: UPDATE Autó SET Ár=Ár*1.2 WHERE Tulaj IN (SELECT Ekód FROM Ember WHERE Cím='Eger'); Töröljük azokat az embereket, akiknek több mint 2 autójuk van: DELETE FROM Ember WHERE Ekód IN (SELECT Ekód, count(*) FROM Ember, Autó WHERE Ekód=Tulaj GROUP BY Ekód HAVING count(*) > 2); 70/56

Példák AL-SELECT-re Autó: Ember: Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Bármely piros autó áránál olcsóbb autók rendszámai: SELECT Rendszám FROM Autó WHERE Ár < ANY (SELECT Ár FROM Autó WHERE Szin='piros'); Minden piros autó áránál olcsóbb autók rendszámai: SELECT rsz FROM autó WHERE ár < ALL (SELECT ár FROM autó WHERE szin= piros ); Rendszám GBC-765 JED-123 AKT-392 Rendszám AKT-392 70/57

Példák AL-SELECT-re Autó: Ember: Rendszám Típus Szín Ár Tulaj Ekód Név Cím Telefon GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék 1200000 1500000 25000 114 178 102 LOG-416 Volvo Piros 2825000 114 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Azok az emberek, akiknek nincs autójuk (1. változat): SELECT Név FROM Ember WHERE Ekód NOT IN (SELECT Tulaj FROM Autó); Azok az emberek, akiknek nincs autójuk (2. változat): SELECT E.Név FROM Ember E WHERE NOT EXISTS (SELECT * FROM Autó A WHERE A.Tulaj=E.Ekód); 70/58

Értéktől függő kiírt adat A select utasításban használható az alábbi szerkezet, melynek segítségével a cellák tartalmától (vagy azokból számított értéktől) függően lehet valamit kiírni: SELECT CASE [kifejezés] WHEN feltétel_1 THEN érték_1 WHEN feltétel_2 THEN érték _2... WHEN feltétel_n THEN érték _n ELSE érték END from 70/59 Darabszám kiírása magyarul select case count(*) when 0 then 'Nulla' when 1 then 'Egy' when 2 then 'Kettő' when 3 then 'Három' else 'Magyarul nem megy' end as "Tervezők száma" from dolgozó where beosztás='tervező'

Értéktől függő kiírt adat Ember: Ekód Név Cím 114 Kis Géza Eger 178 Jó Éva Miskolc 102 Kék Béla Ózd Telefon 20-9555666 30-8765432 70-3355440 155 Bő Jenő Ózd 70-3355440 Van miskolci tulajdonos? select (case when count(*)=0 then 'Nincs' else 'Van' end) as "miskolci tulajdonos" miskolci tulajdonos from Ember Van where Cím='Miskolc' 70/60

70/61

Hierarchia kialakítása ID=11 Nagy V ID=23 Balga L Pék P ID=25 Kiss G Esti P Nagy K Joó É Kő B ID=34 Muri L............ 70/62

Hierarchia kialakítása Dolgozo Dkod Dnev Fonoke Foglalkozas 11 Nagy V Elnök 23 Balga L 11 Menedzser 25 Kiss G 23 Elemző 28 Esti P 23 Eladó 34 Muri L 25 Eladó SZINT Dolgozó Főnök 1. 11 2. 23 11 35 11 3. 25 23 28 23 40 23 33 35 70/63 4. 34 25

Hierarchia kialakítása Dkód Dolgozo Dnév Dolgozo Dkod Dnev Fonoke Fonoke 1 : N kapcsolat create table Dolgozo( dkod int primary key not null, dnev varchar2(20), fonoke int constraint dsk references Dolgozo (dkod), Megfelelő kialakítás mellett Oracle-ben lekérdezhető a hierarchia 70/64

Hierarchia lekérdezése Dolgozo Dkod Dnev Fonoke select [LEVEL] mezőnevek from táblanév CONNECT BY PRIOR szülő=gyermek START WITH induló csomópont LEVEL Pszeudóváltozó, a szint mélységét (sorszámát) jelzi CONNECT BY A szülő-gyerek kapcsolatot biztosító mezők. A PRIOR kulcsszó mindig a szülő felüli oldalra kerül! Ha a főnök felől indulunk lefelé: prior dkod=fonoke, ha a beosztott felől fölfelé: dkod= prior fonoke START WITH A kiinduló pont megadása Ha hurok van a gráfban, nem működik a lekérdezés! 70/65

Dolgozo [dkod, dnev, foglalkozas, fonoke, belepes, fizetes, jutalek] Kinek ki a beosztottja (a főnöktől indulva a beosztott felé) select level, dnev név, foglalkozas, dkod, fonoke from dolgozo connect by prior dkod = fonoke start with dnev = 'Nagy V' order by level level A szint mélysége connect by prior Szülő = Gyerek start with A kiindulópont 70/66

Dolgozo [dkod, dnev, foglalkozas, fonoke, belepes, fizetes, jutalek] Kinek ki a főnöke? Beosztottól 'Laza B'-től indulva, a főnök felé select level, dnev név, foglalkozas, dkod, fonoke from dolgozo connect by dkod = prior fonoke start with dnev = 'Laza B' level A szint mélysége connect by prior Szülő = Gyerek start with A kiindulópont 70/67

Dolgozo [dkod, dnev, foglalkozas, fonoke, belepes, fizetes, jutalek] Mennyi az elnök alatt 2 szinttel az átlagfizetés? select avg(fizetes) Átlagfizetés from dolgozo where level=3 connect by prior dkod = fonoke start with dnev = 'Nagy V' group by level Melyik szinten hányan dolgoznak? select level, count(*) létszám from dolgozo connect by prior dkod = fonoke start with dnev = 'Nagy V' group by level order by level 70/68

70/69

VÉGE VÉGE 70/70