Az SQL alapjai II


Az adatlekérdező nyelv


Az adatlekérdező nyelv tartalmazza az adatok lekérdezését biztosító nyelvi elemeket. Az SQL adatlekérdező nyelve egyetlen utasításra támaszkodik (SELECT), mely számos további alparancsra osztható fel. Figyelem, a szelekció művelete és a SELECT utasítás csak nevében hasonló, egymásnak nem felelnek meg! Egyenlőre hagyatkozzunk az egyrelációs esetekre.

A vetítés műveletét a SELECT utasítás DISTINCT alparanccsal valósíthatjuk meg, melynek szintaxisa a következő:


SELECT [DISTINCT] attributumnev, attributumnev, ... FROM relacionev;

A fenti szintaxis szerint az egy relációnevek felsorolásával kiválogathatjuk azon oszlopokat egy előre meghatározott relációból, melyeken végre szeretnénk hajtani a vetítés műveletét. Egy korábbi fejezetből már tudhatjuk, hogy a vetítés művelete halmazművelet (is), azaz nem lehet két azonos attribútumnevű oszlop.

A torpek reláció klan attribútum egyes elemei többször is előfordulhat, ugyanis egy klánt (mint közösséget) több törpe alkot. Viszont az adatbázis ezen formájában erre vonatkozó reláció és a torpek relációhoz kapcsolódó idegen kulcs nem létezik. Ahhoz, hogy lekérdezzük a klan attribútum elemeit a torpek relációból úgy, hogy a klan attribútum elemei csak egyszer szerepeljenek a lekérdezés eredményében, használjuk az alábbi parancsot:


SELECT DISTINCT klan FROM torpek;

A lekérdezés eredményének megtekintése
klan
TüzesKohó
Rézfejű
NyirkosTárna
JegesSzakáll
Kopaszok
HarcosNóta
SötétÜllő
MélyPokol
Vasököl
Acélkezűek

A kiválasztás művelet megvalósításához a SELECT utasítást feltétellel egészítik ki. Ezáltal azon rekordokra szűkül az eredmény-reláció, melyek teljesítik a megadott feltételt. A szintaxis a következőképpen néz ki:


SELECT attributumnev, attributumnev, ... FROM relacionev WHERE feltetel;

Abban az esetben ha az összes attribútumot szeretnénk bevonni a kiválasztáshoz a kívánt relációból (relációkból), akkor az összes attribútum felsorolása helyett elegendő egy *-al jelölni ezt a "szándékunkat".

A torpek relációból válasszuk ki azon törpöket (rekordokat), melyek neme nő:


SELECT * FROM torpek WHERE nem = 'nő';

A lekérdezés eredményének megtekintése
id nev klan nem suly magassag
13 Terrof Erag SötétÜllő 62 134
14 For Sear Kopaszok 62 133
15 Nallid Surroc MélyPokol 60 134
16 Trad Sure SötétÜllő 60 138
17 Terrin Orsan Vasököl 60 136
18 Dardd Luend Vasököl 62 134
19 Ymed Surrag Vasököl 57 135
20 Gor Rian TüzesKohó 62 134
21 Lok Zian Acélkezűek 67 137
22 Azul Radda Acélkezűek 66 133
23 Ranad Sadda HarcosNóta 54 136
24 Adgal Arroc HarcosNóta 61 133
37 Darrad Melf Acélkezűek 68 134
38 Hardi Arrag Acélkezűek 59 137
39 Adgal Zuen SötétÜllő 62 132
40 Nal Ardta Acélkezűek 65 133
41 Sóg Rian Rézfejű 63 134
42 Adgallid Erak MélyPokol 66 137
43 Krond Saddare HarcosNóta 58 133
44 Sarsi Sadda SötétÜllő 59 136
45 Torraain Luen JegesSzakáll 66 137
46 Ymed Surring HarcosNóta 65 134
47 Sarrin Sare JegesSzakáll 61 138
48 Fród Sear Acélkezűek 65 136

Abban az esetben ha megadjuk a kívánt attribútumokat a lekérdező parancsba, akár össze is vonható a vetítés és a kiválasztás.

Induljunk ki az előző példából. Válasszuk ki azon törpök azonosítóját és nevét, akinek a neme nő:


SELECT id, nev FROM torpek WHERE nem = 'nő';

A lekérdezés eredményének megtekintése
id nev
13 Terrof Erag
14 For Sear
15 Nallid Surroc
16 Trad Sure
17 Terrin Orsan
18 Dardd Luend
19 Ymed Surrag
20 Gor Rian
21 Lok Zian
22 Azul Radda
23 Ranad Sadda
24 Adgal Arroc
37 Darrad Melf
38 Hardi Arrag
39 Adgal Zuen
40 Nal Ardta
41 Sóg Rian
42 Adgallid Erak
43 Krond Saddare
44 Sarsi Sadda
45 Torraain Luen
46 Ymed Surring
47 Sarrin Sare
48 Fród Sear

A SELECT utasítás feltételében lehetőségünk van logikai, aritmetikai és összehasonlító operátorokat használni, melyeket az attribútum értékekre tudunk hattatni. Az összehasonlító operátorokat csoportosíthatjuk egy, illetve többértékes operátorokra.

Összehasonlító operátorok
Operátor Leírás
= Egyenlő.
!= Nem egyenlő.
> Nagyobb.
< Kisebb.
!< Nem kisebb.
!> Nem nagyobb.
>= Nagyobb egyenlő.
<= Kisebb egyenlő.


Operátor =
Leírás Egyenlő.
Operátor !=
Leírás Nem egyenlő.
Operátor >
Leírás Nagyobb.
Operátor <
Leírás Kisebb.
Operátor !<
Leírás Nem kisebb.
Operátor !>
Leírás Nem nagyobb.
Operátor >=
Leírás Nagyobb egyenlő.
Operátor <=
Leírás Kisebb egyenlő.
Összehasonlító operátorok

Aritmetikai operátorok
Operátor Leírás
+ Összeadás.
- Kivonás.
* Szorzás.
/ Osztás.
% Modulus.


Operátor +
Leírás Összeadás.
Operátor -
Leírás Kivonás.
Operátor *
Leírás Szorzás.
Operátor /
Leírás Osztás.
Operátor %
Leírás Modulus.
Aritmetikai operátorok

Logikai operátorok
Operátor Leírás
NOT Logikai tagadás.
AND Logikai és.
OR Logikai vagy.
XOR Logikai XOR.


Operátor NOT
Leírás Logikai tagadás.
Operátor AND
Leírás Logikai és.
Operátor OR
Leírás Logikai vagy.
Operátor XOR
Leírás Logikai XOR.
Logikai operátorok

A torpek relációból válasszuk ki azon törpök neve, melyek B-vel kezdődik:


SELECT nev FROM torpek WHERE nev LIKE 'B%';

A lekérdezés eredményének megtekintése
nev
Bal Dorf
Bal Fars

Kérdezzük le a Tüzeskohó klánba tartozó férfi törpéket:


SELECT * FROM torpek where klan ='Tüzeskohó' AND nem = "férfi";

A lekérdezés eredményének megtekintése
id nev klan nem suly magassag
1 Krond Tard TüzesKohó férfi 54 137
5 Hardd Gráid TüzesKohó férfi 60 136

Kérdezzük le azon törpök adatait, amiknek a magassága 134 cm és 136 cm közé esik és a Vasököl klánba tartoznak:


SELECT * FROM torpek WHERE magassag BETWEEN 134 AND 136 AND klan = 'Vasököl';

A lekérdezés eredményének megtekintése
id nev klan nem suly magassag
17 Terrin Orsan Vasököl 60 136
18 Dardd Luend Vasököl 62 134
19 Ymed Surrag Vasököl 57 135
30 Sarsi Duri Vasököl férfi 64 134
34 Harrin Daggi Vasököl férfi 57 135

Az eddigi lekérdezések eredményei a sorok tárolt sorrendjében kerültek kiírásra. Az SQL lehetőséget biztosít az eredmény-reláció rekordjainak rendezésére az ORDER BY alparancs segítségével, melynek szintaxisa a következő:


SELECT attributumnev, attributumnev, ... FROM relacionev [WHERE feltetel] 
ORDER BY attributumnev [ASC|DESC], attributumnev [ASC | DESC], ...;

Az ORDER BY után megadott attribútumok alapján DESC esetén csökkenő, ASC esetén növekvő sorrendbe rendezi az eredmény-reláció rekordait. Abban az esetben ha több attribútumot adunk meg a rendezés feltételében, akkor a megadás sorrendje alapján történik a rendezés.

A Rézfejű klán tagjait magasság szerint rendezzük sorba:


SELECT * FROM torpek WHERE klan = 'Rézfejű' ORDER BY magassag ASC;

A lekérdezés eredményének megtekintése
id nev klan nem suly magassag
2 Bal Dorf Rézfejű férfi 67 133
7 Tardi Grádi Rézfejű férfi 59 133
31 Sarraain Ramoggad Rézfejű férfi 60 134
41 Sóg Rian Rézfejű 63 134
32 Ranad Falgorf Rézfejű férfi 64 136

Az eredmény-reláció rekordjait csoportosíthatjuk és a csoportok között is további kiválasztást alkalmazhatunk a HAVING ás a GROUP BY alparancsokkal, melynek szintaxisa a következő:


SELECT attributumnev, attributumnev, ... FROM relacionev [WHERE feltetel] 
GROUP BY attributumnev [HAVING feltetel];

A GROUP BY alparancs után megadott attribútum azonos értékei alapján csoportosítja a lekérdezés eredményeit. Az eredménybe a HAVING utáni feltételét teljesító rekordok fognak bekerülni. Az azonos csoporthoz rendelt rekordokra lehetőségünk van speciális aggregációs függvényeket hattatni, melyek közül a leggyakoribbak az alábbiak:

Aggregációs függvények
Függvény Leírás
AVG() Visszatér a nem NULL értékek átlagával.
COUNT() Visszatér a csoportokba rendelt rekordok (beleértve a NULL értékekkek feltöltött rekordokat) darabszámaival.
MAX() Visszatér a legnagyobb értékkel a megadott nem NULL értékek közül.
MIN() Visszatér a legkisebb értékkel a megadott nem NULL értékek közül.
SUM() Visszatér a megadott nem NULL értékek összegével.


Függvény AVG()
Leírás Visszatér a nem NULL értékek átlagával.
Függvény COUNT()
Leírás Visszatér a csoportokba rendelt rekordok (beleértve a NULL értékekkek feltöltött rekordokat) darabszámaival.
Függvény MAX()
Leírás Visszatér a legnagyobb értékkel a megadott nem NULL értékek közül.
Függvény MIN()
Leírás Visszatér a legkisebb értékkel a megadott nem NULL értékek közül.
Függvény SUM()
Leírás Visszatér a megadott nem NULL értékek összegével.
Aggregációs függvények

Kérdezzük le a torpek relációból háromnál nagyobb létszámú klánok nevét és létszámát (letszam alias attribútumnévvel):


SELECT klan, COUNT(*) AS letszam FROM torpek GROUP BY klan HAVING COUNT(*) > 3;

A lekérdezés eredményének megtekintése
klan letszam
Acélkezűek 6
HarcosNóta 6
JegesSzakáll 6
MélyPokol 4
Rézfejű 5
SötétÜllő 8
Vasököl 5

A SELECT SQL utasítás segítségével eddig az egyrelációs eseteket tárgyaltuk. Az élvezeteket fokozva térjünk át a többrelációs esetekre.

A Descartes-szorzás művelet megvalósításához a SELECT utasítást kell használni. Mivel az attribútumok nevei megegyezhetnek, az adatbáziskezelő számára nem lesz egyértelmű, hogy mely mely attribútum mely relációból származik. Ezt hibaüzenet formájában vissza fogja jelezni számunkra. Az objektumorientált programozás során egy objektum egy tulajdonságát a dot notation szintaxissal meg tudjuk hivatkozni. Ehhez hasonlóan egy reláció bármely attribútuma elérhető. Így hiba nélkül megegyező elnevezésű attribútumokat is elérhetünk, melyek különböző relációk részét képezik. Az alábbi parancs lefuttatásával elérhető a kívánt eredmény:


SELECT relacionev.attributumnev, relacionev.attributumnev FROM relacionev, relacionev;

Kérdezzük le a tarna és kozet relációk id attribútumaiból képzett összes lehetséges párosítását:


SELECT kozetek.id, tarnak.id FROM kozetek, tarnak;

A lekérdezés eredményének megtekintése
id id
1 1
2 1
3 1
4 1
1 2
2 2
3 2
4 2
1 3
2 3
3 3
4 3
1 4
2 4
3 4
4 4
1 5
2 5
3 5
4 5
1 6
2 6
3 6
4 6
1 7
2 7
3 7
4 7
1 8
2 8
3 8
4 8
1 9
2 9
3 9
4 9
1 10
2 10
3 10
4 10

A SELECT utasítás lehetőséget ad a relációk belső kapcsolásaik kialakítására. Ennek egyik fajtája a relációs algebra alfejezetnél ismertetett egyenlő kapcsolás, melynek szintaxisa a következéképpen néz ki:


SELECT relacionev.attributumnev, relacionev.attributumnev, ... 
FROM relacionev, relacionev,...
WHERE attributumnev operator attributumnev;

A legjövedelmezőbb bányászati termék az arany. Határozzuk meg, hogy mely tárnákból termeltek ki aranyat a törpék, és mekkora mennyiséget! Az alábbi parancs lefuttatásával elérhető a kívánt eredmény:


SELECT tarnak.nev, Sum(kihol.kitermelt_mennyiseg) AS mennyiseg 
FROM kihol, tarnak, kozetek 
WHERE  kihol.tarna_id = tarnak.id 
AND kozetek.nev = "arany" 
GROUP  BY tarnak.nev; 

A lekérdezés eredményének megtekintése
nev mennyiseg
Dheghkohldur 1717
Dhingrum 1834
Gir Lodur 1679
Khaldarim 1605
Khig Maldir 1956
Khighborim 1500
Moldirth 1904
Narladur 1409
Thir Tharum 1059
Vonkuldor 1991

A SELECT utasítás egy másik megoldást is kínál a relációk belső kapcsolásaik megvalósítására az INNER JOIN és ON kulcsszavak segítségével. Egyenlőre még maradjunk a relációk belső kapcsolásánál, melynek szintaxisa a következő:


SELECT relacionev.attributumnev, relacionev.attributumnev, ... 
FROM relacionev INNER JOIN relacionev
ON relacionev.attributumnev = relacionev.attributumnev;

Átalakítva az előző példánkat a másik megközelítésnek megfelelően alábbi parancs lefuttatásával elérhető a kívánt eredmény:


SELECT tarnak.nev, Sum(kihol.kitermelt_mennyiseg) AS mennyiseg 
FROM kihol INNER JOIN tarnak INNER JOIN kozetek 
ON kihol.tarna_id = tarnak.id 
AND kozetek.nev = "arany" 
GROUP  BY tarnak.nev;

A SELECT utasítás lehetőséget ad a relációk külső kapcsolásaik kialakítására. Ennek egyik fajtája a relációs algebra alfejezetnél ismertetett külső kapcsolás. Ezen belül megkülönböztetjük a jobb oldali, bal oldali és teljes külső kapcsolásokat. Egyenlőre maradjunk a relációk bal oldali külső kapcsolásánál. A megvalósításhoz a LEFT JOIN és ON kulcsszavak kell használnunk. az eredmény-relációban a bal oldali reláció azon sorai is szerepelnek, amelyek a jobb oldali reláció egyetlen sorával sem párosítható. Ezen rekordokban a jobb oldali relációból származó attribútumok értéke NULL. A bal oldali külső kapcsolás szintaxisa a következőképpen néz ki:


SELECT relacionev.attributumnev, relacionev.attributumnev, ...
FROM relacionev LEFT JOIN relacionev
ON relacionev.attributumnev = relacionev.attributumnev;

A LEFT JOIN kapcsolással kérdezzük le a torpek relációból a nev attribútum és a kihol reláció torpe_id attribútum azon rekordjait, melyeknél a torpe_id értéke NULL. Rendezzük a rekordokat ABC sorrendbe a torpek reláció nev attribútuma szerint. Magyarán szólva kérdezzük le azon törpék adatait (név és azonosító), akik még nem teljesítettek szolgálatot (még nem bányásztak). Az alábbi parancs lefuttatásával elérhető a kívánt eredmény:


SELECT torpek.nev, kihol.torpe_id 
FROM torpek LEFT JOIN kihol 
ON kihol.torpe_id = torpek.id AND torpe_id = NULL
ORDER BY nev;

A lekérdezés eredményének megtekintése
nev torpe_id
Adgal Arroc
Adgal Zuen
Adgallid Erak
Azul Dagg
Azul Radda
Azul Sai
Bal Dorf
Bal Fars
Dardd Luend
Darrad Melf
Darrond Anda
For Azgan
For Sear
Fród Sear
Gor Morf
Gor Rian
Gorrond Akhac
Hardd Gráid
Hardi Arrag
Hardi Beronn
Harrin Daggi
Harrof Fard
Krond Saddare
Krond Tard
Lok Zian
Nal Ardta
Nal Traainn
Nallid Loopa
Nallid Surroc
Ranad Falgorf
Ranad Sadda
Sardi Farf
Sarraain Ramoggad
Sarrad Loopa
Sarrin Sare
Sarsi Duri
Sarsi Sadda
Sóg Rian
Sóg Tars
Tardi Grádi
Terrin Orsan
Terrof Erag
Thardd Daggal
Torraain Luen
Trad Sure
Ymed Geronn
Ymed Surrag
Ymed Surring

Az SQL lehetőséget ad a SELECT utasítások egymásba ágyazásába. A belső SELECT utasításokat ekkor () zárójelbe kel foglalni.

Trad Morf szorgos törpe, Gir Lodur-ban 43 kg aranyat bányászott, Moldirth-ban pedig 28 kg kőzetet termelt ki. Vegyük fel a kívánt adatokat a megfelelő relációba. Az alábbi parancs lefuttatásával elérhető a kívánt eredmény:


INSERT INTO kihol(torpe_id, tarna_id, kitermelt_mennyiseg)
VALUES ((SELECT id FROM torpek WHERE nev = 'Trad Morf'),
SELECT id FROM tarnak WHERE nev = 'Gir Lodur'), 43);
    
INSERT INTO kihol(torpe_id, tarna_id, kitermelt_mennyiseg)
VALUES ((SELECT id FROM torpek WHERE nev = 'Trad Morf'),
SELECT id FROM tarnak WHERE nev = 'Moldirth'), 28);

Az adatvezérlő nyelv


Az adatvezérlő nyelv tartalmazza az adatbáziskezelő működését befolyásoló nyelvi elemeket. Jelen tananyagban ezzel nem fogunk foglalkozni.

Irodalomjegyzék

[1]
Vue.js core team. Vue.js: The Progressive JavaScript Framework. https://vuejs.org, Legutóbb megtekintve: 2019. április 22.
[2]
Vue.js core team. API, Global Config, directive. https://vuex.vuejs.org/vuex.png, Legutóbb megtekintve: 2019. április 22.
[3]
Vue.js core team. API, Global Config, computed. https://vuejs.org/v2/api/#computed, Legutóbb megtekintve: 2019. április 22.
[4]
Vue.js core team. API, Global Config, components. https://vuejs.org/v2/api/#components, Legutóbb megtekintve: 2019. április 22.
[5]
Vue.js core team. Vue-CLI. https://cli.vuejs.org/guide/creating-a-project.html#vue-create, Legutóbb megtekintve: 2019. április 22.
[6]
Vue.js core team. Vue-router. https://router.vuejs.org/guide/#html, Legutóbb megtekintve: 2019. április 22.
[7]
Vue.js core team. Render Functions and JSX. https://vuejs.org/v2/guide/render-function.html, Legutóbb megtekintve: 2019. április 22.
[8]
w3schools core team. JavaScript RegExp Reference. https://www.w3schools.com/jsref/jsref_obj_regexp.asp, Legutóbb megtekintve: 2019. április 22.
[9]
Google Chrome DevTools core team. Chrome DevTools. https://developers.google.com/web/tools/chrome-devtools, Legutóbb megtekintve: 2019. április 22.
[10]
Node.js core team. Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. https://nodejs.org/en/, Legutóbb megtekintve: 2019. április 22.
[11]
NPMJS core team. NPMJS. https://www.npmjs.com, Legutóbb megtekintve: 2019. április 22.
[12]
ExpressJS core team. Express Fast, unopinionated, minimalist web framework for Node.js. https://expressjs.com, Legutóbb megtekintve: 2019. április 22.
[13]
EJS core team. EJS: Embedded JavaScript templating. https://ejs.co, Legutóbb megtekintve: 2019. április 22.
[14]
Olga Filipova. Learning Vue.js 2. Packt Publishing Ltd., Livery Place, 35 Livery Street, Birmingham, B3 2PB, UK, 3, 2016.
[15]
E.F. Codd. A relational Model of Data for Large Shared Data Banks. Communications of the ACM, 13 (6) 1970.
[16]
Papp Edit. Adatbáziskezelés. Booklands 2000 Könyvkiadó Kft., 5600 Békéscsaba, Dr. Becsey Oszkár u. 42., 1, 2004.
[17]
Nemzeti Szakképzési és Felnőttképzési hivatal. Szoftverfejlesztő tanfolyam. https://www.nive.hu, Legutóbb megtekintve: 2019. április 22.
[18]
JavaScript.info core team. JavaScript.info. https://javascript.info/promise-basics, Legutóbb megtekintve: 2019. április 22.
[19]
Craig Buckler. Sitepoint (JavaScript) - Understanding ES6 Modules. https://www.sitepoint.com/understanding-es6-modules/, Legutóbb megtekintve: 2019. április 22.