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 (Gözden geãirilmekte)

[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