Az adatbázisok létrehozása és törlése tipikusan adminisztrátori
feladat, ezért általában a MySQL adminisztrátori (root) hozzáféréssel
tehetjük csak meg. A zadminisztratív feladatokat a mysqladmin programmal
végezhetjük el.
Windows esetén:
cd c:\mysql\bin
c:\mysql\bin>mysqladmin create personal
Ha nem állítottunk be adminisztrátori jelszót a telepítés
után, akkor ez a parancs minden további kérdése nélkül lefut és létrehozza
az új personal nevű adatbázist.
Linux esetében ugyancsak a mysqladmin programot kell használnunk,de
itt ha már a telepítésnél megadtunk egy jelszót, akkor azt most használnunk
kell.
Root jogosultsággal dolgozunk:
# cd /usr/local/mysql
# ./bin/mysqladmin -p create personal
Enter password:
Database "personal" created.
Az adminisztrátori jelszó begépelése után a personal adatbázis létrejön. A mysqladmin parancs ezen kívűl több más adminisztrátori funkcióra használható, a legfontosabb tudnivalókat a parancs kilistázza, ha semmilyen paramétert nem adunk meg:
c:\mysql\bin>mysqladmin | more
# ./bin/mysqladmin | more
Adatbázis-felhasználó létrehozása
Saját personal adatbázisunk kezeléséhez hozzunk létre egy
olyan MySQL felhasználót is, aki ezt az adatbázist teljes jogosultsággal kezelni
tudja majd. A felhasználók adatait és az adatbázisokhoz tarozó jogokat a mysql
nevűspeciális adatbázis tárolja. Ezt az adatbázist közvetlenül az adaminisztrátori
hozzáféréssel is módosíthatjuk, de ez nem javasolt, helyette használjuk inkább
az SQL-ben szabványos GRANT és REVOKE parancsokat. A MySQL rendszerbenaz
egyszerű SQL parancsokat a mysql nevű MySQL monitor vagy konzol programon
keresztül gépelhetjük be. (Kicsit sok mindent hívunk mysql-nek a MySQL
rendszerben, ez biztos, de egy kis gyakorlás után ez nem lesz ennyire zavaró.)
Indítsuk el a mysql programot.
Windowson:
c:\mysql\bin>mysql
mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.31
Type 'help;' or '\h' for help. Type '\c' to clear the buffer
mysql>
A parancssorban az első "mysql" szó a futtatható
program neve, a második pedig a köponti adminisztrációs adatbázis neve.
A program indítása Linuxon (root jogosultsággal):
# mysql -p mysql
Enter pasword:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with with -A
Welcome to the MySQL
monitor. Commands end with; or \g.
Your MySQL connection is is 3000 to server version: 3.22.32
Type 'help' for help.
mysql>
A konzol indítása után tehát adminisztrátori joggal kapcsolódtunk a mysql adatbázishoz, ahol az egyéb adatbázisokra és felhasználókra vonatkozó jogokat tudjuk beállítani.
Hozzunk létre egy olyan felhasználót, aki a personal adatbázisunkat kezeli majd! Legyen a felhasználó neve 'admin', a jelszava pedig az egyszerűség kevéért 'pwd'. Felhasználót a GRANT parancs segítségével tudunk létrehozni, amelynek általános alakja:
| GRANT adatbázis elérési jogok |
| ON adatbázis |
| TO felhasználó |
| IDENTIFIED BY jelszó; |
Az adatbázis elérési jogok mező adja meg, hogy ez a felhasználó az
adatbázist olvasni, írni, módosítani tudja-e, vagy ezeket tetszőlegesen kombinálni.
Az adatbázis mező az adatbázis, illetve ezen belül az adattáblák nevét
tartalmazza. A felhasználó természetesen a felhasználót azonosító loginnév,
a jelszó pedig az ehhez tartozó jelszó. A login név a felhazsnáló hálózati
címét, helyét is tartalmazhatja, ezzel azt tudjuk meghatározni, hogy a felhasználó
honnan érheti el az adatbázist, honnan léphet be. Egy igen egyszerű definíció
az alábbi:
mysql> grant all
privileges on personal.* to adm@localhost identified by 'pwd';
Query OK, 0 rows afected (0.02 sec)
Ebben az esetben a felhasználó az "all privileges" jogot, vagyis teljes hozzáférést kapott. A "personal.*" azt jelenti, hogy a personal adatbázis adatbázis bármelyik adattáblájához hozzáférhet. Az "adm@localhost" megadja a login nevet ("adm") és az elérési helyét ("localhost"). Az adm felhasználó tehát csak a localhostról használhatja a personal adatbázist, távolról nem léphet be. Végezetül a "pwd" a loginhoz tartozó jelszó lesz.
mysql> flush privileges;
Querry OK, 0 rows affected (0.00 sec)
A flush privileges parancs érvényre juttatja az adminisztrációs
táblákon végzett módosításokat. Alapesetben ugyanis csak az adattáblák változnak
meg, de eetől az új jogokat a rendszer még nem használja, csak a flush
privileges végrehajtása után.
A GRANT parancs egyéb paramétereiről, a különböző jogosultságok kombinációiról
a dokumentáció "GRANT and REVOKE Syntax" fejezetében olvashatunk
bővebben. Jelen esetben az imént használt egyszerű forma elegendő számunkra:
az adm felhasználó (jelszava pwd) mostantól lokálisan hozzáfér
a personal adatbázishoz.
Próbáljuk ki az új hozzáférést. Az előző GRANT utasítás
értelmében az adm felhasználó a personal adatbázist a mysql
programmal el tudja érni az alábbiak szerint.
Windowson:
c:\mysql\bin>mysql
-uadm-p personal
Enter password: ***
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 3.23.31
Type 'help;' or '\h' for help. Type '\c' to clear the buffer
mysql>
Linuxon:
#/usr/local/mysql/bin/mysql
-uadm -p personal
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2001 to server vresion: 3.22.32
Type 'help' for help.
mysql>
Amennyiben a mysql> promtot megkapjuk, a belépés sikeres volt. A parancsosrban láthatjuk, hogy a felhasználói nevet a -u kapcsoló után adtuk meg, a -p-vel pedig elértük, hogy a program jelszót kérjen. (Egyébként ajelszót a -p után hasonlóan a -u-hoz beírhatjuk a parancssorba is, de ezt nem javasoljuk, hiszen akkor a jelszó látható.) A mysql parancs utlosó paramétere a personal adatbázis neve. A programból a quit parancs begépelésével léphetünk ki.
Az adatbázisokat eddig nem használó Olvasó számára következzen
néhány alapfogalom. Az adatbázisok - név alapján rögtön nyilvánvaló - adatok
tárolására alkalmas alkalmazások (számunkra szerverprogramok), amelyek belső
algoritmusaik, optimalizált funkcióik segítségével hatékonyan és gyorsan tudnak
nagyobb adatmennyiséggel is dolgozni. Az adatokat adattáblázatokban tároljuk,
melyek logikusan sorokból és oszlopokból állnak. Az adattábla egy sora egy
adatrekord, amely több különböző mezőt (cellát) tartalmazhat, ezek az adattábla
oszlopai. Egy elemi mező (cella) több jellmezővel is leírható, például nevével,
értékével, típusával. A relációs adatbázisok az adattáblák között - akár rekord,
akár cellaszinten is - relációs kapcsolatokat tudnak létrehozni, amelyek alapján
a különálló adattáblákat logikailag egymáshoz lehet kapcsolni.
Összegezzük tehát: az adatbázisok adattáblákat tartalmaznak, ezek a táblák
pedig sorokat és oszlopokat, ahol egy sor egy összefüggő adatrekordot jelent,
ennek különálló cellái pedig az elemi adatmezők. Az adatmezőket több szempont
is jellmezi, ezek közül a három leggyakoribb jellmező a mező neve, típusa
és természetesen az értéke.
Az adattábla szerkezetének megértéséhez tekintsük a következő példát. Tegyük fel, hogy cégünk weboldalához - ennek bizonyos részéhez - a hozzáférést a korábban ismertetett technikával, jelszavas védelemmel szeretnénk korlátozni. Felhasználóink adatait egy adattáblában szeretnénk tárolni, ahol a következő mezőket definiáljuk:
Ezek tehát az adatrekordot alkotó mezők, azaz az adattábla oszlopai. Nyilvánvaló, hogy az egyes mezők típusa eltérő lesz, hiszen például az egyedi azonosító lehet egy egész szám, míg a loginnév, a jelszó egy string, ugyanakkor a dátumjellegű mezőket valamilyen dátumtípusban ésserű tárolni. Az alábbi táblázat mutatja a fenti mezők nevét és típusát is:
| A mező neve |
A mező típusa (adathossz) |
| Id | Egyész szám (32 bites integer) |
| Username |
String (16 karakter) |
| Password |
String (16 karakter) |
| Realname |
String (50 karakter) |
| |
String (50 karakter) |
| Status |
Egyész szám (32 bites integer) |
| CreateDate |
Dátum |
| ExpireDate |
Dátum |
A típusokra mindjárt visszatérünk, a fentiek alapján már elkészíthetjük felhasználó táblázatunkat:
Id |
Username |
Password |
Realname |
Email |
Status |
CreateDate |
ExpireDate |
1 |
szaboi | XDFxefw | Szabó Imre | szabo@ |
1 |
2001-01-21 |
2002-01-01 |
2 |
kissp | Pdsdio2a | Kiss Péter | kiss@ homeserver.hu |
1 |
2001-02-20 |
2002-05-11 |
3 |
nagyg | Exwde44 | Nagy Géza | nagy@ homeserver.hu |
0 |
2001-05-30 |
2002-11-10 |
4 |
kovacsz | Sdpepfc | Kovács Zoltán | kovi@ homeserver.hu |
1 |
2001-03-11 |
2005-12-31 |
A táblázat szervezéséből kitűnik, hogy az oszlopok (columns) az azonos mezőket mutatják, míg a sorok (rows) rendre egy-egy komplett adatrekordot tárolnak. Most, hogy már "látjuk is" a táblázatot, még néhány kérdést tisztáznunk kell. Ismerjük a mezők nevét, és majdani típusát, de bizonyos kikötéseket és megszorításokat - amelyek talán nem nyilvánvalóak elsőre - definiálnunk kell ahhoz, hogy a táblázat valóban jól funkcionáljon a későbbiekben. Ezek:
Határozzuk meg - most már a dokumentáció segítségével - a végleges adattípusokat, majd készítsük el első adattáblánkat MySQL-ben. A dokumentáció "Column types" fejezete részletesen tárgyalja az alkalmazható típusokat, mi most ezek közül az alábbiakat választottuk ki:
Az adattábla létrehozása MySQL-ben
Egy adatbázison belül az adattáblákat a CREATE TABLE SQL utasítással hozhatjuk létre. Az utasításról a dokumnetáció "CREATE TABLE Syntax" fejezetében olvashatunk, itt most csak egy egyszerűsített alakját alkalmazzuk. Általánosságban a CREATE TABLE utasítás szintaxisa a következő:
create table táblanév (definíciók);
A táblanév paraméter adja meg a tábla nevét, míg a definíciók rész az egyes mezőket írja le, némely esetben egészen összetett formában. Az alábbi konkrét példa a fenti adatbázis legegyszerűbb megvalósíása lehet:
create table accounts(
|
Id |
int, |
|
Username |
varchar(16), |
|
Password |
varchar(16), |
|
Realname | varchar(50), |
|
Emil |
varchar(50), |
|
Status |
int, |
|
CreateDate |
date, |
|
ExpireDate |
date |
Amint látható, a táblázat neve accounts lesz, az egyes
mezőket pedig mezőnév típus formában írtuk le, a különálló definíciókat
vesszővel elválasztva egymástól. A könnyebb olvashatóság érdekében érdemes a
CREATE TABLE utasításokat ilyen több sorra tördelt, áttekintehtő formában
írni (természetesen az elválasztó vesszőkre akkor is szükség van, ha a teljes
definíciót egyetlne sorban írjuk le).
Hozzunk létre munkakönyvtárunkban egy tabdef.txt nevű fájt és gépeljük bele
a fenti CREATE TABLE definíciót. Az utasítást a mysql konzol
programon belül soronként is beleírhatnánk, de jobb, ha egy külső fájlba írjuk
a CREATE utasításokat, így azokat később könnyen kódosítani tudjuk
majd. Ha elkészítettük a szövegfájlt, akkor a "<" jel segítségével
- ami mindkét operációs redszerben a szabványos bemenet (standard input)
átirányítását jelenti - közvetlenül létrehozhatjuk a táblát.
Windowson:
C:\WORK>c:\mysql\bin\mysql -uadm -ppwd personal < tabdef.txt
Linuxon:
/usr/local/mysql/bin/mysql -uadm -ppwd personal < tabdef.txt
A mysql konzol ilyen formában történő hívása tulajdonképpen nemigen különbözik az előző interaktív módtól: a -u kapcsolóval megadjuk a felhasználót, a -p-vel a jelszót (bár az ilyen kiírt jelszavakat legtöbbször elkerüljük), ezek utánkövetkezik az adatbázis neve, végül a standard input átirányítása segítségével a CREATE parancsot tartalmazó szövegfájl. Ezzel elkészítettük első - de korántsem végleges - SQL táblánkat. A táblázat finomítására, az egyes mezők további definícióira mindjárt visszatérünk, előbb azonban nézzük meg, miként kaphatunk az adatbázisokról és az adattáblákról bővebb információt.
Információk az adatbázisról, az adattáblákról
A táblázat létrehozása után önkéntelenül is felvetődik a kérdés: hogyan ellenőrizhetjük, hogy egy adatbázisban milyen táblák, azokban pedig milyen mezők (oszlopok) vannak? Természetesen a MySQL rendszer több lehetőséget is kínál, ezek közül az egyik a mysqlshow parancs, a másik pedig a szabványos SQL nyelv adta parancsok. Nézzük meg mindkét módszert!
Adjuk ki a mysqlshow parancsot egyelőre mindeféle paraméter
nélkül.
Windowson:
C:\mysql\bin>mysqlshow
Databases |
| mysql |
| personal |
| test |
Linuxon az eredmény ugyanez lesz, de persze a program máshol található:
/usr/local/mysql/bin/mysqlshow
Databases |
| mysql |
| personal |
| test |
Amennyiben a root hozzáférés jelszavas, és Linuxon rootként próbáljuk futtatni a parancsot, az természetesen nem lesz sikeres, ezért itt is alkalmaznunk kell a korábbról már ismert -p kapcsolót!
/usr/local/mysql/bin/mysqlshow -p
Mit láthatunk tehát? A mysql és a test a rendszer által a telepaítéskor automatiksuan megkreált adatbázisok, a personalt pedig mi hoztuk létre. Bővítsük a parancs argumentumait, adjuk meg az adatbázist, valamint a hozzá tartozó felhasználót és jelszót is:
mysqlshow -uadm -ppwd
personal
Database: personal
Tables |
| accounts |
mysqlshow -uadm -ppwd
personal accounts
Database: personal Table: accounts Rows: 0
Field |
Type |
Null |
Key |
Default |
Extra |
Privileges |
| Id | int(11) | YES |
select,insert,update,reference | |||
| Username | varchar(16) | YES |
select,insert,update,reference | |||
| Password | varchar(16) | YES |
select,insert,update,reference | |||
| Realname | varchar(50) | YES |
select,insert,update,reference | |||
| varchar(50) | YES |
select,insert,update,reference | ||||
| Status | int(11) | YES |
select,insert,update,reference | |||
| CreateDate | date | YES |
select,insert,update,reference | |||
| ExpireDate | date | YES |
select,insert,update,reference |
Most, hogy az első argumentum egy adatbázis neve, a mysqlshow
az ebben található adattáblákat - jelen esetben az egyetlne acounts
táblát - mutatja. Ugyanezen logika szerint lépjünk egy szinttel lejjebb.
Ez a táblázat tehát a personal adatbázis accounts adattáblájáról
ad információt. A táblázat első két oszlopát már ismerjük: a mezők nevét (Field
oszlop) és típusát (Type oszlop) mutatja. A további sorok viszont magyarázatra
szorulnak, ami nem is csoda, hiszen még csak most ismerkedünk a MySQL-lel és
az adatbázisok felépítésével. A Null oszlop azt mutatja, hogy az adott
mező felveheti-e a null értéket, ami az adatbázisoknál egy speciális
érték, a megadott mező üres mivoltát hivatott jelezni. A Key
oszlopban láthatnánk, ha valamelyik mező kulcs (vagy index) mező lenne,
erre később a táblázat újabb specifikációjánál visszatérünk. A Default
oszlop mutatná a mezőhöz tartozó default, vagyis alapértelmezett értéket,
de mivel ilyet a korábbi CREATE TABLE utasításbannem adtunk meg, ezért
minden mezőnél üres. Az Extra oszlopban a mezőre vonatkozó különleges
beállításokat láthatnánk, a Privileges pedig azt mutatja, hogy az adott
mezőre nézve milyen hozzáférési jogokkal rendelkezünk.
A mysqlshow parancs tehát egy egyszerű, de igen hasznos segédeszköz,
amely segítségével az adatbázisokról hasznos információkat kapahtunk. A fenti
parancsok analógiájára megpróbálhatjuk a központi mysql adatbázis táblázatait
és azok mezőit is kilistázni, de ehhez természetesen adminisztrátori hozzáférés
szükséges.
Információk közvetlen lekérdezése SQL-ből
A mysqlshow-hoz hasonlóan a tábla- és mezőadatokat a mysql konzolprogramon belül SQL parancsokkal is lekérdezhetjük. Indítsuk el a mysql programot a szokásos módon (most a gyorsaság kedvéért kiírjuk a jelszót a parancssorban, de ezt azért ne szokjuk meh, ha lehet):
mysql -uadm personal
A csatlakozás után az adatbázisban létező táblákaról a show parancs ad információt. A show parancsról érdemes elolvasni a dokumentáció ide vonatkozó részét, mert igen sok paramétert és adatot le lehet kérdezni vele. A táblák neveit az alábbi módon kaphatjuk meg:
myqsl> show tables;
Tables_in_personal |
| accounts |
1 row in set (0.05 sec)
Egy táblázaton belül a mezők nevét és típusát pedig így:
mysql> show columns from accounts;
Field |
Type |
Null |
Key |
Default |
Extra |
| Id | int(11) | YES |
NULL |
||
| Username | varchar(16) | YES |
NULL |
||
| Password | varchar(16) | YES |
NULL |
||
| Realname | varchar(50) | YES |
NULL |
||
| varchar(50) | YES |
NULL |
|||
| Status | int(11) | YES |
NULL |
||
| CreateDate | date | YES |
NULL |
||
| ExpireDate | date | YES |
NULL |
8 rows in set (0.06 sec)
Ha arra vagyunk kíváncsiak, hogy egy bizonyos táblát milyen CREATE utasítás hozott létre, akkor a show create table táblanév formát használhatjuk:
mysql> show create table accounts;
Mind a mysqlshow, mind a show SQL parancs az itt leírtaknál jóval több lehetőséget rejt magában, ezeket a dokumentáció segítségével az Olvasó részletesen részletesen is végigpróbálhatja.
Egy táblát az adatbázisból a DROP TABLE SQL utasítással törölhetünk ki. Ezzel az utasítással óvatosan kell bánni, hiszen a tábla törlése az adatok elvesztését eredményezi. Éppen ezért csak abban az esetben használjuk, ha teljesen biztosak vagyunk a dolgunkban. Most persze azok vagyunk, mert tudjuk, hogy a korábbi definíciót egy szövegfájlban tároljuk és az adattábla jelenleg üres. A további specifikációk érdekében tehát most kitöröljük az accounts táblát, aztán később egy módosított CREATE TABLE utasítással újra létrehozzuk majd!
mysql -uadm -ppwd personal
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20 to server version: 3.23.38
Type `help;' or `\h' for help. Type `\c' to clear the buffer
mysql> drop table accounts;
Query OK, 0 rows affected (0.00 sec)
Az előzőleg létrehozott, majd a DROP TABLE utasítással később eltávolított accounts tábla sok szempontból hibás, pontatlna volt. Aze gyes mezők értékére olyan specifikus szempontokat is meg kell adnunk - ahogy korábban felsoroltuk - amit az első kezdetleges CREATE TABLE utasításunk nem tartalmazott. Fejlesszük most ezt a definíciót tovább, specifikáljuk a számunkra különleges jelentőséggel bíró mezket kicsit jobban. Ehhez természetesen szükséges értenünk néhány alapvető SQL fogalmat, kulcsszót. Nézzük meg most a később alkalamzott újdonságokat. Ezek tulajdonképpen egy-egy mező attribútumaiként, jellemző paramétereként is felfoghatók:
Elősként lássuk a kibővített CREATE TABLE utasításunkat, utána pedig részletesen elmagyarázzuk, hogy mi mit jelent.
create table accounts (| Id | int not null auto_increment, | |
| Username | varchar(16) not null, | |
| Password | varchar(16) not null, | |
| Realname | varchar(50), | |
| varchar(50), | ||
| Status | int, | |
| CreateDate | date, | |
| ExpireDate | date, | |
| primary key | (Id), | |
| key | (Username), | |
| unique | (Username) |
Az új tábla-definícióban kiemeltük a változásokat. Az Id
mező két attribútumot is kapott: nem lehet null értékű, ugyanakkor
az adatbázis automatiksuan növelheti ezt. (A növelés nem szükségszerű.) A Username
és a Paasword mező szintén nem lehetnek üresek (null értékűek). A további
változásokat a definíció alján láthatjuk: az Id mező lesz a primary key,
azaz a táblázat elsődleges kulcsmezője. Az elsődleges kulcsmező szerepe kitüntetett:
ez hivatott a táblázat minden egyes sorát különállóan azonosítani. A Username
egyszerű key mező lett, erre azért van szükség, mert előreláthatóan
erre a mezőre adjuk majd ki a legtöbb keresési feltételt. Az adatbázis belső
működésének köszönhetően így a mező értékére történő bármilyen feltétel kiértékelése
gyorsabb lesz. Végezetül a unique kulcsszóval azt határoztuk meg, hogy
a Username mező két sorban nem lehet azonos, mindig egyedinek kell
lennie. Az Id mező - mivel ez a tábla elsődleges kulcsmezője - mindenképpen
unique lesz, ezt a MySQL biztosítja.
Módosítsuk a korábbi tabdef.txt fájlunkat a fentiek szerint, majd ismételjük
meg az accounts tábla létrehozását (hiszen előzőleg a DROP TABLE-el
töröltük):
mysql -uadm -ppwd personal < tabdef.txt
Ha ezek után ismét belépünk a konzolprogramba és megtekintjük a táblázat mezőit, akkor egy kicsit módosított definíciólistát kapunk:
mysql> show columns from accounts;
Field |
Type |
Null |
Key |
Default |
Extra |
| Id | int(11) | PRI |
NULL |
auto_increment | |
| Username | varchar(16) | UNI |
|||
| Password | varchar(16) | ||||
| Realname | varchar(50) | YES |
NULL |
||
| varchar(50) | YES |
NULL |
|||
| Status | int(11) | YES |
NULL |
||
| CreateDate | date | YES |
NULL |
||
| ExpireDate | date | YES |
NULL |
8 rows in set (0.11 sec)
A Field és a Type oszlopokban a korábbihoz
hasonló módon szerepelnek a mezőnevek és típusok, a többi mező viszont a CREATE
TABLE alapján módosult. Eszerint az Id, a Username és
a Password mezők mezők nem lehetnek null értékűek, az Id az
elsődleges (PRI), a Username pedig egy egyedi (UNI)
kulcsmező. Továbbá az Id mező extra tulajdonsága az automatikus novekedés.
Bár minden rendeben levőnek tűnik, az éles szemű Olvasó egy apró ellentmondást
mégis felfedezhet a fenti táblázatban. Hogy lehet az, hogy az Id mező
nem lehet null értékű, ugyanakkor a Default értéke null?
Nos lehet, mégpedig azért, mert a MySQL az auto_increment mezőknél
éppen a null értéket használja annak jelzésére, hogy a mezőt az adatbázisnak
kell növelnie. Ezt majd az INSERT utasításnál részletesen tárgyaljuk,
a dolog lényege az, hogy ha érvényes értéket adunk meg, akkor a mező azt kapja,
ha pedig a nullt adjuk meg, akkor az adatbázis automatikusan generálja
a mező következő értékét.
Mindezek hatását persze a gyakorlatban láthatjuk a legszemléletesebben. Lépjünk
tehát tovább, és ismerjük meg az alapvető adatbázis-műveleteket!
Persze most nem a matematikában megszokott négy alapműveletről, hanem az adabáziskezelés négy alapvető műveletéről van szó. Ezek pedig:
Az első három művelet általában - de nem szükségszerűen - az adattábla módosítását vonja maga után, az utolsó SELECET művelet pedig az adattábla lekérdezését, az adatok kinyerését szolgálja. A műveletek szintaxisa meglehetősen hasonló egymáshoz, a kulcsszavak logikusak és angolul olvasva meglepően értelmesnek bizonyulnak, ahog később látni fogjuk. az SQL egyik igen nagy előnye az áttekinthetőség és az egyértelmű szóhasználat. Az alapműveleteket igen egyszerű példákon keresztül mutatjuk be, ehhez természetesen a personal adatbázisunk accounts tábláját használjuk fel.
Az INSERT utasítás az adatttáblában egy új sort hoz létre. Általános alakja:
insert into táblanév values (értékek)
Ez a forma az egyszerűbb alakja az utasításnak, ahol feltételezzük, hogy a zarójelben elhelyezett - vesszővel elválasztott - értékek pontosan megfelelnek a táblázat definíciója szerinti alaknak, azaz annyi és olyan típusú adatot tartalmaznak, amennyi a sor létrehozásához szükséges. Lépjünk be a mysql konzol (mysql -uadm -ppwd peersonal) programba, és adjuk ki a következő utasítást (ez természetesen logkailag egy sor, de a képernyőn nyilván tördelve jelenik meg):
insert into accounts values (1, 'szaboi', 'XDFxefw', 'Szabo Imre', 'szabo@homeserver.hu', 1, now(), null);
Az utasításból sok tudnivalót kiovashatunk. A values kulcsszó után a zárójelek között pontosan annyi érték szerepel - vesszővel elválasztva -, amennyi a táblázat oszlopainak száma, ebből következik, hogy a definíció sorban (egy az egyben) megfeleltethető a mezőknek (az első érték az Id-be, a második a Username-be kerül és így tovább). A string (varhcar) típusú mezők rétékeit az egyszeres idézőjelek (') között adtuk meg, míg a legelső Id mezőt - amely numerikus - idézőjelek nélkül is írhatjuk. A CreateDate definíciójánál a now() beépített MySQL függvényt hívtuk, ami a mai dátumot írja a mezőbe. Végül az ExpireDate mezőt nem definiáltuk, hanem a null kulcsszó segítségével üresen hagytuk. Ez az INSERT utasítás tehát létrehozza az accounts táblázat legelső sorát, adatrekordját.
Nézzünk egy másfajta INSERT-et (logikailag ez is egy sor):
insert into accounts values (null, 'kissp', 'Pdsdio2a', 'Kiss Peter', 'kiss@homeserver.hu', 1, now(), '2002-12-31');
Ebben az esetben a zárójelek közötti értékek száma szintén
teljesen azonos a tábla oszlopainak számával, ám most az Id mező null
értéket kapott, az ExpireDate-et pedig szöveges formában dátumként
megadtuk. Mivel az Id mező auto_increment, ezért az itt megadott
null érték most azt jelenti a MySQL számára, hogy az Id értékét
automatikusan - a legutolsó inzertált értékből számítva, azt 1-gyel növelve
- kell alőállítania. Ahogy majd később látjuk, éppen ezért az ehhez a rekodrhoz
tartozó Id 2 lesz. Az utolsó ExpireDate ilyenformátumban történő
definíciója igen kényelmes: a MySQL megengedi, hogy mint egyszerű stringet adjuk
meg a dátumot év-hónap-nap alakban, de eltárolni természetesen már
az adatbázis belső szervezése szerint (dátumtípusú változóként) fogja.
Az INSERT utasításnak létezik egy másik formálya is, ahol a zárójelek
között nem írjuk ki az összes mező értékét, hanme specifikáljuk, hogy mely mező
milyen érétéke kap, míg más mezőket egyszerűen kihagyunk. Ennek hatására az
inzertált sor azon mezői, melyeket az INSERT utasítás nme tartalmazott,
a Default értéket kapják. Az utasítás általános alakja ebben az esetben:
insert into táblanév (mezőnevek...) values (értékek);
Tegyük fel, hogy a következő felhasználónál csak a loginnevet, a jelszót és a valódi nevet definiáljuk, a többi mező értéke érdektelen. Az INSERT alakja most:
insert into accounts (username, password, realname) values ('nagyg', 'Exwde44', 'Nagy Geza');
Az utasítás hatására a létrehozott adatrekord definiált mezői
a megadott értékeket kapták, míg a kihagyott mezők a Default értéket.
Az Id mező kezelése itt is különleges, hiszen a Default értéke
null, viszont az auto_increment attribútum miatt mégis a megfelelő
következő egész értéket kapja.
Javasoljuk, hogy az Olvasó az INSERT utasítás különböző formáit használva
próbáljon meg újabb rekordokat létrehozni a táblában, esetleg kísérletezze ki,
mi történik akkor, ha például ugyanazzal a Username-mel akar új rekordot
létrehozni, vagy a not null attribútummal allátott mezőkbe null
értéket írni. Látni fogjuk, hogy a MySQL nem engedi meg sem az azonos loginneveket,
sem a null értékeket ezekben a speciális attribútumokkal ellátott mezőkben,
azaz úgy viselkedik, ahogyan azt a CREATE TABLE utasítással megszabtuk.
Logikailag ugyan a DELETE és UPDATE utasítást kellen először ismertetnünk, de ha látni akarjuk, hogy a táblánk jelenleg milyen adatokat is tartalmaz, akkor elsőként a SELECT utasítás használatát kell elsajátítanunk. Ez ugyanis az az utasítás, amelyik az adatok kinyerésére, a megfelelő sorok és oszlopok kiválasztására szolgál. A SELECT funkciója - és épen ezért szintaxisa is - az SQL nyelvben meglehetősen összetett (például lehetőséget nyújt arra, hogy több táblából egyidejűleg kérdezzünk le adatokat logikai összefüggések alapján). Mi most néhány egyszerűbb formáját ismertetjük, aztán a könyv későbbi részeiben majd bonyolultabb SELECT-eket is bemutatunk. A SELECT utasítás általános alakja:
select mezők from táblázatok where logikai feltétel egyéb utasítások;
Az egyik legegyszerűbb SELECT az, amikor egy tábla teljes tartalmára vagyunk kíváncsiak a definíciók alapján (a where záradékot most elhagyjuk):
select * from accounts;
A mezőnevek helyén ebben az esetben a '*' szerepel, tahát minden
mezőt kiválasztunk az accounts táblából, logikai feltételt pedig nem
adunk meg, tehát a where kulcsszót elhagyjuk. Az utasítás mindem adatrekordot
megjelenít a táblából.
Ha nem vagyunk minden oszlopra kíváncsiak, akkor szűkíthetjük a mezőlistát,
sőt a mezőneveket tetszőlegesen felcserélhetjük:
mysql> select realname, username, password from accounts;
realname |
username |
password |
| Szabo Imre | szaboi | XDFxefw |
| Kiss Peter | kissp | Pdsdio2a |
| Nagy Geza | nagyg | Exwde44 |
3 rows in set (0.06 sec)
mysql> select * from accounts;
| Id | Username | Password | Realname | Status | CreateDate | ExpireDate | |
| 1 | szaboi | XDFxefw | Szabo Imre | szabo@homeserver.hu | 1 |
2001-09-21 | NULL |
| 2 | kissp | Pdsdio2a | Kiss Peter | kiss@homeserver.hu | 1 |
2001-09-22 | 2002-12-31 |
| 3 | nagyg | Exwde44 | Nagy Geza | NULL | NULL |
NULL | NULL |
3 rows in set (0.05 sec)
Most egészítsük ki a SELECT-et a where szűkítéssel. Tegyük fel, hogy csak azokra a loginokra vagyunk kíváncsiak, ahol a Status mező értéke 1. Ehhez az alábbi utasítást kell kiadnunk:
mysql> select realname, username, password from accounts where status=1;
realname |
username |
password |
| Szabo Imre | szaboi | XDFxefw |
| Kiss Peter | kissp | Pdsdio2a |
2 rows in set (0.11 sec)
Itt a where kulcsszó után egy logikai kifejezés szerepel, és a SELECT csak azokat az adatrekordokat fogja visszaadni, amelyekre a megadott feltétel igaznak bizonyul, azaz azokat a sorokat, ahol a Status mező értéke 1-gyel egyenlő. A logikai feltétel ebben az esetben egy egyszerű egyenlőség volt, de természetesen bármilyen összetett logikai kifejezést összeállíthatunk. Nézzünk még néhány példát ezekre. A 'szaboi' loginhoz tartozó valódi név kiválasztása:
mysql> select realname from accounts where username='szaboi';
realname |
Szabo Imre |
1 row in set (0.00 sec)
Azon sorok kiválasztása, ahol az Id mező nagyobb, mint 1:
mysql> select id, username, realname from accounts where id>1;
id |
username |
realname |
2 |
kissp | Kiss Peter |
3 |
nagyg | Nagy Geza |
2 rows in set (0.06 sec)
Azon sorok kiválasztása, ahol az Id mező nagyobb, mint 1 és a Username 'k' betűvel kezdődik:
mysql> select realname from accounts where id>1 and username like 'k%';
realname |
Kiss Peter |
1 row in set (0.11 sec)
Ebben a SELECT-ben láthatunk egy érdekes műveletet, a like-ot. A like szöveges egyezések, a stringek bizonyos részeinek összehasonlítására szolgál. A % jel több karakter (bármilyen szövegrész) behelyettesítésére szolgál.A fenti 'k%' tehát azt jelenti, hogy olyan stringekre illeszkedik a kifejezés, amelyek 'k' betűvel kezdődnek, majd bármilyen tetszőleges karaktersorozattal folytatódnak. Ennek analógiájára néhány példa a like használatára:
A legutolsó egyenlőségvizsgálat használatát nem javasoljuk, helyette használjuk a jól bevált = relációt! A % jelen kívül egyetlen karakter helyettesítésére használható az _ (aláhúzás) jel, de ez csak egy karaktert helyetesít. Ide kapcsolódik az escape SQL záradék is, amelyet most nem ismertetünk, a like és az escape további lehetőségeiről a MySQL dokumentációban találunk bővebb információt. A where záradékban használható logikai kifejezéseketkésőbb természetesen gyakran használjuk majd, így folyamatosan egyre összetettebb SQL utasításokat ismerhetünk meg. Az újdonságokat - eddigi gyakorlatunk szerint - mindenhol külön elmagyarázzuk.
Az adattáblában már létező sorok módosítására szolgál az UPDATE utasítás. Általános alakja a következő:
update táblázat set mezőnév=érték... where logikai feltétel;
A set kulcsszó után vesszővel elválasztva következhetnek azok a mezők, melyeknek új értéket szeretnénk adni. Ha a where feltételt elhagyjuk, akkor az UPDATE a táblázat mindem sorára vonatkozik. Például módosítsuk minden account lejárati dátumát 2002. december 31-re:
mysql> update accounts set ExpireDate='2002-12-31';
mysql> select * from accounts;
| Id | Username | Password | Realname | Status | CreateDate | ExpireDate | |
| 1 | szaboi | XDFxefw | Szabo Imre | szabo@homeserver.hu | 1 |
2001-09-24 | 2002-12-31 |
| 2 | kissp | Pdsdio2a | Kiss Peter | kiss@homeserver.hu | 1 |
2001-09-24 | 2002-12-31 |
| 3 | nagyg | Exwde44 | Nagy Geza | NULL | NULL |
NULL | 2002-12-31 |
3 rows in set (0.00 sec)
Ha most újra kilistázzuk a táblázatot a SELECT-tel,
akkor látható, hogy az összes sorban az ExpireDate ezt a dátumot vette
fel. (előző ábra)
Ha csak egyetlen sort akarunk módosítani, akkor ahhoz természetesen olyan feltételt
kell megadnunk, ami csak arra bizonyos sorra teljesül, tehát valamelyik egyedi
mezőt kell használnunk. Például, ha a 'nagyg' account E-mail címét és státusát
szeretnénk beállítani, akkor legegyszerűbb az Id vagy a Username
szerint megtenni, hiszen ezek egyértelműen csak erre a sorra vonatkozhatnak.
Az alábbi két UPDATE parancs ugyanazt a hatást váltja ki:
update accounts set email='nagyg@homeserver.hu', status=1 where id=3;
vagy
update account set email='nagyg@homeserver.hu', status=1 where username='nagyg';
mysql> select * from accounts;
| Id | Username | Password | Realname | Status | CreateDate | ExpireDate | |
| 1 | szaboi | XDFxefw | Szabo Imre | szabo@homeserver.hu | 1 |
2001-09-24 | 2002-12-31 |
| 2 | kissp | Pdsdio2a | Kiss Peter | kiss@homeserver.hu | 1 |
2001-09-24 | 2002-12-31 |
| 3 | nagyg | Exwde44 | Nagy Geza | nagyg@homeserver.hu | 1 |
NULL | 2002-12-31 |
3 rows in set (0.00 sec)
Egy SQL táblából egy vagy több sor törlésére hazsnálható a DELETE utasítás. Akárcsak a SELECT, ez is egy logikai feltétel (where záradék) alapján dönti el, hogy mely sort, sorokat kell törölni. Általános alakja:
delete from táblázat where logikai feltétel;
A SELECT-hez hasonlóan itt is elhagyható a where logikai feltétel rész, az ilyen utasítás viszont a tábla teljes tartalmának a törlését eredményezi, tehát legyünk óvatosak. A teljes accounts tábla törlése (egyelőre ne adjuk ki a parancsot, csak nézzük meg):
delete from accounts;
Néhány további példa:
A 'szaboi' loginhoz tartozó rekord törlése:
delete from accoutns where username='szaboi';
Az összes olyan rekord törlése, ahol a Status mező 0:
delete from accounts where status=0;
Nyilvánvaló: ha a logikai kifejezés egyetlen sorra sem igaz,
akkor a DELETE nem fog egyetlen rekordot sem törölni a táblából.
A SELECT, az UPDATE és a DELETE utasítások esetében
mindig ügyeljünk arra, hogy alapértelmezésben ezek nem egyetlen sorra vonatkoznak,
hanem minden olyan sort érintenek, amelyekre a where feltétel igaznak
bizonyul, illetve a táblázat összes sorára vonatkoznak, ha nincs megadva a feltétel.
Ennek tükrében talán már érthetőbb, miért olyan fontos, hogy bármilyen SQL táblázatnak
legyen legalább egy egyedi azonosító kulcsmezője, amely szerint minden egyes
sort külön-külön is el tudunk érni. A fenti accounts táblázatban tulajdonképpen
két ilyen mező is van, az Id és a Username. Ha saját táblákat
kreálunk, soha ne felejtsünk el ilyen (elsődleges kulcs) mezőt létrehozni, máskülönben
könnyen előfordulhat, hogy olyan sorokat is létrehozunk, amelyek teljesen egyformák
(minden mezőjük azonos), ezáltal lehetetlen őket egymástól megkülönböztetni.
A korábbi CGI példák között a C nyelvű programozásnál ismertettünk egy linkeket megjelenítő egyszerű programot. Eza program a linnkgyűjteményt egy egyszerű strukturált szövegfájlban tárolta. Most ezt továbbfejlesszük, és az adatokat adatbázisban tároljuk. A inkeket leíró szöveg fájl:
#Kereső:Portál:Oktatás:Szórakoás:Számítástechnika:Internet:Fájlok
0,Altavista,http://www.altavista.com,B
1,Startlap,http://www.startlap.com,I
3,Magyar Televízió,http://www.mtv.hu,BI
1,Extra,http://www.extra.hu,BI
0,Yahoo,http://www.yahoo.com,
4,AMD,http://www.amd.com,B
4,Intel,http://www.intel.com,B
3,Port,http://www.port.hu,B
5,Netscape honlap,http://www.netscape.com,
0,Google kereső,http://www.google.com,I
6,FUNet fájlgyűjtemény,ftp://ftp.funet.fi,
1,Elender Online,http://www.eol.hu,B
6,KFKI ftp, ftp://ftp.kfki.hu,I
5,Microsoft honlap,http://www.microsoft.com,
5,Apache Group,http://www.apache.org,B
5,Free-Pascal,http://www.freepascal.org,B
A szöveg legelső sora a különböző témaköröket tartalmazza, itt a kettőspont karakter szolgált elválasztó jelként. A további sorok egy-egy link adatait tartalmazták, ahol a mezőket a vessző választotta el. A linkeknél a mezők sorrendje ez volt: témakör azonosító, a link neve, a link URL-je, formázó opciók. A legelső sor és az utána következők funkcionálisan különböznek egymástól, érdemes lenne tehát két különálló adattáblát létrehozni a linkek és a témakörök számára. Legyen az egyik tábla neve links, a másiké pedig topics. A témakör tábla felépítése lehet a következő:
Id |
Name |
Status |
1 |
Kereső | 1 |
2 |
Portál | 1 |
3 |
Oktatás | 1 |
4 |
Szórakozás | 1 |
Az Id mező a témakör azonosító száma, a Name mező a témakör neve, míg a Status a témakör állapota. A links tábla ehhez hasonlóan könnyen felépíthető:
Id |
TopicId |
Name |
URL |
Options |
Status |
1 |
1 |
Altavista | www.altavista.com | B |
1 |
2 |
2 |
Startlap | www.startlap.com | I |
1 |
3 |
4 |
Magyar Televízió | www.mtv.hu | BI |
1 |
A szövegfájltól eltérően a témakör-azonosítókat most nem 0-tól,
hanme 1-től felfelé számozzuk, egyéb eltérés nincs. Mindkét táblázathoz hozzárendeltük
a Status mezőt is, amelyet engedélyezési/tiltási célokra, vagy egyéb
kiegészítésekre használhatunk majd a későbbiekben.
Adott tehát a két tábla szerkezete, állítsuk elő őket a megfelelő CREATE
TABLE utasítással. A topics táblát létrehozó utsasítás:
| Id | int not null auto_increment, | |
| Name | varchar(40) not null, | |
| Status | int, | |
| primary key | (Id), | |
| key | (Name), | |
| unique | (Name) |
A links tábla létrehozása:
create table links (| Id | int not null auto_increment, | |
| TopicId | int not null, | |
| Name | varchar(80), | |
| URL | varchar(128), | |
| Options | varchar(8), | |
| Status | int, | |
| primary key | (Id), | |
| key | (TopicId) |
A két utasítás nem tartalmaz semmi újdonságot, eddigi ismereteink alapján a definíciók minden sorát értelmezni tudjuk. Ne tévesszen meg bennünket, hogy a táblákban azonos nevű mezőket használunk, ezeknek nyilván nincs közük egymáshoz, az SQL nyelv ezt korlátozás nélkül megengedi. (A két tábla között lesz majd egy relációs kapcsolat, hiszen a links TopicId mezője a topics tábla Id mezőinek értékét veszi fel, de egyelőre ez még nem lényeges.) Írjuk be mindkettőt egy szövegfájlba (linksdef.txt), majd mentsük el a fájlt. Ezt az ismert módon a standard input átirányításával "betehetjük" a mysql konzolnak:
mysql -uadm -ppwd personal < linksdef.txt
A parancs lefutása után létrejön a topics és a links tábla a personal adatbázisban. Lépjünk be a konzolprogramba (mysql -uadm -ppwd personal), és adjunk hozzá néhány sort mindkét táblázathoz:
insert into topics
values (null, 'Kereső',1);
insert into topics values (null, 'Portál',1);
insert into topics values (null, 'Oktatás',1);
insert into topics values (null, 'Szórakozás',1);
insert into links values
(null,1,'Altavista','www.altavista.com', 'B', 1);
insert into links values (null,1,'Google','www.google.com','B',1);
insert into links values (null,2,'Startlap','www.startlap.com', 'BI',1);
insert into links values (null,2,'Extra','www.extra.hu','BI',1);
insert into links values (null,2,'EOL','www.eol.hu','BI',1);
insert into links values (null,4,'C64 info','www.c64.org','',1);
Az INSERT-ek után ellenőrizzük a táblák tartalmát a SELECT-tel:
mysql> select * from topics;
Id |
Name |
Status |
1 |
Kereső | 1 |
2 |
Portál | 1 |
3 |
Oktatás | 1 |
4 |
Szórakozás | 1 |
4 rows in set (0.01 sec)
mysql> select * from links;
| Id |
TopicId |
Name |
URL |
Options |
Status |
| 1 |
1 |
Altavista | www.altavista.com | B | 1 |
| 2 |
1 |
www.google.com | B | 1 |
|
| 3 |
2 |
Startlap | www.startlap.hu | BI | 1 |
| 4 |
2 |
Extra | www.extra.hu | BI | 1 |
| 5 |
2 |
EOL | www.eol.hu | BI | 1 |
| 6 |
4 |
C64 info | www.c64.org | 1 |
6 rows in set (0.00 sec)
Hogy az összetettebb SELECT-re is legyen példa, nézzük meg, hogyan lehet a két táblából egyszerre kiválasztani az oszlopokat. A links tábla TopicId mezője tulajdonképpen felfogható egy mutatóként a topics táblára, hiszen a megfelelő témakör azonosító számát (Id) tartalmazza. A relációs kapcsolat tehát a két tábla között a links.TopicId=topics.Id egyenlőség. Az ilyen esetekben, amikor egy mező neve mellett a tábla nevét is specifikáljuk, ezt ezen a módon, azaz a "táblanév.mezőnév" alakban tehetjük meg. A feladat tehát a témakör, valamint a link nevének és URL-jének kiválasztása. A megfelelő SELECT :
select topics.Name,
links.Name, links.URL
from topics, links
where links.TopicId=topics.Id;
Ennek eredménye pedig egy háromoszlopos táblázat lesz a megfelelő adatokkal:
Name |
Name |
URL |
| Kereső | Altavista | www.altavista.com |
| Kereső | www.google.com | |
| Portál | Startlap | www.startlap.com |
| Portál | Extra | www.extra.hu |
| Portál | EOL | www.eol.hu |
| Szórakozás | C64 info | www.c64.org |
A táblázat fejlécében a name mezőnév sajnos kétszer is szerepel, hiszen mindkét táblában ugyanaz az azonosító, de ez nem igazán zavaró, hiszen mi tudjuk, hogy mit kérdeztünk le. Egyébként ezt módosítani is tudjuk az as kiegészítéssel:
select topics.Name
as Topic, links.Name, links.URL
from topics, links
where links.TopicId=topics.Id;
Ebben az esetben az eredmény táblázat fejléce a megadott helyettesítő szót mutatja:
Topic |
Name |
URL |
| Kereső | Altavista | www.altavista.com |
| Kereső | www.google.com | |
| Portál | Startlap | www.startlap.com |
| Portál | Extra | www.extra.hu |
| Portál | EOL | www.eol.hu |
| Szórakozás | C64 info | www.c64.org |
6 rows in set (0.00 sec)
Természetesen az összetett SELECT utasításoknál is használhatunk a where záradékban egyéb szűkítő feltételeket, amelyeket az and logika kapcsolattal kell a táblákat összekötő feltétel mellé tennünk. Például, ha csak a "Portál" témakör linkjeire vagyunk kíváncsiak, akkor a where feltételt így módosítjuk:
select topics.Name
as Topic, links.Name, links.URL
from topics, links
where links.TopicId=topics.Id and topics.name='Portál';
Topic |
Name |
URL |
| Portál | Startlap | www.startlap.com |
| Portál | Extra | www.extra.hu |
| Portál | EOL | www.eol.hu |
3 rows in set (0.01 sec)
Végezetül következzen néhány egyéb csoportosító, rendező záradéka a SELECT utasításnak. Részeletes magyarázat MySQL dokumentációjában, itt egy-két példa következik:
A links tábla sorainak száma:
mysql> select count(*) from links;
count(*) |
6 |
1 row in set (0.00 sec)
A 2-es számú témakörhöz tartozó sorok száma a links táblában:
mysql> select count(*) from links where topicid=2;
count(*) |
3 |
1 row in set (0.00 sec)
A témakör-azonosítók és a hozzájuk tartozó linkek száma (csoportosítás):
mysql> select topicid, count(*) from links group by topicid;
TopicId |
count(*) |
1 |
2 |
2 |
3 |
3 |
1 |
3 rows in set (0.00 sec)
A links tábla a Name mező szerint rendezetten (ABC sorrend) kiírva:
mysql> selcet * from links order by name;
| Id |
TopicId |
Name |
URL |
Options |
Status |
| 1 |
1 |
Altavista | www.altavista.com | B | 1 |
| 6 |
4 |
C64 info | www.c64.org | 1 |
|
| 5 |
2 |
EOL | www.eol.hu | BI | 1 |
| 4 |
2 |
Extra | www.extra.hu | BI | 1 |
| 2 |
1 |
www.google.com | B | 1 |
|
| 3 |
2 |
Startlap | www.startlap.hu | BI | 1 |
6 rows in set (0.01 sec)
Ugyanez a rendezés fordított sorrendben:
mysql> select * from links order by name desc;
| Id |
TopicId |
Name |
URL |
Options |
Status |
| 3 |
2 |
Startlap | www.startlap.hu | BI | 1 |
| 2 |
1 |
www.google.com | B | 1 |
|
| 4 |
2 |
Extra | www.extra.hu | BI | 1 |
| 5 |
2 |
EOL | www.eol.hu | BI | 1 |
| 6 |
4 |
C64 info | www.c64.org | 1 |
|
| 1 |
1 |
Altavista | www.altavista.com | B | 1 |
6 rows in set (0.00 sec)
Talán ezek a példák is mutatják, hogy az SQL nyelv és általában az adatbázis milyen hatékony eszköz. Hangsúlyozzuk, hogy e fejezetünk csak az alapszintű SQL ismereteket mutatta be.