Home Map Index Search News Archives Links About LF
[Top Bar]
[BottomBar]
SQL'e giri� ve PostgreSQL'in kurulumu
[no author] [no author]
Yazar: Manuel Soriano
<manu(at)europa3.com>



�ngilizce'ye �eviren:
Miguel A Sepulveda <sepulveda(at)linuxfocus.org>


T�rk�e'ye �eviren:
Erdal Mutlu <erdal(at)linuxfocus.org>

Content:

 

SQL'e giri� ve PostgreSQL'in kurulumu

[Illustration]

�zet:

Bu k�sa kurs �� k�s�mdan olu�maktad�r. �lk k�s�mda, SQL hakk�nda genel bilgi ile kamuya a��k (public domain) veritaban� olan PostgreSQL hakk�nda bilgiler verce�iz. �kinci k�s�mda SQL buyruklar�n� daha ayr�nt�l� olarak i�leyece�iz. ���n�c� k�s�mda, geli�mi� SQL buyruklar, projelerde kullan�lmas� ilgin� olabilecek PostgreSQL'e �zg� fonksiyonlar ile her�eyi birden g�steren bir C program�n� g�zden ge�irece�iz.
_________________ _________________ _________________

 

Giri�

Verileri veritabanlar� d���nda da saklamak olas�yken, t�m olas�l�klar hakk�nda yazmak, yaz�m�z�n amac� d���na ��kaca��ndan, onlar hakk�nda burada s�z etmeyece�im.

Yak�n zamana kadar, verilere olan eri�im, belli bi�imde tan�mlanm�� ba�lant�lar �zerinde yap�l�yordu. B�yle yap�lan eri�imlerin getirileri vard�. �zellikle h�z bunlardan biridir. Ancak, g�t�r�leri de yok de�ilidi. Veriye sadece var olan bir ba�lant� �zerinden eri�ilebilinmesi, en �nemli g�t�r�lerdendi. S�zgelimi:

     �lke -> eyaletler -> b�lgeler
ba�lant�s� tan�mlanm��sa, a�a��daki gibi bir eri�im olamazd�:
     �lke -> b�lgeler
Buradaki "->" i�areti ba�lant�y� simgelemektedir.

E�er, yukar�daki ikinci ili�kiyi tan�mlamak isteseydik, �emay� yeniden tan�mlamam�z ve derlememiz gerekecekti ...

Asl�nda, hiyerar�ik veritabanlar�ndaki ili�kiler dura�and�r ve de�i�tirilmeleri gerekti�inde, �emalar�n yeniden tan�mlanmas� ve daha sonra da derlenmesi gerekir.

�li�kisel veritaban� arkas�nda yatan d���nce, dura�an ba�lant�ya gereksinim duyulmadan, verileri sorgu s�ras�nda birbirleriyle bir belirte� (identifier) arac�l���yla tam olarak ili�kilendirmektir.

Yukar�daki c�mleyi anlamak i�in insan�n bir aspirine gereksinimi vard�r:)

Hiyerar�i i�inde a�a��lara do�ru gidebilmemiz i�in ili�kisel veritabani y�neticilerinin dura�an ba�lant�lara sahip olmalar� gerekmemektedir. Onun yerine, sorgunun sonucu olarak olu�acak ge�ici ili�kiyi ve ili�ki i�erisinde yer alan verileri, tekil (unique) belirlemeye yarayan bir kod kullan�lmaktad�r.

Kimliklendirme bir kod numaras�ndan ba�ka bir �ey de�ildir. S�zgelimi, benim telefon numaram :

1234567

de�il, :

34 6 1234567

dir. Asl�nda benim telefon numaram �lke kodu (34), eyalet kodu (6) ve ilgili ayg�t numaras� (1234567) ile tan�mlanmaktad�r.

Yukar�da verdi�im �rnek i�in temel kavramlar� belirtecek olursam:

     Bir eyalet ve �lkeye ait olan her b�lgenin bir kodu vard�r.
     Bir �lkeye ait olan her eyaletlerin bir kodu vard�r.
     Her �lkenin bir kodu vard�r.

Bir eyaletteki t�m b�lgeleri elde etmek i�in, b�lgeleri, eyaletler ve �lkelerle, b�lge ve �lke kodu arac�l��� ile ili�kilendiriyoruz. Bir �lkedeki t�m b�lgeleri elde etmek i�in, b�lgeler ile �lkeleri �lke kodu arac�l��� ile ili�kilendiriyoruz. Bu ili�kiler ge�icidir ve sadece sorgu s�ras�nda varl�k g�stermektedir.

Konunun zor kavrand���n� biliyorum ve a�a��da verece�im �rneklerle ait olma ve kodlar gibi kavramlar�n daha iyi anla��lac��n� umuyorum.

DB y�neticisine y�nelti�im ilk sorgunun sonucunda, DB y�neticisinden ilgili t�m verileri elde ediyorum. Pek iyi ama, ger�ekte elde etti�im veriler nedir? Her b�lge i�in �lke verileriyle, �lke ve eyaletlerin birle�imini elde edece�im.

�lk sorgum s�ras�nda �lkeler ve b�lgelerin kopyas�ndan olu�an, isimsiz yeni bir nesne yarat�lm�� oldu. Sorgum sona erdi�inde bu nesne ortadan kalkacakt�r.

Bir veri k�mesine eskiden verilen ad dosya (file) idi. Dosya i�erisinde yazma�lar (register) vard� ve yazma�lar da kendi i�inde alanlardan (field) olu�maktayd�. �li�kisel veritabanlar�nda, dosya, tablo ad� alt�nda bilinmekte ve bir tablo sat�rlardan olu�maktad�r. Sat�rlar da kendi i�inde s�t�nlardan olu�maktad�r. Bunlar, isim de�i�ikli�inden ba�ka bir �ey de�ildir.

Verilere eri�im dili olarak, baz� hiyerar�ik veritaban� y�neticileri SQL dilinin de kullan�labilece�i s�ylenmekte. Ama bu bir �akadan ba�ka bir �ey de�ildir. SQL dili, ili�kisel veritaban� y�neticilerinin ait bir mal gibidir.

SQL kullan�m�n� g�sterebilmek i�in PostgreSQL ili�kisel veritaban� y�neticisini kullaca��z. PostgreSQL her nekadar SQL kurallar�yla tam uygunluk g�stermese de, bizim amac�m�z i�in yeterilidir. Ayr�ca PostgreSQL, �ok daha a��r i�lerin y�neticisidir.

Yaz�n�n amac� SQL oldu�unu belirtikten sonra, izin verirseniz, PostgreSQL veritaban� sisteminin k�saca y�kleni�ini g�stereyim. �lk yapman�z gereken www.postgresql.org adresinden kaynak kodlar�n� ve varsa yamalar� indirmektir. Paketi tar xvfz buyru�u ile bir dizinde a��n ve cd postgresql-6.3 ile olu�an dizinine ge�in:

cd src
./configure --prefix=/the/desired/path
make all >& make.log &
tail -f make.log

export PATH=$PATH:/the/desired/path/pgsql/bin
export MANPATH=$MANPATH:/the/desired/path/pgsql/man
export PGLIB=/the/desired/path/pgsql/lib
export PGDATA=/the/desired/path/pgsql/data

initdb
createdb test
psql test
Welcome to the POSTGRESQL interactive sql monitor:
  Please read the file COPYRIGHT for copyright terms of POSTGRESQL

   type \? for help on slash commands
   type \q to quit
   type \g or terminate with semicolon to execute query
 You are currently connected to the database: postgres

test=>
Yukar�da g�rm�� oldu�unuz sat�r, postgres'in buyruk imlecidir. Art�k buyruklar�m�z� vermeye ba�layabiliriz:
mytest=>create table mytest (field1 varchar(10));
CREATE

mytest=>insert into mytest values ('hello');
INSERT number 1

mytest=>commit work;
NOTICE:EndTransactionBlock and not inprogress/abort state
END

mytest=>select * from mytest;
field1
------
hello
(1 row)

mytest=>drop table mytest;
DROP

mytest=>Ctrl-d
Art�k SQL ortam�ndan ��km�� durumday�z.

Postgres95'i derleme ve y�klemede sorun ya�arsan�z, paketle birlikte gelen INSTALL dosyas�n� okuman�z� �neririm.

�zin verirseniz bir konu d��� a��klama daha yapmak istiyorum. �li�kisel bir veritaban� genel olarak a�a��daki bile�enlerden olu�maktad�r:

  1. Veri eri�im katman�
  2. SQL i�leme katman�
  3. SQL ayr��t�rma katman�
  4. Haberle�me katman�

�stemci olarak sunucuyla yapt���m�z haberle�me dolay�s�yla bizler, yukar�dakilerden d�rd�nc� katman� tan�yoruz. G�nderdi�imiz SQL buyruklar�, SQL ayr��t�rma (parser) katman�na iletilmektedir. Burada buyruklar denetlenmekte ve hata yoksa, ikinci katmana iletilmektedir. T�m i�leme ve sorgulamalar veri katman�n�n da yard�m�yla, bu katmadan yap�lmaktad�r. Yap�lan i�lemler aras�nda, veri toplama, haberle�me katman� arac�l��� ile hatalar�n istemciye iletilmesi s�ralanabilir. SQL i�leme katman� istemciyle olan haberle�mesinde, veri aktar�m� denetimi, hareketler (transactions) ve kesmeler gibi i�lemleri yerine getirirken, istemciyle s�rekli ileti�im halindedir.

 

�lk ad�mlar

Yukar�da �rnek olarak verilenleri g�stermeye y�nelik, �� adet tablo (veya dosya) yaratal�m:

�lkeler.sql dosyays�:
create table ulkeler (ulke_kodu integer, adi varchar(30));
insert into ulkeler values (1, '�lke 1');
insert into ulkeler values (2, '�lke 2');
insert into ulkeler values (3, '�lke 3');
commit work;
eyaletler.sql dosyas� :
create table eyaletler (eyalet_kodu int,
            ulke_kodu int,
            eyalet_adi varchar(30));
insert into eyaletler values (1, 1, 'Eyalet 1, �lke 1');
insert into eyaletler values (2, 1, 'Eyalet 2, �lke 1');
insert into eyaletler values (1, 2, 'Eyalet 1, �lke 2');
insert into eyaletler values (2, 2, 'Eyalet 2, �lke 2');
insert into eyaletler values (1, 3, 'Eyalet 1, �lke 3');
insert into eyaletler values (2, 3, 'Eyalet 2, �lke 3');
commit work;
b�lgeler.sql dosyas�:
create table bolgeler (ulke_kodu int,
            eyalet_kodu int,
            bolge_kodu int,
            bolge_adi varchar(60));
insert into bolgeler values (1, 1, 1, 'B�lge 1, Eyalet 1, �lke 1');
insert into bolgeler values (2, 1, 1, 'B�lge 2, Eyalet 1, �lke 1');
insert into bolgeler values (3, 1, 1, 'B�lge 3, Eyalet 1, �lke 1');
insert into bolgeler values (1, 2, 1, 'B�lge 1, Eyalet 2, �lke 1');
insert into bolgeler values (2, 2, 1, 'B�lge 2, Eyalet 2, �lke 1');
insert into bolgeler values (3, 2, 1, 'B�lge 3, Eyalet 2, �lke 1');
insert into bolgeler values (1, 3, 1, 'B�lge 1, Eyalet 3, �lke 1');
insert into bolgeler values (2, 3, 1, 'B�lge 2, Eyalet 3, �lke 1');
insert into bolgeler values (3, 3, 1, 'B�lge 3, Eyalet 3, �lke 1');
insert into bolgeler values (1, 1, 2, 'B�lge 1, Eyalet 1, �lke 2');
insert into bolgeler values (2, 1, 2, 'B�lge 2, Eyalet 1, �lke 2');
insert into bolgeler values (3, 1, 2, 'B�lge 3, Eyalet 1, �lke 2');
insert into bolgeler values (1, 2, 2, 'B�lge 1, Eyalet 2, �lke 2');
insert into bolgeler values (2, 2, 2, 'B�lge 2, Eyalet 2, �lke 2');
insert into bolgeler values (3, 2, 2, 'B�lge 3, Eyalet 2, �lke 2');
insert into bolgeler values (1, 3, 2, 'B�lge 1, Eyalet 3, �lke 2');
insert into bolgeler values (2, 3, 2, 'B�lge 2, Eyalet 3, �lke 2');
insert into bolgeler values (3, 3, 2, 'B�lge 3, Eyalet 3, �lke 2');
insert into bolgeler values (1, 1, 3, 'B�lge 1, Eyalet 1, �lke 3');
insert into bolgeler values (2, 1, 3, 'B�lge 2, Eyalet 1, �lke 3');
insert into bolgeler values (3, 1, 3, 'B�lge 3, Eyalet 1, �lke 3');
insert into bolgeler values (1, 2, 3, 'B�lge 1, Eyalet 2, �lke 3');
insert into bolgeler values (2, 2, 3, 'B�lge 2, Eyalet 2, �lke 3');
insert into bolgeler values (3, 2, 3, 'B�lge 3, Eyalet 2, �lke 3');
insert into bolgeler values (1, 3, 3, 'B�lge 1, Eyalet 3, �lke 3');
insert into bolgeler values (2, 3, 3, 'B�lge 2, Eyalet 3, �lke 3');
insert into bolgeler values (3, 3, 3, 'B�lge 3, Eyalet 3, �lke 3');
commit work;

SQL buyruklar�n� i�eren bir dosyay� pgsql ile a�a��daki gibi verebilirsiniz:

\i dosya_ad�

Buyruklar� kopyala ve yap��t�r y�ntemiyle de verebilirdik.

�imdi var olan b�lgeleri g�relim:

manu=> select * from bolgeler;
ulke_kodu|eyalet_kodu|bolge_kodu|bolge_adi
---------+-----------+----------+----------------------------
        1|          1|         1|B�lge 1, Eyalet 1, �lke 1
        2|          1|         1|B�lge 2, Eyalet 1, �lke 1
        3|          1|         1|B�lge 3, Eyalet 1, �lke 1
        1|          2|         1|B�lge 1, Eyalet 2, �lke 1
        2|          2|         1|B�lge 2, Eyalet 2, �lke 1
        3|          2|         1|B�lge 3, Eyalet 2, �lke 1
        1|          3|         1|B�lge 1, Eyalet 3, �lke 1
        2|          3|         1|B�lge 2, Eyalet 3, �lke 1
        3|          3|         1|B�lge 3, Eyalet 3, �lke 1
        1|          1|         2|B�lge 1, Eyalet 1, �lke 2
        2|          1|         2|B�lge 2, Eyalet 1, �lke 2
        3|          1|         2|B�lge 3, Eyalet 1, �lke 2
        1|          2|         2|B�lge 1, Eyalet 2, �lke 2
        2|          2|         2|B�lge 2, Eyalet 2, �lke 2
        3|          2|         2|B�lge 3, Eyalet 2, �lke 2
        1|          3|         2|B�lge 1, Eyalet 3, �lke 2
        2|          3|         2|B�lge 2, Eyalet 3, �lke 2
        3|          3|         2|B�lge 3, Eyalet 3, �lke 2
        1|          1|         3|B�lge 1, Eyalet 1, �lke 3
        2|          1|         3|B�lge 2, Eyalet 1, �lke 3
        3|          1|         3|B�lge 3, Eyalet 1, �lke 3
        1|          2|         3|B�lge 1, Eyalet 2, �lke 3
        2|          2|         3|B�lge 2, Eyalet 2, �lke 3
        3|          2|         3|B�lge 3, Eyalet 2, �lke 3
        1|          3|         3|B�lge 1, Eyalet 3, �lke 3
        2|          3|         3|B�lge 2, Eyalet 3, �lke 3
        3|          3|         3|B�lge 3, Eyalet 3, �lke 3
(27 rows)
manu=>
Sonu� 27 sat�rdan olu�tu ve �u anda pgsql bizden bir sonraki buyru�u vermemizi beklemektedir. A�a��daki buyru�u deneyin:
manu=> select * from ulkeler, eyaletler;
ulke_kodu  |adi   |eyalet_kodue|ulke_kodu|eyalet_adi
-----------+------+------------+---------+------------------
          1|�lke 1|           1|        1|Eyalet 1, �lke 1
          2|�lke 2|           1|        1|Eyalet 1, �lke 1
          3|�lke 3|           1|        1|Eyalet 1, �lke 1
          1|�lke 1|           2|        1|Eyalet 2, �lke 1
          2|�lke 2|           2|        1|Eyalet 2, �lke 1
          3|�lke 3|           2|        1|Eyalet 2, �lke 1
          1|�lke 1|           1|        2|Eyalet 1, �lke 2
          2|�lke 2|           1|        2|Eyalet 1, �lke 2
          3|�lke 3|           1|        2|Eyalet 1, �lke 2
          1|�lke 1|           2|        2|Eyalet 2, �lke 2
          2|�lke 2|           2|        2|Eyalet 2, �lke 2
          3|�lke 3|           2|        2|Eyalet 2, �lke 2
          1|�lke 1|           1|        3|Eyalet 1, �lke 3
          2|�lke 2|           1|        3|Eyalet 1, �lke 3
          3|�lke 3|           1|        3|Eyalet 1, �lke 3
          1|�lke 1|           2|        3|Eyalet 2, �lke 3
          2|�lke 2|           2|        3|Eyalet 2, �lke 3
          3|�lke 3|           2|        3|Eyalet 2, �lke 3
(18 rows)
18 sat�r m�? Ama bu nas�l olur? Biz sadece 3 �lke ve 6 eyalet girmi�tik. Nas�l oluyor da 18 sat�r elde ediyoruz?

Son buyruk, iki tablonun birle�imini olu�turdu. pgsql'e birle�imde kullan�lacak kural� belirtmedi�imizden, ulkeler ve eyaletler tablosunu ili�kilendiren pgsql, olu�abilecek t�m olas�l�klar� yaratt�. 3 adet �lke ile 6 adet eyaleti �arpt���n�zda toplam 18 adet kay�t ortaya ��kar. Bu sonu� hem mant�ks�z ve hem de kullan��s�zd�r. �yisimi biz, a�a��daki gibi yapal�m:

manu=> select * from ulkeler, eyaletler
manu-> where ulkeler.ulke_kodu = eyaletler.ulke_kodu;
ulke_kodu  |ad�   |eyalet_kodu|ulke_kodu|eyalet_adi
----------+-------+---------+-----------+------------------
          1|�lke 1|        1|          1|Eyalet 1, �lke 1
          1|�lke 1|        2|          1|Eyalet 2, �lke 1
          2|�lke 2|        1|          2|Eyalet 1, �lke 2
          2|�lke 2|        2|          2|Eyalet 2, �lke 2
          3|�lke 3|        1|          3|Eyalet 1, �lke 3
          3|�lke 3|        2|          3|Eyalet 2, �lke 3
(6 rows)
Evet, bu sonu� daha akla yatk�n gelmeye ba�lad�. Toplam alt� sat�r, do�ru, �yle de�il mi?

Evet, toplam alt� b�lge var ve herbiri bir �lkede bulunmaktad�r. Sonucun toplam b�lge say�s� kadar ��kmas� akla yatk�n, ��nk� b�lgelerin bir �zelli�i �lke i�erisinde bulunmalar�d�r. �lkeler tablosuyla b�lgeler tablosunu �lke kodu arac�l��� ile ili�kilendiriyoruz. Hat�rlarsan�z, �lkeler ve b�lgeler tablolar�n�n her ikisinde de ait olduklar� �lkenin kodu bulunmaktad�r.

Neden ulkeler.ulke_kodu = eyaletler.ulke_kodu ?

Hem ulkeler ve hem de b�lgeler tablosundaki ulke_kodu ayn� isme sahiptir:

ulke_kodu=ulke_kodu
yazsayd�k mant�ks�z olurdu, ��nk� yorumlay�c�, hangisinin hangi tabloya ait oldu�unu bilemezdi ve a�a��daki gibi bir hata elde ederdiniz:
select * from ulkeler, eyaletler
        where ulke_kodu = ulke_kodu;

ERROR:  Column ulke_kodu is ambiguous
S�tun isimleri i�in ba�ka isimler de kullanabiliriz:
manu=> select * from ulkeler a, eyaletler b
manu-> where a.ulke_kodu = b.ulke_kodu;
ulke_kodu|adi        |eyalet_kodu|ulke_kodu|eyalet_adi
-----------+---------+---------+-----------+------------------
          1|�lke 1|        1|          1|Eyalet 1, �lke 1
          1|�lke 1|        2|          1|Eyalet 2, �lke 1
          2|�lke 2|        1|          2|Eyalet 1, �lke 2
          2|�lke 2|        2|          2|Eyalet 2, �lke 2
          3|�lke 3|        1|          3|Eyalet 1, �lke 3
          3|�lke 3|        2|          3|Eyalet 2, �lke 3
(6 rows)
Pek iyi, veritaban� y�neticisinden elde etti�imiz sonu� nedir?
ulke_kodu, adi, eyalet_kodu, ulke_kodu eyalet_adi.

"select * from ulkeler, eyaletler" sorgusunda HER�EY anlam�na gelen * i�aretini kulland���m�zdan, �lkeler tablosundaki iki ve eyaletler tablosundaki �� s�tunu birlikte elde ettik. �imdi ise, daha belirleyici olal�m:

manu=> select a.ulke_kodu, eyalet_kodu, adi, eyalet_adi
manu-> from ulkeler a, eyaletler b
manu-> where a.ulke_kodu = b.ulke_kodu;
ulke_kodu  |eyalet_kodu|adi    |eyalet_adi
-----------+---------+---------+------------------
          1|        1|�lke 1|Eyalet 1, �lke 1
          1|        2|�lke 1|Eyalet 2, �lke 1
          2|        1|�lke 2|Eyalet 1, �lke 2
          2|        2|�lke 2|Eyalet 2, �lke 2
          3|        1|�lke 3|Eyalet 1, �lke 3
          3|        2|�lke 3|Eyalet 2, �lke 3
(6 rows)
Son sorgumuzda, �lke kodu, eyalet kodu, �lke ve eyalet adlar�n� belirtmi�tik. Dikkat ederseniz, a.ulke_kodu gibi baz� s�tunlar �zel isimlendirilmi�, eyalet_adi gibi baz�lar� da isimlerini korumu�lard�r. Bunun nedeni, ulke_kodu alan�n�n her iki tabloda da yer almas�d�r. Buna kar��n olarak eyalet_adi sadece eyaletler tablosunda bulunmaktad�r. Sadece bir defa yer alan alan isimlerinin �zel isimlendirilmesine gerek yoktur.

�sterseniz olay� biraz daha kar��t�ral�m:

manu=> select a.ulke_kodu, eyalet_kodu, adi, eyalet_adi
manu-> from ulkeler a, eyaletler b
manu-> where a.ulke_kodu = b.ulke_kodu
manu-> and a.ulke_kodu = 3;
ulke_kodu  |eyalet_kodu|adi     |eyalet_adi
-----------+---------+---------+------------------
          3|        1|�lke 3|Eyalet 1, �lke 3
          3|        2|�lke 3|Eyalet 2, �lke 3
(2 rows)
Bu sefer, sorgumuzu 3 numaral� �lke ile s�n�rlam�� olduk.  

Fonksiyonlar

A�a��da, sat�r say�s�n� veren count() fonksiyonunun kullan�m�na bir �rnek g�rmektesiniz:
select count(*) from eyaletler;

count
-----
   27
(1 row)
Sorgu, b�lgeler tablosundaki sat�r say�s�n� vermektedir.
manu=> select ulke_kodu, count(*) from eyaletler
manu-> group by cod_�lke;
ulke_kodu  |count
-----------+-----
          1|    2
          2|    2
          3|    2
(3 rows)
Sorgusu, AYNI �lke koduna sahip sat�rlar�n say�s�n� vermektedir. ulke_kodu alan�n�n burada kullan�lmas�n�n nedeni budur.

��te size daha g�zel bir �rnek:

manu=> select adi, count(*) from ulkeler a, eyaletler b
manu-> where a.ulke_kodu = b.ulke_kodu
manu-> group by adi;
adi      |count
---------+-----
�lke 1|    2
�lke 2|    2
�lke 3|    2
(3 rows)
Biz yine ayn� �� sat�r� elde ediyoruz, ancak bu sefer sonu� daha a��klay�c�d�r.

G�zel, �imdiye kadar sadece �s�nma harekleri yapt�k ve konuya giri� nitelindi�inde �rnekler verdik:-)

 

Kavramlar�n g�zden ge�irilmesi

�imdiye kader SQL'in baz� temel kavramlar�na deyindik. Burada en �nemli olan nokta, SQL'in kendisidir. Art�k belli verilerle de�il, veri elemanlar�yla �a�l���yoruz. Veri eleman�, veritaban�n�n soyut bir kavram�d�r. E�er, basit�e ifade etmek gerekirse : "Var olanlar�n i�inden sadece bir k�sm�n� elde et."

�imdiye kadar g�rm�� oldu�umuz buyruklar� a�a��da �zetledik:

CREATE TABLE Bu buyruk, alanlar�yla birlikte bir tablo yaratmaktad�r.
DROP TABLE Tabloyu yok etmekte.
SELECT Sadece ilgili alanlar�n�n verileriyle doldurulmu� ge�ici bir tablo yaratan bu buyruk, SQL'in temelidir. SELECT buyru�u, fonksiyon, karma��k ifadeler ve alt select'ler olmak �zere, �e�itli paremetreler alabilir:
select count(*) from eyaletler
    where ulke_kodu in (select ulke_kodu from ulkeler);

count
-----
   27
(1 row)
BEGIN WORK Bu da temel buyruklardan biridir. Buyru�u vermekle, veritaban� y�neticisine BEGIN WORK an�na kadar yap�lan T�M de�i�ikliklerin onayland���n� ve yerine getirilmesi emrini vermekteyiz. Bizim kulland���m�z veritaban� y�neticisi, BEGIN WORK hareketlerin ba��n� i�aretlemektedir. Di�er baz� veritaban� y�neticilerinde ise, veri de�i�tirilmesine y�nelik ilk buyruk verildi�inde bu i�aret konulmaktad�r. PostgreSQL'de ise, BEGIN WORK buyru�u verilmedi�inde, veri de�i�tirilmesine y�nelik t�m buyruklar do�rudan i� g�recektir.

Uyar�: veritaban� yap�s�n� (schema) de�i�tirmeye yarayan buyruklar, COMMIT WORK buyru�unu kendili�inden vermektedir. Bu y�zden, BEGIN WORK buyru�u ile hareketler ba�lat�lm�� ve veritaban� yap�s�n� de�i�tirmeye y�nelik buyruklardan bir verilmi�se, hareketler hemen durudurulmakta ve daha sonra ROLLBACK WORK buyru�unu vermek bir i�e yaramamaktad�r. Yap�lan de�i�iklikler geriye al�namamaktad�r.

Kullan�c�lardan biri hareketler i�erisinde iken, bu kullan�c� di�er kullan�c�lar�n�n, kendi verilerine olan eri�imi a�a��daki gibi tan�mlayabilir:

  • De�i�tirilmi� verilere olan eri�ime izin ver.
  • Transaksiyondan �nceki as�l verilere eri�mesini sa�la.
  • Veri eri�imini engelle.
COMMIT WORK De�i�tirilmi� verileri veritaban� i�erinde etkin k�larak, hareketleri sonland�r�r. ROLLBACK WORK buyru�u ise, hareketlerin ba��nda veriler ne durumda ise, o duruma geri d�n�lmesini sa�lar. Ba�ka bir deyi�le, yap�lan de�i�iklikleri iptal eder.


Hata olu�tu�unda, hareketler i�erisinde yap�lan de�i�iklikleri iptal edilebiliniyorsa, hareketler �ok �nemli bir ara�t�r. �sterseniz bu i�lemi deneyebiliriz. �nceki hareketleri sonland�rmak i�in rollback work buyru�unu vermeliyiz:
manu=> select * from ulkeler;
ulke_kodu|adi
-----------+---------
          1|�lke 1
          2|�lke 2
          3|�lke 3
(3 rows)
�� adet sat�r var.
begin work;
Transaksiyon ba�lang�c� i�aretler.
insert into ulkeler values (5, '�lke ger�ek de�il');
Bir sat�r ekledik. Bu sat�r�n ger�ekte eklenip eklenmedi�ine bir bakal�m:
manu=> select * from ulkeler;
ulke_kodu|adi
-----------+----------------
          1|�lke 1
          2|�lke 2
          3|�lke 3
          5|�lke ger�ek de�il
(4 rows)
T�m sat�rlar tamam. Daha sonra
rollback work;
buyru�uyla, hareketleri iptal edelim ve
manu=> select * from ulkeler;
ulke_kodu|adi
-----------+---------
          1|�lke 1
          2|�lke 2
          3|�lke 3
(3 rows)
sat�r say�s�na bakt���m�zda, tabloda sadece eski sat�rlar�n, yani 3 adet sat�r�n yer ald���n� g�r�r�z.

INSERT Bu buyruk, daha �nce de g�rd���m�z gibi, bir tabloya kay�t veya sat�r girilmesini sa�lar.
CREATE TABLE �nemli buyruklardan biri daha. Buyruk, bir tabloyu alanlar�yla birlikte yarat�lmas�n� sa�lamaktad�r. Alanlar�n sahip olabilecekleri veri t�rleri a�a��da verilmi�tir:
char(s��a): Karakter ve say�lar�n saklanmas�ndan kullan�lan ve sabit say�da (s��a 1,2,3,4 vs de�erlerini alabilir.) karakter alabilen bir veri t�r�d�r.
varchar(s��a): Karakter ve say�lar�n saklanmas�ndan kullan�lan ve en fazla s��a kadar say�da (s��a 1,2,3,4 vs de�erlerini alabilir.) karakter alabilen de�i�ken uzunlukta bir veri t�r�d�r. En fazla 30 byte uzunlu�unda olabilir.
int2: �ki byte bellek kaplayan ve -2**-15 ile 2**15 aral���nda tam say� de�erleri alabilen bir veri t�r�d�r.
int4: D�rt byte bellek kaplayan ve -2**-31 ile 2**31 aral���nda tam say� de�erleri alabilen bir veri t�r�d�r.
money: Sabit uzunluklu say�sal veri t�r�d�r. S�zgelimi, money(6,3) olarak tan�mlan�rsa, 6 basamak virg�lden �nce, 3 basamak da virg�lden sonras�na, yani k�s�rata ayr�lm�� olacakt�r.
time: HH:MM:SS:CCC saat, dakika, saniye ve saniyenin binde biri �eklinde zaman de�eri alabilen bir veri t�r�d�r.
date: YYYY/MM/DD y�l, ay ve g�n �eklinde tarih de�eri alabilen bir veri t�r�d�r.
timestamp: Bu yukar�daki time ve date veri t�rlerinin bir bile�imini, YYYY/MM/DD:HH:MM:SS:CCC �ekklinde alabilen bir veri t�r�d�r.
float(n): Duyarl��� az ger�ek say� alabilen bir veri t�r�d�r.
float3: float'un iki kat� duyarl��a sahip ve ger�ek say� alabilen bir veri t�r�d�r.
Veri t�r� tan�mlamalar� veritaban� y�neticileri aras�nda farkl�l�k g�stermektedir. Ancak, �e�itli veri t�rlerini ve �zelliklerini tan�mlayan bir SQL �l��n� (standard�) (Sonuncusunun ad� ANSI/92 veya SQL/3 idi.) da vard�r. Bu kurs i�erisinde SQL veri t�rlerinden PostgreSQL'e �zg� sadece bir iki adedini g�rece�iz.
DELETE Tablodaki sat�rlar�n silinmesini sa�lar.
UPDATE Bir tablonun sat�rlar�nda yer alan alanlar�n de�i�tirilmesini sa�lar.
 

�zet

Garip anlat�m�ma kar��n, bir ili�kisel veritaban� y�klemi� ve SQL'e giri� yapm�� olduk.

SQL, verilerin �zerine soyut bir katman yaratmam�z� ve verilere olan eri�imi istedi�imiz do�rultuda yapmam�z� sa�lamaktad�r.

Buraya kadar anlat�lanlardan akla �u soru gelebilir: SQL uygulamalar i�erisinde nas�l kullan�l�yor?

Sorunun yan�t�, C ile SQL kullan�m� hakk�nda yazaca��m�z bir yaz�da verilecektir.


G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r.
© Manuel Soriano, FDL
LinuxFocus.org
�eviri bilgisi:
es --> -- : Manuel Soriano <manu(at)europa3.com>
es --> en: Miguel A Sepulveda <sepulveda(at)linuxfocus.org>
en --> tr : Erdal Mutlu <erdal(at)linuxfocus.org>