Egy rugalmas lekérdező nyelv - SQL

Az SQL (Structured Query Language, struktúrát lekérdező nyelv) nyelv a relációs adatbázisokhoz kifejlesztett, szabványos, könnyen tanulható lekérdező nyelv, amely lehetővé teszi, hogy csak a feltételeknek megfelelő rekordokat lássuk, akár úgy is, hogy bizonyos tulajdonságokat elrejtünk a megjelenítés elől. Ezen a feladaton kívül lehetőséget nyújt táblák összekapcsolására, valamint azok adatainak módosítására is. Ebből a kis bevezetőből is látható már, hogy egy összetett eszközről van szó, amelynek a használatát a cikksorozatból ismerhetik meg.

A cikkben feltételezem, hogy a kedves Olvasó ismeri az adatbázisokkal kapcsolatos alapfogalmakat, valamit a relációs adattáblákra vonatkozó követelményeket. A nyelv elsajátítását teszi lehetővé az a kis program, amit megtalálhatnak a CD mellékletén, illetve letölthetnek az internetről is. Akinek ez nem szimpatikus, elérhetővé teszem az adattáblát tartalmazó Microsoft Access adatbázist is, a feladatokat ebben is gyakorolhatják.

Nézzük meg, hogy mi is lesz a sorozat tematikája:

1. rész

Alapfogalmak. Áttekintjük a nyelv szerkezetét, valamint megismerkedünk a legfontosabb parancsokkal. Ennek a résznek az áttanulmányozása után már mindenki önállóan is képes lesz lekérdezéseket készíteni, bár mindezt csak egy tábla esetén.

2. rész

Megismerkedünk az adatok sorba rendezésével, valamint az adatok módosításának a lehetőségével.

3. rész

Ebben a részben haladóbb témákkal foglalkozunk, megnézzük, hogyan lehet táblákat összekapcsolni, hogyan lehet ezekből adatokat kinyerni.

4. rész

Összefoglaljuk az eddigi ismereteinket, valamint az Olvasók rendelkezésére bocsátok egy tesztet, amely segítségével leellenőrizhetik, hogy mennyire sikerült az itt leírt ismereteket elsajátítani. 

Kezdjünk bele...

Mielőtt elkezdenénk a nyelvvel való ismerkedést, fontos, hogy megismerjük, hogy milyen adatokkal fogunk dolgozni. A feladatok végrehajtásához elsőként egy országok adatait tartalmazó relációt fogunk felhasználni, majd a későbbiekben áttérünk egy négytáblás adatbázisra.

Vizsgáljuk meg, hogy milyen adatszerkezettel rendelkezik a country.dbf (vagy country.mdb, amelyen belül van egy country nevű tábla) elnevezésű relációnk. Ennek az adatszerkezete a következő:

Mező neve

Mező típusa

Mezőméret

Funkció

NEV

Szöveg

34

Az ország neve

REGIO

Szöveg

39

Az ország elhelyezkedése

TERULET

Szám

2 bájt

Az ország területe

NEPESSEG

Szám

2 bájt

A népesség állapota

GDP

Szám

2 bájt

Az éves GDP mértéke

Amint látható, ez nem túl bonyolult szerkezet, a NEV mező egyben az elsődleges kulcs szerepét is betöltheti, mert két egyforma nevű ország nem létezik.

Most, hogy már ismerjük az adatforrást, el is kezdhetünk foglalkozni a lekérdező nyelvünkkel.

Az SQL utasítások szerkezete

Annak ellenére, hogy az SQL elnevezés elsősorban adatok lekérdezésére, kigyűjtésére utal, maga a nyelv ettől sokkal többre képes, sokkal robosztusabb eszköz lehet a kezünkben.  Maga az SQL nyelv két nagy csoportba sorolható utasításokat tartalmaz, így tulajdonképpen két nyelv összetételeként is felfogható.

Az első csoportba tartoznak az adatokat kezelő parancsok (Data Manipulation Language, DML), melyek lehetővé teszik az adatok lekérdezését (SELECT), módosítását (UPDATE), törlését (DELETE), valamint természetesen új adat beszúrását a táblába (INSERT INTO).

A másik csoportba az adatszerkezetet meghatározó parancsok (Data Definition Language, DDL) tartoznak, melyek az adattáblákon tesznek lehetővé módosításokat, segítségükkel táblákat hozhatunk létre (CREATE TABLE), módosíthatjuk a meglévő táblákat (ALTER TABLE), törölhetjük azokat (DROP TABLE), indexet hozhatunk létre bizonyos mezőkhöz (CERATE INDEX), valamint ezeket törölhetjük is (DROP INDEX).

Ezekkel a parancsokkal természetesen mind meg fogunk ismerkedni, de mostani cikkünkben még csak az adatok lekérdezését fogjuk gyakorolni, amelyhez a SELECT parancsot fogjuk használni.

Készítsünk lekérdezéseket a SELECT paranccsal

A lekérdezéseket mindig a SELECT utasítással vezetjük be, amely után fel kell sorolni azoknak a mezőknek a neveit, amelyekre szükségünk van, vagyis amelyeket szeretnénk most megjeleníteni. Ehhez természetesen tisztában kell lennünk a reláció szerkezetével, tudnunk kell a pontos mezőneveket. Amennyiben minden mezőre szükségünk van, akkor azokat nem kell egyesével megadnunk, hanem egyszerűen egy * karakterrel utasíthatjuk az SELECT-et, hogy minden mezőt vegyen figyelembe. A meződefiníció után meg kell határoznunk, hogy melyik relációból szedje az adatokat. Ezt a FROM foglalt szóval és az ezt követő táblanévvel tehetjük meg. A fentieket mutatja az alábbi utasítássor:

SELECT * FROM country.dbf

Ezzel tulajdonképpen már meg is van az első lekérdezésünk, amely a reláció minden adatát megjeleníti a képernyőn.

Az alábbi példa megjeleníti a táblában lévő országok neveit:

SELECT NEV FROM country.dbf

Több mezőt is megadhatunk a SELECT után, ezeket vesszővel kell elválasztanunk egymástól.

Az előző példánál maradva jelenítsük meg az országok nevei mellett a területüket és a népességüket is:

SELECT NEV, TERULET, NEPESSEG FROM country.dbf

A mezőnevek felsorolásával lehetőségünk nyílik a mezősorrend befolyásolására. Vizsgáljuk meg az alábbi parancs kimenetét:

SELECT TERULET, NEPESSEG, NEV FROM country.dbf

Amint láthatjuk a mezők fizikai sorrendjétől függetlenül a lekérdezés eredménylistájában a mezők pontosan azt a sorrendet követik, amelyet mi meghatároztunk a parancsban. Így lehetőségünk van mindig a megfelelő sorrendet kialakítani.

A SELECT utasítás eddig arra használtuk, hogy a reláció tulajdonságtípus halmazából megjelenítsünk valamennyi tulajdonságot, illetve azoknak a sorrendjét meghatározzuk. Mi a helyzet akkor, amikor a rekordok számát is korlátozni szeretnék azáltal, hogy a kimeneten csak bizonyos feltételnek, vagy feltételeknek megfelelő rekordokat jelenítünk meg.?

Természetesen ilyen feladatot is megoldhatunk az SQL segítségével, hiszen ennek hiányában nem is beszélhetnénk lekérdezésről.

Ahhoz, hogy feltételt adhassunk meg, szükségünk lesz a WHERE utasításra, amely után egy vagy több feltételt adhatunk meg. A feltételek lehetnek nagyon egyszerűek és nagyon bonyolultak egyaránt. Mind aritmetikai, mind logikai kifejezések szerepelhetnek itt, de akár SQL utasításokat is elhelyezhetünk a WHERE után. A legfontosabb operátorokat mutatja az alábbi táblázat:

Operátor

Jelentése

=

Egyenlőségjel, a feltétel egyenlőségét vizsgálja

<>

Nem egyenlő

>

Nagyobb, mint a feltétel

<

Kisebb, mint a feltétel

>=

Nagyobb, vagy egyenlő, mint a feltétel

<=

Kisebb, vagy egyenlő, mint a feltételben megadott érték

BETWEEN

Két érték közötti tartomány megadása

LIKE

Azonosság vizsgálata

AND, OR, NOT, XOR

Logikai operátorok, rendszerint több feltétel összekapcsolására alkalmasak

Jelenítsük meg azokat az országok neveit és minden más adatukat is, amelyeknek a GDP-jüket nem ismerjük, vagyis a GDP mező értéke 0. A számokkal történő összehasonlítás borzasztó egyszerű, mivel egyszerűen csak le kell írni a relációt:

SELECT * FROM country.dbf WHERE GDP=0

Jelenítsük meg azokat az országoknak a nevét, amelyek Afrikában helyezkednek el:

SELECT NEV FROM country.dbf WHERE REGIO="Afrika"

Amint látható, a szöveget ' ' (az adatbázis-kezelő rendszerek többsége elfogadja a sztringeket " " között is, mi a példákban ezt fogjuk használni) közé kell tennünk, ezt a sztringet fogja feltételként az SQL megkapni. Ha kíváncsiak vagyunk arra, hogy tényleg csak az afrikai országokat látjuk, akkor vegyük fel a megjelenített mezők közé a REGIO-t is:

SELECT NEV, REGIO FROM country.dbf WHERE REGIO="Afrika"

Számos esetben előfordul, hogy nem teljes szövegre kell a szűrést elvégeznünk. Ilyen esetekben az egyenlőségjelet nem használhatjuk, mert nem ismerjük a pontos karaktersorozatot. Helyette használjuk a LIKE parancsot, ami összehasonlítja a mező értékét a LIKE után szereplő sztringgel. Ha nem tudjuk a pontos tartalmat, használhatjuk a %-jelet tetszőleges számú karakter helyettesítésére.

Jelenítsük meg azoknak az országoknak a neveit, amelyek neve B betűvel kezdődik:

SELECT NEV FROM country.dbf WHERE NEV LIKE "B%"

A joker karakter nem csak a karakterek után helyezkedhet el, hanem meg is előzheti azokat. A következő példában jelenítsük meg az Amerikában lévő országok neveit és a népességüket:

SELECT NEV, NEPESSEG FROM country.dbf WHERE REGIO LIKE "%Amerika%"

Az eredmény ellenőrzéséhez megjeleníthetjük a REGIO mezőt is, amivel láthatjuk, hogy minden olyan ország szerepel, amely Amerika valamely részén található:

SELECT NEV, NEPESSEG, REGIO FROM country.dbf WHERE REGIO LIKE "%Amerika%"

Abban az esetben, ha számokat tartalmazó mező alapján szűrünk és két határérték közötti adatokra vagyunk kíváncsiak, akkor használhatjuk a BETWEEN utasítást. A BETWEEN után két határértéket kell megadni és ezek közé az AND logikai operátort kell megadnunk.

Jelenítsük meg azokat az országokat, minden adatukkal együtt, amelyek területe nagyobb, mint 50 000 km2, de kisebb, mint 500 000 km2:

SELECT * FROM country.dbf WHERE TERULET BETWEEN 50000 AND 500000 

Ugyanezt az eredményt érhetjük el akkor is, ha a két feltételt összekapcsoljuk egy AND operátorral:

SELECT * FROM country.dbf WHERE TERULET>50000 AND TERULET<500000

A fenti információk ismeretében már bárki képes lehet egyszerű lekérdezéseket készíteni bármilyen, egytáblás adatbázisból. A fentiek alapján a Kedves Olvasók önállóan készíthetnek feladatokat. A cikksorozat következő részeiben ezekre az információkra fogunk építkezni.

Markó Imre