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.
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:
şiir gibi anlatmışsın. eline sağlık...
Teşekkür ediyorum, başarılar dilerim.
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 ?
acaba VİEW i başka bir örnek ile açıklamanız mümkün mü ?
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.
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