SQL szintaxis
Nyelvi elemek
Angolszerű mondatokForrás: előadás diái
DML
Adatmódosító (Data Manipulation Language –DML)Új adatok (példányok, entitások) beszúrása (INSERT)Létező adatok módosítása (UPDATE)Létező adatok törlése (DELETE)
Utasítások
INSERT
Új adat bevitele
Példa
INSERT INTO Termek (Id, Nev, Raktarkeszlet) VALUES (1, ’Alma’, 15);
UPDATE
A táblában már elérhető adatok frissítése.
Példa
Változtassuk meg a város oszlopban az egyik rekordot a Customers táblában:UPDATE CustomersSET City='Hamburg'WHERE CustomerID=1;Forrás: https://www.w3schools.com/sql/sql_update.asp
DELETE
Létező adatok törlése
Példa
Ki szeretnénk törölni a "Alfreds Futterkiste" customer-t a "Customers" táblából.DELETE FROM CustomersWHERE CustomerName='Alfreds Futterkiste' AND ContactName='Maria Anders';Forrás: https://www.w3schools.com/sql/sql_delete.asp
DDL
Adatleíró (Data Definition Language -DDL)Felhasználói objektumok kezeléseÚj objektumok (adatbázisok, relációk, nézetek, kényszerek, ...) létrehozásaMeglévő objektumok módosítása (pl reláció kibővítése), törléseCREATE, ALTER, DROP...Forrás:db_02_SQL
Utasítások
CREATE
Új adatbázis létrehozása
Példa
CREATE TABLE Megrendeles(Id int,Megrendelo nvarchar(50),Cim nvarchar(50),Datum datetime);
ALTER
Új attribútum felvétele
Példa
Szintaxis: ALTER TABLE <táblanév> ADD <új oszlop> <típus> <megköt.>Példa: ALTER TABLE Termek ADD Leiras nvarchar(500) DEFAULT ’?’;
Létező attribútum törlése
Példa
Szintaxis: ALTER TABLE <táblanév> DROP COLUMN <oszlopnév>Példa: ALTER TABLE Termek DROP COLUMN Raktarkeszlet;
Létező attribútum tulajdonságainak változtatása
Példa
Példa: ALTER TABLE <táblanév> MODIFY <oszlopnév><új típus> <új megkötések>;
PURGE
A PURGE végérvényesen kitörli a táblát gépről. (Ezzel szembe a DROP csak a lomtárba helyezi.)Forrás:http://www.dba-oracle.com/t_oracle_purge_recycle_bin.htm
aPélda
DROP TABLE alkalmazott PURGE; Forrás: 2. gyakorlat
DROP
Tábla törlése
Példa
szintaxis: DROP TABLE <táblanév>Példa: DROP TABLE MegrendelesTetel;
DCL
Adatelérést vezérlő (Data Control Language –DCL)Jogosultság szabályozás (GRANT)
DQL
Az SQL-ben szigorú a szórend, mint a németben.Színkódolás:piros - kötelező megadninarancssárga - kötelező, de választhatózöld - választhatókék - választhatónak a választható részecitromsárga - (logikai) condition feltétel: minden egyes sorra eldönti hogy igaz-e; csak egy feltétel de ez lehet összetett feltétel!
Select
Ez a vetítés relációnak felel meg.(Feldolgozási sorrendben a 3.)Vesszővel választjuk el a felsorolást (amikor felsoroljuk melyik oszlopokat szeretnénk megkapni).Forrás: előadás, gyakorlat
Predikátumok
Az Structured Query Language (strukturált lekérdezőnyelv – SQL)-lekérdezések által kijelölt rekordok körét szabják meg.Forrás: https://support.office.com/hu-hu/article/ALL-DISTINCT-DISTINCTROW-TOP-predik%C3%A1tumok-24f2a47d-a803-4c7c-8e81-756fe298ce57
DISTINCT
Elhagyja azokat a rekordokat, amelyek többszörös adatokat tartalmaznak a kijelölt mezőkben.Fontos: A DISTINCT-re a halmaz szemantika igaz.Forrás: Előadás, https://support.office.com/hu-hu/article/ALL-DISTINCT-DISTINCTROW-TOP-predik%C3%A1tumok-24f2a47d-a803-4c7c-8e81-756fe298ce57
Példa
SELECT DISTINCT szulev FROM minta.alkalmazott;Forrás: 3. gyakorlat
ALL
Alapértelmezett választás, amennyiben a fenti predikátumok egyikét sem használja. A Microsoft Access-adatbázismotor minden olyan rekordot visszaad, amely megfelel az SQL-karakterlánc/utasítás szereplő feltételeknek.Fontos: Az ALL zsák szemantikát követ.
Példa
az Alkalmazottak tábla összes rekordját adja vissza:SELECT ALL * FROM Alkalmazottak ORDER BY Alkalmazottkód;Forrás:https://support.office.com/hu-hu/article/ALL-DISTINCT-DISTINCTROW-TOP-predik%C3%A1tumok-24f2a47d-a803-4c7c-8e81-756fe298ce57
DISTINCTROW
Mezők helyett teljes rekordok alapján hagyja el a többszörös adatokat.Fontos: Halmaz szemantika az igaz rá.Forrás:https://support.office.com/hu-hu/article/ALL-DISTINCT-DISTINCTROW-TOP-predik%C3%A1tumok-24f2a47d-a803-4c7c-8e81-756fe298ce57
Példa
Vegyünk például egy olyan lekérdezést, amely a Vevőkód alapján illeszti a Vevők és a Rendelések táblát. A Vevők tábla nem tartalmaz többszörös Vevőkód mezőket, a Rendelések tábla viszont igen, hiszen egy-egy vevőhöz több rendelés is tartozhat. Az alábbi SQL-utasítás szemlélteti, hogy a DISTINCTROW segítségével hogyan kérdezheti le azoknak a cégeknek a listáját, amelyekhez legalább egy rendelés tartozik, ha a rendelések további részleteire nem kíváncsi:SELECT DISTINCTROW Cégnév FROM Vevők INNER JOIN Rendelések ON Vevők.Vevőkód = Rendelések.Vevőkód ORDER BY Cégnév;
Oszlopnevek
Felsoroljuk a megjeleníteni kívánt oszlopokat.
*
Az összes oszlopot jelenítse meg.
AS
A kapott (eredmény)oszlop elnevezésére szolgál(nem szükséges).Forrás: Gyakorlat
FROM
Feldolgozási sorrendben az 1. => Nem tudunk aliassal hivatkozni, mivel a lekérdezés logikája szerint a select később jön
Tábla
Felsoroljuk melyik táblá(k)ból szeretnénk adatokat kinyerni.Forrás: előadás
JOIN
A relációs adatbázis-kezelő rendszerek igazi ereje abban rejlik, hogy lehetőséget nyújtanak olyan lekérdezések megfogalmazására és végrehajtására, amelyek több relációból gyűjtik össze a kívánt adatot.Forrás: Előadás
Egyen-összekapcsolások (Equi-Join)
Egyen-összekapcsolások (EQUI-join): párbarendezés két azonos oszlop alapján, összekapcsolás feltétele az egyenlőség
Natural-Join
A természetes illesztést SQL-ben a NATURAL JOIN operátorral lehet végrehajtani.Az a lényeg, hogy a két táblát természetesen összeilleszti. Ahol ugyanazolyan nevűek az oszlopok, azt egynek veszi, ahol különböznek, azt külön kiírja. Tehát pl. ha van két táblám, és mindegyikben 3-3 oszlop van, amelyikből 1-1 megegyezik, akkor a SELECT utasítás eredményül egy 5 oszlopos eredmény fog adni.
Példa
SELECT * FROM Termek NATURAL JOIN Gyarto;
USING
A USING klauzula akkor hasznos, amikor két oszlopnak azonos a neve, amiket JOIN-oltunk.Forrás:http://docs.oracle.com/javadb/10.10.1.2/ref/rrefsqljusing.html
Példa
SELECT * FROM COUNTRIES JOIN CITIES USING (COUNTRY); Forrás:http://docs.oracle.com/javadb/10.10.1.2/ref/rrefsqljusing.html
ON
Általában ON klauzulát használunk. (Akkor használhatjuk, amikor az összejoinolt klauzulák között nincsenek azonos nevű oszlopok.)Forrás:http://docs.oracle.com/javadb/10.10.1.2/ref/rrefsqljusing.html
Példa
select department_name, city from departments dept join locations loc on (d.location_id = l.id);
Nem egyen-összekapcsolások (Non equi-join)
NON-EQUI-join: a két tábla között nincsen egyenlőség. Például: fizetési osztályok, sávos adózás stb..Forrás: előadás diái
Példa
SELECT e.first_name, e.last_name, e.salary, j.grade_levelFROM workers e JOIN job_grades jON e.salary BETWEEN j.lowest_sal AND j.highest_sal;Forrás: előadás diái
Külső összekapcsolások (Outer Join)
Más információs igényt valósít meg, pl 2 jegy egy hallgató: elsőnek van párja, másodiknak már nincs, eddigiek nem adnák ki eredménynek.
LEFT OUTER JOIN
Baloldal minden sorát kiírja. Akkor is, ha nincs párja.Forrás: előadás diái
Példa
Példa:SELECT GyartoNev, TermekNev FROM GyartoLEFT OUTER JOIN Termek ON Gyarto.GyartoKod=Termek.GyartoKodWHERE Termek.TermekKod IS NULL;
RIGHT OUTER JOIN
Baloldal minden sorát kiírja. Akkor is, ha nincs párja.Forrás: előadás diái
Példa
Példa: Hasonlóan, mint a left outer join esetében.SELECT GyartoNev, TermekNev FROM GyartoRIGHT OUTER JOIN Termek ON Gyarto.GyartoKod=Termek.GyartoKodWHERE Termek.TermekKod IS NULL;
FULL OUTER JOIN
A FULL OUTER JOIN mindent megjelenít. Akkor is, ha valamelyik oldalon nincsen párja.Forrás: Előadás diái
Példa
SELECT Szemely.Nev, Szulo.Nev FROM SzemelyFULL OUTER JOIN Szemely SzuloON Szemely.AnyaId=Szulo.Id OR Szemely.ApaId=Szulo.Id;
Descartes szorzat (Cross join)
Descartes szorzat: a valós élet nem nagyon generál olyen helyzeteket, ahol ezt használnunk kellene. Rengeteg rekord lenne, valószínűleg sok felesleges sorral is egy táblázatban."Általában ezt olyankor használjuk, amikor egy korábbi hibát szeretnénk orvosolni."Forrás: Előadás, előadás diái
Példa
SELECT * FROM Termek CROSS JOIN Gyarto;Az eredmény reláció sémája a két séma egymás után illesztéséből áll elő.Itt a termék tábla minden oszlopát összeszorozzuk a gyártó tábla minden oszlopával (mivel nem adtunk meg ON klauzulát).
WHERE
A WHERE kulcsszó utáni szelekciós feltétel határozza meg, hogy a vizsgált rekordok közül melyik fog bekerülni a végeredménybe.
BETWEEN
logikai feltételez a szűrés
GROEP BY
A csoportosítási műveletet az SQL-ben a GROUP BY utasítással valósíthatjuk meg, amelyet a csoportosító attribútumok követnek. A csoportosítás a szelekció (WHERE feltétel) alkalmazása után történik meg, és szintaktikailag is a szelekciós feltétel után következik. Ha a lekérdezés csoportosítást alkalmaz, akkor a SELECT kulcsszó után csak csoportosító attribútumok vagy aggregált értékek állhatnak: ekkor az aggregálás csoportonként történik meg.
HAVING
Ha a csoportosítás után előálló rekordokra szeretnénk szelekciós feltételt megadni, akkor erre a célra használhatjuk a GROUP BY utáni HAVING kulcsszót, amely mögött egy további szelekciós feltételt adhatunk meg, ami már a csoportosítás(aggregálás) után alkalmazódik.Forrás:http://docs.oracle.com/javadb/10.10.1.2/ref/rrefsqlj14854.html
Példa
Ha azt szeretnénk megtudni, hogy melyek azok a kategóriák, amelyekben legalább 5 különböző, 10.000 Ft-nál többe kerülő termék fajta található, akkor az a következőképp válaszolhatjuk meg:SELECT Kategoria, COUNT(*) FROM Termek WHERE Ar > 10000 GROUP BY Kategoria HAVING COUNT(*) >=5;
ORDER BY
NEM RELÁCIÓS MŰVELET! (mivel a relációban a sorok sorrendje tetszőleges) lehet úgy rendezni amit a select meg sem jelenítmegj: feldolg. sorrend: 4. ergo lehet alissal hivatkozni
Sorbarendezés módja
Gyakori igény, hogy a lekérdezés során előállított rekordokat valamely attribútum szerint sorba rendezzük.
ASC (ascending, növekvő; ALAPÉRTELMEZET!)
Növekvő sorbarendezés; alapértelmezett
DESC (descending, csökkenő)
Csökkenő sorbarendezés
LIMIT
Az első hány találatot listázza ki.
Szabványosság
Az SQL nyelv az angolhoz hasonló.
Különböző nyelvjárások
Az amerikai szabványügyi hivatal a cégek hatására több utasítást is elfogadott, így nyelvjárások alakultak ki.
MS SQL
Oracle
PostgreSQL
MySQL
Hierarchikus lekérdezések
Fastruktúrájú adatokat relációs táblákban helyezhetünk el, és hierarchikus lekérdezésekkel tudjuk rekonstruálni a hierarchiát.Forrás: előadás diái
START WITH
Ezzel járjuk körbe a faszerkezetet. "hierarchikus lekérdezés"
Null érték
CODD nem tartotta elfogadhatónak a relációs adatbázisban.
Probléma
Összekapcsolódásnál furcsán viselkedik
Gyakori hiba
0 érték nem egyenlő zérussal
Példa
SELECT * FROM Hallgatók WHERE Neptun = NULL;0 az értéke(üres eredményhalmaz), mivel a Neptun értéke sehol sem 0SELECT * FROM Hallgatók WHERE Neptun IS NULL;nincs értéke (Ez a jó, ha hiányzó értékre keresünk.)
Egy rekord egy attribútuma nincs beállítva, üres
Mert nem adunk neki értéket:
Példa
INSERT INTO Termek (Id, Raktarkeszlet) VALUES (1, 15);(Megjegyzés: Ha a táblában több attribútum van, akkor azok null-ok lesznek)
Vagy mert NULL értéket adunk:
Példa
INSERT INTO Termek (Id, Nev, Raktarkeszlet) VALUES(1,NULL,15);
Nem csak stringre, bármilyen típusra lehetséges
Példa
INSERT INTO Termek VALUES (NULL, NULL, NULL);
Ha meg akarjuk tiltani, akkor használjuk a NOT NULL
opciót
Példa
CREATE TABLE Termek (Id int NOT NULL,Nev nvarchar(50) NOT NULL,Raktarkeszlet int NOT NULL);
Csoportfüggvények
Több sorhoz egy soros eredményt adnak vissza. Ugyanúgy függvényként működnek, mint például az excelben. Nem adja meg, hogy melyik az a bizonyos rekord, csupán egy értéket ad vissza.
Count
a COUNT(A) művelet megszámolja, hogy hány ürestől különböző, de nem feltétlen egyedi érték található az A oszlopban. Egyszerűsítésként használható a COUNT(*) kifejezés is, amely a reláció összes sorának számát adja vissza. (itt az A az előadás diáin a DistinctComission volt)Ez a fv. a NULL értéket ignorálja.Forrás: jegyzet, előadás
Példa
/* managerek szama */ select count(*) from alkalmazott where beosztas = 'MANAGER'; Forrás: http://www.agt.bme.hu/szakm/adatb/ora.htm
Sum
a SUM(A) művelet összegzi az A oszlopban tárolt numerikus értékeket
Példa
/*az alkalmazott táblában mennyi a fizetések összege/SELECT SUM(fizetes) FROM alkalmazott;Forrás: http://www.agt.bme.hu/szakm/adatb/ora.htm
MIN, MAX
a MIN(A) illetve MAX(A) operátorok az A oszlop legkisebb illetve legnagyobb értékeit adják vissza. Numerikus értékeket tároló oszlopoknál a működésük egyértelmű, stringeket esetén pedig abc szerint adja vissza az értékeket.
Példa
/*az alkalmazott táblában mennyi a fizetések minimumam-maximuma/SELECT MIN(fizetes) FROM alkalmazott;SELECT MAX(fizetes) FROM alkalmazott;Forrás: http://www.agt.bme.hu/szakm/adatb/ora.htm
AVG
az AVG(A) művelet az A oszlopban tárolt numerikus értékek átlagát állítja elő.
Példa
/*az alkalmazott táblában mennyi a fizetések átlaga/SELECT AVG(fizetes) FROM alkalmazott;Forrás: http://www.agt.bme.hu/szakm/adatb/ora.htm
NVL
Ha az érték NULL(azaz nincs megadva), akkor azt 0-ként értelmezve. Így értelemszerűen más lesz az átlag.
Bonyolítás
Összetett lekérdezések
A lekérdezések tetszőlegesen egymásba ágyazhatók a SELECT után és a WHERE feltétel után egyaránt.SELECT nev, leiras FROM gyumolcsok WHERE nev IN (SELECT DISTINCT gyumcsolnev FROM kiszalltiasok);A SELECT utáni al-lekérdezéseknek csak egyetlen visszatérési értéke lehet(nem lehet az eredmény több sor).SELECT nev, (SELECT COUNT(1) FROM kiszallitasok WHERE gyumolcsnev = nev) FROM gyumolcsok;Forrás: http://nyelvek.inf.elte.hu/leirasok/SQL/index.php?chapter=7
aInline nézet
A materializált nézetet létrehozó SELECT utasítás meghatározza, hogy a materializált nézet milyen adatokat tartalmaz. Csak néhány megszorítás van, amit specifikálhatunk. Tetszőleges számú táblát összekapcsolhatunk. A táblák mellett nézeteket, inline nézeteket (allekérdezés a SELECT utasítás FROM utasításrészében), allekérdezéseket, materializált nézeteket használhatunk az összekapcsolásban. A definiáló lekérdezés SELECT listájában viszont nem lehet allekérdezés, de például a WHERE feltételben igen.Forrás: http://www.tankonyvtar.hu/hu/tartalom/tamop412A/2010-0011_oracle_adattarhaz/lecke4_lap2.scorml
aTöbboszlopos allekérdezés
IN lefut->eredmény->külső selectForrás: előadás
Tárolt lekérdezések
Eredménytárolás (statikus)
Create table as(SELECT…)-> új tábla lesz abból, amit kiolvastam
Nézet létrehozása
Csak nézet születik, adatokat nem tárol.Forrás: előadás
Példa
Ha egy olyan nézetre van szükségünk, ami a legnagyobb megrendelés-állománnyal rendelkező termékeket mutatja, akkor azt a következő utasítással hozhatjuk létre:CREATE VIEW TopTermekek AS SELECT Termek.TermekKod, Nev, SUM(Darab) Darab FROM Termek INNER JOIN MegrendelesTetel ON Termek.TermekKod=MegrendelesTetel.TermekKod GROUP BY Termek.TermekKod, Termek.Nev ORDER BY SUM(Darab) DESC;
Materializált nézet
Az eddigiekben a virtuális nézetekkel ismerkedtünk meg: amikor az általuk reprezentált adathoz hozzá akarunk férni, akkor a nézetbe ágyazott lekérdezés minden egyes alkalommal kiértékelődik. A nézetek egy másik fajtája az ún. materializált nézet, amely a nézetbe ágyazott lekérdezés által előállított rekordokat fizikailag is eltárolja. Ezáltal amikor az általuk megjelenített adatot fel akarjuk használni, akkor az rögtön rendelkezésre áll a lemezen, így a rájuk építő lekérdezések jelentősen gyorsulnak. Az ilyen nézeteket rendszeresen frissíteni is kell, hiszen az általuk hivatkozott táblák tartalma is folyamatosan változhat.Ez az adattárházak kedvenc eleme, mert a képlet és az adat is átmásolódik.Forrás: jegyzet, előadás