SQL Eğitselyazısı
Bölüm II
Çeviri: Yeşim Tanrısever ve Fehmi Toprak (Gözden geãirilmekte)
Ö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
NotBoş (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 oynamakPostgreSQL 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ıkarNotePostgreSQL, 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çimiBu 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 komutuUPDATE 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 komutuDELETE 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. |
|