13 Nisan 2011 Çarşamba

SQL View Kavramı

Sıkça kullandığımız karmaşık sorguları, istediğimiz bir anda kolayca kullanmak üzere saklamak için View’lerden faydalanırız. Kısaca; Select saklamak olarak da tanımlayabiliriz. Önemli kullanım sebeplerinden biri de kullanıcılara hak vermek ya da sınırlama yapmaktır. Yani server üzerindeki kullanıcıların hangi sorguları görüp göremeyeceğine müdahale etmek mümkündür.

İlk olarak üzerinde çalışabileceğimiz bir veritabanı oluşturalım.

CREATE DATABASE Deneme

USE Deneme

Şimdi de bu database üzerinde ‘Urunler’ adında bir tablomuz olsun. Bu tabloyu AdventureWorks veritabanındaki Production.Product tablosu ile birebir aynı özelliklere ve kayıtlara sahip bir şekilde elde etmek için aşağıdaki kodu çalıştıralım.

SELECT * INTO Urunler FROM AdventureWorks.Production.Product

Artık Urunler adlı tablomuzda Prodcution.Production tablosundan çektiğimiz  504 ürün mevcut. Şimdi de basit olarak bir view’in nasıl yazılacağını görelim. Urunler tablosundaki rengi null olan ürünleri elde etmemizi sağlayan bir view yazalım.

CREATE VIEW VW_RenksizUrunler

AS

      SELECT * FROM Urunler

      WHERE Color IS NULL

Oluşan bu view bir tablo gibi sorgulanabilir,

SELECT * FROM VW_RenksizUrunler

diyerek istediğimiz sonuç kümesine ulaşabiliriz. Bu sorgu üzerinden filtreleme, sıralama, gruplama gibi işlemler de yapabiliriz.

SELECT * FROM VW_RenksizUrunler

WHERE ListPrice=0

ORDER BY Name

Şimdi de AdventureWorks veritabanında, hangi ürünün hangi firmadan sipariş edildiği, kiminle iletişime geçileceği ve bu kişinin iletişim bilgilerini listeleyen bir view yazalım.

USE AdventureWorks

 

-- Purchasing.Vendor , tedarikçilerin tutulduğu tablo

-- Purchasing.VendorContact, tedarikçilerin contactId'lerinin tutulduğu tablo

-- Person.Contact, kişilerin iletişim bilgilerinin tutulduğu tablo

 

CREATE VIEW VW_VENDORCONTACT

AS

      SELECT PP.ProductID,PP.Name,PC.FirstName+' '+PC.LastName [İletişime Geçilecek Kişi],PC.Phone [Telefon] FROM Purchasing.ProductVendor PPV

      JOIN Purchasing.Vendor PV ON PPV.VendorID=PV.VendorID

      JOIN Production.Product PP ON PP.ProductID=PPV.ProductID

      JOIN Purchasing.VendorContact PVC ON PVC.VendorID=PV.VendorID

      JOIN Person.Contact PC ON PC.ContactID=PVC.ContactID

Oluşturduğumuz view’e select attığımızda aşağıdaki gibi bir sonuç elde edeceğiz.

Untitled

NOT: View içerisinde ORDER BY komutunu tek başına kullanamayız. Eğer ORDER BY yazmak istiyorsak, TOP ile birlikte kullanmalıyız. Çünkü view’e select attığımız zaman zaten ORDER BY kullanabiliyoruz. Bu sebepten ötürü view içerisinde yazılması önlenmiştir. Amaç, view içerisindeki sonuç kümesini değiştirmektir aslında. ORDER BY komutu tek başına kullanıldığında gelen satır sayısı üzerinde etki etmeyecektir. Dolayısı ile TOP ile birlikte sonuç kümesini değiştirmeye zorlanmış oluruz.



6 yorum:

iltermutlu dedi ki...

şiir gibi anlatmışsın. eline sağlık...

Onur Salkaya dedi ki...

Teşekkür ediyorum, başarılar dilerim.

Adsız dedi ki...

SELECT * INTO Urunler FROM AdventureWorks.Production.Product BU KISIM HAKKINDA BİRKAÇ SORUM OLACAK ONUR BEY,AdventureWorks ayrı Urunler tablosunun bulunduğu DATABASE ayrı dimi? Birde Urunler ve Prodcution.Production tablolarının içerikleri aynı mı ?

Mesela ben Kitaplar ve Müsteri tablolarını ayrı database ler içine yazdım.Şöyle:

CREATE DATABASE KUTUPHANE
USE kitaplar
SELECT * INTO kitaplar FROM MUSTERİ.MüsteriBilgileri.MüsteriID //Databaseİsmi. TabloAdı. Tablo PK

CREATE VIEW KitapMüsteri

AS

SELECT * FROM kitaplar

WHERE Color IS NULL
AMA BİR SONUCA VARAMADIM YARDIM EDER MİSİNİZ ACABA RİCA ETSEM ?

Adsız dedi ki...

acaba VİEW i başka bir örnek ile açıklamanız mümkün mü ?

Onur Salkaya dedi ki...

Merhaba,

Yukarıda belirtmiş olduğunuz "SELECT * INTO Urunler FROM AdventureWorks.Production.Product" kısmında yapılan olayın adı BULK INSERT işlemi.

AdventureWorks veri tabanında mevcut olan bir Production.Product tablosu var. Bu tablonun içerisinde 504 adet kayıt mevcut. Kendi oluşturduğumuz başka bir veri tabanında, Production.Product tablosu ile birebir aynı olacak şekilde ve aynı kayıtları içerecek yeni bir tablo oluşturmak istiyoruz. Normal şartlarda bir tablo oluşturulmalı ve bir cursor ile tüm kayıtların yeni oluşturulan tabloya aktarılması gerekir. Ancak Bulk insert işlemi ile hedef tablonun birebir aynısı (anahtarlar hariç) yaratılarak içerisindeki dataların da kopyalanması tek bir satır kod ile sağlanabilir. Biz de yukarıda bunun bir örneğini yaptık.

Burada View ile ilgili anlatılanlar oldukça sadece aslında. En basit mantıkla baktığımızda yaptığımız iş sadece SELECT saklamak. AdventureWorks veri tabanından bazı dataların kopyalanması işi tamamen konu dışı. Amacım, AdventureWorks DB'si üzerinde değil de kendi oluşturduğum bir DB üzerinde işlem yapmaktı. Sizin takıldığınız nokta VIEW konusundan ziyade BULK INSERT kısmı gibi gözüküyor.

Sizin yazdığınız kod örneğini de yapmış olduğum açıklamaya göre tekrar gözden geçirmelisiniz. FROM'dan sonra "Musteri.MusteriBilgileri.MusteriID" gibi bir kod görüyorum. Burada bir kolon ismi veremezsiniz. FROM'dan sonra kaynak tablo adı belirtilmeli. Burada belirttiğiniz tablonun birebir aynısı "INTO" anahtar sözcüğünden sonra vermiş olduğunuz isim altında yeni br tablo olarak yaratılacaktır.

Adsız dedi ki...

Merhaba arkadaşa katılıyorum biraz karışık olmuş daha fazla ekran görüntüsü yapıp anlatır mısınız tekrardan zahmet olmazsa tabi teşekkürler bu arada bloğunuz bir harika

Yorum Gönder