SQL: Egy rugalmas lekérdező nyelv - 2. rész

 

Az előző részben megnéztük a lekérdező nyelv alapjait és elkészítettünk néhány lekérdezést. Ebben a számban egy kicsit tovább boncolgatjuk az egytáblás lekérdezésekben használható lehetőségeket, újabb SQL parancsokkal fogunk megismerkedni.

Gyakorlásképpen készítsünk egy olyan lekérdezést, amely megmutatja az országokat és a régiókat és a GDP-jüket. A listában ne jelenjenek meg azok az országok, amelyek területe 100000 km2 alatti.

SELECT NEV, REGIO, GDP FROM COUNTRY.DBF WHERE TERULET>1000000

Máris láthatjuk a végeredményt a képernyőn.

A következő feladatban jelenítsük meg a régiókat, annak érdekében, hogy tudjuk, milyen lehetőségek vannak a táblában ennek meghatározására.

Ez borzasztó egyszerű SELECT utasítással megoldható, ezt már biztosan tudja mindenki:

SELECT REGIO FROM COUNTRY.DBF

Az eredményt megnézzük, rögtön, a táblára való ránézéssel meg tudjuk-e állapítani, hogy milyen régiók szerepelnek a táblában? Természetesen nem, mivel ez a lekérdezés minden rekordból csak a REGIO mező értékét jeleníti meg. Ennek kiküszöbölésére is van lehetőségünk, mivel erre az SQL a DISTINCT parancsát használhatjuk. Ez összegyűjti az azonos értékeket és azokból csak egyet jelenít meg. Ez a funkció különösen akkor hasznos, ha egy listát, vagy egy legördülő listát szeretnénk programból feltölteni, ilyenkor minden értékből csak egy előfordulásra van szükség.

Vizsgáljuk meg, hogy milyen listát eredményez az alábbi SQL kifejezés:

SELECT DISTINCT REGIO FROM COUNTRY.DBF

Mint láthatjuk, tényleg csak egyszer fordul elő minden régió.

Adatok sorba rendezése

Ha megnézünk egy táblát, akkor a legritkább esetben vannak a rekordok valamilyen szempont szerint sorba rendezve. Márpedig az nagyon fontos, hogy egy táblát bármilyen tulajdonság szerint sorba rendezhessünk. Erre a feladatra tervezték meg az ORDER BY utasítást.

Az ORDER BY utasítás az SQL parancs végén található, utána fel kell sorolnunk azokat a mezőket, amelyek alapján az adatokat sorba szeretnénk rendezni.

Nézzük meg, hogy mi lesz az eredménye az alábbi SQL utasításnak:

SELECT * FROM COUNTRY.DBF ORDER BY GDP

Ez megjelenít minden mezőt a táblában, de a rekordokat a GDP szerint növekvő sorrendbe rendezi.

A következő feladatban jelenítsük meg az országok nevét, a régiót és a népességüket, mégpedig a népesség alapján növekvő sorrendben. Ehhez a feladathoz ugyanazt a szintaktikát kell használnunk, amit eddig is számtalanszor megtettünk már, csupán a végére kell a rendezés szempontját megadni.

SELECT NEV, REGIO, NEPESSEG FROM COUNTRY.DBF ORDER BY NEPESSEG

Láthatjuk, hogy milyen egyszerű a sorba rendezés az SQL-ben, pusztán a mező nevét kell megadnunk, a többit elvégzi az adatbázis motor, vagy az adatbázis-kezelő rendszer.

Felmerülhet a kérdés, hogy mi a helyzet akkor, amikor nem csak egy mező szerint kell a sorba rendezést elvégeznünk? A válasz, mint már megszokhattuk, borzasztó egyszerű. Természetesen több mezőt is megadhatunk az ORDER BY parancs után, ezeket egymástól vesszővel kell elválasztanunk. Ilyenkor az első mező szolgál elsődleges rendezési szempontként, tehát ez alapján a rekordok sorba rendezése megtörténik. Amennyiben vannak egyforma értékek, akkor azokat a rekordokat is sorba rendezzük, mégpedig a második helyen szereplő mező alapján. Ez így folytatódik minden egyes tulajdonságra.

Jelenítsük meg az országok adatait a régió szerint sorba rendezve. Ehhez az alábbi SQL utasítást kell használnunk:

SELECT * FROM COUNTRY.DBF ORDER BY REGIO

A listából látható, hogy nagyon sok olyan ország van, amelyek például Afrikában terülnek el. Most az előbbi eredményt rendezzük a terület alapján is növekvő sorrendbe:

SELECT * FROM COUNTRY.DBF ORDER BY REGIO, TERULET

Amint látjuk, most már az országok a régió szerint sorban vannak, de az azonos régiókban lévőket a program a területük alapján is sorba rendezte.

A következő kérdés, ami felmerülhet, hogy miért növekvő sorrendbe rakta a program a rekordokat? Azért, mert az alapértelmezett rendezési sorrend a növekvő irány. Mivel ez az alapértelmezett, ezért ezt külön meg sem kell határoznunk. A fordított sorrenddel már más a helyzet, ugyanis ilyen esetben meg kell mondani, hogy a sorrend forduljon meg. A fordított sorrendet a mező neve után beillesztett DESC utasítással határozhatjuk meg.

A fentiek gyakorlására jelenítsük meg az országok adatait, de a régió szerint fordított sorrendbe! Ehhez az alábbi SQL utasítást használhatjuk:

SELECT * FROM COUNTRY.DBF ORDER BY REGIO DESC

Amint a megjelenő listából is látható, az országok régió szerint sorrendben vannak, de most ezek fordított, vagyis csökkenő sorrendben vannak.

Természetesen olyan eset is előfordulhat, amikor több szempont szerint kell a rendezést megoldani, de mezőnként változó irányban. Ilyenkor is a mező neve után kell írnunk a sorrendet. 

Vizsgáljuk meg az alábbi SQL parancs eredményét!

SELECT * FROM COUNTRY.DBF ORDER BY REGIO, TERULET DESC

Amint az várható volt, az országok a régiójuk szerint növekvő sorrendben vannak, de az azonos régióban lévő országok a területük alapján csökkenő sorrendben jelentek meg.

Annak ellenére, hogy rendszerint nincs szükség a növekvő rendezési irány megadására, azért az SQL nyelvben létezik ennek a feladatnak megfelelő utasítás is, mégpedig az ASC. Ez a rendezési sorrendet visszaállítja növekvőre.

A fentiek összefoglalására álljon itt az alábbi SQL parancs:

SELECT * FROM COUNTRY.DBF ORDER BY REGIO DESC, TERULET ASC

Ez a rekordokat sorba rendezi a régió szerint csökkenő, majd azon belül a terület alapján növekvő sorrendbe.

SELECT * FROM COUNTRY.DBF ORDER BY REGIO DESC, TERULET DESC

Ebben az esetben a régió és azon belül a terület alapján is csökkenő sorrendbe kerülnek a rekordok.

A fentiek alapján már egyszerűen elkészíthet a Kedves Olvasó is különböző lekérdezéseket, amelyekben a rekordok sorrendjét is egyszerűen meghatározhatja.

Kifejezések használata az SQL lekérdezésekben

Nagyon gyakran kerülhetünk olyan helyzetben az adatbázis-kezelési feladataink során, hogy a tárolt tulajdonságokból származtatható értékre lenne szükségünk. Ilyen esetben kézenfekvő megoldásnak tűnhet, hogy a táblába felveszünk egy olyan mezőt, amely majd ez az értéket fogja tárolni az után, hogy a programunk kiszámította annak értékét.

Ez a megoldás több szempontból sem célszerű. Egyrészt feleslegesen növeljük a tábla méretét olyan adatokkal, amelyeket bármikor előállíthatunk, amikor csak szükségünk van rá. A másik ok, hogy nem biztos, hogy a programunk tervezési idejében tudjuk, hogy milyen számított mezőkre lesz szükségünk. Ha új igény merül fel, az akár az egész program átdolgozását is jelentheti.

Éppen ezért alapkoncepció, hogy olyan értéket, amelyek valamely mező értékéből valamilyen matematikai úton előállítható, nem tárolunk el, hanem akkor számítjuk ki, amikor szükség van rá.

Természetesen ilyen lehetőség az SQL-ben is megtalálható, egyszerűen a kívánt matematikai művelet a meznevek felsorolásakor megadható.

A megoldás menetét mutatja az alábbi lekérdezés, amely az országok GDP-jét egymillióval osztja, ami a könnyebb leolvasást is elősegíti.

SELECT NEV, REGIO, TERULET, GDP, GDP/1000000 FROM COUNTRY.DBF

Az eredményből látszik, hogy a táblánk kiegészült egy olyan oszloppal, ami eddig nem volt, ennek a tartalma pedig a GDP oszlop tartalmának az egymilliomod része.

Ezzel a módszerrel tetszőleges mezőt definiálhatunk, a mezőnév az lesz, amit a kifejezésbe írtunk. A kifejezések lehetnek aritmetikai, logikai műveletek és függvények.

Az aritmetikai műveletek az összeadás (+), a kivonás (-), a szorzás (*), az osztás (/), a hatványozás (^) és a moduló (%). Magyarázatra talán csak ez utóbbi szorul. Két szám modulója a számok hányadosának a maradéka. Például: 5 % 2 = 1, mivel ha 5-töt elosztunk kettővel, a maradék 1 lesz.

A logikai műveletekről már volt szó az előző részben, a leggyakrabban az ÉS (AND), a VAGY (OR) és  NEM (NOT) műveleteket használjuk, illetve az első kettő tagadott változatát, a NEM-ÉS (NAND) és a NEM-VAGY (NOR) műveleteket. A kizáró-VAGY (XOR) művelete már ritkábban alkalmazzuk.

A függvényekről a következő részben olvashatnak bővebben csakúgy, mint arról is, hogy  hogyan lehet a táblákban tárolt adatokat módosítani.

Markó Imre