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. |
|