sapientia - erdélyi magyar tudományegyetem (emte ) csíkszereda

33
Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda 4. Előadás Az SQL adatbázisnyelv Sorváltozók Alkérdések Ismétlődő sorok Összesítések 1

Upload: pancho

Post on 18-Jan-2016

25 views

Category:

Documents


0 download

DESCRIPTION

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE ) Csíkszereda. 4 . Előadás Az SQL adatb á zisnyelv Sorv áltozók Alkérdések Ismétlődő sorok Összesítések. Sapientia - Erdélyi Magyar TudományEgyetem (EMTE ) Csíkszereda. Sorv áltozók - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

1

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

4. Előadás

Az SQL adatbázisnyelv

• Sorváltozók

• Alkérdések

• Ismétlődő sorok

• Összesítések

Page 2: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

2

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Sorváltozók

Olyan lekérdezéseknél, amelyik UGYANAZON reláció két vagy több sorát kombináljuk össze.

A FROM záradékban R minden előfordulásához hozzárendelünk egy másodnevet. Ezt nevezzük sorváltozónak.

A FROM záradékban R minden előfordulása után következhet az AS szócska és a sorváltozó neve.

R attribútumait megkülönböztetjük a SELECT és a WHERE záradékokban egy előtag segítségével, amelyik a megfelelő sorváltozóból és egy pontból áll.

Page 3: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

3

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Sorváltozók

Keressük azon színész párokat, akik egy címen laknak. (házastársak pl.)

SELECT Szinesz1.nev, Szinesz2.nev

FROM Filmszinesz AS Szinesz1, Filmszinesz AS Szinesz2

WHERE Szinesz1.cim=Szinesz2.cim AND

Szinesz1.nev<Szinesz2.nev;

Page 4: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

4

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Alkérdések

Az alkérdések segítségével sorokat vagy relációkat tudunk összehasonlítani. Egy alkérdés egy olyan kifejezés, mely egy relációt eredményez, például egy select-from-where kifejezés.

SELECT SQL parancs általános formája, mely tartalmaz alkérdést a következő:

SELECT <attribútum_lista>FROM <tábla>WHERE <kifejezés> <operátor>

(SELECT <attribútum_lista> FROM <tábla>);

Page 5: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

5

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Alkérdéseket csoportosíthatjuk annak megfelelően, hogy az eredménye hány sort és hány oszlopot tartalmaz:

• egy oszlopot, egy sort, vagyis egy skalár értéket ad vissza (single-row);

• egy oszlopot, több sort, u. n. több soros alkérdés (multiple-row subquery);

• több oszlopot, több sort, u.n. több oszlopos alkérdés (multiple-column);

Használt operátorok:

1. IN (NOT IN)-benne van, tartalmazza

2. ALL-mind

3. ANY-valamelyik

Page 6: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

6

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Példa: “Keressük a ‘Tervezés’ nevű részleg menedzserének a nevét”. A megoldás alkérdés segítségével:

1) SELECT Név 2) FROM Alkalmazottak3) WHERE SzemSzám =4) (SELECT MenSzemSzám5) FROM Részlegek6) WHERE Név = ‘Tervezés’);

A skalár értéket adó alkérdéssel használható operátorok az: =, <, <=, >, >=, <>.

Page 7: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

7

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Példa: “Keressük azon alkalmazottakat, kiknek fizetése nagyobb, mint annak az alkalmazottnak, kinek a személyi száma 333333.”

SELECT Név FROM AlkalmazottakWHERE Fizetés >

(SELECT Fizetés FROM AlkalmazottakWHERE SzemSzám = 333333);

Page 8: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

8

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Példa: “Keressük azon részlegeket és az alkalmazottak minimális fizetését a részlegből, ahol a minimális fizetés nagyobb, mint a minimális fizetés a 2-es ID-jű részlegből”.

SELECT RészlegID, MIN(Fizetés)FROM Alkalmazottak GROUP BY RészlegID HAVING MIN(Fizetés) > (SELECT MIN(Fizetés) FROM Alkalmazottak WHERE RészlegID = 2);

Page 9: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

9

A több-soros alkérdések esetén a WHERE záradék feltétele tartalmazhat olyan operátorokat, amelyeket egy R relációra alkalmazhatunk és az eredmény logikai érték lesz. Bizonyos operátoroknak egy skaláris s értékre is szükségük van. Ilyen operátorok:

EXISTS R – feltétel, mely akkor és csak akkor igaz, ha R nem üres.

Példa: SELECT Név FROM Alkalmazottak, ManagerekWHERE Alkalmazottak. SzemSzám = Managerek.SzemSzámAND EXISTS

(SELECT * FROM Alkalmazottak

WHERE Fizetés > 500);

A fenti példa csak abban az esetben adja meg a managerek nevét, ha van legalább egy alkalmazott, kinek a fizetése nagyobb, mint 500 Euro.

Page 10: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

10

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

s IN R, mely akkor igaz, ha s egyenlő valamelyik R-beli értékkel. Az s NOT IN R akkor igaz, ha s egyetlen R-beli értékkel sem egyenlő.

Példa: “Adjuk meg azon szállítók nevét és címét, kik szállítanak valamilyen csokit” (Áruk.Név LIKE ‘*csoki*’)

1) SELECT Név, Helység, UtcaSzám2) FROM Szállítók3) WHERE SzállID IN4) (SELECT SzállID5) FROM Szállít6) WHERE ÁruID IN7) (SELECT ÁruID8) FROM Áruk9) WHERE Név LIKE ‘%csoki%’) );

Page 11: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

11

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

s > ALL R, mely akkor igaz, ha s nagyobb, mint az R reláció minden értéke, ahol az R relációnak csak egy oszlopa van. A > operátor helyett használhatjuk bármelyik összehasonlítási operátort. Az s <> ALL R eredménye ugyanaz, mint az s NOT IN R feltételnek.

Példa: Legyen a következő lekérdezés:SELECT SzemSzám, NévFROM AlkalmazottakWHERE Fizetés > ALL (SELECT MIN(Fizetés) FROM Alkalmazottak

GROUP BY RészlegID);

Page 12: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

12

MySQL alkérdések a FROM-ban

• Alkérdések legálisak a SELECT utasítás FROM direktívájában. Az aktuális szintaxis:

• SELECT ... FROM (alkérdés) [AS] név ... • Sok esetben az alkérdésekkel megoldunk bizonyos

alproblémákat.• Hogy ne bonyolítsuk a komplexitását a

lekérdezésnek, ezen alkérdést ugyanúgy használhatjuk, mint a relációkat.

Page 13: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

13

A 7-ik előadásban szereplő lekérdezés megvalósításae) Melyek azok a gyártók, akik laptopot árulnak, PC-t

viszont nem

gyártó(Laptop Termék)

gyártó(PC Termék)SELECT DISTINCT Gyarto FROM Termek INNER JOIN Laptop ON Termek.modell=Laptop.modellWHERE Gyarto NOT IN(SELECT DISTINCT Gyarto FROM Termek INNER JOIN PC ONTermek.modell=PC.modell);

Page 14: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

14

Adott az adatbázis sémája, amelyik négy relációból áll:Termék(gyártó, modell, típus)PC(modell, sebesség, memória, merevlemez, cd, ár)Laptop(modell, sebesség, memória, merevlemez, képernyő, ár)Nyomtató(modell, színes, típus, ár)

a) Keressük meg a legalább 160-as sebességű PC-k gyártóit?

SELECT gyarto FROM Termek INNER JOIN PC ON Termek.modell=PC.modell WHERE PC.sebesseg>=160;

SELECT gyarto FROM Termek WHERE modell IN

(SELECT modell FROM PC WHERE sebesseg>=160);

Page 15: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

15

b) Keressük meg a legdrágább nyomtatókat?c) Keressük meg azokat a laptopokat, amelyek minden PC-nél

lassúbbak?d) Keressük meg a modellszámát a legdrágább terméknek

(PC, laptop vagy nyomtató)

SELECT modell FROM NyomtatoWHERE ar=(SELECT MAX(ar) FROM Nyomtato);

SELECT modell FROM LaptopWHERE sebesseg< ALL (SELECT sebesseg FROM PC);

Q1=(SELECT modell,ar FROM PC) UNION (SELECT modell,ar FROM Laptop) UNION (SELECT modell,ar FROM Nyomtato);

SELECT modell FROM Q1 WHERE ar=(SELECT MAX(ar) FROM Q1)

Page 16: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

16

e) Keressük meg a legolcsóbb színes nyomtató gyártóját?Melyik a jó válasz, és miért?

SELECT gyarto FROM Termek WHERE modell IN(SELECT modell FROM Nyomtato WHERE szines ANDar=(SELECT MIN(ar) FROM Nyomtato));

SELECT gyarto FROM Termek WHERE modell IN(SELECT modell FROM Nyomtato WHERE ar=(SELECT MIN(ar) FROM Nyomtato WHERE szines));

SELECT gyarto FROM Termek WHERE modell IN(SELECT modell FROM Nyomtato WHERE szines AND ar=(SELECT MIN(ar) FROM Nyomtato WHERE szines));

Page 17: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

17

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

f) Keressük meg annak a nyomtatónak a gyártóját, amely a leggyorsabb processzorú PC-t gyártja a legkisebb memóriájú PC-k között.

Q2=SELECT gyarto, sebesseg FROM Termek INNER JOIN PC ON Termek.modell=PC.modell WHERE sebesseg IN (SELECT sebesseg FROM PC WHERE memoria=(SELECT MIN(memoria) FROM PC));

SELECT gyarto FROM Q2 WHERE sebesseg IN (SELECT MAX(sebesseg) FROM Q2)

Page 18: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

18

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Összesítések:

Az összesítés művelete egy oszlop értékeiből egy új értéket hoz létre

Összesítő függvények a következők:

SUM, megadja az oszlop értékeinek az összegét;AVG, megadja az oszlop értékeinek a átlag értékét;MIN, megadja az oszlop értékeinek a minimumát;MAX, megadja az oszlop értékeinek a maximumát;COUNT, megadja az oszlopban szereplő értékek számát, beleértve az ismétlődéseket is, ha azok nincsenek megszüntetve a DISTINCT kulcsszóval;

Page 19: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

19

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Példa: A következő lekérdezés segítségével megkapjuk az alkalmazottak átlagos fizetését:

SELECT AVG(Fizetés)FROM Alkalmazottak;

Példa: Az Egyetem adatbázis esetén keressük azon csoportoknak a számát, amelyekben vannak diákok, akik átlaga kisebb, mint 7:

SELECT COUNT(DISTINCT CsopKod)FROM DiákokWHERE Átlag < 7

Page 20: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

20

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

Csoportosítások:

A reláció sorait csoportosítani szeretnénk egy vagy több oszlop értékei szerint.

A parancs általános formája:

SELECT < csoportosító oszlopok listája >, <összesítőfüggvény>(<oszlop>)FROM <reláció>[WHERE <feltétel>][GROUP BY <csoportosító oszlopok listája>][HAVING <csoportosítási-feltétel>][ORDER BY <oszlop>];

Page 21: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

21

Példa:A részlegeken belüli átlag fizetést a következő parancs segítségével kapjuk meg:SELECT RészlegID, AVG(Fizetés), MIN(Fizetés), MAX(Fizetés), SUM(Fizetés)FROM AlkalmazottakGROUP BY RészlegID;

SzemSzám Név RészlegID Fizetés (Euro)

111111 Nagy Éva 2 300

222222 Kiss Csaba 9 400

456777 Szabó János 9 900

234555 Szilágyi Pál 2 700

123444 Vincze Ildikó 1 800

333333 Kovács István 2 500

RészlegID AVG(Fizetés) MIN(Fizetés) MAX(Fizetés) SUM(Fizetés)

1 800 800 800 800

2 500 300 700 1500

9 650 400 900 1300

Eredmény:

Page 22: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

22

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

A csoportosítás után kapott eredmény reláció soraira alkalmazhatunk egy feltételt a HAVING kulcsszót használva.

Példa: Keressük azon részlegeket, ahol az alkalmazottak átlag fizetése nagyobb, mint 500 Euro, átlag fizetés szerint növekvő sorrendben.

SELECT RészlegID, AVG(Fizetés)FROM AlkalmazottakGROUP BY RészlegIDHAVING AVG(Fizetés) > 500ORDER BY AVG(Fizetés);

Page 23: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

23

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

a) Keressük meg a PC-k átlagos sebességét?b) Keressük meg a 2500$-nál drágább laptopok átlagos

sebességét?c) Keressük meg az “A” gyártó által gyártott PC-k átlagos árát?

a) SELECT AVG(sebesseg) AS atlagsebesseg FROM PC;

b) SELECT AVG(sebesseg) FROM Laptop WHERE ar>2500;

c) SELECT AVG(ar) FROM Termek INNER JOIN PC ON Termek.modell=PC.modell WHERE Gyarto=‘A’;

Page 24: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

24

d) Keressük meg a “D” gyártó által gyártott PC-k és laptopok átlagos árát?e) Keressük meg minden egyes PC-sebességéhez az ilyen sebességű PC-k átlagos árát?f) Keressük meg minden gyártó esetén a laptopok átlagos képernyőméretét?

d)Q1=(SELECT ar FROM Termek INNER JOIN PC ON Termek.modell=PC.modell WHERE Termek.gyarto=‘D’) UNION ALL (SELECT ar FROM Termek INNER JOIN Laptop ON Termek.modell=Laptop.modell WHERE Termek.gyarto=‘D’);SELECT AVG(ar) FROM Q1;

e) SELECT sebesseg, AVG(ar) FROM PC GROUP BY (sebesseg);

f) SELECT gyarto, AVG(kepernyo) FROM Termek INNER JOIN laptop ON Termek.modell=laptop.modell GROUP BY (gyarto);

Page 25: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

25

g) Keressük meg azokat a gyártókat, akik legalább háromfajta PC-t gyártanak?h) Keressük meg minden gyártó esetén a maximális PC árat?i) Keressük meg minden 150-nél nagyobb sebességű PC átlagos árát?j) Keressük meg minden olyan gyártóhoz, akik nyomtatót gyártanak, a PC-k átlagos merevlemezméretét

g) SELECT gyarto FROM Termek INNER JOIN PC ON Termek.modell=PC.modell GROUP BY gyarto HAVING Count(*)>2;

h) SELECT gyarto, MAX(ar) FROM Termek INNER JOIN PC ON Termek.modell=pc.modell GROUP BY (gyarto);

i) SELECT AVG(ar) FROM PC WHERE sebesseg>150 GROUP BY sebesseg;

i) SELECT gyarto, AVG(merevlemez) FROM Termek INNER JOIN PC ON Termek.modell=PC.modell WHERE gyarto IN (SELECT DISTINCT gyarto FROM Termek WHERE tipus=‘nyomtato’) GROUP BY gyarto;

Page 26: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

26

Hajóosztályok(osztály, típus, ország, ágyúkSzáma, kaliber, vízkiszorítás)

Hajók(név, osztály, felavatva)Csaták(név, dátum)Kimenetek(hajó, csata, eredmény)

1. Adjuk meg a hajóosztályokat a gyártó országok nevével együtt, amelyeknek az ágyúi legalább 16-os kaliberűek.

SELECT osztaly,orszag

FROM Hajoosztalyok

WHERE kaliber>=16;

Page 27: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

27

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

2. Melyek azok a hajók, amelyeket 1921-ben avattak fel?3. Adjuk meg a North Atlantic csatában elsüllyedt hajók nevét.

SELECT nevFROM HajokWHERE felavatva=1921;

SELECT hajo

FROM Kimenetelek

WHERE csata=‘North Atlantic’ AND

Allapot=‘elsullyedt’;

Page 28: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

28

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

4. Az 1921-es washingtoni egyezmény betiltotta a 35.000 tonnánál súlyosabb hajókat. Adjuk meg azokat a hajókat, amelyek megszegték az egyezményt.

SELECT hajo

FROM Hajoosztalyok INNER JOIN Hajok ON Hajoosztaly.osztaly=Hajok.osztaly

WHERE vizkiszoritas>35000 AND

Felavatva>1921;

Page 29: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

29

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

5. Adjuk meg a Guadalcanal csatában részt vett hajók nevét, vízkiszorítását és ágyúinak a számát.

SELECT Hajo.nev, hajoosztaly.vizkiszoritas, hajoosztaly.agyukszama

FROM Hajoosztaly, Kimenetelek, Hajok

WHERE Hajoosztaly.osztaly=Hajo.osztaly AND

Hajo.nev=Kimenetelek.hajo AND

Csata=‘Guadalcanal’;

Page 30: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

30

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

6. Adjuk meg az adabázisban szereplő összes hadihajó nevét (ne feledjük, hogy a Hajók relációban nem szerepel az összes hajó!)

(SELECT hajo FROM Kimenetelek)

UNION

(SELECT nev FROM Hajok);

Page 31: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

31

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

7. Adjuk meg azokat az osztályokat, amelyekbe csak egyetlenegy hajó tartozik

SELECT hajoosztalyok.osztaly

FROM hajoosztalyok, hajok

WHERE hajoosztalyok.osztaly=hajok.osztaly

GROUP BY hajoosztalyok.osztaly

HAVING COUNT(*)=1;

Page 32: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

32

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

8. Melyek azok az országok, amelyeknek csatahajóik és cirkálóhajóik is voltak?

SELECT Hajoosztaly.orszag

FROM Hajoosztaly, Hajoosztaj AS HO2

WHERE Hajoosztaly.orszag=HO2.orszag AND

Hajoosztaly.tipus<>HO2.tipus;

Page 33: Sapientia -  Erdélyi Magyar TudományEgyetem  (EMTE ) Csíkszereda

33

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda

9 Adjuk meg azokat a hajókat, amelyek újjáéledtek, azaz egyszer már megsérültek egy csatában, de egy későbbi csatában újra harcoltak.

Q=SELECT hajo, csata, allapot, datum FROM Csatak INNER JOIN Kimenetelek ON Csatak.nev=Kimenetelek.csata WHERE ALLAPOT<>’elsullyedt’;

SELECT Q.hajo

FROM Q, Q AS Q2

WHERE Q.hajo=Q2.hajo AND Q.allapot=‘serult’ AND

Q.datum<Q2.datum