A MySQL szerver használata

 

Adatbázis létrehozása

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.

 

Hozzáférési jogok beállítása

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.

 

Belépés új felhasználóként

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áziskezelés alapjai

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.

 

Adattábla

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)

Email

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@
homeserver.hu

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!

 

A mysqlshow használata

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
Email 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
 
Email 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;

CREATE TABLE `accounts` (
`Id` int(11) default NULL,
`Username` varchar(16) default NULL,
`Password` varchar(16) default NULL,
`Realname` varchar(50) default NULL,
`Email` varchar(50) default NULL,
`Status` int(11) default NULL,
`CreateDate` date default NULL,
`ExpireDate` date default NULL
) TYPE=MyISAM

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.

 

Az adattábla törlése

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)

 

További specifikációk

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),
  Email 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
 
Email 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!

 

A négy alapművelet

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.

INSERT

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.

SELECT

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 Email 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.

UPDATE

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

DELETE

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.

 

Linkek adatbázis

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:

create table topics (
  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
Google 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)

 

Összetett SELECT

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ő Google 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ő Google 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
Google 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
Google 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.