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