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

Hasonló dokumentumok
Adatbázis rendszerek Gy: DQL Lekérdezések

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

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

Adatbázis Rendszerek II. 3. SQL alapok

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

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

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

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

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

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

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ázis Rendszerek I. 9. SQL alapok (DDL esettanulmány)

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

Adatbázis rendszerek SQL nyomkövetés

Adattípusok. Max. 2GByte

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

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

SQL parancsok feldolgozása

Adattípusok. Max. 2GByte

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

Adatbázisok I. Az SQL nyelv

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

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

Adatbázisok I A relációs algebra

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

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

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

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

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

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-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.

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

Adatbázisok* tulajdonságai

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

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

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

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

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

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

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

BEVEZETÉS Az objektum fogalma

STRUCTURED QUERY LANGUAGE(SQL) - ALAPOK

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

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

5.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:

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

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 elmélete 10. előadás

Adatbázis, adatbázis-kezelő

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

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

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

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

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

Tábla létrehozása: CREATE TABLE alma( ID INT( 3 ) NOT NULL PRIMARY KEY, Leiras VARCHAR( 100 ) );

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

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:

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

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

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

Tankönyv példák kidolgozása

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

BGF. 4. Mi tartozik az adatmodellek szerkezeti elemei

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

Bevezetés: az SQL-be

ADATBÁZIS RENDSZEREK I BEADANDÓ

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

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

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

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

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

Adatbázis használat I. 2. gyakorlat

Adatbázis használat I. 2. gyakorlat

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

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

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

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

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

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.

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

Adatok szűrése, rendezése

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

Java és web programozás

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

Adatbázis Rendszerek

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

Az indexelés újdonságai Oracle Database 12c R1 és 12c R2

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

Az SQL lekérdeznyelv

Adatbázisok II. rész

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

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

Adatbázis használat I. 5. gyakorlat

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

SQL DDL-1: táblák és megszorítások

ADATBÁZISKEZELÉS ADATBÁZIS

Adatbáziskezelő-szerver. Relációs adatbázis-kezelők SQL. Házi feladat. Relációs adatszerkezet

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

Adatbázis-kezelés alapjai SQL 1: DDL, DML. v: B IT MAN 92/1B IT MAN

Átírás:

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: 2018.11.25 169/1

DQL utasítások 169/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]; 169/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ó; 169/4 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 az 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 169/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: 169/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 169/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 169/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 169/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ó 169/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. 169/11 Példa: RTRIM(' alma ') = ' alma'

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 169/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 169/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 Sum(Ár), Avg(Kor) from Autó; 169/14

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); 169/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; 169/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; 169/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]; 169/18

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály -es feladatsor 169/19 75 feladattal :-)

>< Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Készítsünk egy táblát, dolgozók nyilvántartására: CREATE TABLE Dolgozó( Kód Number(4) Primary key, Név Varchar(20) Not Null, Város Varchar(20), Beosztás Varchar(20), Belépés Date Default sysdate, Fizetés Number(7), Osztály Varchar(15) ); Elsődleges kulcs mező A mezőbe kötelező adatot írni Alapérték: az aktuális dátum 169/20

<< Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a tábla szerkezetét. desc dolgozó Töltsük fel a megadott adatokkal. begin INSERT INTO Dolgozó VALUES (1169, 'Brumi Barna', null, 'Programozó', Default, 250, 'Fejlesztés');... end; Írassuk ki a tábla tartalmát. select * from dolgozó 169/21

<< Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály 169/22

1 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Vigye fel mindenki saját magát, tetszőleges adatokkal! INSERT INTO Dolgozó VALUES (1180, 'BitMan', 'Miskolc', 'Programozó', Default, 900, 'Fejlesztés'); select * from dolgozó where név='bitman' 169/23

2 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Hibás Ilona miskolci elemző. Vigyük fel az új adatokat. UPDATE Dolgozó SET Város='Miskolc', Beosztás='Elemző' WHERE Név='Hibás Ilona'; select * from dolgozó where név='hibás Ilona'; 169/24

3 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Hibás Ilona a fejlesztésre került, 300 fizetéssel. Vigyük fel az új adatokat. UPDATE Dolgozó SET Osztály='Fejlesztés', Fizetés=300 WHERE Név='Hibás Ilona'; 169/25

4 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a miskolci emberek nevét. SELECT Név FROM Dolgozó WHERE Város='Miskolc'; 169/26

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a nem miskolci emberek nevét, városát. SELECT Név, Város FROM Dolgozó WHERE Város!= 'Miskolc'; További lehetőségek: Város <> 'Miskolc' Város ^= 'Miskolc' not Város = 'Miskolc' Város not in ('Miskolc') 169/27

6 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a fejlesztés osztályon dolgozók nevét, ABC sorrendben. SELECT Név FROM Dolgozó WHERE Osztály='Fejlesztés' ORDER BY Név; 169/28

7 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a neveket, fizetéseket, fizetés szerinti csökkenő sorrendben. SELECT Név, Fizetés FROM Dolgozó ORDER BY Fizetés DESC; 169/29

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki az M betűvel kezdődő neveket! M1 SELECT Név FROM Dolgozó WHERE Név LIKE 'M%'; P M2 SELECT Név FROM Dolgozó WHERE Név LIKE 'm%'; SELECT Név FROM Dolgozó WHERE UPPER(Név) LIKE 'M%'; Like Joker karakterek: _ : kötelezően egy darab karaktert jelent % : tetszőleges számú karakter jelent, lehet 0 db is! 169/30 upper(szöveg) A szöveget nagybetűssé alakítja

9 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki az A és a Z betűre végződő neveket! M1 M2 SELECT Név FROM Dolgozó WHERE Név LIKE '%a' OR Név LIKE '%z'; SELECT Név FROM Dolgozó WHERE SUBSTR(Név, -1, 1) IN ('a', 'z'); substr(string, kezdő_pozíció, hossz) Rész sztring képzés Ha a kezdő_pozíció negatív, a művelet jobbról indul. 169/31

10 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki azok kódját, nevét, akiknek a kódjában van 4-es számjegy. SELECT Kód FROM Dolgozó WHERE Kód LIKE '%4%'; 169/32

11 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki azok kódját, nevét, akiknek a kódjában van 1-es, 2-es, és 4-es számjegy is. M SELECT Kód, Név FROM Dolgozó WHERE Kód LIKE '%1%' AND Kód LIKE '%2%' AND Kód LIKE '%4%'; H SELECT Kód, Név FROM Dolgozó WHERE Kód LIKE '%1%2%4%'; Miért hibás? Így elő van írva a sorrend is! 169/33

12 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki azok kódját, nevét, akiknek a vezetékneve 4 betűs! SELECT Név FROM Dolgozó WHERE Név LIKE ' %'; 4 db _ jel, aztán szóköz, aztán % 169/34

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály M1 Írassuk ki azok nevét, kódját, akik kódja 1030 és 1130 közötti. Irányítható szélsőérték kezelés SELECT Kód, Név FROM Dolgozó WHERE Kód >= 1030 AND Kód <= 1130; M2 SELECT Kód, Név FROM Dolgozó WHERE Kód BETWEEN 1030 AND 1130; Fix szélsőérték kezelés 169/35

14 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Kinek nincs megadva a városa? SELECT Név FROM Dolgozó WHERE Város is null; 169/36

15 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a rendszerdátumot. SELECT sysdate FROM dual; sysdate dual tábla Az adatbázisban érvényes dátumot és időpontot adja vissza Létező tábla, egy Dummy nevű oszlopa van, és egy sora, benne egy x adattal. Beépített függvények meghívásakor használható. Tartalma módosítható, de ne nyúljunk hozzá! Próbáld ki: select * from dual 169/37

16 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki azok nevét, belépési dátumát, akik 2013-ban léptek be. M1 M2 SELECT Név, Belépés FROM Dolgozó WHERE Belépés LIKE '%2013'; SELECT Név, Belépés FROM Dolgozó WHERE extract(year FROM Belépés) = 2013; extract(érték from dátum) A dátumból kibontja a definiált értéket. Érték lehet: year, month, day, hour, minute, second 169/38

17 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki azok nevét, belépési dátumát, akik márciusban léptek be. M1 M2 SELECT Név, Belépés FROM Dolgozó WHERE Belépés LIKE '03%'; SELECT Név, Belépés FROM Dolgozó WHERE extract(month FROM Belépés) = 3; 169/39

18 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a 2010.01.01 és 2013.12.31 között belépett dolgozók nevét, belépési dátumát. SELECT Név, Belépés FROM Dolgozó WHERE Belépés BETWEEN '01.01.2010' AND '12.31.2013'; 169/40

19 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Ki, hány éve dolgozik a cégnél? SELECT Név, floor((sysdate-belépés)/365) "Eltelt évek" FROM Dolgozó; floor(szám) A szám egész része Ha több szóból áll az alias, kell a " " 169/41

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Milyen osztályok vannak? P SELECT Osztály FROM Dolgozó; M1 M2 SELECT DISTINCT Osztály FROM Dolgozó; SELECT Osztály FROM Dolgozó GROUP BY Osztály; 169/42

21 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a fejlesztésen dolgozó miskolciak nevét. SELECT Név FROM Dolgozó WHERE Osztály='Fejlesztés' AND Város='Miskolc'; 169/43

22 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a fejlesztésen és a terjesztésen dolgozó nem miskolciak nevét. M1 M2 SELECT Név FROM Dolgozó WHERE (Osztály='Fejlesztés' OR Osztály='Terjesztés') AND Város!= 'Miskolc'; SELECT Név FROM Dolgozó WHERE Osztály IN ('Fejlesztés', 'Terjesztés') AND Város!= 'Miskolc'; 169/44

23 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki azon osztályok nevét, ahol dolgozik budapesti! SELECT DISTINCT Osztály FROM Dolgozó WHERE Város='Budapest'; 169/45

24 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Hány rekord van a táblában? SELECT Count(*) FROM Dolgozó; 169/46

25 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki az átlagfizetést. SELECT avg(fizetés) FROM Dolgozó; 169/47

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki az átlagfizetéstől többet keresők nevét, fizetését. M SELECT Név, Fizetés FROM Dolgozó WHERE Fizetés > (SELECT AVG(Fizetés) FROM Dolgozó); H SELECT Név, Fizetés FROM Dolgozó WHERE Fizetés > AVG(Fizetés); 169/48

AL-SELECT Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály 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!) 169/49

27 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki az osztályonkénti létszámot, és átlagfizetést. SELECT Osztály, count(*) Létszám, avg(fizetés) Átlagfizetés FROM Dolgozó GROUP BY Osztály; 169/50

28a Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Melyik programozónak a legmagasabb a fizetése? L1 L2 SELECT MAX(Fizetés) FROM Dolgozó WHERE Beosztás = 'Programozó' SELECT Név, Fizetés FROM Dolgozó WHERE Beosztás = 'Programozó' AND Fizetés = (SELECT MAX(Fizetés) FROM Dolgozó WHERE Beosztás = 'Programozó'); L1: A legnagyobb programozói fizetés L2: Azon programozók, akiknek egyezik L1-el a fiztése 169/51

28b Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Melyik programozónak a legalacsonyabb a fizetése? L1 L2 SELECT MIN(Fizetés) FROM Dolgozó WHERE Beosztás = 'Programozó' SELECT Név, Fizetés FROM Dolgozó WHERE Beosztás = 'Programozó' AND Fizetés = (SELECT MIN(Fizetés) FROM Dolgozó WHERE Beosztás = 'Programozó'); 169/52

29 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki az átlagos programozói fizetéstől többet kereső programozók nevét, fizetését. L1 L2 SELECT AVG(Fizetés) FROM Dolgozó WHERE Beosztás = 'Programozó' SELECT Név, Fizetés FROM Dolgozó WHERE Beosztás = 'Programozó' AND Fizetés > (SELECT AVG(Fizetés) FROM Dolgozó WHERE Beosztás = 'Programozó'); 169/53

30 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Melyik tesztelő keres többet, mint a legtöbbet kereső eladó? L1 L2 SELECT MAX(Fizetés) FROM Dolgozó WHERE Beosztás = 'Eladó' SELECT Név, Fizetés FROM Dolgozó WHERE Beosztás = 'Tesztelő' AND Fizetés > (SELECT MAX(Fizetés) FROM Dolgozó WHERE Beosztás = 'Eladó'); 169/54

31 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Hányan dolgoznak az egyes osztályokon? SELECT Osztály, count(*) FROM Dolgozó GROUP BY Osztály; 169/55

32 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Az egyes városokban hány programozó van? SELECT Város, COUNT(*) "Programozók száma" FROM Dolgozó WHERE Beosztás='Programozó' GROUP BY Város Ha több szóból áll az alias, kell a " " 169/56

33 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály L1 L2 L3 Írassuk ki azok nevét, akik abban a városban laknak, ahol a legtöbben laknak. 169/57 SELECT MAX(COUNT(Város)) FROM dolgozó GROUP BY Város SELECT Város FROM dolgozó GROUP BY Város HAVING COUNT(Város)=(SELECT MAX(COUNT(Város)) FROM dolgozó GROUP BY Város) A legnagyobb lakószám A legnagyobb lakószámú város neve SELECT Név FROM dolgozó A városban lakók neve WHERE Város = (SELECT Város FROM dolgozó GROUP BY Város HAVING COUNT(Város)=(SELECT MAX(COUNT(Város)) FROM dolgozó GROUP BY Város));

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Mennyit keresnek összesen a tervezők és az elemzők? SELECT SUM(Fizetés) FROM Dolgozó WHERE Beosztás IN ('Tervező', 'Elemző'); 169/58

35 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Mely osztályok azok, ahol összesen legalább 1000 BitCoint keresnek? SELECT Osztály FROM Dolgozó GROUP BY Osztály HAVING sum(fizetés) >= 1000; 169/59

36 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Mely osztályokon dolgoznak legalább hárman? SELECT Osztály, COUNT(*) FROM Dolgozó GROUP BY Osztály HAVING COUNT(*) >= 3; 169/60

36b Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Mely osztályokon dolgozik legalább három programozó? SELECT Osztály, COUNT(*) FROM Dolgozó WHERE beosztás='programozó' GROUP BY Osztály HAVING COUNT(*) >= 3; 169/61

37 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a miskolci eladók és az egri tesztelők nevét. M1 M2 SELECT Név FROM Dolgozó WHERE (Város='Miskolc' AND Beosztás='Eladó') OR (Város='Eger' AND Beosztás='Tesztelő'); SELECT Név FROM Dolgozó WHERE Város='Miskolc' AND Beosztás='Eladó' UNION SELECT Név FROM Dolgozó WHERE Város='Eger' AND Beosztás='Tesztelő'; 169/62

38 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki a miskolci nem programozók nevét. M1 M2 SELECT Név FROM Dolgozó WHERE Város='Miskolc' AND Beosztás!='Programozó'; SELECT Név FROM Dolgozó WHERE Város='Miskolc' MINUS SELECT Név FROM Dolgozó WHERE Beosztás='Programozó'; 169/63

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki azon osztályok nevét, ahol minden ember fizetése kevesebb 320 BitCoin-nál! L1 L2 L3 SELECT osztály, count(*) FROM Dolgozó GROUP BY Osztály SELECT osztály, COUNT(*) FROM Dolgozó WHERE Fizetés<320 GROUP BY Osztály SELECT Osztály FROM Dolgozó D1 GROUP BY Osztály HAVING COUNT(*)=(SELECT COUNT(*) FROM Dolgozó D2 WHERE D2.Fizetés<320 AND D1.Osztály=D2.Osztály GROUP BY D2.Osztály); L1: Osztályonkénti létszám L2: 320-nál kevesebbet keresők osztályonkénti létszáma L3: Azon osztályok neve, ahol L1=L2 169/64

40 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Hány darab különböző város van? SELECT count(distinct Város) FROM Dolgozó; 169/65

41 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Az egyes beosztásokban dolgozók hány darab különböző városban laknak? SELECT Beosztás, count(distinct Város) FROM Dolgozó GROUP BY Beosztás; 169/66

42 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki azon beosztások nevét, melyeknek minden városban van képviselője! L1 L2 L3 SELECT count(distinct Város) FROM Dolgozó SELECT Beosztás, count(distinct Város) FROM Dolgozó GROUP BY Beosztás SELECT Beosztás FROM Dolgozó GROUP BY Beosztás HAVING count(distinct Város) = (SELECT count(distinct Város) FROM Dolgozó); L1: Különböző városok száma L2: Az egyes beosztásokban hány különböző városból vannak L3: Azon beosztások neve, ahol L1=L2 169/67

43 Dolgozó D2 Kód Név Város Beosztás Belépés Fizetés Osztály Készítsünk egy új táblát (legyen a neve D2), melybe a miskolci dolgozók adatai kerülnek. CREATE TABLE D2 AS (SELECT * FROM Dolgozó WHERE Város='Miskolc'); 169/68

Dolgozó D2 Kód Név Város Beosztás Belépés Fizetés Osztály Töröljük ki a D2 táblából azokat, akik nem a fejlesztésen dolgoznak. DELETE FROM D2 Where Osztály!='Fejlesztés' 169/69

45 Dolgozó D2 Kód Név Város Beosztás Belépés Fizetés Osztály Töröljük ki az összes rekordot a D2 táblából. M1 DELETE From D2; M2 TRUNCATE TABLE D2; 169/70

Dolgozó D2 Kód Név Város Beosztás Belépés Fizetés Osztály Töröljük a D2 táblát. DROP TABLE D2; 169/71

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály :) 169/72

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Hogyan lehetne megoldani, hogy a dolgozó táblában lévő redundanciát (az osztálynevek többszörös tárolását) megszüntessük? 1. Kellene készíteni egy új osztály táblát, benne egy kóddal és az osztályok nevével. 2. Ki kellene cserélni az osztályneveket osztálykódra a dolgozó táblában. 3. Össze kellene kapcsolni a két táblát. 169/73

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Írassuk ki az osztályok nevét ABC sorrendben select distinct osztály from dolgozó order by osztály; 169/74

48 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Készítsünk egy új osztály táblát a dolgozó tábla alapján, másoljuk bele az osztályok nevét is. create table osztály as select distinct osztály from dolgozó order by osztály Osztály Osztály Ellenőrizzük le: select * from osztály 169/75

49 Dolgozó Osztály Kód Név Város Beosztás Belépés Fizetés Okód Osztály Osztály Adjunk egy új, okód nevű mezőt az osztály táblához, ez lesz az elsődleges kulcs. P alter table osztály add okód number(2) primary key H M alter table osztály add okód number(2) 169/76

Dolgozó Osztály Kód Név Város Beosztás Belépés Fizetés Okód Osztály Osztály Töltsük fel értékekkel az okód mezőt update osztály set okód=1 where osztály like 'F%' update osztály set okód=2 where osztály like 'I%' update osztály set okód=3 where osztály like 'T%' 169/77

51 Dolgozó Osztály Kód Név Város Beosztás Belépés Fizetés Okód Osztály Osztály Készítsünk kulcsmezőt az okód mezőből alter table osztály modify okód primary key Nézzük meg, minden rendben van-e? desc osztály 169/78

Dolgozó Osztály Kód Név Város Beosztás Belépés Fizetés Okód Osztály Onév Hogy ne legyen ugyanaz a tábla és az egyik mező neve, javítsuk ki az osztály mezőnevet onév-re alter table osztály rename column osztály to onév Ellenőrizzük le: select * from osztály 169/79

53 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály A dolgozó táblában cseréljük le az osztályneveket okód-ra. Hogy ne veszítsünk adatot, több lépésben fogjuk ezt megcsinálni! Először szúrjunk be egy okód nevű mezőt. alter table dolgozó add okód number(2) 169/80

54 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Az okód mezőt töltsük fel adatokkal. 1. lehetőség: az osztálynevek alapján több lépésben kijavítjuk az okód értékét: update dolgozó set okód=1 where osztály='fejlesztés' update dolgozó set okód=2 where osztály='irányítás' update dolgozó set okód=3 where osztály='terjesztés' 169/81

55 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Az okód mezőt töltsük fel adatokkal. Osztály Okód Onév 2. lehetőség: kapcsoljuk össze a dolgozót táblát az osztály táblával, és abból töltsük fel az adatokat: update dolgozó set okód= (select okód from osztály where osztály=onév) Ellenőrizzük le: select * from dolgozó 169/82

56 Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály Okód Töröljük ki az osztály mezőt a dolgozó táblából alter table dolgozó drop column osztály 169/83

Dolgozó Dolgozó Osztály Kód Név Város Beosztás Kód Név Belépés Város Beosztás Fizetés Okód Belépés Fizetés Okód Osztály Onév A dolgozó táblában az okód mezőbe most még bármit beírhatunk, nincsenek szabályok. Ha idegen kulcsot készítünk belőle, ami az osztály tábla okód mezőjére mutat, akkor már csak olyan adat kerülhet bele, ami megtalálható az osztály tábla okód mezőjében! Ez megvédi a mezőt, és tartalma konzisztens marad! alter table dolgozó add constraint d_fk foreign key (okód) references osztály(okód); 169/84

Dolgozó Dolgozó Osztály Kód Név Város Beosztás Kód Név Belépés Város Beosztás Fizetés Okód Belépés Fizetés Okód Osztály Onév Írassuk ki a Terjesztésen dolgozók nevét select név from dolgozó join osztály using(okód) where onév='terjesztés' 169/85

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); 169/86 Rendszám GBC-765 JED-123 AKT-392 Név Kis Géza Jó Éva Kék Béla

Dolgozó Dolgozó Osztály Kód Név Város Beosztás Kód Név Belépés Város Beosztás Fizetés Okód Belépés Fizetés Okód Osztály Onév Mennyi a Fejlesztésen dolgozók átlagkeresete? select avg(fizetés) from dolgozó join osztály using(okód) where onév='fejlesztés' 169/87

Dolgozó Dolgozó Osztály Kód Név Város Beosztás Kód Név Belépés Város Beosztás Fizetés Okód Belépés Fizetés Okód Osztály Onév Hányan dolgoznak az egyes osztályokon? select onév, count(*) from dolgozó join osztály using(okód) group by onév 169/88

61 Dolgozó Dolgozó Osztály Kód Név Város Beosztás Kód Név Belépés Város Beosztás Fizetés Okód Belépés Fizetés Okód Osztály Onév Hány különböző munkakörben dolgoznak az egyes osztályokon? select count(distinct(beosztás)) "Munkakörök száma", onév from dolgozó join osztály using(okód) group by onév 169/89

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály :) 169/90

62 Dolgozó Projekt Kód Név Város Beosztás Pkód Belépés Pnév Indult Fizetés Lezárult Osztály Készítsünk egy táblát, amelyben céges projektek adatait tároljuk. create table projekt( pkód number(3) primary key, pnév varchar2(30) not null, indult date default sysdate, lezárult date ) 169/91

63 Dolgozó Projekt Kód Név Város Beosztás Pkód Belépés Pnév Indult Fizetés Lezárult Osztály Vigyünk fel néhány projektet insert into projekt values(1, 'Háttal a falnak', '03.15.2016', '06.15.2016') insert into projekt values(2, 'Kék fűzfa', '09.01.2017', '03.01.2018') insert into projekt values(3, 'Számító gépek', '10.21.2018', null) 169/92

64 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Egy projekten többen is dolgozhatnak, és egy dolgozó több projektben is dolgozhat. Hogyan lehet ezt megoldani? Egy kapcsolótábla létrehozásával: create table d_p( dkód number(4), pkód number(3), foreign key (dkód) references dolgozó(kód), foreign key (pkód) references projekt(pkód) ) 169/93

65 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Vigyünk fel néhány dolgozót a projektekhez: begin insert into d_p values (1016, 1); insert into d_p values (1026, 1); insert into d_p values (1028, 1); insert into d_p values (1039, 1); insert into d_p values (1214, 1); insert into d_p values (1125, 1); insert into d_p values (1142, 2); insert into d_p values (1118, 2); insert into d_p values (1028, 2); insert into d_p values (1016, 2); insert into d_p values (1016, 3); insert into d_p values (1026, 3); insert into d_p values (1151, 3); 169/94 end;

66 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Írassuk ki a 2018-ban futó projektek nevét! select pnév from projekt where indult like '%2018' or lezárult like '%2018' select pnév from projekt where extract(year FROM indult)=2018 or extract(year FROM lezárult)=2018 169/95

67 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Kik (név) dolgoznak a Számító gépek projekten? select név from dolgozó join d_p on kód=dkód join projekt using(pkód) where pnév='számító gépek' Ha nem egyforma a két összekapcsolt táblában a kapcsolómező neve, akkor a kapcsolatban az on kulcsszót kell használni. Ha egyforma a két mező neve, egyszerűbb a using kulcsszó használata. Ha mégis az on-t használjuk, akkor d_p join projekt on d_p.pkód=projekt.pkód 169/96

68 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Ki, hány projekten dolgozott? select név, count(dkód) "Projektek száma" from dolgozó join d_p on kód=dkód group by név 169/97

69 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Ki, hány projekten dolgozott? Írassuk ki a 0-s adatokat is! select név, count(dkód) "Projektek száma" from dolgozó left outer join d_p on kód=dkód group by név 169/98

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'; 169/99 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.

70 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Mely városok lakói dolgoztak a Háttal a falnak projekten? select distinct város from dolgozó join d_p on kód=dkód join projekt using(pkód) where pnév='háttal a falnak' 169/100

71 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Osztály Dkód Pkód Okód Onév A terjesztés osztály dolgozói mely projekteken dolgoztak? select distinct pnév from osztály join dolgozó using(okód) join d_p on kód=dkód join projekt using(pkód) where onév='terjesztés' Fontos a join-ok sorrendje! Osztály Dolgozó d_p Projekt 169/101

72 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Mely projekteken dolgoztak legalább 5-en? 1 2 select pkód, count(*) from d_p group by pkód select pkód, count(*) from d_p group by pkód having count(*)>5 3 select pnév from projekt where pkód in (select pkód from d_p group by pkód having count(*)>5) 169/102

73 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód A 2017-ben indult projektekben volt-e miskolci résztvevő? Igen, vagy nem! select (case when count(*)=0 then 'Nem' else 'Igen' end) as Résztvevő from dolgozó join d_p on kód=dkód join projekt using(pkód) where indult like '%2017' and város='miskolc' 169/103

74 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Az egyes projekteben hány programozó dolgozott? select pnév, count(*) "Programozók száma" from dolgozó join d_p on kód=dkód join projekt using(pkód) where beosztás='programozó' group by pnév 169/104

75 Dolgozó Projekt Kód Név Város Beosztás Dolgozó Belépés Fizetés Okód Pkód Pnév Indult Lezárult Kód Név Város Beosztás Belépés Fizetés Osztály d_p Dkód Pkód Mely projekteken nem dolgoztak eladók? 1 select pnév from dolgozó join d_p on kód=dkód join projekt using(pkód) where beosztás='eladó' 2 select distinct pnév from projekt minus select pnév from dolgozó join d_p on kód=dkód join projekt using(pkód) where beosztás='eladó' 169/105

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály 169/106

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). 169/107

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; 169/108

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 169/109

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 169/110

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; 169/111

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 169/112

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 169/113 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 169/114

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: 169/115 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 169/116

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; 169/117 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 169/118

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); 169/119 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! 169/120

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; 169/121 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. 169/122

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). 169/123

169/124 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'; 169/125 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'; 169/126 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 169/127

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 169/128

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 169/129

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); 169/130 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. 169/131

Semi join 1 2 3 m1 semi join m2 A B C = 1 2 m1 169/132

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); 169/133 Név Kis Géza Jó Éva

Anti semi join 1 2 3 m1 anti semi join m2 A B C = 3 m1 169/134

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); 169/135 Név Bő Jenő

169/136

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 169/137 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 169/138 Név Jó Éva A \ B

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály 169/139

AL-SELECT Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály 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) 169/140

Dolgozó Az AL-SELECT operátorai Kód Név Város Beosztás Belépés Fizetés Osztály 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 (<, >, =,!= ) 169/141

Dolgozó Az AL-SELECT operátorai Kód Név Város 2. Beosztás Belépés Fizetés Osztály 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) 169/142

Dolgozó Példák AL-SELECT-re Kód Név Város Beosztás Belépés Fizetés Osztály Autó: Rendszám Típus Szín GBC-765 Opel Piros JED-123 Nissan Ezüst AKT-392 Trabant Kék Ár 1200000 1500000 25000 Tulaj 114 178 102 LOG-416 Volvo Piros 2825000 114 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 Az egri tulajdonosok autóinak árát növeljük meg 20%-al: 169/143 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);

Dolgozó Példák AL-SELECT-re Kód Név Város Beosztás Belépés Fizetés Osztály Autó: Rendszám Típus Szín GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék Ár 1200000 1500000 25000 Tulaj 114 178 102 LOG-416 Volvo Piros 2825000 114 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 Bármely piros autó áránál olcsóbb autók rendszámai: 169/144 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

Dolgozó Példák AL-SELECT-re Kód Név Város Beosztás Belépés Fizetés Osztály Autó: Rendszám Típus Szín GBC-765 Opel Fehér JED-123 Nissan Ezüst AKT-392 Trabant Kék Ár 1200000 1500000 25000 Tulaj 114 178 102 LOG-416 Volvo Piros 2825000 114 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 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); 169/145

Dolgozó Értéktől függő kiírt Kód adat Név Város Beosztás Belépés Fizetés Osztály 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 169/146 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ő'

Dolgozó Értéktől függő kiírt Kód adat Név Város Beosztás Belépés Fizetés Osztály 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' 169/147

169/148

Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] -es feladatsor 169/149

o Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] A feladatsor táblái: Create Table Tulajdonos( Tkód Number(4) Primary Key, Név Varchar2(20) Not Null, Város Varchar2(20) ); Create Table Kategória( Knév varchar2(12), AlsóHP number(4), FelsőHP number(4) ); 169/150 Create Table Autó( Rendszám Char(7) Primary Key, Típus Varchar2(25) Not Null, Szín Varchar2(15), Kor Number(2), Ár number(8), Tulaj Number(4), Foreign key (Tulaj) References Tulajdonos(TKód) );

oo Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Hozzuk létre a táblákat Töltsük fel a megadott adatokkal Ellenőrizzük a táblák tartalmát! SELECT * FROM tulajdonos SELECT * FROM autó SELECT * FROM kategória 169/151

1 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Írassuk ki az autók rendszámát, és tulajdonosuk nevét. M1 M2 M3 SELECT Rendszám, Név FROM Autó, Tulajdonos WHERE Tulaj=Tkód; SELECT Rendszám, Név FROM Autó CROSS JOIN Tulajdonos WHERE Tulaj=Tkód; SELECT Rendszám, Név FROM Autó INNER JOIN Tulajdonos ON Tulaj=Tkód; Milyen illesztés? Descartes szorzat Milyen illesztés? CROSS JOIN Milyen illesztés? EQUI JOIN 169/152

2 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Írjuk ki a miskolci tulajdonosok autóinak adatait. SELECT Autó.* FROM Autó JOIN Tulajdonos ON Tulaj=Tkód WHERE Város='Miskolc'; Autó.* Az Autó tábla minden oszlopa. A SELECT * FROM parancs mindkét tábla, minden egyes oszlopát kiírná. 169/153

3 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Írassuk ki az autók típusát, árát, és kategóriáját. M1 SELECT típus, ár, knév FROM autó CROSS JOIN kategória WHERE ár BETWEEN AlsóHP AND FelsőHP Milyen illesztés? CROSS JOIN THETA JOIN CROSS JOIN THETA JOIN Azt jelenti, hogy teljes illesztésről van szó Azt jelenti, hogy nem egyenlőség alapján szűri a kapcsolódó rekordpárokat 169/154 SELECT típus, ár, knév FROM autó JOIN kategória on ár BETWEEN AlsóHP AND FelsőHP

3 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Írassuk ki az autók típusát, árát, és kategóriáját.?? SELECT típus, ár, knév FROM autó CROSS JOIN kategória WHERE ár BETWEEN AlsóHP AND FelsőHP Ha kihagynánk a CROSS szót, működne a parancs? Nem, mert akkor belső illesztésként (INNER JOIN) kezelné a rendszer, ahol csak egyenlőség adható meg feltételként, az ON vagy a USING kulcsszóval! Ettől THETA JOIN! 169/155

4 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Kinek, milyen rendszámú autója van? Szerepeljen az is, akinek nincs autója! M1 M2 SELECT Név, Rendszám Milyen illesztés? OUTER JOIN FROM Autó RIGHT OUTER JOIN Tulajdonos ON Tulaj=Tkód; Az OUTER szó kihagyható! SELECT Név, Rendszám FROM Autó JOIN Tulajdonos ON Tulaj(+)=Tkód; Olyan speciális belső illesztés, ahol kérjük (+) az egyik tábla kiegészítését null értékekkel, így a másik táblából azon rekordoknak is lesz párja, amelyeknek eredetileg nincs! Így e fondorlatos módszerrel a belső illesztés külső illesztéssé válik! 169/156

5 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Az egyes autóknak (rendszám) ki a tulajdonosa? Minden autó szerepeljen a listában! M1 M2 SELECT Rendszám, Név FROM Autó LEFT JOIN Tulajdonos ON Tulaj=Tkód; SELECT Rendszám, Név FROM Autó JOIN Tulajdonos ON Tulaj=Tkód(+); Ahhoz, hogy minden Autó szerepelhessen, a Tulajdonost kell kiegészíteni null értékekkel! 169/157

6 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] L1 L2 A miskolci autók átlagárától drágább, nem miskolci autók rendszáma. SELECT avg(ár) FROM Autó Inner JOIN Tulajdonos ON Tulaj=Tkód WHERE Város='Miskolc' SELECT Rendszám FROM Autó JOIN Tulajdonos ON Tulaj=Tkód WHERE Város!='Miskolc' AND Ár > (SELECT avg(ár) FROM Autó JOIN Tulajdonos ON Tulaj=Tkód WHERE Város='Miskolc'); L1: A miskolci autók átlagára 169/158 L2: Az L1-től drágább, nem miskolci autók rendszáma

7 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Írassuk ki azok nevét, akiknek több autójuk van! SELECT Név FROM Autó JOIN Tulajdonos ON Tulaj=Tkód GROUP BY Név HAVING Count(*)>1 A HAVING segítségével a GROUP BY által előállított csoportokra képezhetünk keresési feltételt. Csak a GROUP BY kifejezéssel együtt használható. Szintaxisa hasonlít a WHERE feltételhez, de itt használhatunk összegző függvényeket is. 169/159

8 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Azon autók rendszáma, melyek idősebbek, mégis drágábbak saját típustársuknál: M1 SELECT a1.rendszám FROM Autó a1 JOIN Autó a2 ON a1.típus=a2.típus WHERE a1.kor > a2.kor AND a1.ár > a2.ár; Milyen illesztés? SELF JOIN Az Autó tábla önmagához kapcsolódik. Ezt alias nevek segítségével tudjuk megvalósítani (a1 és a2). Bár a két tála ilyenkor ugyanaz, a rendszer úgy tekinti, mintha két különböző tábla lenne! 169/160

8 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Azon autók rendszáma, melyek idősebbek, mégis drágábbak saját típustársuknál: M2 SELECT a1.rendszám FROM Autó a1 JOIN Autó a2 Milyen illesztés? USING(Típus) WHERE NATURAL SELF JOIN a1.kor > a2.kor AND a1.ár > a2.ár; 169/161

9 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Bármely piros autó áránál olcsóbb autók adatai: Megfelelő? IGEN 169/162

9 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Bármely piros autó áránál olcsóbb autók adatai: M1 SELECT * FROM Autó WHERE Ár < ANY (SELECT Ár FROM Autó WHERE Szín='Piros'); Másképp fogalmazva: a legdrágább piros autó árától olcsóbb autók M2 SELECT * FROM Autó WHERE Ár < (SELECT max(ár) FROM Autó WHERE Szín='Piros'); 169/163

10 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Minden piros autó áránál olcsóbb autók adatai: Megfelelő? NEM! 169/164

10 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Minden piros autó áránál olcsóbb autók adatai: M1 SELECT * FROM Autó WHERE Ár < ALL (SELECT Ár FROM Autó WHERE Szín='Piros'); Másképp fogalmazva: a legolcsóbb piros autó árától olcsóbb autók M2 SELECT * FROM Autó WHERE Ár < (SELECT min(ár) FROM Autó WHERE Szín='Piros'); 169/165

M1 Azok neve, akiknek van autójuk. Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Milyen illesztés? SELECT distinct Név FROM Tulajdonos JOIN Autó ON Tulaj=Tkód EQUI JOIN M2 M3 Select Név from Tulajdonos Halmaz típusú megoldás WHERE TKód IN (SELECT Tulaj FROM Autó); Select Név from Tulajdonos Milyen illesztés? SEMI JOIN WHERE EXISTS (SELECT * FROM Autó WHERE Tulaj=TKód); 169/166 IN: a keresett érték benne van-e a belső lekérdezés által visszaadott eredményhalmazban (több érték között szerepel-e) EXISTS: a belső lekérdezés eredményeként kapott 1 db adatsor létezik (nem null érték)

12 Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] Azok neve, akiknek nincs autójuk. M1 M2 SELECT Név FROM Tulajdonos MINUS SELECT Név FROM Tulajdonos JOIN Autó On TKód=Tulaj; Select Név from Tulajdonos WHERE TKód NOT IN (SELECT Tulaj FROM Autó WHERE Tulaj IS NOT NULL); M3 Select Név from Tulajdonos Milyen illesztés? WHERE NOT EXISTS (SELECT * FROM Autó WHERE Tulaj=TKód); ANTI JOIN 169/167 NOT EXISTS: a belső lekérdezés eredményeként kapott 1 db adatsor nem létezik (null érték)

Tulajdonos [Tkód, Név, Város] Autó [Rendszám, Típus, Szín, Kor, Ár, Tulaj] Kategória [Knév, AlsóHP, FelsőHP] 169/168

Dolgozó Kód Név Város Beosztás Belépés Fizetés Osztály VÉGE VÉGE 169/169