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