Táblaműveletek

 

Az SQL nyelv segítségével táblaműveleteket is el tudunk végezni. Ez azt jelenti, hogy egy lekérdezőnyelv segítségével akár táblát is létrehozhatunk, amelybe azután adatokat vihetünk be, módosíthatunk és törölhetünk.

Az SQL-ben, mint ahogy a relációs adatbázis-kezelőkben, meg kell egymástól különböztetnünk az adatbázis és a tábla fogalmát. Minden adatbázist a nevével azonosíthatunk, aminek természetesen egyedinek kell lennie. Egy adatbázis több táblából állhat, azonban fontos, hogy minden táblának az adatbázison belül egyedi névvel kell rendelkeznie, ugyanis ellenkező esetben nem lehetne a táblákat egyértelműen azonosítani.

Mindkét elemet a CREATE SQL paranccsal hozhatjuk létre, ami után meg kell adni, hogy adatbázist (DATABASE) vagy táblát (TABLE) kívánunk készíteni. A parancs általános alakja a következő:

CREATE DATABASE  adatbazis_neve

A tábla készítése annyival nehezebb, hogy itt természetesen meg kell adni az oszlopok, vagyis a mezők neveit, valamint azok típusát és egyéb tulajdonságait. Az általános alakja:

CREATE TABLE tabla_neve

(

oszlop1_neve adat_tipus,

oszlop2_neve adat_tipus,

oszlopn_neve adat_tipus

)

A mezőknél az alábbi típusokat használhatjuk:

Adattípus

Leírás

integer(meret)
int(meret)
smallint(meret)
tinyint(meret)

Különböző hosszúságú egész számok tárolását teszi lehetővé ez a típus. A meret változóban kell megadni a kívánt mező hosszát. A típustól függ, hogy mekkora a legnagyobb ábrázolható szám.

decimal(meret,d)
numeric(meret,d)

Tizedes törtek, vagy egyéb numerikus adatok tárolására szolgál. A meret határozza meg, hogy mekkora lesz a mező szélessége, míg a d a tizedes jegyek számát adja.

char(meret)

Fix hosszúságú szövegeket tárol, a mező hosszát a zárójelek között kell megadni.

varchar(meret)

Változó hosszúságú szöveges információkat tárol, tartalmazhat betűket, számokat és egyéb jelek tartalmazhat, a mező maximális hosszát kell megadni a meret érték helyére.

date(yyyymmdd)

Dátum típus, ahol az yyyy jelenti az évet, a mm a hónapot és a dd a napot.

 

Például egy Partnerek nevű táblát az alábbi módon hozhatunk létre:

CREATE TABLE Partnerek

(

Nev varchar,

Varos varchar,

Cim varchar,

Telefon varchar,

Szuletesi_ev int

)

CREATE TABLE Partnerek

(

Nev varchar (30),

Varos varchar (15),

Cim varchar (50),

Telefon varchar (11),

Szuletesi_ev int (3)

)

 

Ha már feleslegessé vált egy tábla, akkor azt törölhetjük az adatbázisból, vagy akár az egész adatbázist is letörölhetünk az alábbi parancsokkal:

DROP DATABASE Adatbazis_neve

DROP TABLE tabla_neve

 

Amikor elkészítettük a táblát, akkor természetesen fel kell adatokkal azt tölteni. Ebben az esetben is sokszor célszerű az SQL nyelvet használni, mert ezzel egyrészt az adatok rögzítése felgyorsítható, másrészt az adatkezelés a lekérdezésekkel azonos módon megoldható.

A táblához új rekordot hozzáfűzni az INSERT INTO paranccsal tudunk. A parancs általános alakja a következő:

INSERT INTO tabla_neve

VALUES (ertek1, ertek2, …, ertekn)

Mint látható, a konkrét mezőértékeket felsorolás szerűen kell megadni a VALUES után. Arra kell ügyelni, hogy ennek alkalmazásakor minden mezőnek értéket kell adni, mivel a parancs végrehajtásakor a mezőlistában mindig a soron következő elem kapja az éppen aktuális értéket.

Természetesen olyan eset is előfordulhat, amikor nem tudunk minden mezőhöz értéket megadni, vagy egyszerűen nem is látjuk a jogosultságok miatt az össze mezőt. Ilyen esetben, a lekérdezésekhez hasonlóan, tudjuk csökkenteni az oszlopok számát az alábbi módon:

INSERT INTO tabla_neve (mezo1, mezo2, …, mezon)

VALUES (ertek1, ertek2, …, ertekn)

A fenti szabály, miszerint minden mezőnek értéket kell adni, itt is érvényes, csak itt a mezőket már az INTO utáni felsorolásból veszi, balról jobbra haladva.

A mindennapi munkánk során természetesen nem csupán új rekordokkal kell egy-egy relációt feltölteni, hanem adott esetben a már felvitt adatokat is módosítani kell. Ilyenkor tehet jó szolgálatot az UPDATE parancs. A használata nagyon egyszerű, az alábbi módon történik:

UPDATE tabla_neve

SET oszlop_neve=uj_ertek

WHERE oszlop_neve=ertek

Amit a fenti utasításon is olvasható, a SET paranccsal tudjuk megadni a mező új értékét. Ahhoz, hogy a megadott rekordot meg tudjuk találni, a WHERE utasítást használhatjuk, ami után egy egyszerű feltétellel kiválaszthatjuk a kívánt rekordot. Több mezőt is változtathatunk, ami egyszerű módon a SET után a megadott mezők felsorolásával történhet.

Amikor egy rekord feleslegessé válik, akkor a táblából ki kell azt törölnünk. Erre a célra a DELETE FROM utasítást kell használni az alábbi módon:

DELETE FROM tabla_neve

WHERE oszlop_nev=ertek

A törlés során is ki kell választani a megfelelő rekordot, amit ahogy az a fent is látható, a WHERE paranccsal tehetünk meg.

A táblát kiüríteni minden rekord törlésével lehet, amit az alábbi parancsok valamelyikével tudunk megtenni:

DELETE FROM tabla_neve

DELETE * FROM tabla_neve

A gyorsabb keresésé érdekében szükségessé válhat a táblák rekordjainak bizonyos tulajdonság szerinti logikai sorba rendezése, indexelése. Az indexelés nyomán a létrejövő táblákat a felhasználók nem látják, csupán az adatbázis-kezelő rendszerek használják fel őket a keresés és a szűrés gyorsítása érdekében. Az indexekkel kapcsolatban annyit érdemes megjegyezni, hogy egyrészt ma már az adatbázis-kezelő rendszerek akár index nélkül is képesek ugyanakkora sebességgel keresni, mint indexelve, másrészt az indexek frissítése is időt vesz igénybe. Ez utóbbi művelet szükségessége miatt nem célszerű gyakran változó mezőt indexelni, mivel ilyenkor az adatfelvitel és módosítás akár drasztikus mértékben is leromolhat.

Az indexek készítésénél meg kell határoznunk, hogy egyedi (Unique) vagy nem egyedi indexet szeretnénk-e készíteni. Az egyedi index nem teszi lehetővé, hogy az indexelt mezőben két sorban ugyanaz az érték szerepeljen. Az ilyen indexet az alábbi paranccsal hozhatjuk létre:

CREATE UNIQUE INDEX index_nev

ON tabla_nev (oszlop_nev)

Az oszlop_nev annak az oszlopnak a neve, amely alapján a relációt indexelni szeretnénk.

Amennyiben nincs szükség az egyedi indexre, akkor használjuk az alábbi parancsot:

CREATE INDEX index_nev

ON tabla_nev (oszlop_nev)

Amennyiben már nincs szükségünk egy indexre, akkor azt töröljük ki, mert feleslegesen foglalja az erőforrásokat. Erre a célra az alábbi SQL utasítást használjuk:

DROP INDEX Tabla_nev.index_nev

  

Függvények használata

 

Az SQL nyelvben sok függvény áll rendelkezésre, amelyeket a számítások és a számolások során használhatunk. Minden függvényt azonos szintaktikával kell használni, amelyek általános alakja.

SELECT fuggveny_neve(oszlop) FROM tabla_neve

A függvényeket a SELECT utasítás részeként kell használni.

A numerikus mezőértékek átlagát az AVG (Average) függvénnyel számíthatjuk ki. A számításnál az üres mezőket nem veszi figyelembe. A használata az alábbi módon történhet:

SELECT AVG(oszlop) FROM tabla_neve

Persze itt is megadhatunk feltételt, mint minden lekérdezésnél, aminek során a lekérdezés eredményén kerül a függvény végrehajtásra:

SELECT AVG(oszlop) FROM tabla_neve WHERE feltétel

Ha a mező legnagyobb vagy legkisebb értékére vagyunk kíváncsiak, akkor használjuk a MAX és a MIN függvényt, amelynek általános alakja:

SELECT MAX(oszlop) FROM tabla_neve

SELECT MIN(oszlop) FROM tabla_neve

Ha mindez szűr rekordokon kell végrehajtani, akkor használnunk kell a WHERE parancsot.

SELECT MAX(oszlop) FROM tabla_neve WHERE feltétel

SELECT MIN(oszlop) FROM tabla_neve WHERE feltétel

Az átlag számítása mellett nagyon fontos, hogy az összeget is ki tudjuk számíttatni az SQL segítségével, amihez a SUM (Summarize) függvényt kell használnunk.

SELECT SUM(oszlop) FROM tabla_neve

SELECT SUM(oszlop) FROM tabla_neve WHERE feltétel

A második sorban a rekordok szűkítésére láthatjuk a SUM függvény alakját.

Sok esetben lehet szükségünk a táblában tárolt rekordok számának a megállapítására. Ilyen célra is találunk SQL parancsot, mégpedig a COUNT formájában.

SELECT COUNT (oszlop) FROM tabla_neve

A függvény visszatérési értéke a rekordok száma lesz.

Ha csak bizonyos feltételnek megfelelő rekordokat szeretnénk megszámolni, akkor a WHERE paranccsal megadható a feltétel. Ilyen esetben a SELECT parancs fut le elsőként, ami kiszűri azokat a rekordokat, ami a feltételnek megfelelő, majd a COUNT megszámolja a sorok számát. Amikor minden sornak szerepelnie kell az összegben, akkor a COUNT után a *-got adjuk meg. Abban az esetben, amikor csak azok a sorok számítanak, amelyekben szerepel érték, akkor a zárójelek között írjuk be a mezőneveket.

SELECT COUNT (*) FROM tabla_neve

SELECT COUNT (oszlop) FROM tabla_neve

Ha csak az eltérő értékeket szeretnénk összeszámolni, akkor a táblában az azonos értékkel rendelkező rekordokat csak egyszer vegyük számításba. Ehhez használnunk kell a DISTINCT parancsot az alábbi módon:

SELECT COUNT(DISTINCT oszlopok)) FROM tabla_nev

 

Számos feladat követeli meg, hogy a rekordokat egy megadott szempont szerint foglaljuk csoportba és a számításokat csoportok szerint végezzük el. Ehhez a GROUP BY parancsot kell használni az alábbi alakban:

SELECT oszlop, SUM(oszlop) FROM tabla_neve GROUP BY oszlop

Amikor a csoportosításban is szeretnénk egy függvény visszatérési értékét felhasználni, akkor a HAVING utasítást kell használni a következő módon:

SELECT oszlop, SUM(oszlop) FROM tabla_nev
GROUP BY oszlop

HAVING SUM(oszlop) ertek

 

Táblák összekapcsolása

A normalizált adatbázisokban az adatok több relációba kerülnek szétválasztásra, amelyek így rugalmas kezelést és az anomáliáktól való mentességet valósítanak meg. Az ilyen megoldásoknál a kapcsolatot a táblák között meg kell oldani, amit ún. kulcsok segítségével oldhatunk meg. A kulcs egy olyan mező, vagy mezők csoportja, amelyek minden egyes rekordot egyértelműen azonosítanak. Ezeket a táblákat lekérdezések segítségével logikailag egyesíthetünk, azokból az adatok lekérdezhetők.

Amikor két, vagy több táblával dolgozunk, akkor a mezőneveket a táblanévvel együtt, attól ponttal elválasztva kell használnunk, annak érdekében, hogy egyértelműen azonosítani lehessen az egyes mezőket. Például a Termek táblának a cikkszam mezőjére az alábbi módon hivatkozhatunk:

Termek.cikkszam

Az alábbi módon lehet egy lekérdezésben két, vagy több táblát összekapcsolni:

SELECT Tabla1.mezo2, Tabla2.mezo2
FROM Tabla1, Tabla2

WHERE Tabla1.mezo1=Tabla2.mezo2

Láthatjuk, hogy a WHERE után kell azokat a mezőket egyenlővé tenni, amelyek segítségével szeretnénk az összekapcsolást megvalósítani. A SELECT után nem szükséges a kulcs mezőket felsorolni, amennyiben azok megjelenítésére nincs szükségünk. Amennyiben más feltételt is meg kívánunk adni, akkor az AND vagy az OR logikai operátorokkal kapcsolhatjuk ezeket össze.

A táblák összekapcsolására más lehetőségünk is van, mégpedig a JOIN használatával. Ennek három változata létezik, az INNER, a LEFT és a RIGHT JOIN.

Az INNER JOIN segítségével olyan rekordokat kapunk vissza eredményül, amelyeknél a kulcsmezők tartalmaznak azonos értéket. Használata a következő:

SELECT mezo1, mezo2, mezo3

FROM Elso_tabla_neve

INNER JOIN Masodik_tabla_neve

ON Elso_tabla_neve.kulcsmezo= Masodik_tabla_neve.kulcsmezo

Ennek használatakor nem jelennek meg azok a rekordok, amelyeket tartalmaz az Elso_tabla, de nincs hozzá tartozó érték a Masodik_tabla-ban.

A LEFT JOIN használatakor az Elso_tabla (baloldali)nevű táblában szereplő rekordok akkor is megjelennek, amikor nincs hozzá tartozó érték a Masodik_tabla (jobboldali) nevű táblában. Az utasítássorozat felépítése:

SELECT mezo1, mezo2, mezo3

FROM Elso_tabla_neve

LEFT JOIN Masodik_tabla_neve

ON Elso_tabla_neve.kulcsmezo= Masodik_tabla_neve.kulcsmezo

A RIGHT JOIN ugyanezt a terminológiát követi, csak éppen a Masodik_tabla-ban szereplő értékeket mutatja meg akkor is, amikor az Elso_tabla-ban nincs neki megfelelő érték.

SELECT mezo1, mezo2, mezo3

FROM Elso_tabla_neve

RIGHT JOIN Masodik_tabla_neve

ON Elso_tabla_neve.kulcsmezo= Masodik_tabla_neve.kulcsmezo

Markó Imre - marko.imre@akribisbt.hu