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�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. |
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�lgelerba�lant�s� tan�mlanm��sa, a�a��daki gibi bir eri�im olamazd�:
�lke -> b�lgelerBuradaki "->" 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-dArt�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:
�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.
�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_koduyazsayd�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 ambiguousS�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?
"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.
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:-)
�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:
|
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. |
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:
|
||||||||||||||||||||
DELETE | Tablodaki sat�rlar�n silinmesini sa�lar. | ||||||||||||||||||||
UPDATE | Bir tablonun sat�rlar�nda yer alan alanlar�n de�i�tirilmesini sa�lar. |
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:
|