SQL Eğitselyazısı
Bölüm II
Çeviri: Yeşim Tanrısever ve Fehmi Toprak
Ö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. |
|