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ő | nő | 62 | 134 |
14 | For Sear | Kopaszok | nő | 62 | 133 |
15 | Nallid Surroc | MélyPokol | nő | 60 | 134 |
16 | Trad Sure | SötétÜllő | nő | 60 | 138 |
17 | Terrin Orsan | Vasököl | nő | 60 | 136 |
18 | Dardd Luend | Vasököl | nő | 62 | 134 |
19 | Ymed Surrag | Vasököl | nő | 57 | 135 |
20 | Gor Rian | TüzesKohó | nő | 62 | 134 |
21 | Lok Zian | Acélkezűek | nő | 67 | 137 |
22 | Azul Radda | Acélkezűek | nő | 66 | 133 |
23 | Ranad Sadda | HarcosNóta | nő | 54 | 136 |
24 | Adgal Arroc | HarcosNóta | nő | 61 | 133 |
37 | Darrad Melf | Acélkezűek | nő | 68 | 134 |
38 | Hardi Arrag | Acélkezűek | nő | 59 | 137 |
39 | Adgal Zuen | SötétÜllő | nő | 62 | 132 |
40 | Nal Ardta | Acélkezűek | nő | 65 | 133 |
41 | Sóg Rian | Rézfejű | nő | 63 | 134 |
42 | Adgallid Erak | MélyPokol | nő | 66 | 137 |
43 | Krond Saddare | HarcosNóta | nő | 58 | 133 |
44 | Sarsi Sadda | SötétÜllő | nő | 59 | 136 |
45 | Torraain Luen | JegesSzakáll | nő | 66 | 137 |
46 | Ymed Surring | HarcosNóta | nő | 65 | 134 |
47 | Sarrin Sare | JegesSzakáll | nő | 61 | 138 |
48 | Fród Sear | Acélkezűek | nő | 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.
Operátor | Leírás |
---|---|
= | Egyenlő. |
!= | Nem egyenlő. |
> | Nagyobb. |
< | Kisebb. |
!< | Nem kisebb. |
!> | Nem nagyobb. |
>= | Nagyobb egyenlő. |
<= | Kisebb egyenlő. |
Operátor | Leírás |
---|---|
+ | Összeadás. |
- | Kivonás. |
* | Szorzás. |
/ | Osztás. |
% | Modulus. |
Operátor | Leírás |
---|---|
NOT | Logikai tagadás. |
AND | Logikai és. |
OR | Logikai vagy. |
XOR | Logikai XOR. |
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 | nő | 60 | 136 |
18 | Dardd Luend | Vasököl | nő | 62 | 134 |
19 | Ymed Surrag | Vasököl | nő | 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ű | nő | 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:
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. |
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. |