Select ....İnto yapısı ve Join İşlemleri

SELECT İNTO komutunu genellikle geçici tablo oluşturmak için kullanılır. Gelin şimdi ne olduğuna bakalım.

SELECT İNTO komutunu genellikle geçici tablo oluşturmak için kullanılır. Gelin şimdi ne olduğuna bakalım.

Cümlecik Örnekleri

Ziyaretcidefteri veritabanı içerisindeki mesaj tablosu kayıt deseni aşağıdadır. (Örnekler için referans alınan tablo)

 

adi soyadi yas mesaji tarih id (PK)
nvarchar(30) nvarchar(30) tinyint nvarchar(MAX) smalldatetime  


select * from mesaj
Tüm kayıtları seçer

TOP ifadesi
select top 5 * from mesaj
en üstteki 5 kaydı seçer

select top 5 * from mesaj order by yas desc
tabloyu yaş alanına göre büyükten küçüğe doğru sıralar, sıralama neticesindeki ilk 5 kaydı görüntüler

select top 5 adi,soyadi from mesaj order by yas desc
Yukarıdakinden farkı sıralama sonrasında tüm kayıtları (*) değilde sadece adı ve soyadı alanlarını gösterir.

yaşı en büyük kişiyi bulmak için
select top 1 * from mesaj order by yas desc
ifadesi kullanılır. Bir sorun ile karşılaşılır. top 1 en üstteki kaydı verir. Mesaj tablosunda en büyük yaş 50 olsun. 50 yaşında 5 kişi olsa bile top 1 ifadesi sadece ilk kişiyi ekrana getirir işte bu sorunun çözümü için with ties ifadeciği kullanılır

Örnek:
select top 1 with ties * from mesaj order by yas desc
with ties order by sıralaması olmadan kullanılamaz.

select top 50 percent * from mesaj
kayıtların %50 sini görüntüle. Baştna itibaren kaç kayıt görüntülendiği bilinmediği zaman kullanılır.

Baştan ilk 5 kayıt hariç diğer kayıtları seçen sorguyu yazınız.

 
SET ROWCOUNT n
Seçme hatta güncelleme ve silme sorgularındada kullanılan bir özelliktir. SET ROWCOUNT 5 yazıldığında rowcount özelliğine 5 değeri atanarak. Seçme, silme ve güncelleme işlemlerinde ilk 5 kayıtla işlem yaptıktan sonra işlemi durdurur.

SET ROWCOUNT 5

select * from urunler
rowcount ifadesine 5 değeri atandığı için sadece ilk 5 kaydı görüntüler

select * from urunler order by urunkodu DESC
ürün kodunu büyükten küçüğe doğru sıralayarak en büyük koda sahip 5 kaydı alır

select top 5 * from urunler
sadece ilk 5 kaydı gösterir. zaten top özelliği ile baştan istediğimiz kadar kaydı alabiliyoruz. TOP ile ROWCOUNT arasındaki fark Rowcount a atanan sayıya kadar işlem yapılır o sayıya erişildiğinde son bir kez daha işlem yapılır ve işlem durdurulur. TOp ifadesinde ise arka planda tüm satırlar yüklenir, yüklenen satırlardan TOP ifadesiyle belirtilen sayı kadarı ekrana getirilir. Diğer kayıtlar görüntülenmez.


Set rowcount 5
select * from urunler
urunler tablosundaki ilk 5 kaydı seç. 6. kayda gelindiğinde seçme işlemini durdur.

set rowcount 0
bu ifade ile şart kaldırılır. Ne kadar kayıt varsa hepsini listele anlamına gelir.


select top 5 * from urunler
tüm kayıtlar arka planda seçilir sadece ilk 5 kayıt ekrana getirilir. Diğer kayıtlar görüntülenmez. bu işlem ise bilgisayarın fazla işlem yapmasını ve hafızada fazla yer kaplamasıdır.

 
DISTICT

select distinct adi from mesaj
adi aynı olanlardan sadece ilk karşına çıkanı al. sadece adi alanını döndürür.

select distinct adi,soyadi from mesaj
adi ve soyadı birleşimi aynı olanlardan sadece ilk karşına çıkanı al. Sadece adı ve soyadı alanlarını döndürür.

 
SELECT....INTO

select * into yeni from urun

select * from urun ifadesi urun tablosundaki tüm kayıtları seçer idi. Kırmızı renkli cümlecik ise urun tablosundaki tüm kayıtlar yeni isminde bir tablo oluşturarak içerisine atar. Oluşturulan yeni tablonun alanları ve veri bütünlüğü ilkeleri urun tablosundan olduğu gibi alınır.

aynı işlem create table ile oluşturulan tablonun içinse insert into ..... select ifadesi ile kayıtların kopyalanmasıylada yapılabilir. Fakat bu yöntem bu iş için daha hızlı çalışır.


 
JOIN işlemleri (Bu bölümü derste işlenmeden okumayınız)

 
UNION

union sözcüğü iki select sorgusunu alt alta getirerek birleştirir. Sık sık kullanılmaz fakat gerektiği yerde ise pratiklik sağlar. ayrı ayrı öğrenci ve öğretmen tablosu olsun.

select adi+' '+soyadi as adsoyad,telefon,adres from ogrenciler
öğrenci tablosundaki tüm kayıtları seçer

select adi+' '+soyadi as adsoyad,telefon,adres from ogretmenler
öğretmen tablosundaki tüm kayıtları seçer

select adi+' '+soyadi as adsoyad,telefon,adres from ogrenciler UNION select adi+' '+soyadi as adsoyad,telefon,adres from ogretmenler
öğrenci tablosundaki kayıtları listeler listeleme bittiğinde öğretmen tablsoundaki kayıtları öğrenci tablosunun altına listeler.

union ifadesinde tüm kayıtlar aynı olursa sadece 1 tanesi (çift kayıtları almaz, DISTINCT ifadesi gibi) alınır. tamamının alınması için UNION ALL ifadesi kullanılır.

Soru: union ifadesinde sorgu neticesinde sıralama yapılacaksa nasıl yapılır? sıralama her select için ayrı ayrı mı olmalı, ayrı ayrı olursa 2 sorgu arasında nasıl sıralanır?

 
  RDBMS te kayıtları birden fazla tablo içerisine kategorilendirilir. select ifadesi ile tek tablodan sonuç döndürülür. iki veya daha fazla tablodan veri döndürmek için join işlemleri kullanılır.

INNER JOIN
En sık kullanılan join türüdür. Sonuç kümesi olarak eşleşen kayıtların listesini verir. İki tablonun eşleşen kayıtları yan yana tek sonuç kümesi olarak döndürülür.

SELECT * FROM ogrenci INNER JOIN notlar ON (ogrenci.id= notlar.id)
id leri eşit olan tabloları listeler. kolon sırasında önce yazılan tablo öne geçer.

SELECT ogrenci.adi,ogrenci.soyadi,notlar.* FROM ogrenci INNER JOIN notlar ON (ogrenci.id= notlar.id)
ogrenci tablosundan sadece adi ve soyadi alanlarını al, notlar tablosundan tüm alanları al.

Uzun sorgularda Takma Ad Kullanımı
SELECT o.adi,o.soyadi,n.* FROM ogrenci o INNER JOIN notlar n ON (o.id= n.id)
from ifadesinden sonra ogrenci ye o notlara n ifadesi atanarak sorgu yazımı kısaltılır, okunabilirliği artırılır. Bir tablo için takma ad (alias) kullanılıyorsa sorgunun her yerinde bu takma ad kullanılmalıdır. Aksi halde hata oluşur.

SELECT o.adi,o.soyadi,n.* FROM ogrenci as o INNER JOIN notlar as n ON (o.id= n.id)
yukarıdaki sorgu ile aynı tek farkı as ifadesinin olmasıdır.

SELECT o.adi,o.soyadi,n.* FROM ogrenci o INNER JOIN notlar n ON (o.id= n.id) where n.notu>45
n tablosunda notu alanı 45 ten büyük olanların birleşimini döndürür.

SELECT DISTINCT o.adi,o.soyadi,n.* FROM ogrenci o INNER JOIN notlar n ON (o.id= n.id) where n.notu>45
adı,soyadı ve n tablosundaki tüm alanları aynı olan kayıt varsa bu kayıtlardan sadece birisini al ve notu 45 ten büyük olanları aldıktan sonra birleştir. inner join bir nevi where ifadesine benzer, where ifadesinden sonra belirtilen şarta uygun olanlar listelenir. inner join de işe on dan sonra belirtilen şarta uygun olanlar listelenir diğerleri listelenmez.

3 veya daha fazla tabloda join işlemleri
select * from ogrenci
inner join notlar on notlar.numara=ogrenci.numara
inner join ceza on ceza.numara=ogrenci.numara
cezası ve notu ve öğrenci tablosunda bilgisi olan öğrenciyi ekrana getirir.

inner joinlerde inner ifadesi yazılmadan sadece join yazılması yeterlidir. Çünkü varsayılan join türü inner joindir.

OUTER JOIN
Sık kullanılmazlar. iç içe select ifadeleriyle oluşturulan sorgulardan performans bakımından daha hızlı çalışır. inner join RDBMS göre ilişki kurulan alanların eşleşme şartı gerektiğinde kullanılır. Örneğin 10 nolu öğrencinin notları varsa inner joinle oluşturulan sorgu sonucunda görüntülenir. eğer 10 nolu öğrenciye ait not yoksa 10 nolu öğrenci görüntülenmez

select * from ogrenci left outer join notlar on notlar.numara=ogrenci.numara
ifadesi ise 10 nolu öğrenciye ait notlar yoksa sorgu neticesinde 10 nolu öğrenciyi görüntüle, notu olmadığı içinde not kısımlarını NULL göster.

select * from ogrenci right outer join notlar on notlar.numara=ogrenci.numara
notlar tablosundaki numarası olan kayıtlardan ogrenci tablosundaki numarası olan kayıtları birleştirir. right ifadesi olduğu için notlar tablosundaki var olan numaraların öğrenci tablosundaki eşiti alınır sonuç kümesi döndürülür. eğer notlarda olurda öğrencide olmayan kayıt varsa ogrenci tablosunda ilgili kayıta NULL döndürür. Ama FK kısıtlaması zaten bu duruma izin vermez.

select ogr.adi,ogr.soyadi,ogr.numara,ogr.sinif from ogrenci as ogr left outer join notlar on notlar.numara=ogr.numara where notlar.numara is null
eşleşmeyi soldaki tabloyu göze alarak yapar ve notları girilmemiş öğrencilerin (ki bu öğrencilerin numarası NULL değer içerir-girilmediği için) adi soyadi numara ve sinif bilgilerini görüntüle

select * from ogrenci left outer join notlar on notlar.numara=ogrenci.numara
left outer join ceza on ceza.numara=ogrenci.numara
notlar, ceza ve ogrenci tablosundaki tüm kayıtları getir (soldaki tablonun varlığına göre kıyaslama yapılır), kaydın karşılığı yok ise NULL olarak göster

select * from ogrenci full join notlar on notlar.numara=ogrenci.numara
soldaki tablo baz alınarak yapılan join left outer join idi, sağdaki tablo baz alınarak yapılan join right join idi. sağda ya da solda olması farketmezsizin kullanlıan joint tipi full joindir.

select * from ogrenci full join notlar on notlar.numara=ogrenci.numara
full join ceza on ceza.numara=ogrenci.numara
3lü full join örneği.

 

CROSS JOIN (Kartezyen çarpım)

birinci tablodaki kayıtların herbirisini ikinci tablodaki kayıtlarla eşleştirilir. Kartezyen çarpımını alır. A tablosunda 3 kayıt olsun B tablosunda 5 kayıt olsun herbir kayıt diğer tablonun herbir kaydı ile eşleşeceğinden 3x5=15 kayıt döndürür.

select * from ogrenci cross join notlar order by ogrenci.adi

bu join türü hazırladığınız veritabanın performansını ve oluşabilecek hatalar için test amaçlı kullanılır. Hazırlanılan veritabanları test edilirken 5-6 veya en fazla 20 kayıt ile test edilir. Oluşturduğumuz veritabanı ileride 1 milyon kayda ulaştığında veritabanımız nasıl olur? sorusunun cevabını cross join ile alırız. ogrenci tablosunda 20 kayıt olsun notlar tablosunda 10 kayıt olsun iki tablo cross join işlemine tabi tutulursa 200 kayıt döndürülür.aynı ogrenci tablosu aynı sorguda farklı bir alias ile cross join işlemine tabi tutulursa. 200x20=4000 kayıt döndürür.

select * from ogrenci cross join notlar n
cross join notlar nott
cross join ogrenci ogr
cross join notlar nottt
cross join ogrenci ogrr
cross join notlar notttt
cross join ogrenci ogrrr

Kısaltılmış Join Yazımları

SELECT * FROM ogrenci INNER JOIN notlar ON (ogrenci.id= notlar.id)
ifadesi
SELECT * FROM ogrenci JOIN notlar ON (ogrenci.id= notlar.id)
şeklinde yazılabilir
ya da
SELECT * FROM ogrenci, notlar where ogrenci.id= notlar.id
şeklindede yazılabilir.

 

LEFT JOIN *= ile
RIGHT JOIN =* ile kısaltılır

select * from ogrenci left outer join notlar on notlar.numara=ogrenci.numara
ifadesi
select * from ogrenci, notlar where notlar.numara*=ogrenci.numara
şeklinde yazılabilir.


select * from ogrenci right outer join notlar on notlar.numara=ogrenci.numara
ifadesi ise
select * from ogrenci, notlar where notlar.numara=*ogrenci.numara
şeklinde yazılabilir

select * from ogrenci cross join notlar order by ogrenci.adi
ise
select * from ogrenci,notlar
şeklinde yazılabilir.

Telefon +90 505 747 42 84
Email info@devedijital.com
Adres
Tacettin Veli Mahallesi Halit Narin Caddesi Bahadır Plaza Kat:11 Daire:41 38230 Deve Dijital Melikgazi/Kayseri/Türkiye