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