SQL
Veri Tipleri
Verileri veritabanında tutarken aşağıdaki tiplere uygun olacak şekilde hazırlamamız gerekmektedir.
char(n): Değişmez uzunluklu karakter dizilimi. Karakter sayısı belli olan nesneler için kullanılabilir.
varchar(n): Değişken boyutlarda değişken tutmaya yarayan değişken. Karakter ekledikçe hafızada eklenen karakter kadar yer kaplar.
int: Tam sayıları tutmak için kullanılır. Hafızada 4 byte2lık yer kaplar.
smallint: Hafızada int’e göre daha az yer kaplar.
numeric(p,d): Kesirli sayıları saklamak için kullanılır. p toplam basamak sayısını, d ise ondalık basamak sayısını belirler. Tam sayılar ve ondalıklı sayılar için yüksek doğruluk sağlar.
real: Kesirli sayılar için kullanılır ve yaklaşık olarak 4 byte’lık bir hafıza kaplar.
double precision: Daha büyük kesirli sayılar için kullanılır ve yaklaşık olarak 8 byte’lık bir hafıza kaplar.
float(n): kesirli sayılar için kullanılır. n değeri, depolanan değerin hassasiyetini belirler. real ve double precision veri türlerinin daha genel bir versiyonudur.
İlişkisel veritabanları tablolar üzerine kuruludur.
1) Tablonun oluşturulması:
➤ create table ile tablomuzu oluşturmaya başlarız.
» create table sube // tabloya “sube” adını verdik.
(
sube_adi char(15) not null, // not null kullanarak şube adının boş bırakılamayacağını belirttik.
sube_sehri char(30), // burada not null kullanılmamış yanı şehir bilgisini boş bırakabiliriz.
varlik int
)
» create table sube
(
sube_adi char(15) not null,
sube_sehri char(30),
varlik int,
primary key (sube_adi) // tabloda eşi benzeri olmaması(unique) gereken nesneyi primary key ile belirtiriz.
)
2) Tablonun silinmesi ve değiştirilmesi:
➤ drop table -> silme
➤ alter table -> değiştirme (kolon ekleyip silebiliriz)
» drop table sube // sube adlı tablo direkt olarak veritabanından silinir.
» alter table sube add telefon_no char(15) // sube adlı tabloya 15 karaktere sahip telefon_no kolonu eklendi.
» alter table sube drop telefon_no // sube adlı tablodan telefon_no kolonunu siler.
3) Tablonun içine koyduğumuz verileri genellikle sorgularız. SQL'de çoğunlukla bu kısım kullanılır.
➤ select ozellik_adi
from tablo_adi
where istenilen_kosullar
» select sube_adi
from sube
where sube_sehri=’Ankara’
➤ distinct -> tekrarlı verilerden sadece bir tanesini göster.(Buna özetini göstermekte denebilir.)
» select distinct sube_adi
from borc
➤ all -> verilerin hepsini gösterir yani tekrarlı olup olmadığına bakmaz.
» select all sube_adi
from borc
➤ * sembolü bütün değerleri göster anlamındadır.
» select * from sube // sube tablosundaki tüm içerikleri gösterir.
4) Tabloda sorgu yaparken daha da spesifikleştirmek adına koşul ifadeleri kullanırız.
➤ where -> istediğimiz özelliği bulmada kullanılır.
➤ and -> birden fazla koşulun aynı anda sağlanmasını gerektirir.
➤ not -> belirtilen koşulun tersi anlamına gelir.
➤ or -> bir veya daha fazla koşuldan en az birinin sağlanmasını gerektirir.
➤ between -> iki koşul arasındaki değerleri bulmak için kullanılır.
» select sube_adi
from sube
where sube_sehri=’İstanbul’ and varlik > 1200 // İstanbul’da ve varlığı 1200’den fazla olan şubeleri bulur.
» select sube_adi
from sube
where sube_sehri=’İstanbul’ not varlik > 1200 // İstanbul’da ve varlığı 1200’den fazla olamayan şubeleri bulur.
» select sube_adi
from sube
where sube_sehri=’İstanbul’ or varlik > 1200 // İstanbul’da veya başka bir şehirde varlığı 1200’den fazla olan şubeleri bulur.
» select sube_adi
from sube
where varlik > 1200 // İstanbul’da veya başka bir şehirde varlığı 1200’den fazla olan şubeleri bulur.
» select sube_adi
from sube
where varlik between 1200 and 3000 // Varlığı 1200 ve 3000 arasında olan şubeleri listeler.
➤ join -> kartezyen çarpım yapar, farklı tablolardaki verileri birleştirerek ilişkili olan verileri sorgulatır.
➤ as -> hem kolonlar için hem tablolar için isim değiştirmede kullanılır.
5) Satır değişkenleri:
➤ from -> tablolara isim vermek için kullanılır.
» select musteri_adi, T.hesap_numarasi,S.miktar
from borçlu as T, kredi as S
where T.hesap_numarasi = S.hesap_numarasi
6) Dizgi işlemleri: Hafızanın kullanımı açısınıdan problemli işlemlerdir. Hafızayı yavaşlatabilir.
➤ % -> Bulunan her şey anlamındadır. Başta, sonda ve hem başta hem sonda kullanılabilirç
» select musteri_adi
from musteri
where musteri_adresi like ‘%Ana Cadde%’ // Müşteri adreslerinden içinde Ana Cadde geçenleri listeler.
➤ \ -> Kaçış karakteridir. % ve ‘ gibi karakterleri metinsel ifade olarak belirtmek için kullanılır.
» like ‘Ana Cadde\%’ escape ‘\’ // Ana Cadde% ifadesi sorguda aranır.
➤ || -> İki dizgiyi birleştirir.
7) Sıralama işlemleri:
➤ order by -> bir seçim işlemi yaptığımızda verilerimizi belli bir düzende sıralamak için kullanılır.
» select distinct musteri_adi,
rom borc_alan,kredi
where borc_alan hesap_numarasi = kredi.hesap_numarasi and sube_adi= ‘Beyoğlu’
order by musteri_adi // Müşteri adına göre sıralama yapr.
➤ asc -> artan sırada sıralamak için kullanılır.
» order by musteri_adi asc // A’an Z’ye artan şekilde sırlar.
➤ desc -> azalan sırada sıralamak için kullanılır.
» order by musteri_adi desc // Z’den A’ya azalan şekilde sırlar.
8) Küme operatörleri: Birlerşim, kesişim ve fark işlemleri.
➤ union -> iki sorgudan alınan verileri tek bir tabloda birleştir.
» select musteri_adi from borc_veren
union
select musteri_adi from borc_alan
➤ intersect -> iki sorgudan alınan verilerden sadece ortak olan satırlarını alır.
» select musteri_adi from borc_veren
intersect
select musteri_adi from borc_alan // Hem borç alıp hem borç verenleri listeler.
➤ except -> iki sorgudan alınan verilerden farklı olanları çıkartır
» select musteri_adi from borc_veren
except
select musteri_adi from borc_alan // Borç verenlerden borç alanları çıkar sadece borç verenler kalır.
9) Toparlama(aggregate) fonksiyonları:
➤ avg -> kolonun ortalama değerini alır.
➤ min -> kolonun minimum değerini alır.
➤ max -> kolonun maksimum değerini alır.
➤ sum -> kolunun toplam değerini alır.
➤ count -> kolondaki değer sayısını alır.
» select avg(bakiye)
from hesap
where sube_adi = ‘Bakırköy’ // Bakırköy şubesinde bulunan hesaplardaki bakiyelerin ortalamasını al.
» select count(*)
from musteri // Müşteri saysını bul.
» select count (distinct musteri_adi)
from borc_veren // Borç veren tablosundaki müşteri sayısını bul
10) Gruplama fonksiyonları:
➤ group by -> Belirtilen koşula göre verileri gruplar. Ayrıca bize aggregate fonskiyonları kullanma şansı verir.
» select sube_adi, count (distinct musteri_adi)
from borc_veren,hesap
where borc_veren.hesap_numarası=hesap.hesap_numarası
group by sube_adi // Her şubede kaç farklı müşterinin borcu olduğunu öğrenmek için kullanılır.
➤ having -> where gibi kullanılır fakat where’den farklıdır. Gruplama işleminden sonra eğer şart belirtmek istiyorsak kullanılır.(group by ile kullanılır diyebiliriz)
» select sube_adi, avg(bakiye)
from hesap
group by sube_adi // Her şubedeki ortalama bakiye değerleri gösterir.
having avg(bakiye) > 1200 // Hesaptaki ortalama bakiye değeri 1200’den yüksek olanları gösterir.
11) Null(boş) değerler:
➤ null-> Herhangi bir değeri olmayan satırlarda kullanılır. null hangi işlem yapılırsa yapılsın null’dır.
» select hesap_numarasi
from kredi
where miktar is null
▷ null hangi işlem yapılırsa yapılsın null’dır.
– null > 5 = null
– null <> null = null
– null = null
➤ unkown -> Bilinmeyen değerlerdir.
OR: unkown or true = true
unkown or false = unkown
unkown or unkown = unkown
AND: true and unkown = unkown
false and unkown = false
unkown and unkown = unkown
NOT: not unkown = unkown
▷ Null değerler ile Toparlama (Aggregate) fonksiyonları kullama:
-> sum ‘da null değerler 0 olarak kabul edilir.
-> count(*) ‘da null değerler hiç yokmuş gibi düşünülür.
12) İç içe sorgular: Sınırsız sayıda alt sorgu (subquery) yazarak işlemimize devam edebiliriz.
▷ subquery’ler genellikle select-from-where ifadeleriyle yazılan sorgulardır. Genel mantık subquery’lerden gelen verileri tutup üst query yazmaktır.
➤ in -> Küme içerisinde var olup olmadığını arar.
➤ not in -> Küme içerinde yok olup olmadığını arar.
» select distinct musteri_adi
from borc_alan // 2) Borç alan müşterilerin arasından borç veren müşterileri getir.
where musteri_adi
in (select musteri_adi from borc_veren) // 1) Borç veren tablosundan müşteri isimlerini al.
» select distinct musteri_adi
from borc_alan // 2) Borç alan müşteriler arasından, aynı zamanda borç veren olmayan müşterilerin listesini getir.
where musteri_adi
not in (select musteri_adi from borc_veren) // 1) Borç veren tablosundan müşteri isimlerini al.
▷ Sorguları okurken en içten başlamak her zaman kolaylık sağlar.
» select distinct musteri_adi
from borc_alan, kredi
where borc_alan.hesap_numarasi=kredi.hesap_numarasi and
sube_adi=’Bakırköy’ and // Bakırköy şubesinden kredi alan
(sube_adi,musteri_adi) in // Müşteriler arasından aynı zamanda
(select sube_adi,musteri_adi
from borc_veren,hesap
where borc_veren.hesap_numarasi=hesap.hesap_numarasi) // Borç veren müşterileri seçer.
13) Küme karşılaştırmaları:
» select distinct T.sube_adi
from sube as T, sube as S
where T.varlik > S.varlik and S.sube_adi=’Bakırköy’
➤ some -> Şartın en az bir kayıtta sağlanması gerektiğini belirtir.
» select sube_adi
from sube
where varlik > some
(select varlik
from sube
where sube_sehri=’İstanbul’)
➤ all -> Şartın hepsini sağlaması gerektiğini belirtir.
➤ not unique -> Tekrarlı olmayan verileri alır.
➤ with -> Geçici bir sonuç kümesi oluşturur ve sorgunun geri kalanında kullanılabilir.
14) View kullanımı:
➤ view -> Bir sanal tablodur. Diğer başka tabloları birleştirir ve çıkan sonucu saklama imkanı sağlar. Güvenlik anlamında kullanıcıları kısıtlandırmak için kullanılabilir. İşi parçalara bölme, problemleri basitleştirme ve özetleştirme anlamında kullanılabilir.
» create view v as <sorgu ifadesi>
» create view tum_musteriler as
(select sube_adi, musteri_adi
from borc_veren, musteri_adi
where borc_veren.hesap_numarasi = hesap.hesap_numarasi)
union
(select sube_adi, musteri_adi
from borc_alan,kredi
where borc_veren.kredi_numarasi = hesap.kredi_numarasi)
▷ depend directly -> Bir view’in diğer view ile doğrudan bağlantılı olması. Eğer bir view oluşturulen başka bir view’den veri alıyorsak depend directly denir.
▷ depend on -> Direkt olarak birbiriyle bağımlı olmayan view’lerden bahseder. Eğer view’lerden birinin silinmesi diğerini etkilemez.
▷ recursive -> Bir view’in kendi üzerindeki bazı verilerden oluşturulması anlamına gelir.
15) Veri tabanındaki değişiklikler:
➤ delete -> Veritabanından satır siler.
» delete from hesap
where sube_adi=’Denizli’ // Denizli’de hesabı olan herkesi sil.
➤ insert into -> Satır ekler ve value ile kullanılır. Value sıralaması önemlidir.
» insert into hesap
values (‘A-9732′,’Pamukkale’,1200)
ya da
» insert into hesap (sube_adi, bakiye, hesap_numarasi)
values (‘Pamukkale’,1200,’A-9732′) // Diğer kolonlara eklenmeyen değerleri null olarak tamamlar.
▷ Ekleme yapılarken bir tabloya diğer tablolardan veriler çekilip eklenebilir.
➤ update -> Veritabanında değişiklik yapmaya yarar ve set ile kullanılır.
» update hesap
set bakiye=bakiye*1.06
where bakiye > 10000 // bakiye değeri 10000’in üstünde olanları 1.06 kadar arttır.