Home Map Index Search News Archives Links About LF
[TopBar]
[Bottom Bar]
[Photo notavailable]
Manuel Soriano

Yazara yazmak i�in 
��erik 
Giri� 
Bir tablo yarat�m� 
Bir tablo �zerinde oynamak 
Tabloya veri giri�i yapma 
Veri se�imi 
WHERE in detaylar�  
UPDATE komutu 
DELETE komutu 
Kaynaklar

 

SQL E�itselyaz�s�
B�l�m II

�eviri: Ye�im Tanr�sever ve Fehmi Toprak

[Illustration] 

�zet: �kinci b�l�mde yine SQL dilinin baz� temel ifadelerini g�rece�iz 


Giri�

Bu SQL dersinin ikinci b�l�m�d�r.Bu b�l�mde, �esitli  SQL komutlarini g�rece�iz (bir tablonun yarat�lmasi,de�i�iklikleri ve silinmesi).  

Her�eyden �nce, bence en  �nemli olan SELECT komutu �zerinde odaklanaca��z  

Umar�m bu ikinci b�l�m sizin i�in eylenceli ve ��retici olur.  

Bir tablo yarat�l�m�

Ilk yerle�meden de g�rd�g�m�z gibi bir tablo olusturmak i�in CREATE komutunu  TABLE nitelikcisiyle kullanmaktayiz.  
CREAT komutu tablo, kullanici yaratmakta da kullanilir.  
  • kullanicilar: CREATE USER 
  • tablolar: CREATE TABLE 
  • indeksler: CREATE INDEX 
  • baki�lar: CREATE VIEW 
CREATE komutu bir�eyin yarat�lacag�n� belirtir.Daha ilerde bunun ne ve de nasil oldugunu inceleyecegiz. �u an bizi ilgilendiren ise bir tablonun yarat�lmas�d�r:  

Syntax

CREATE TABLE isim ( kolon tip [DEFAULT deger] [NOT NULL], ...
      [INHERITS (kal�tlar, ...)]
      [CONSTRAINT constrains CHECK (test), CHECK (test)] );
Burada:  
isim: tabloya verilen ve komutlarla da kullanilan isim
Kolon: kolonun ismi
Tip: bu verinin tipidir(varchar, char, int, date, time, timestamp), Postgres in baska turde verileri de vardir,fakat bunlar ANSI SQL ile uyumlu degildir.
Deger: normal olarak alinacak deger 
Kal�tlar:  Postgres' e ozeldir. baska bir tablodan alinan bir kal�t� tanimlar.Bu yarat�lan ve bir b�l�m� kullan�lan tablonun kolonlar�n�n tamam�n� i�ermektedir.
Nom_cons: Siranin her degisime ugramasinda uygulanacak olan b�t�nl�k kuralidir
Test: Incelenecek sartlar
�rne�in:  
CREATE TABLE ulkeler (
         cod_ulke integer NOT NULL,
         isim varchar(30))
   CONSTRAINT cod_raro CHECK (cod_ulke > 0 AND cod_ulke < 154);
Bu �rnekle beraber ulkelerin bir tablosunu olusturduk.Her yeni satir yazisimizda, su sartlarla karsilasilacaktir:  
  • �lke kodu bo�(null) olmayacaktir.�ayet bir bo�(null) kod eklenmeye calisilirsa asagidaki mesaj cikacaktir:
  • ExecAppend: Fail to add null value in not null attribute cod_ulke
  • �lke kodu sifirdan buyuk, 154 ten k���k olacaktir. Sayet bu sartlara uyulmazsa asagidaki hata mesaji goruntulenecektir:
  • ExecAppend: rejected due to CHECK constraint cod_raro

Not

Bo� (NULL) ne anlama gelmektedir?  SQL de iki �e�it durum bulunmaktad�r veri ve veri olmayan (data and no data). Sf�r gibi hi�bir veri i�ermeyen s�ra b�l�mleriyle ilgilenebiliriz(bo�luklar da veridir).  SQL BO�(NULL) kavram�n� tan�r ve onunla �al���r. �rne�in:  

Bir fatura tablom oldu�unu farzedelim ve b�l�mleri de :t�ketici , de�er, kesilen_tarih ,�deme_tarih  

S�ray� yaratt���m zaman,t�ketici,de�er,kesilen_tarih verilerini yazar�m. 

�denmi� tarihini do� b�rakaca��m;b�ylelikle hangi faturan�n a�a��daki komutla �denmesi gerekti�ini ��renebiliriz.: 

SELECT * FROM bills WHERE �deme_tarih IS NULL;
 NULL ile yarat�lan �rnekler:  
insert into ulkeler de�erler (15, NULL);
Yada:  
insert into ulkeler (cod_ulke) de�erler  (27);
"isim" b�l�m�n�n yoklu�u bir BO� (NULL) de�er ortaya ��kar�r. 

 Bir tablo �zerinde oynamak

PostgreSQL de, de�isim sadece yeni kolonlar eklemekten ibarettir. 
 
ALTER TABLE tablo ADD isim tip;
Burada:  
 
Tablo  De�isecek olan tablonun ismi
Isim  Eklenecek kolonun ismi
Tip  Verinin tipi (bakiniz CREATE TABLE)

Bir tabloya veri giri�i yapma

�imdi tablomuza bir veri yazalim:  
SYNTAX:  
INSERT INTO tablo [(kolon, kolon, ...)] VALUES (de�er-1, de�er-2,
...)
ya da:  
INSERT INTO tablo [(kolon, kolon, ...)] SELECT ....
G�r�ld��� gibi,tabloya iki t�rde veri nakledilebiliyor:sat�r sat�ra yada bir yada daha fazla s�ra olusturan sub-select sonucu 

Bir tabloya sat�rlar� yazd���m�z zaman, HER ZAMAN verileri kolonlara yerle�tirmeliyiz. Bunlar BO� de�erleriyle yarat�lacaklard�r. 

E�er komuta hangi kolonlar� dolduraca��m�z� belirtmez isek,verimiz hepsine a�a��daki gibi iletilir.:  

INSERT INTO �lkeler VALUES (34, 'Spain');
Bu yanl�� olacakt�r :  
INSERT INTO �lkeler VALUES (34);
Fakat bu do�ru olacakt�r:  
INSERT INTO �lkeler (cod_ulke) VALUES (34);
ALWAYS  kullanaca��m�z kolonlar� belirler, bir nevi i�aretler.E�er tabloya yen� bir kolon eklenecek ise(ALTER TABLE), yeni yaz�mda  bir hata meydana gelir. �rne�in: 
INSERT INTO �lkeler VALUES (34, 'Spain');  

INSERT 18301 1  

ALTER TABLE �lkeler add n�fus integer  

INSERT INTO �lkeler VALUES (34, 'Spain');  
 

N�fus ver�s�n� ver�lmeme�s oldugunu bel�rten b�r hata mesaj� ortaya c�karNote

PostgreSQL, bir hatay� genelle�tirmez. N�fus ile  bo� bir sat�r olu�turur Bu sadece  PostgreSQL'in bir �zell�g�d�r,di�er SQL duzenley�c�ler�yse sadece bir hata mesaj� vermekle yet�neceklerd�r. 
We still have another type of INSERT, which is fed from a sub-select.  

This type of insert is used very often to create temporary tables or tables to carry out a concrete task of speculative calculations.  

The part replaced is that which touches the data itself, this comes from the SELECT instructions that were carried out previously and the inserting of the data. The instruction SELECT can return one or more rows, this instruction SELECT has the same restrictions of the same SELECT.  

Veri se�imi

Bu noktaya ulasmak istiyorduk! :-))  

We have covered required SQL commands, the SQL language without SELECT would be like beans without sausage.  

The SELECT command allows us to access data, but with the reservation that searches, unions of tables, functions with the data, and with the search rules can be carried out.  

An example:  

select * from �lkeler;
Another example:  
SELECT a.name, SUM(population)
    FROM �lkeler a, states b, counties c
    WHERE b.cod_ulke = a.cod_ulke
        AND (c.cod_ulke = b.cod_ulke
        AND c.state_code = b.state_code)
        AND population IS NOT NULL
        GROUP BY a.name
        ORDER BY sum ASC;
T�m �lkeler n�fusu s�rayla yaz�lm�it�r.
Bunun i�in counties tablosuna  yen� b�r kolon (n�fus) ilave ettim��yle olacakt�r:  
create table ulkeler (kod_ulke int, 
                        state_kod int, 
                        ulke_kod int,
                        ulke_isim varchar(60),
                        n�fus int);
insert into counties values (1, 1, 1, '�lke 1, State 1, County 1',
5435);
insert into counties values (2, 1, 1, '�lke 2, State 1, County 1',
7832);
insert into counties values (3, 1, 1, '�lke 3, State 1, County 1',
4129);
insert into counties values (1, 2, 1, '�lke 1, State 2, County 1',
76529);
insert into counties values (2, 2, 1, '�lke 2, State 2, County 1',
9782);
insert into counties values (3, 2, 1, '�lke 3, State 2, County 1',
852);
insert into counties values (1, 3, 1, '�lke 1, State 3, County 1',
3433);
insert into counties values (2, 3, 1, '�lke 2, State 3, County 1',
7622);
insert into counties values (3, 3, 1, '�lke 3, State 3, County 1',
2798);
insert into counties values (1, 1, 2, '�lke 1, State 1, County 2',
7789);
insert into counties values (2, 1, 2, '�lke 2, State 1, County 2',
76511);
insert into counties values (3, 1, 2, '�lke 3, State 1, County 2',
98);
insert into counties values (1, 2, 2, '�lke 1, State 2, County 2',
123865);
insert into counties values (2, 2, 2, '�lke 2, State 2, County 2',
886633);
insert into counties values (3, 2, 2, '�lke 3, State 2, County 2',
982345);
insert into counties values (1, 3, 2, '�lke 1, State 3, County 2',
22344);
insert into counties values (2, 3, 2, '�lke 2, State 3, County 2',
179);
insert into counties values (3, 3, 2, '�lke 3, State 3, County 2',
196813);
insert into counties values (1, 1, 3, '�lke 1, State 1, County 3',
491301);
insert into counties values (2, 1, 3, '�lke 2, State 1, County 3',
166540);
insert into counties values (3, 1, 3, '�lke 3, State 1, County 3',
165132);
insert into counties values (1, 2, 3, '�lke 1, State 2, County 3',
0640);
insert into counties values (2, 2, 3, '�lke 2, State 2, County 3',
65120);
insert into counties values (3, 2, 3, '�lke 3, State 2, County 3',
1651462);
insert into counties values (1, 3, 3, '�lke 1, State 3, County 3',
60650);
insert into counties values (2, 3, 3, '�lke 2, State 3, County 3',
651986);
insert into counties values (3, 3, 3, '�lke 3, State 3, County 3',
NULL);
commit work;
ALTER TABLO olmadan �uan bunu yapamay�z,ama UPDATE (g�ncelleme) yapilabilir ki bundan daha �nce hic bahsetmemi�tim "cut & paste" (kopyala ve yapistir) metodunu kullanabilirsiniz b�ylece herkes mutlu olur:-))  

�imdi  QUERY'yi kullanabiliriz ve de sonu� a�a��daki gibi olacakt�r:  

isim    |    toplam
- ---------+-------
ulke 1| 705559
ulke 2|1212418
ulke 3|2804018
(3 sira)
Simdi sunu do�rulayabiliriz:  

�lkelerin toplam(nufus) kod_ulke = 1;  

De�erler:  

   toplam
- ------
791986
(1 row)
!!!!!! Bir fark !!!!!!  

states tablosuna bakalim orada state 3 atlanmis, yaptigimiz:  

INSERT INTO states VALUES (3, 1, 'State 3, �lke 1');
INSERT INTO states VALUES (3, 2, 'State 3, �lke 2');
INSERT INTO states VALUES (3, 3, 'State 3, �lke 3');
ve komutu tekrarlayin, sonuc olarak:  
isim    |    toplam
- ---------+-------
ulke 1| 791986
ulke 2|1872205
ulke 3|3003629 
 state 3 u her ulke icin atlamisiz.  

�imdi t�m kaybolmu�lar i�in, unutmamak gerekir ki tablolar EXACT ile birbirlerine ba�lanabiliyorlard�, e�er �artlar uygun ise datalar� a�makta idi.�imdi WHERE' in ilk kismina bakalim: b.cod_ulke = a.cod_�lke 

Bu demektir ki  �lke tablosunu "state"lerle birlestirdim ki burada �lke kodu esit satete e e�it,simdi yazm�� oldugumuz �lke verisini hatirlayalim:  

Bunu yazmayin, bu sadece bir �rnek olarak kullanilmaktadir.  

create table �lkeler (cod_ulke integer, name varchar(30));
insert into �lkeler values (1, 'ulke 1');
insert into �lkeler values (2, 'ulke 2');
insert into �lkeler values (3, 'ulke 3');
commit work;
�imdi states verisi:  
create table states (state_code int, 
                        cod_ulke int, 
                        state_name varchar(30));
insert into states values (1, 1, 'State 1, �lke 1');
insert into states values (2, 1, 'State 2, �lke 1');
insert into states values (1, 2, 'State 1, �lke 2');
insert into states values (2, 2, 'State 2, �lke 2');
insert into states values (1, 3, 'State 1, �lke 3');
insert into states values (2, 3, 'State 2, �lke 3');
commit work;
T�m "state"ler 3'te her �lke atlanm�� fakat �lke tablosunda state 3 'lerin buna kar��l�k gelen verisi bulunmaktabuy�zden �lke verisini state lerle kod 3 beraberinde ikinci par�ada belirtilecektir: , so it is normal that we don't add the ulke data with the states with code 3 to be discarded in the second part where:  
        AND (c.cod_ulke = b.cod_ulke
        AND c.state_code = b.state_code)
State county tablolar�nda bulunmas�na kar��n states tablosunda bulunmamaktad�r. 

Anlamam��lar i�in, bir asprin al�p k�pe�inizle biraz y�r�y��e ��k�n(e�er bir k�pe�iniz yoksa da y�r�meye k�peksiz ��k�n), biraz temiz hava al�p ilk egzersizden ba�lay�n.   

SELECT [DISTINCT] expression1 [AS nom-attribute] {, expression-i [as
nom-attribute-i]} 
       [INTO TABLE classname] 
       [FROM from-list] 
       [WHERE where-clause] 
       [GROUP BY attr_name1 {, attr_name-i....}] 
       [ORDER BY attr_name1 [ASC | DESC ] [USING op1 ] {,
nom-attribute-i...}] 
       [UNION {ALL} SELECT ...] 
Basamak basamak:  
DISTINCT: Geri d�nen s�ran�n tekrar�n� eler.
deyim1:  geri d�nmesini istedi�imiz,normal olarak  FROM listesindeki bir  tablo i�in bir kolon 
AS nom-attribute:   column ��in bir takma isim , �rnek:  
manu=> select kod_�lke from �lkeler;
kod_�lke
- -----------
          1
          2
          3
(3 rows)          
�imdi takma isimle :  
manu=> select kod_ulke as countr from �lkeler;
countr
- ------
     1
     2
     3
(3 s�ralar)
INTO TABLE:  sonu�lanan s�ran�n direk olarak ba�ka bir tabloya yaz�lmas�n� sa�lar (bak�n�z INSERT ... SELECT...)
FROM:  tablo giri� listesi
WHERE:  se�me ifadesi (birle�im ve se�im �ng�r�leri).
GROUP BY:  grup �ng�r�s�, baz� deyimlerde kullan�lan fonksiyonlar�n gruplanmaya ihtiya�lar� olabilir.
ORDER BY:  Geri d�nen s�ralar�n s�ralanma �art� ASC artan s�ralama, DESC azalan s�ralama, USINGe�er s�ralanacak deyim llistede de�ise kulan�l�r
UNION ALL SELECT:  �lk SELECT sonu�lar�n ilave olmas�n� g�sterir. �kinci SELECT ise,tablolarda de�i�ebilir,fakat ayn� kolon say�s�n� geri d�nd�r�r.
Sadece SELECT komutlar�n�n sadece DB deki par�alar� geri d�n�� olarak de�il ayr�ca onlar �zerinde de�i�iklikler de yapabilece�imizi g�rd�k: 
SELECT SUM(salary * 1.1) - SUM(salary) AS azalma FROM �al��anlar;  

�imdi de elimizdeki fonksiyonlara bakal�m:  
 
COUNT(): BO� olmayan s�ra say�s�n� verir
SUM():  kolonda bulunan say�lar�n toplam�n� verir
AVG():  kolondaki say�lar�n ortalamas�n� verir
MIN():  kolondaki en k���k de�eri verir
MAX():  kolondaki en b�y�k de�eri verir
FLOAT(int):  geri d�n�� olarak FLOAT8, FLOAT(12345)
FLOAT4(int):  geri d�n�� olarak FLOAT4, FLOAT4(12345)
INT(float): FLOAT/4, INT(123.456) dan bir INT de�eri al�n�r
LOWER(yaz�):  yaz� k���k harfliye �evrilir
UPPER(yaz�):  yaz� b�y�k harfliye �evrilir
LPAD(yaz�, uzunluk, char): soldan char(karakter) ile "uzunluk" uzunlu�unda kolonlu "yaz�" kolonunu doldurur 
RPAD(yaz�, uzunluk, char):  sa�dan char(karakter) ile "uzunluk" uzunlu�unda kolonlu "yaz�" kolonunu doldurur
LTRIM(yaz�, char):  yaz� n�n solundan itibaren t�m char olan karakterler siliniyor
RTRIM(yaz�, char):  yaz� n�n sa��ndan itibaren t�m char olan karakterler siliniyor
POSITION(string IN text): dizinin ilk pozisyonundan a�ar, fakat �ALI�MAMAKTA
SUBSTR(yaz�,from[,to]):  extract the substring of text, from the position from to the position of to or the end of the string
DATETIME(tarih,saat):  verilen zamana form verir g�n i�in:(YYYY-MM-DD) ve saat i�in: (HH:MM)
Yukar�da SQL'de bulunan fonksiyonlardan k���k bir b�l�m�yaz maktad�r.Bu fonks�yonlar�n hepsi ANSI SQL'de de tan�mlanm�� ve de ayr�ca Postgres95'te de mevcuttur.  

WHERE in detaylari

�imdiye kadar,SELECT'ten WHERE'in b�l�mlerini g�rd�k.A�a�daki �ekilde yerle�tirilebilirler: 
AND kolon =de�er
A�a��da k���k bir �rnek bulunmaktad�r: 
AND, OR, NOT, IN, IN ALL, =, !=, >, <, (SELECT....), LIKE ayr�ca parantezler kald�r�labilir, �rne�in:  
WHERE 
   kolon IN (SELECT DISTINCT kolon FROM tablo WHERE ....)
   kolon IN ('de�er1',de�er2','de�er3',...)
   (kolon = 'de�er' ve kolon = 'di�er_de�er' OR kolon != 'de�er')
!=  NOT EQUAL (e�it de�idir) ile ayn� anlamdad�r. 

LIKE bir kolonda string aramay� sa�l�yor: 

WHERE kolon LIKE '%Pepito%'
 % is a wildcard,�rnekte, e�er"Pepito"  string ise  
WHERE kolon LIKE 'Pepito%'
Pepito  string ba��ndaysa do�ru de�eri d�necektir 
WHERE kolon LIKE '%Pepito'
"Pepito" string sonunda ise do�ru de�eri d�necektir 

WHERE ile kullan�lan t�m se�enekleri listeleme imkan�m�z yoktur.Limiti sadece programc�n�n hayal g�c�ne kalm��t�r yada ki�isel process parser limitine kalm��t�r. 
�imdi SELECT komutunu bir kenara birakip son iki komuta konsantre olalim.  

UPDATE komutu

UPDATE komutu bir ya da daha fazla siranin WHERE sartina bagli olarak degisimini saglar. 
 
UPDATE tablo SET kolon-1 = expression-1 
                 [ kolon-i = expression-i] 
       [WHERE �art] 
Where:  
tablo: degistirilecek tablo, her seferinde sadece bir tablo secilebilir.
kolon: degistirilecek kolon
expression: kolonun alacagi deger.Bu deger bir sabit ya da bir fonksiyonun sonucu olabilir.
�art: degisime ugrayan sinirlari belirleyen sart, burada belirlenmis kurallar SELECT icin uygulanistir

DELETE komutu

DELETE komutu bir tabloda bir yada daha fazla siranin degistirilmesini saglar.  
 

SYNTAX  

DELETE FROM tablo
       [WHERE sart] 
Where:  
tablo:  Siralarin silinecegi tablo, sadece bir tablo secilebilir her seferinde
sart: degisimin olacegi sinirlarin sarti, burada belirlenen kurallar SELECT icin kullanilir.  
NOT: WHERE kullanilmaz ise, tablodan TUM siralar silinecektir. 
 

Kaynaklar:

SQL: SQL e giris. PostgreSQL in kurulmasi, serinin ilk yazisi

Dallas L. Gale taraf�ndan �ngilizce'ye �evrilmi�tir

G�rsel sanalsayfalar�n bak�m� Miguel Ángel Sepúlveda taraf�ndan yap�lmaktad�r.
© Manuel Soriano 1998
LinuxFocus 1998