"Vatanını en çok seven, görevini en iyi yapandır."


Hoş Geldin, Ziyaretçi!

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı yada giriş yapmalısınız. Forum üye olmak tamamen ücretsizdir.

  • Yeni üyeler Neler Yapmalı, Nasıl Başlamalı? Detaylar için tıklayın
    Rütbeler ve genel görevlendirme konuları hakkında bilgi almak için tıklayın
    Uzmanlık alanları hakkında bildirge için tıklayın
    Güncel forum kuralları için tıklayın

SQL Server T-SQL'e Giriş Ve Sorgular #4

Codbar

Yarbay
Katılım
8 Şub 2017
Mesajlar
1,340
Uzmanlık Alanları:
Veritabanı Sistemleri
Yapay Zeka
Yazılım / Kodlama
Görev/Org:
lojistik
Merhabalar değerli forum üyeleri, Veritabanı ile ilgili, üçüncü serinin son makalesi ile karşınıza çıkıyorum. Daha önceden paylaşımlarım bu konuda olmuştu. Fakat tam olarak derli toplu değildi. Bunu çözmek için belli bir başlık altında alt konulardan oluşan bir makale düşündüm. Uzun bir makale olacak, keyifli okumalar dilerim.

Bu makale içeriğine geçmeden ön bilgi olarak konu başlıkları şu şekildedir;

  1. Tabloları Birleştirmek (joinler)
  2. İnsert, Update, Delete
1552433681519.png
TABLOLARI BİRLEŞTİRMEK (JOINLER)
İlişkisel verilerde farklı tablolarda yer alan ve birbirini tamamlayan kayıtların tek bir tabloymuş gibi sorgu sonucunda birleştirerek listeleme işlemleri join ifadeleri ile gerçekleştirilir.

Bir tablo kendisi ile birleştirilebileceği gibi farklı birden fazla tablo ile de birleştirilebilir.Birleştirmek işleminde istenen işleme göre farklı yaklaşımlar mevcuttur.

Örneğin; e-ticaret sisteminde, müşterilerin siparişlerini tutan tablo ile müşteri tablosu birleştirilerek müşterinin hangi ürünleri sipariş ettiğini, hatta hangi kategorilerdeki ürünlere karşı daha fazla satın alma işlemini gerçekleştirdiği gibi bilgileri listelemek için kullanılabilir.

Sql Server performans ve sonuç olarak en iyi işlemi gerçekleştirecek join'i kendisi belirler. Ayriyeten join sorgularını oluşturmak için şu alt seviye join yöntemleri kullanılır.

  • Merge join: Birinci tablodan bir kayda karşılık ikinci tablodan alınan kaydın ilişkili olması şartı ile çalışır.
  • Hash join: Tablolardan her ikisinde de uygun bir indeks bulamazsa ya da WHERE cümleciği yer alıyorsa kullanılır.
  • Nested Loop Join: Birleştirilecek iki tablodan az kaydı olan tablo dışarıdaki, çok olan tablo içerideki döngü gibi çalışır. Adından da anlaşılacağı gibi iç içe iki döngü gibi çalışır.
Tabi biz günümüzde en çok kullanılan birleştirme işlemlerinden bahsedeceğiz. (inner join, left join, right join, full join) Yukarı belirttiğim joinler ise bir gün karşınıza çıktığı vakit aa evet böyle bir şey bulunmaktadır diyebilmeniz içindir.
INNER JOIN
İki tablo arasında birleştirme yaparken, her iki tabloda da yer alan değerler seçilir. Tablolardan sadece birinde yer alıp, diğerinde ilişkili değer bulunmayan kayıtlar seçilmez. JOIN yöntemlerinde en çok kullanılan tablo birleştirme yöntemidir.

Kullanım Şekli:
SELECT alan_ad(lari)
FROM tablo1 JOIN tablo2
ON tablo1.alan_adi=tablo2.alan_adi


Görsel olarak ifade etmeye çalışırsak;


Genel olarak kullanım INNER JOIN olsa da, bazı sorgu örneklerinde sadece JOIN komutunun kullanılmış olduğunu görmüş olabilirsiniz. Kısaca SQL Server'da JOIN ile INNER JOIN aynı yöntem çalışır.(Daha iyi kavrayabilmek için örnekler kısmına bakabilirsiniz.)

OUTER JOIN
Aynı anda her iki tabloda yer almayan kayıtları listelemek için kullanılır. OUTER JOIN sorgusunda kullanılan ilk tablo soldaki, ikinci tablo ise sağdaki tablo olarak kabul edilir. Outer join tipleri;

  • LEFT OUTER JOIN
Soldaki tabloda yer alan kayıtlar, sağdaki tabloda karşılıkları olmasa bile getirilirler.

Kullanım şekli:
SELECT alan_ad(lari)
FROM tablo1 LEFT OUTER JOIN tablo2
ON tablo1.alan_adi=tablo2.alan_adi

Görsel olarak ifade etmeye çalışırsak;

  • RIGTH OUTER JOIN
Sağdaki tabloda yer alan kayıtlar, soldaki tabloda karşılıkları olmasa bile getirilirler.

Kullanım şekli:
SELECT alan_ad(lari)
FROM tablo1 OUTER JOIN tablo2
ON tablo1.alan_adi=tablo2.alan_adi

Görsel olarak ifade etmeye çalışırsak;

  • FULL OUTER JOIN
Soldaki ve sağdaki tabloda karşılıklı olarak eşit satırı olmayan kayıtlar getirilir.

Kullanım şekli:
SELECT alan_ad(lari)
FROM tablo1 FULL OUTER JOIN tablo2
ON tablo1.alan_adi=tablo2.alan_adi

Görsel olarak ifade etmeye çalışırsak;


*** OUTER yazılması zorunlu değildir. Sadece; Left, Right, Full join olarak kullanılabilir.***

CROSS JOIN
İki tabloda yer alan kayıtları çaprazlamak için kullanılır. Bu işleme matematiksel olarak kartezyen çarpımı denir. İki tablo arasında herhangi bir ilişkilendirme olmasına gerek yoktur. CROSS JOIN, birinci tabloda yer alan her bir kaydı ikinci tabloda yer alan her bir kayıt ile ilişkilendirerek satırlar türetmede kullanılır. CROSS JOIN sıklıkla kullanılan bir JOIN işlemi değildir. Ancak bazı satır türetme isteklerinde kullanılabilir.

Örnek; 5 kayıt içeren A tablosu ile 3 kayıt içeren B isimli iki tabloda CROSS JOIN işlemi uygulandığında, sonuç listesi 5*3 kayıttan oluşacaktır.


ÖRNEKLER
Elimizde Kütüphane adlı bir veritabanı bulunuyor ve bu kütüphanemiz içerisinde ise 4 farklı olarak tablomuz bulunmaktadır. Bu veri tabanımızı baz alarak soruların çözülmesi bekleniyor. Aşağıda ise 4 farklı tablo bilgileri ve bu tablolara ait veriler bulunmaktadır.
  • Kütüphane adlı tablomuz:

Kütüphane adlı tablomuzun içeriği:

  • Üyeler adlı tablomuz:

Üyeler adlı tablomuzun içeriği:

  • Emanet adlı tablomuz:

Emanet adlı tablomuzun içeriği:

  • Kitaplar adlı tablomuz:

Kitaplar adlı tablomuzun içeriği:

+Tabi örneğimize geçmeden önce size SQL Server'ın bize sunduğu başka bir araçtan bahsetmek istiyorum. Bu araç bize join işlemlerimizi, diğer sorgularımızı daha rahat oluşturmamızı + birden fazla sorgu gerçekleştirmeyi sağlar. Ardından bu yazdığımız kodları dışarıya aktarabilme olanağı sağlar. Bu aracımızın ismi: Query 'dir. Aşağıdaki görselde de gördüğünüz gibi New Query'i ikonuna tıklamamız yeterli.


+ Join işlemini iki farklı şekilde gerçekleştirebiliriz SQL Server içerisinde. İlki queri ekranımızda sağ tık yaparak- Desing Query in Editör ile gerçekleştirebiliriz.Diğeri ise query ekranımızda kod yazarak gerçekleştirmek. İlk öncelikle mause yardımıyla ilişkilendirmeyi görelim.


Desing Editörümüzü açalım;


İlk durumda şöyle bir ekran bizi karşılayacaktır. Burada sormak istenen şey; ilişki kuracağımız tabloların seçilmesidir.İstediğimiz tabloları seçerek(add)çıkıyoruz.(close)



Tabloların hepsini seçtiğimiz de karşımıza şöyle bir ekran gelecektir. Ben fazla alan kaplamaması için belirli yerlerden kestim. Aşağıdaki ki görsel de ilişkilendirme yapmak istediğimizi fare aracılığıyla sürükleyip bırakabiliriz.



Hemen bu görselin alt tarafında ise bu yaptığınız fare ile sürüklemelerini kod yapısına döndüren bir alan mevcut. Gördüğünüz gibi tüm tablolarımızı ilişkilendirmek isteseydik aşağıdaki gibi bir kod yazmamız gerekecekti.


Evet bunu da belirttiğimize göre örneklerimize geçebiliriz.

Örnek_1: Erdemliden emanete verilen kitapların ISBN ve emanet tarihlerini görüntüleyen sql sorgusunu yazalım.

SQL:
Please, Giriş yap or Kayıt ol to view codes content!


Örnek_2: Emanet kitap almış ancak henüz teslim etmemiş üyelerin isimlerini ve aldıkların kitapların ISBN'lerini görüntüleyen sql sorgusunu yazalım.

SQL:
Please, Giriş yap or Kayıt ol to view codes content!


Bur da dikkat ederseniz left join kullandık. Normalde inner join kullansaydık sadece eşleşen değerler yani sadece 2 kayıt listelenecekti. Fakat emanet tablosunda isim girilmemiş, kitap alınmış kayıtlar vardı. Bunu önlemek için left joini kullandık. Aşağıda ise inner joinli sonuç gösterilmektedir.



Örnek_3: Kütüphaneye kayıtlı ancak henüz hiç kitap almamış (ID)'ların isimlerini görüntüleyen sql sorgusunu yazalım.
SQL:
Please, Giriş yap or Kayıt ol to view codes content!


Örnek_4: Kütüphane bazında kitapların ortalama sayfa sayısı 250'den az olan kütüphanelerin isimlerini ve sayfa sayılarını görüntüleyen sqli yazalım.
SQL:
Please, Giriş yap or Kayıt ol to view codes content!


Bu örnekte dikkat ettiniz ise birden çok join işlemini bir arada kullandık. Bizim bir referans tablomuz bulunmakta(Emanet). Bu referans tablomuz diğerleri ile ilişkilendiriyoruz. Diğer nokta ise referans tablosu genellikle from'dan sonra gelir.

Örnek_5: Birden fazla kitap alan üyelerin isimlerini ve aldıkları kitapların fiyat ve kitap isimlerini görüntüleyen sqli yazalım.

SQL:
Please, Giriş yap or Kayıt ol to view codes content!


VERİTABANINI VE HAZIR KODLARI AŞAĞIDAKİ EK'TEN İNDİREBİLİRSİNİZ, DİYEREK DEVAM EDELİM..


INSERT, UPDATE, DELETE
INSERT INTO
INSERT INTO ifadesi tablomuza yeni bir kayıt eklemek için kullanılır. Insert Into kodu iki türlü kullanılabilir.

  • Birinci yöntem: Bu yöntemde direk tablo adı belirterek sadece değerleri yazmak suretiyle kayıt ekleyebiliriz. Ancak burada dikkat edeceğimiz nokta eklenecek değer tablomuzda ki alan sırasına göre olmalıdır. Mesela tablomuzda ki alan sıralaması Ad, Soyad, ve Dogum_yili seklinde olsun. Values ifadesinden yazılacak değerler sırası ile işlenir. Karışık yazdığımız zaman, Dogum_yili alanı sayısal bir alan ise metinsel veri girilemeyeceği için programımız hata verecektir. Veya sıralamaya dikkat etmezsek bilgilerimizin olması gerektiği alana yazılmaz.
INSERT INTO Kullanım Biçimi
INSERT INTO tablo_adi
VALUES (deger1, deger2, ...
)

  • İkinci yöntem: Bu yöntemde ise eklenecek alanları ve değerleri kendimiz belirtiriz. Burada dikkat edilmesi gereken şey; yazdığımız alan adının sırasına göre değerleri eklememiz olacaktır.
INSERT INTO Kullanım Biçimi
INSERT INTO tablo_adi (alan_adi1, alan_adi2, alan_adi3)
VALUES (deger1, deger2, deger3)


Sorgumuzu Nerede Çalıştırabiliriz?
Tablo ismine sağ tık - Script Table as - INSERT To - New Query Editor Windows yolunu takip ederek ulaştığımız alanda çalıştırabiliriz.

Örnek olarak aşağıdaki gibi Personel isimli tablomuz olsun.


Örnek_1:INSERT INTO Personel VALUES (3, 'Serkan ÖZGÜREL', 'Erzincan', 'Muhasebe', 3456789)

Yukarıda görüldüğü gibi tablomuza yeni bir kayıt ekleme kodunu yazdık. Alan adlarını sırası ile kontrol ettik ve değerlerimizi sıraya dikkat ederek girdik.
Metin karakterli alanlara veri eklenirken tek tırnak işareti kullanılır. Sayısal alanlara veri eklerken ifade direk olarak yazılır. Bazı veritabanı editörleri sayısal alana veri girerken de tek tırnak işareti içinde yazımı kabul etmektedir.Tablomuzun son hali;


Artı bir bilgi olarak ise, biz belli sütunlarımıza primary key değeri vererek onu benzersiz olmasını sağlardık ve el ile girmek zorunda kalıyorduk değerlerini. Şöyle bir örnek verirsek daha açıklayıcı olabilir; Düşünün elinizde binlerce satırlardan oluşan bir tablo var ve biz bir kayıt girişi yapmak istiyoruz. Normalde ne yapmak gerekir satırın sonunu bulup ona göre değer-kayıt ataması gerçekleştiririz. Oysa bunca zahmete katlanmanın yerine, primary key olarak tanımladığımız alana otomatik artan özelliği belirlersek işin içerisinden sıyrılabiliriz. Yani insert yoluyla ekleme gerçekleştirirken primary key alanını belirtmemize gerek yoktur.
Bunu gerçekleştirebilmek için sütun belirlenir: Column Properties (hemen alt kısmındadır) - Identity Specification alanını buluyoruz.



(Is Identiy) alanına fare yardımıyla çift tıklatmanız.
Ardından ise alt kısmında bulunan kısımları istediğiniz gibi doldurabilirsiniz. Yani kaçar kaçar artması gerektiğini vb.


Personel2 adlı tablomuzun bilgileri aşağıdaki gibidir. (
YH adlı veritabanında oluşturuyoruz.)

Personel2 adlı tablomuzun içeriği;

Örnek_2: Bölümü Muhasebe olan yeni bir kayıt giriniz.
SQL:
Please, Giriş yap or Kayıt ol to view codes content!

Gördüğünüz gibi eklemeyi gerçekleştirdik.

UPDATE
Kayıtların belirli kurallar çerçevesinde güncellenmesini sağlar.

UPDATE Kullanım Biçimi
UPDATE tablo_adi
SET alan_adi1=deger1, alan_adi2=deger2, alan_adi3=deger3, ...)
WHERE secilen_alan_adi=alan_degeri


Burada dikkat edilecek nokta WHERE ifadesi ile belli bir kayıt veya kayıtlar seçilip değiştirilmek istenilen alanlardaki değerler değiştirilir. Eğer WHERE ifadesini kullanmadan yaparsak tablodaki bütün kayıtları değiştirmiş oluruz.

Sorgumuzu Nerede Çalıştırabiliriz?
Tablo ismine sağ tık - Script Table as - UPDATE To - New Query Editor Windows yolunu takip ederek ulaştığımız alanda çalıştırabiliriz.

Örnek_3: Bölümü muhasebe olanların personel notunu 20 puan arttırıp ve bölüm alanını boşaltan sqli yazınız.

SQL:
Please, Giriş yap or Kayıt ol to view codes content!


Örnek_4: Personel notu 75'den büyük olup içerisinde "a" karakteri olan personellerin bölüm bilgisini "Genel Sekreterlik" olarak değiştiren sorguyu yazınız. (2 row(s) affected)

SQL:
Please, Giriş yap or Kayıt ol to view codes content!


DELETE
DELETE ifadesi tablomuzda bulunan kayıtları silmek için kullanılır.

DELETE Kullanım Biçimi
DELETE FROM tablo_adi
WHERE secilen_alan_adi=alan_degeri


Burada dikkat edilecek nokta WHERE ifadesi ile belli bir kayıt seçilip silinir. Eğer WHERE ifadesini kullanmadan yaparsak tablodaki bütün kayıtları silmiş oluruz.

Sorgumuzu Nerede Çalıştırabiliriz?
Tablo ismine sağ tık - Script Table as - DELETE To - New Query Editor Windows yolunu takip ederek ulaştığımız alanda çalıştırabiliriz.

Örnek_5: Personel numarası 3'ten büyük olan kayıtları silen sqli yazınız.

SQL:
Please, Giriş yap or Kayıt ol to view codes content!


Kaynaklar:
1-
Please, Giriş yap or Kayıt ol to view URLs content!

animated-goodbye-image-0044.gif

Elimden geldiğince işlemleri örnekler ile anlatmaya çalıştım. Bu giriş seviyesine de nokta koyuyoruz bu makale ile. Umarım Makale Yararlı Olmuştur.. Saygilar @Dapirr
 
Son düzenleme:
Üst