SQL szintaxis

Nyelvi elemek

r

Angolszerű mondatokForrás: előadás diái

DML

r

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

r

Új adat bevitele

Példa

r

INSERT INTO Termek (Id, Nev, Raktarkeszlet) VALUES (1, ’Alma’, 15);

UPDATE

r

A táblában már elérhető adatok frissítése.

Példa

r

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

r

Létező adatok törlése

Példa

r

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

r

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ásaMeglévő objektumok módosítása (pl reláció kibővítése), törléseCREATE, ALTER, DROP...Forrás:db_02_SQL

Utasítások

CREATE

r

Új adatbázis létrehozása

Példa

r

CREATE TABLE Megrendeles(Id int,Megrendelo nvarchar(50),Cim nvarchar(50),Datum datetime);

ALTER

Új attribútum felvétele

Példa

r

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

r

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

r

Példa: ALTER TABLE <táblanév> MODIFY <oszlopnév><új típus> <új megkötések>;

PURGE

r

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

a

Példa

r

DROP TABLE alkalmazott PURGE; Forrás: 2. gyakorlat

DROP

r

Tábla törlése

Példa

r

szintaxis: DROP TABLE <táblanév>Példa: DROP TABLE MegrendelesTetel;

DCL

r

Adatelérést vezérlő (Data Control Language –DCL)Jogosultság szabályozás (GRANT)

DQL

r

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

r

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

r

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

r

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

r

SELECT DISTINCT szulev FROM minta.alkalmazott;Forrás: 3. gyakorlat

ALL

r

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

r

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

r

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

r

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

r

Felsoroljuk a megjeleníteni kívánt oszlopokat.

*

r

Az összes oszlopot jelenítse meg.

AS

r

A kapott (eredmény)oszlop elnevezésére szolgál(nem szükséges).Forrás: Gyakorlat

FROM

r

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

r

Felsoroljuk melyik táblá(k)ból szeretnénk adatokat kinyerni.Forrás: előadás

JOIN

r

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)

r

Egyen-összekapcsolások (EQUI-join): párbarendezés két azonos oszlop alapján, összekapcsolás feltétele az egyenlőség

Natural-Join

r

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

r

SELECT * FROM Termek NATURAL JOIN Gyarto;

USING

r

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

r

SELECT * FROM COUNTRIES JOIN CITIES USING (COUNTRY); Forrás:http://docs.oracle.com/javadb/10.10.1.2/ref/rrefsqljusing.html

ON

r

Á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

r

select department_name, city from departments dept join locations loc on (d.location_id = l.id);

Nem egyen-összekapcsolások (Non equi-join)

r

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

r

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)

r

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

r

Baloldal minden sorát kiírja. Akkor is, ha nincs párja.Forrás: előadás diái

Példa

r

Példa:SELECT GyartoNev, TermekNev FROM GyartoLEFT OUTER JOIN Termek ON Gyarto.GyartoKod=Termek.GyartoKodWHERE Termek.TermekKod IS NULL;

RIGHT OUTER JOIN

r

Baloldal minden sorát kiírja. Akkor is, ha nincs párja.Forrás: előadás diái

Példa

r

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

r

A FULL OUTER JOIN mindent megjelenít. Akkor is, ha valamelyik oldalon nincsen párja.Forrás: Előadás diái

Példa

r

SELECT Szemely.Nev, Szulo.Nev FROM SzemelyFULL OUTER JOIN Szemely SzuloON Szemely.AnyaId=Szulo.Id OR Szemely.ApaId=Szulo.Id;

Descartes szorzat (Cross join)

r

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

r

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

r

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

r

logikai feltételez a szűrés

GROEP BY

r

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

r

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

r

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

r

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

r

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!)

r

Növekvő sorbarendezés; alapértelmezett

DESC (descending, csökkenő)

r

Csökkenő sorbarendezés

LIMIT

r

Az első hány találatot listázza ki.

Szabványosság

r

Az SQL nyelv az angolhoz hasonló.

Különböző nyelvjárások

r

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

r

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

r

Ezzel járjuk körbe a faszerkezetet. "hierarchikus lekérdezés"

Null érték

r

CODD nem tartotta elfogadhatónak a relációs adatbázisban.

Probléma

Összekapcsolódásnál furcsán viselkedik

Gyakori hiba

r

0 érték nem egyenlő zérussal

Példa

r

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

r

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

r

INSERT INTO Termek (Id, Nev, Raktarkeszlet) VALUES(1,NULL,15);

Nem csak stringre, bármilyen típusra lehetséges

Példa

r

INSERT INTO Termek VALUES (NULL, NULL, NULL);

Ha meg akarjuk tiltani, akkor használjuk a NOT NULL
opciót

Példa

r

CREATE TABLE Termek (Id int NOT NULL,Nev nvarchar(50) NOT NULL,Raktarkeszlet int NOT NULL);

Csoportfüggvények

r

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

r

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

r

/* managerek szama */ select count(*) from alkalmazott where beosztas = 'MANAGER'; Forrás: http://www.agt.bme.hu/szakm/adatb/ora.htm

Sum

r

a SUM(A) művelet összegzi az A oszlopban tárolt numerikus értékeket

Példa

r

/*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

r

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

r

/*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

r

az AVG(A) művelet az A oszlopban tárolt numerikus értékek átlagát állítja elő.

Példa

r

/*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

r

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

r

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

a

Inline nézet

r

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

a

Többoszlopos allekérdezés

r

IN lefut->eredmény->külső selectForrás: előadás

Tárolt lekérdezések

Eredménytárolás (statikus)

r

Create table as(SELECT…)-> új tábla lesz abból, amit kiolvastam

Nézet létrehozása

r

Csak nézet születik, adatokat nem tárol.Forrás: előadás

Példa

r

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

r

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