Şimdi Ara

SQL programi öğrenmek istiyorum

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
3 Misafir - 3 Masaüstü
5 sn
3
Cevap
0
Favori
3.226
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • SQL programı öğrenmek istiyorum, nasıl öğrenebilirim?



  • MsSql kullanmakmı istiyorsun yoksa sorgumu yazmak istiyorsun?


    Eğer sorgu yazmak istiyorsan internette biraz araştırma yap ve microsoft un eğitim amaçlı hazırladığı "Northwind" veritabınını indir.
    Ve bunlara bir göz at.
    --------------------------------------------------------------------------------------------------------------------------
    T-SQL (Transactional - Structure Query Language), üç dil yapısının birleşiminden oluşur.
      
       1. DDL : Data Definition Language
             --- CREATE <NesneTipi><NesneAdi> (Oluşturucu)
             --- ALTER <NesneTipi><NesneAdi> (Değiştirir)
             --- DROP <NesneTipi><NesneAdi> (Siler)
            
       2. DML : Data Manipulation Language
             --- INSERT (Kayıt Ekler)
             --- UPDATE (Varolan Kaydı Günceller)
             --- DELETE (Varolan Kaydı Siler)
             --- SELECT (Belirtilen Kritere Uygun Kayıtları Getirir.)
      
    */
    -- INSERT
    -- INSERT into <TabloAdi>(<KolonAdi1>,<KolonAdi2>,<KolonAdiN>)
                  values(<Deger1>,<deger2>,<degerN>)

    INSERT into Products (ProductName,UnitPrice,UnitsInStock,Discontinued)
                  values ('Kuru Fasülye',5,1000,0)

                 
    -- UPDATE <tabloAdi> SET <KolonAdi1>=<Deger1>,
    --                       <KolonAdi2>=<Deger2>,
    --                       <KolonAdi3>=<Deger3>
    --WHERE <kriter>

    UPDATE Products SET ProductName='Taze Fasülye'
    WHERE ProductID=78

    -- DELETE FROM <TabloAdi> WHERE <Kriter>
    DELETE FROM Products WHERE ProductID=78

    INSERT into Products (ProductName,UnitPrice,UnitsInStock,Discontinued)
                  values ('Kuru Fasülye',5,1000,0)

                  
     -- SELECT <KolonAdi1>,<KolonAdi2> FROM <TabloAdi> WHERE <VARSA kriter>
      -- SELECT * FROM <TabloAdi> WHERE <VARSA kriter> (Tüm Kolonları Getirir..)

      
      SELECT * FROM Employees

      SELECT FirstName, LastName FROM Employees
     
       -- SELECT <TabloAdi>.<KolonAdi1>, FROM <TabloAdi>.<KolonAdi2> WHERE <VARSA kriter>
       -- Uzunca..
      

       SELECT Products.ProductName, Products.UnitPrice FROM Products
       WHERE UnitPrice>100
       -- 100 $ dan büyük ürünler..

       -- UnitsInStock (stok) değeri 10'un altında olan ürünlerin adı, fiyatı ve stok bilgileri
       SELECT Products.ProductName, Products.UnitPrice, Products.UnitsInStock FROM Products
       WHERE UnitsInStock<10


    /*
      1. Hangi tablo(lar) ile çalışacağına karar ver.
      2. Bu tablo(lar) daki hangi kolon(lar)ı görmek istediğine karar ver
      3. Eğer varsa kriterini yaz.
    */

    -- Brazil'de bulunan müşterilerin Şirket Adı, TemsilciAdi, Adres, Şehir, Ülke bilgileri
    SELECT CompanyName, ContactName, Address, City, Country FROM Customers
    where Country='Brazil'


    -- Brezilya'da olmayan müşteriler
    SELECT CompanyName,ContactName,Address,City,Country FROM Customers
    where Country != 'Brazil'

    -- Londra'da ya da Paris'de bulunan müşterilerim:
    SELECT CustomerID,CompanyName,Address, City FROM Customers
    WHERE City= 'London' OR City= 'Paris'

    -- Hem Mexico D.F'da ikamet eden HEM DE ContactTitle bilgisi 'owner' olan müşteriler:
    SELECT CustomerID,CompanyName,ContactTitle,City FROM Customers
    WHERE City='México D.F.' AND ContactTitle='owner'

    -- C ile başlayan ürünlerimin isimleri ve fiyatları
    SELECT ProductName,UnitPrice FROM Products
    WHERE ProductName LIKE 'C%'
    -- Satışı yapılmayan ürün listesi
    --(İpucu: Discontinued=1 olacak)
    SELECT ProductName,UnitPrice FROM Products
    WHERE Discontinued=1

    -- Adı (FirstName) 'A' harfiyle başlayan çalışanların (Employees); Ad, Soyad ve Doğum Tarihlerini görmek istiyorsak:
    SELECT FirstName,LastName,BirthDate FROM Employees
    WHERE FirstName LIKE 'A%'

    -- İsminde 'RESTAURANT' geçen müşterilerimin şirket adları:
    SELECT CompanyName FROM Customers
    WHERE CompanyName LIKE '%RESTAURANT%'

    -- 50$ ile 100$ arasında bulunan tüm ürünlerin adları ve fiyatları
    SELECT ProductName,UnitPrice FROM Products
    WHERE UnitPrice BETWEEN 50 AND 100

    -- 1 temmuz 1996 ile 31 Aralık 1996 tarihleri arasındaki siparişlerin (Orders), SiparişID (OrderID) ve SiparişTarihi (OrderDate) bilgileri
    SELECT OrderID,OrderDate FROM Orders
    WHERE OrderDate BETWEEN '01/07/1996' AND '31/12/1996'

    -- Ülkesi (Country) YA Spain, Ya France, Ya da Germany olan müşteriler
    SELECT CompanyName,Country FROM Customers
    WHERE Country='Spain' OR Country='France' OR Country='Germany'

    -- Eğer OR çok fazla kullanmışsak, aşağıdaki gibi de yazabiliriz.
    SELECT CompanyName,Country FROM Customers
    WHERE Country IN ('Spain','France','Germany')

    --Olumsuzu (NOT IN)
    SELECT CompanyName,Country FROM Customers
    WHERE Country NOT IN ('Spain','France','Germany')

    --Faks numarasını bilmediğim müşteriler
    SELECT CustomerID, CompanyName, Fax FROM Customers
    where Fax is null

    -- ResultSet Sıralama:
    Müşterilerimi ülkeye göre sıralıyorum:
    SELECT CompanyName,Country FROM Customers
    ORDER BY Country ASC
    -- asc: ascendence (küçükten büyüğe)
    -- desc: descendence (büyükten küçüğe)
    --Ürünlerimi en pahalıdan en ucuza doğru sıralama, sonuç olarak ürün adı ve fiyatını istiyoruz:
    SELECT ProductName,UnitPrice FROM Products
    ORDER BY UnitPrice DESC

    --Ürünlerimi en pahalıdan en ucuza doğru sıralasın, ama stoklarını küçükten-büyüğe doğru göstersin sonuç olarak ürün adı ve fiyatını istiyoruz:
    SELECT ProductName,UnitPrice,UnitsInStock FROM Products
    --WHERE ProductName LIKE 'C%' de yazabiliriz..
    ORDER BY UnitPrice DESC, UnitsInStock ASC

    -- AGGREGATE FUNCTIONS (Değer döndüren fonksiyonlar. Tabloda kaç sütün var gibi..)
    SELECT COUNT(*) FROM Customers
    -- 91 Tane Müşterim varmış..

    SELECT CategoryID,CategoryName FROM Categories

    SELECT ProductName,CategoryID FROM Products
    -- 1 Numaralı kategoride kaç ürün vardır..?
    SELECT COUNT(*) FROM Products
    WHERE CategoryID=1

    --COUNT(<KolonAdi>) : Belirtilen kolonun, ResultSet içinde kaç adet geçtiğini verir.

    -- Kaç farklı ülkeye ihracat yapıyorum..?
    SELECT COUNT(DISTINCT Country) FROM Customers

    -- DISTINCT - Tekrar edeniş verme.. 3 kez Almanya geçiyorsa 1 kez göster..

    -- Bu ülkeler hangileri..?
    SELECT DISTINCT Country FROM Customers

    -- DISTINCT: ResultSet (Uyarı: ResultSet ram üzerindedir.) içinde tekrar eden verilerden YALNIZCA BİRİNİ alarak, bir nevi veriyi süzer.

    --Veri Süzme: TOP x
    SELECT TOP 3 CompanyName FROM Customers

    -- En Pahalı 5 ürün dersem
    SELECT TOP 5 ProductName, UnitPrice FROM Products
    ORDER BY UnitPrice Desc

    --ALFKI CustomerID'sine sahip müşterimin sipariş sayısı..?
    --(Orders)
    SELECT COUNT(*) FROM Orders
    WHERE CustomerID='ALFKI'

    -- Sütun'a isim vermek için:
    SELECT COUNT(*) AS ToplamSiparis FROM Orders
    WHERE CustomerID='ALFKI'

    SUM(<KolonAdi>): Belirtilen Kolonun resultset içindeki toplamını verir. Yalnızca sayısal kolonlarda kullanılabilir.

    --Ürünlerimin toplam maliyeti:
    SELECT SUM(UnitPrice) ToplamFiyat FROM Products

    --Şirketim, şimdiye kadar ne kadar ciro yapmış..?
    --Kaynak: Order Details tablosu
    --1-Discount (İskontoları düşeriz..
    SELECT SUM(UnitPrice*Quantity*(1-Discount)) ToplamCiro FROM [Order Details]

    --AVG(<KolonAdi>): ResultSet içinde belirtilen kolonun ortalamasını alır:
    --Ortalama Ürün Fiyatım:
    SELECT AVG(UnitPrice) Ortalama FROM Products

    SELECT FirstName + ' ' + LastName as AdSoyad FROM Employees
    -- MAX ve MIN

    SELECT MAX(UnitPrice) FROM Products

    SELECT MIN(UnitPrice) FROM Products

    -- En Pahalı Ürünün Adı
    SELECT ProductName FROM Products
    WHERE UnitPrice= (SELECT MAX(UnitPrice) FROM Products)

    --En az kazandıran sipariş (Kaynak: Order Details)
    SELECT MIN(UnitPrice * Quantity) FROM [Order Details]

    Üssünü Alma:
    SELECT POWER (3,2)
    SELECT SQRT(81)
    SELECT LEN('DENEME')

    -- Müşterilerimin içinde en uzun isimli müşteri (harf sayısı)
    SELECT MAX(LEN(CompanyName)) FROM Customers
    SELECT GETDATE()
    SELECT YEAR (GETDATE())
    SELECT DAY (GETDATE())
    SELECT MONTH (GETDATE())

    --Çalışanlarımın Ad, Soyad ve Yaşları
    SELECT FirstName,LastName, YEAR(GETDATE())-YEAR(BirthDate) as Yas FROM Employees

    SELECT photo FROM Employees

    -- GROUP BY (Gruplama)
    -- Hangi üründen toplam kaç adet alınmış..?
    SELECT ProductID, SUM(Quantity ) FROM [Order Details]
    GROUP BY ProductID

    -- Eğer bir sorguda Aggregate Function ve normal bir kolon kullanıyorsanız; o sorguda GROUP BY olmak zorundadır. GROUP BY ile bağlanacak kolon ise, Aggregate Funtion dışındaki tüm kolonlardır.
    SELECT ProductID, SUM(Quantity ) as ToplamAdet FROM [Order Details]
    GROUP BY ProductID
    ORDER BY ToplamAdet DESC

    -- Hangi siparişte toplam ne kadar kazanmışım..?
    -- Kaynak tablo: Order Details
    -- İstenen kolonlar: OrderID ve Kazanç (adet*fiyat)
    -- SUM var: GROUP BY kullanmak zorundayım..
    SELECT OrderID, SUM(Quantity * UnitPrice) FROM [Order Details]
    GROUP BY OrderID

    -- Hangi Kategoride toplam kaç adet ürün bulunuyor..?
    SELECT CategoryID, COUNT(ProductID) FROM Products
    GROUP BY CategoryID

    --MAX ve MIN tek değer döndürdüğü için GROUP BY kullanılmaz..!
    SELECT CategoryID, COUNT(ProductID) as Adet FROM Products
    GROUP BY CategoryID
    ORDER BY Adet

    -- HAVING:
    -- 1000 Adetten fazla satılan ürünler:
    SELECT ProductID,SUM(Quantity) As SatisAdeti FROM [Order Details]
    GROUP BY ProductID
    HAVING SUM(Quantity)>1000

    -- Bir resultset'e uygulayacağınız kriter eğer tabloda bir kolona bağlıysa; WHERE kullanırsınız. Ancak ram'de hesaplanmış bir değere kriter uygulayacaksanız HAVING Kullanılır..

    -- SUB-QUERY (Alt sorgular iç içe sorgular)
     
    -- Ortalamanın altında bir fiyata sahip ürünlerimin adı ve fiyatı:
    -- 1. Önce ortalamasını bulmak için bir sorgu:
    SELECT AVG(UnitPrice) FROM Products

    -- 2. Bu sonucu kriter olarak kullanacak sorgu:
    SELECT ProductName,UnitPrice FROM Products
    WHERE UnitPrice < (SELECT AVG(UnitPrice) FROM Products)

     SELECT COUNT(*) FROM Customers
     SELECT COUNT(DISTINCT CustomerID) FROM Orders

     
     -- Hangi Müşterilerim hiç sipariş vermemiş..? (91 Müşteriden 89'u sipariş vermişti..)
     SELECT CompanyName,Address,City,Country FROM Customers
     WHERE CustomerID NOT IN (SELECT DISTINCT CustomerID FROM Orders)


    -- Aşağıdaki örneğin amacı, sub-query'nin yalnızca WHERE kriterinden sonra kullanılacağı gibi bir yanılgıyı önlemektir:
    SELECT c.CategoryName + ' (' + CAST((SELECT COUNT(ProductID) FROM Products
    WHERE CategoryID=c.CategoryID) as NVARCHAR(5) ) +')' FROM Categories as c

    -- INNER JOIN
    -- Birbiriyle ilişkili tablolardan Sadece ürünü olan (EŞLEŞEN (PRIMARY KEY ile FOREIGN KEY karşılığı olan)) kayıtlardan resultset oluşturan sorgu tipi:

    SELECT Products.ProductName, Categories.CategoryName FROM Products
    INNER JOIN Categories
    ON Products.CategoryID=Categories.CategoryID
    -- Hangi ürün hangi kategoride..

    INSERT into Categories(CategoryName,Description)
              values ('Tatlılar', 'Sütlü Tatlılar')
    SELECT * FROM Categories

    -- Hangi tedarikçi (Suppliers.CompanyName), Hangi Ürünü (Products.ProductName) Sağlıyor..? 
    SELECT sp.CompanyName,p.ProductName FROM Suppliers as sp
    INNER JOIN Products as p
    ON sp.SupplierID=p.SupplierID
    -- p.ProductName=Products.ProductName (Kısalttık..)

    -- Hangi sipariş (Orders.OrderID) hangi kargo şirketi ile (Shippers.CompanyName) ne zaman (Orders.OrderDate) gönderilmiş..?
     SELECT Orders.OrderID,Shippers.CompanyName,Orders.OrderDate FROM Shippers
    INNER JOIN Orders
    ON Shippers.ShipperID=Orders.ShipVia

    -- 25.11.2009. Çarşamba
    -- hangi siparişi hangi müşteri verir..?
    SELECT Customers.CompanyName,Orders.OrderID,Orders.OrderDate FROM Customers
    INNER JOIN Orders
    -- PRIMARY KEY             -- FOREIGN KEY
    ON Customers.CustomerID = Orders.CustomerID

    -- Hangi çalışan, TOPLAM kaç sipariş almış..?
    -- Employees, Orders
    SELECT FirstName,LastName, COUNT(OrderID)  FROM Orders
    INNER JOIN Employees
    ON Orders.EmployeeID=Employees.EmployeeID
    GROUP BY FirstName,LastName
    -- COUNT Kullandığımız için GROUP BY Kullandık..

    -- En fazla siparişi kim almış..
    SELECT FirstName,LastName, COUNT(OrderID) AS ToplamSiparisSayisi  FROM Orders
    INNER JOIN Employees
    ON Orders.EmployeeID=Employees.EmployeeID
    GROUP BY FirstName,LastName
    ORDER BY ToplamSiparisSayisi DESC

    --BIRDEN FAZLA TABLO ILISKILERI
    -- Hangi siparişi
    -- Hangi çalışan,
    -- Hangi müşteri vermiştir..?
    SELECT Orders.OrderID,Employees.FirstName,Employees.LastName,Customers.CompanyName FROM Employees
    INNER JOIN Orders
    ON Employees.EmployeeID=Orders.EmployeeID
    INNER JOIN Customers
    ON Customers.CustomerID=Orders.CustomerID


    -- Hangi ürün
    -- hangi kategoride bulunmaktadır..?
    -- Bu ürünü kim tedarik etmektedir..?
    SELECT Products.ProductName,Categories.CategoryName,Suppliers.CompanyName FROM Products
    INNER JOIN Suppliers
    ON Products.SupplierID=Suppliers.SupplierID
    INNER JOIN Categories
    ON Products.CategoryID=Categories.CategoryID

    -- Hangi siparişi
    -- hangi müşteri vermiş,
    -- hangi çalışan almış,
    -- hangi tarihte,
    -- hangi kargo şirketi tarafından gönderilmiş
    -- hangi üründen kaç adet alınmış,
    -- hangi fiyattan alınmış
    -- ürün hangi kategorideymiş
    -- bu ürünü hangi tedarikçi sağlamış
    SELECT
           Orders.OrderID,
           Customers.companyName,
           Employees.FirstName+ ' ' + Employees.LastName as Calisan,
           Orders.OrderDate,
           Shippers.CompanyName as Kargo,
           Products.ProductName,
           [Order Details].Quantity,
           [Order Details].UnitPrice * (1-[Order Details].Discount) as indirimliFiyat,
           Categories.CategoryName,
           Suppliers.CompanyName as Tedarikci
          
     FROM Employees
    INNER JOIN Orders
    ON Orders.EmployeeID=Employees.EmployeeID
    INNER JOIN Customers
    ON Customers.CustomerID=Orders.CustomerID
    INNER JOIN Shippers
    ON Shippers.ShipperID=Orders.ShipVia
    INNER JOIN [Order Details]
    ON Orders.OrderID=[Order Details].OrderID
    INNER JOIN Products
    ON Products.ProductID=[Order Details].ProductID
    INNER JOIN Categories
    ON Categories.CategoryID=Products.CategoryID
    INNER JOIN Suppliers
    ON Suppliers.SupplierID=Products.SupplierID

    -- OUTER JOIN

    SELECT * FROM Categories
    INSERT into Categories(CategoryName,Description) values
                            ('Tatlılar', 'Hede Hödö')

                           
    -- Altında ürün bulunmayan kategoriler                       
    SELECT Categories.CategoryName,Products.ProductName FROM Products
    RIGHT JOIN Categories
    ON Products.CategoryID=Categories.CategoryID
    WHERE ProductName is null

    -- 91 müşterim var. Sadece 89'u sipariş vermiş. Sipariş vermeyen 2 kişiyi bulun:
    SELECT CompanyName,Address,OrderID FROM Customers
    LEFT JOIN Orders
    ON Customers.CustomerID=Orders.CustomerID
    WHERE OrderID is null

    -- LEFT veya RIGHT kelimesi tamamını getirmek istediğiniz tablonun Join kelimesinin neresine yazıldığı ile ilgilidir.
    -- JOIN kelimesinin solundaki tablonun tüm kayıtlarını getirmek için LEFT,
    -- Sağındakini getirmek için ise RIGHT kelimesini kullanırım.


      -- Daha önce aşağıdaki şekilde bulmuştuk..
      -- Hangi Müşterilerim hiç sipariş vermemiş..? (91 Müşteriden 89'u sipariş vermişti..)
      -- SELECT CompanyName,Address,City,Country FROM Customers
      -- WHERE CustomerID NOT IN (SELECT DISTINCT CustomerID FROM Orders)
     

      
      -- HANGİ ÇALIŞAN ŞİMDİYE KADAR TOPLAM KAÇ SİPARİŞ ALMIŞ..?
      -- iki farklı (bağımsız) sorgu var..
      
      SET STATISTICS TIME ON
     
      SELECT EmployeeID,FirstName,LastName,
      (SELECT COUNT(orderID) FROM Orders WHERE EmployeeID= x.EmployeeID)
      FROM Employees as x

    -- UNION (2 farklı resultset'i birleştirir.)
    -- iki ya da daha fazla tabloyu birleştirir..
    -- Kural: iki resultset içindeki kolonlar aynı sayıda ve sırasıyla aynı tipte olmalıdır. (int-string alt alta olmaz..)
    SELECT CompanyName,Address,City,Country, ' Müşteri' FROM Customers
    UNION
    SELECT CompanyName,Address,City,Country, ' Tedarikçi' FROM Suppliers
    ORDER BY Country
    -- 01.12.2009.SALI
    SET STATISTICS TIME ON
    SELECT Products.ProductName, Products.UnitPrice, Categories.CategoryName,Categories.Description FROM Products
    CROSS JOIN Categories

    -- CROSS JOIN Tüm ilişkili-ilişkisiz (LEFT JOIN, RIGHT JOIN, INNER JOIN, OUTER JOIN)Tabloları Görmemizi sağlar. Sadece süre olarak ne kadar sürede sorgu çekildiğini hesaplamamıza yardımcı olur.

    CHECK ve DEFAULT Constraintler
    use Normalizasyon
    ALTER TABLE Urunler
    ADD CONSTRAINT DF_AktifMi
    DEFAULT 1 for AktifMi
    -- Products için yapsaydık DF_Discontinued - for Discontinued olacaktı...

    -- CHECK
    ALTER TABLE Urunler
    ADD CONSTRAINT CK_Fiyat
    CHECK (Fiyati > -1)
    -- Artık ürünler tablosuna eksi bir değer giremeyeceğiz..

    -- INDEX ---

    use Northwind
    GO
    SELECT ProductName,UnitPrice FROM Products
    WHERE ProductID = 1

    SELECT * FROM Customers
    WHERE Country='Germany'
    -- Almanya'da bulunan müşterim
    -- Hangi kolonu indexlemem lazım.. Burada Ülke'yi index'lersek "Germany" 'yi sadece ülkelerde arayacak..

    CREATE Nonclustered INDEX ix_Ulke
    ON Customers(Country)

    -- Sorgular, boşluklardan sonra yavaşlar. 3-6 aylık bakımlarda index temizlemek gerekebilir...
    -- DBCC INDEXDEFRAG
    -- DROP INDEX deyip yeni INDEX Olusturmak

    SELECT * FROM Northwind.dbo.Products

    -- FQN: FULLY QUALIFIED NAME: UZUN KÜNYE (Sunucudan Kolon Adına Kadar Tüm Nesneleri Nokta İle Birleştiren Object Adı):
    --Örnek: <sunucuAdi>.<veritabaniAdi>.<semaAdi>.<tabloAdi>.<kolonAdi>

    -- FQN Master ile Sunucuma bağlı (ya da tanımlı) diğer sunucularıma sorgu çekebilmemi sağlar..
    -- Sunucu adı yerine IP Numarası da yazabiliriz...

    CREATE VIEW UrunlereGoreTedarikciler
    AS
    SELECT ProductName,companyName,Address,City,Country FROM Products
    INNER JOIN Suppliers
    ON
    Products.SupplierID=Suppliers.SupplierID
    -- View yaratmadan önce sorgunun çalışıp-çalışmadığı mutlaka kontrol edilmelidir..

    SELECT * FROM UrunlereGoreTedarikciler
    -- Sonuçta tablo olduğuna göre WHERE kriteri de kullanabiliriz..
    WHERE CompanyName LIKE 'E%'
    order by Country

    SELECT * FROM tumSiparisDetaylari
    WHERE OrderID=10248
    ORDER BY ProductName


    -- Hangi durumlarda view içine INSERT Yapılamaz:
    -- 1. Eğer, View, INNER JOIN içeriyorsa (Arkada bisürü tablo var, hangisini yapacağını bilemiyor)
    -- 2. View sonucunda oluşacak resultset'deki tüm kolonlar boş geçileez ise
    -- 3. CHECK OPTION seçeneği ile view oluşmuşsa

    CREATE VIEW AlmanMusteriler
    AS
    SELECT CustomerID,CompanyName,Address,City,Country FROM Customers
    WHERE Country='Germany'
    -- INNER JOIN içermiyor, boş geçilemez (not null) alan da var o zaman view a uyuyor. (ilk iki koşulu sağladı)
    WITH CHECK OPTION
    -- Insert sırasında gelen kaydı kontrol et, eğer uyuyorsa kabul et..

    SELECT * FROM AlmanMusteriler

    INSERT into AlmanMusteriler(CustomerID,CompanyName,Address, City,Country)
    values
    ('ACTHU','ACHTUNG Co.','Hede','Berlin','Germany')
    -- Burada Türkiye yazmış olsaydık insert into yapamazdık. Çünkü where kriteri Germany olarak aldık. Eğer where kriteri koymamış olsaydık bu sefer de CHECK OPTION a gerek kalmazdı..


    -- WITH CHECK OPTION: Bir view nesnesine, INSERT ya da UPDATE sorgusu çalıştığında, yeni gelen datanın view kurallarına uymasını istiyorsak; CHECK OPTION seçeneğini kullanabiliriz.

    --Şifrelemek istiyorsak; with encryption kullanırız.. Şifreledikten sonra biz bile göremiyoruz..
    CREATE VIEW UrunBilgisi
    with Encryption
    AS
    SELECT ProductName,UnitPrice FROM Products

    -- INJECTION
    SELECT * FROM Users WHERE KullaniciAdi='' AND Sifre=''
    -- Normalde Şifre mantığı yukarıdaki gibidir.. o halde aşağıdaki şifreyi kırar..
    SELECT * FROM Employees WHERE FirstName='' OR 'A'='A' AND LastName='' OR 'A'='A'
    ' or 'A'='A

    -- SCHEMABINDING

    -- SCRIPT ve BATCH
    -- Değişkenler

     DECLARE @Sayi int
     -- Değişkenin değerini ben veriyorsam:
     SET @Sayi=5
     Print(@Sayi)

     
     DECLARE @CalisaninAdi nvarchar(20)
     -- Değişkenin değerini bir sorgu aracılığı ile gelecekse:
     SELECT @CalisaninAdi=FirstName FROM Employees
     WHERE EmployeeID=1
     Print(@CalisaninAdi)

     
     DECLARE @x int
     SET @x=8
     Print('Sayı = '+
     CAST(@x as nchar(2))
     )
    -- x'i al 2 karakterli nchar'a çevir..

     
      DECLARE @x int
     SET @x=8
     Print('Sayı = '+
     CONVERT(nchar(2),@x)
     )
     -- x'i al 2 karakterli nchar'a çevir.. (Yukarıdaki ile tamamen aynı)

     
     -- Bir sipariş girdiğim anda, oluşan SON ORDERID bilgisini nasıl elde ederim..?
     SELECT TOP 1 OrderID FROM Orders
     ORDER BY OrderID DESC

     
     -- Bunu Değişken atmak istersem;
     DECLARE @ID int
      SELECT TOP 1 @ID=OrderID FROM Orders
     ORDER BY OrderID DESC
     Print(@ID)

     
     INSERT into Orders(CustomerID,EmployeeID,OrderDate,ShipVia)
                  values ('ALFKI','1',GETDATE(),1)
     SELECT @@IDENTITY
     -- Global Değişken @@
     -- Herhangi bir user, global sql değişkeni TANIMLAYAMAZ

     
      INSERT into Orders(CustomerID,EmployeeID,OrderDate,ShipVia)
                  values ('ALFKI','1',GETDATE(),1)
     SELECT @@IDENTITY
     select SCOPE_IDENTITY()

     
     -- WHEN / CASE:
     
     SELECT CompanyName,Region =
                         CASE
                             WHEN Region='BC' THEN 'Washington'
                             WHEN Region='SP' THEN 'Pensilvanya'
                             WHEN Region='OR' THEN 'Orlando'
                         END
     
     FROM Customers
     WHERE Region is not null

     
     SELECT ProductName,Discontinued=
                          CASE
                              WHEN Discontinued='0' THEN 'Satış Durduruldu'
                              WHEN Discontinued='1' THEN 'Satış Devam Ediyor'                         
                          END
     
      FROM Products

    --    TRY - CATCH    --
    BEGIN TRY
    SELECT 1/0
    END TRY
    BEGIN CATCH
    SELECT ERROR_Message()
    END CATCH

    -- STORED PROCEDURE (SAKLI YORDAM) ---
    CREATE PROC KategoriGetir
    AS
    SELECT * FROM Categories
    KategoriGetir


    CREATE PROC IDyeGoreUrun
    @id int
    AS
    SELECT ProductName,UnitPrice,UnitsInStock FROM Products
    WHERE ProductID=@id

    IDyeGoreUrun 77
    -- ID si 77 olan ürünün bilgisini getiriyor..

    -- Normalde Ürün eklerken şu şekilde işlem yaparız..
    INSERT INTO Categories (CategoryName,Description)
                 values (@KategoriAdi,@Aciklama)

     -- Stored Procedure Yapalım..
     
     
     CREATE PROC KategoriEkle
     @KategoriAdi nvarchar(15),
     @Aciklama ntext
     AS
     INSERT INTO Categories (CategoryName,Description)
                 values (@KategoriAdi,@Aciklama)
    KategoriEkle 'Unlu Mamüller', 'Türk Usulü Unlu Börek Çörek'
    -- ÖDÜLLÜ ÖDEV: Yapan Herkese Çikolata...
    -- ID'si verilen müşterinin toplam ne kadarlık alışveriş yaptığını (fiyat olarak) bulan procedure


    SELECT SUM([Order Details].UnitPrice*Quantity*(1-Discount))
    FROM [Order Details]
    INNER JOIN Orders
    ON Orders.OrderID=[Order Details].OrderID
    INNER JOIN Customers
    ON Customers.CustomerID=Orders.CustomerID
    WHERE Customers.CustomerID='ALFKI'

    --- Önce burası çalışıyor mu kontrol edelim ve
    --  Şimdi Procedure ı oluşturalım


    CREATE PROC MusterininAlisVerisi
    @ID char(5)
    AS
    SELECT SUM([Order Details].UnitPrice*Quantity*(1-Discount))
    FROM [Order Details]
    INNER JOIN Orders
    ON Orders.OrderID=[Order Details].OrderID
    INNER JOIN Customers
    ON Customers.CustomerID=Orders.CustomerID
    WHERE Customers.CustomerID='ALFKI'
    MusterininAlisVerisi 'OCEAN'

    SELECT CustomerID from Customers

    -- Çeşitlendirmek mümkün...
    CREATE PROC MusterininAlisVerisi2
    @ID char(5)
    AS
    SELECT SUM([Order Details].UnitPrice*Quantity*(1-Discount)) AS Toplam
    FROM [Order Details]
    INNER JOIN Orders
    ON Orders.OrderID=[Order Details].OrderID
    INNER JOIN Customers
    ON Customers.CustomerID=Orders.CustomerID
    WHERE Customers.CustomerID=@ID
    GROUP BY Customers.CustomerID,CompanyName
    ORDER BY Toplam DESC
    MusterininAlisVerisi2 'QUICK'

    SELECT CustomerID from Customers
    -- iki tarih aralığında bulunan siparişler:
    SELECT OrderID,OrderDate,ShipAddress FROM Orders
    WHERE OrderDate BETWEEN '31/12/1996' AND '15/07/1997'

     -- Şimdi procedure oluşturalım..
     
     CREATE PROC TariheGoreSiparis
     @Tarih1 smalldatetime,
     @Tarih2 smalldatetime
     AS
     SELECT OrderID,OrderDate,ShipAddress FROM Orders
    WHERE OrderDate BETWEEN @Tarih1 AND @Tarih2
    TariheGoreSiparis '01/01/1997', '06/06/1997'

    -- Yıla Göre Ciro
    CREATE PROC YilaGoreCiro
    @Yil int
    AS
    SELECT SUM(Quantity * UnitPrice * (1-Discount)) FROM [Order Details]
    INNER JOIN Orders
    ON Orders.OrderID=[Order Details].OrderID
    WHERE YEAR (Orders.OrderDate)=@Yil
    YilaGoreCiro 1997

    -- ID si verilen müşteri, en son hangi ürünü almış..?
    -- ID si verilen çalışan, en çok kime ürün satmış..?
    -- ID  si verilen müşteriyle ne kadar süredir çalışıyoruz..?
    -- ID si verilen kategorinin içinde en çok satan 5 ürün..?
    -- ID si verilen tedarikçi bana hangi ürünleri sağlıyor..?

    CREATE PROC HangiUrun
                @ID char(5)
                AS
    SELECT TOP 1 Customers.CompanyName,Products.ProductName,[Order Details].Quantity,Orders.OrderDate FROM Customers
    INNER JOIN Orders
    ON Customers.CustomerID=Orders.CustomerID
    INNER JOIN [Order Details]
    ON Orders.OrderID=[Order Details].OrderID
    JOIN Products
    ON [Order Details].ProductID=Products.ProductID
    WHERE Customers.CustomerID=@ID
    ORDER BY Orders.OrderDate DESC

    HangiUrun 'QUICK'
    -- Tabloda ilişkili olanlara baktık..

    -- Flash Disk Alanlar..
    SELECT FROM

    -- 1. Sadece o ürünün bulunduğu siparişler:
    CREATE PROC BunuAlanBunudaAldi
    @productID int
    AS
    SELECT TOP 5 ProductName, SUM(Quantity) as toplam FROM Products
    INNER JOIN [Order Details]
    ON Products.ProductID=[Order Details].ProductID
    WHERE
    [Order Details].OrderID
    IN
    (
      SELECT OrderID FROM [Order Details]
      WHERE ProductID=@productID
    )
    AND [Order Details].ProductID !=@productID
    GROUP BY ProductName
    ORDER BY toplam DESC
    BunuAlanBunudaAldi 9


    ----- FONKSİYONLAR -----
    -- ÜRÜNLER TABLOSUNDAKİ TÜM FİYATLARIN KDV'SİNİ HESAPLASIN
    -- PROCEDURE
    -- HERHANGİ BİR DEĞERİN KDV'SİNİ HESAPLASIN dersek, FONKSİYON OLUR.. Herhangi bir tabloya bağlı kalmadan..

    CREATE FUNCTION KDVHesaplayici
    (
      @Para money
    )
    RETURNS money
    AS
    BEGIN
      DECLARE @Deger money
      SET @Deger= @Para * 1.18
      RETURN @Deger
    END
    SELECT ProductName,UnitPrice, dbo.KDVHesaplayici(UnitPrice) AS KDVDahil

    -- Fonksiyon, her zaman şemaya bağlı çalışır
    FROM Products

    -- Parametre olarak girilen int bir sayının karesini alalım..
    CREATE FUNCTION KaresiniAl
    (
      @Sayi int
    )
    RETURNS int
    AS
    BEGIN
      DECLARE @Sonuc int
      SET @Sonuc= @Sayi * @Sayi
      RETURN @Sonuc
    END
    SELECT  dbo.KaresiniAl(9)

    -- VEYA

    CREATE FUNCTION KaresiniAlalim
    (
      @x int
    )
    RETURNS int
    AS
    BEGIN
      RETURN @x*@x
    END
    SELECT  dbo.KaresiniAlalim(9)


    -- A.AKYILDIRIM
    SELECT UPPER('türkay')
    SELECT LOWER ('ABDULLAH')
    SELECT LEN('Dilara')
    SELECT SUBSTRING('BilgeAdam',1,5)

    CREATE FUNCTION ParafOlusturucu
    (
      @Ad nvarchar(50),
      @Soyad nvarchar(50)
    )
    RETURNS nvarchar(100)
    AS
    BEGIN
      DECLARE @donenDeger nvarchar(100)
      SELECT @donenDeger = UPPER(SUBSTRING(@Ad,1,1))+'.'+
                           UPPER(SUBSTRING(@Soyad,1,1)) +
                           LOWER(SUBSTRING(@Soyad,2,LEN(@Soyad)))
    RETURN @donenDeger
    END
               
    SELECT dbo.ParafOlusturucu('Ali','Akyıldırım') 

     
    SELECT TitleOfCourtesy + ' ' + dbo.ParafOlusturucu(FirstName,LastName)
    FROM Employees    

    -- İKİ TÜRLÜ FUNCTION VARDIR; IN-LINE FUNCTION ve MULTI-LINE FUNCTION.
    ADINDAN ANLASILDIGI GIBI, IN-LINE FUNCTION ICINDE YALNIZCA TEK SATIR VARDIR. BU DURUMDA BEGIN/END YAPISINI KULLANMAK ZORUNDA DEĞİLSİNİZ. ANCAK MULTI-LINE (COK SATIRLI) BİR FUNCTION BEGIN İLE BASLAYIP END ILE BITMEK ZORUNDADIR.

    CREATE FUNCTION ResultSetOlustur
    ()
    RETURNS TABLE
    AS
      RETURN SELECT CompanyName, Country FROM Customers
    SELECT * FROM dbo.ResultSetOlustur()

    -- TRANSACTION

    BEGIN TRY
    END TRY
    BEGIN CATCH
    END CATCH
    -- KALIP BU..

    BEGIN TRY
    Begin Tran
        -- Insert, Update ya da Delete sorgusu transaction içinde kullanılabilir
    commit tran
    END TRY
    BEGIN CATCH
    END CATCH

    -- Adım Adım Nasıl yazıldığına bakalım..

    BEGIN TRY
    Begin Tran T1
        -- Insert, Update ya da Delete sorgusu transaction içinde kullanılabilir
        Begin Tran T2
          -- Bir sorgu daha (Önce T1 çalışır sonra T2)
    commit tran
    commit tran
    END TRY
    BEGIN CATCH
          -- Hata oluşursa, tüm transaction'ı geri al:
          ROLLBACK TRAN T1
    END CATCH


    BEGIN TRY
      BEGIN TRAN KategoriEkle
        insert into Categories(CategoryName,Description)
           values ('Ayakkabı','Kışlık/Yazlık Bay/Bayan')
           Begin Tran UrunSil
             DELETE FROM Products WHERE ProductID=1
             commit tran
      commit Tran
    END TRY
    BEGIN CATCH
         ROLLBACK TRAN KategoriEkle
    END CATCH


    -- Veri güvenliği açısından, eğer execute edilecek sorgulama mantığı birbiriyle ardışık olması gerekiyorsa:
    -- (Örnek: Önce Sipariş Ekle, Sonra sipariş detaylarına gidip adet ekle sonra ürünler tablosundan stok düş)
    -- Mutlaka transaction bloğu kullanın!
    --* DIPNOT: Transaction bloğunu kullanmak için en elverişli ortam stored procedure'lerdir.
    --- TRIGGER (INSERT, UPDATE, DELETE Sorgusundan Sonra Tetikler)---
    -- SİPARİŞ ALINDIĞINDA ÜRÜNDEN STOK DÜŞEN TRİGGER'I YAZALIM..

    CREATE TRIGGER tr_OtomatikStok
    ON [Order Details]
    for INSERT
    -- INSERT SORGUSUYLA ÇALIŞ , INSERT SORGUSUYLA BİRLİKTE TETİKLEN
    AS
    -- Amaç: Order Details Tablosuna kayıt girildiğinde, ilgili ürünün stok bilgisini Products Tablosundan bulup, adet kadar azaltsın.
    DECLARE @UrunID int
    -- Bir değişken tanımladık
    DECLARE @Adet int
    -- Adet kadar azaltacağı için Adet adlı bir değişkenimiz olmalı..
    -- Her Tabloya bağlı iki adet geçici tablo vardır. Bu tablolara Trigger dışından ulaşılamaz. inserted ve deleted ismindedirler.
    -- INSERTED; INSERT Sorgusundan sonra oluşacak satır, önce INSERTED geçici tablosunda bekletilir.
    -- DELETED; Silinmeye çalışılan satır, silinmeden önce DELETED geçici tablosunda bekletilir.

    SELECT @UrunID=ProductID, @Adet=Quantity
    FROM INSERTED
    UPDATE Products SET UnitsInStock=UnitsInStock-@Adet
    WHERE ProductID=@UrunID

    -- Trigger ı oluşturduktan sonra aşağıdaki sorguları yaptığımda otomatik olarak güncellenecektir.

    INSERT into [Order Details](OrderID, ProductID, Quantity)
                              values (10323, 1, 2)
                             

    SELECT ProductName,UnitsInStock FROM Products
    WHERE ProductID=1                         
    -- ihtiyaç: Products tablosundan ürün silinmeye çalışıldığında bu ürünün Discontinued kolonunu 1 yapsın (Yani Silmesin, Update etsin):

    CREATE TRIGGER tr_SatisiDurdur
    ON Products
    INSTEAD OF delete
    -- Delete 'in çalışmasına izin vermeden trigger çalışsın
    AS
    -- INSTEAD OF 'ların tamamı BEGIN - END içinde yazılır...
    -- Silmeye çalıştığım ürünün Discontinued 'ını 1 yapacağım:
    BEGIN
    DECLARE @UrunID int
       SELECT @UrunID=ProductID FROM deleted
        UPDATE Products SET Discontinued=1
         WHERE ProductID=@UrunID
    END

    SELECT * FROM Products WHERE ProductID=1
    DELETE FROM Products WHERE ProductID=1

    -- INSTEAD OF TRIGGER 'lar tetikleyici sorgunun YERİNE çalışırlar. Ayırdedici tek özellikleri ise BEGIN END satırları arasına yazılıyor olmasıdır..

    --- ÖRNEK VERİTABANI - TRIGGER İÇİN ---

    CREATE TABLE Ogrenciler
    (
    OgrenciNo int,
    Ad nvarchar(50),
    Soyad nvarchar(50),
    DersNotu tinyint
    )
    GO
    -- GO: BİR SONRAKİ ADIMA GİT DEMEKTİR
    --CREATE TABLE Gecenler
    --(
    --OgrenciNo int,
    --Ad nvarchar(50),
    --Soyad nvarchar(50),
    --DersNotu tinyint
    --)
    --GO
    --CREATE TABLE Kalanlar
    --(
    --OgrenciNo int,
    --Ad nvarchar(50),
    --Soyad nvarchar(50),
    --DersNotu tinyint
    --)

    ---- Ders Notu 50 den küçükse kalanlara kaydet, 50 den büyükse Geçenlere kaydet.. Kendisi karar versin..

    --CREATE TRIGGER tr_KararVer
    --ON Ogrenciler
    --FOR INSERT
    --AS
    --DECLARE @No int
    --DECLARE @Ad nvarchar(50)
    --DECLARE @Soyad nvarchar(50)
    --DECLARE @DersNotu tinyint
    --SELECT @No=OgrenciNo, @Ad=Ad, @Soyad=Soyad, @DersNotu=DersNotu
    --FROM INSERTED
    ---- INSERTED Geçici tablusunda sadece 1 satır var..
    --IF @DersNotu <50
    --   INSERT into Kalanlar values (@No,@Ad,@Soyad,@DersNotu)
    --ELSE
    --   INSERT into Gecenler values (@No,@Ad,@Soyad,@DersNotu)
         
    --INSERT into Ogrenciler values (1, 'Mustafa', 'Mutlu', 80)
    --SELECT * FROM Ogrenciler
    --SELECT * FROM Gecenler

    --INSERT into Ogrenciler values (1, 'Türkay', 'Ürkmez', 40)
    --SELECT * FROM Ogrenciler
    --SELECT * FROM Kalanlar


    -- GÜVENLİK ve PERFORMANS..
    -- DBCC KOMUTLARI
    DBCC ShowContig ('Customers')

    -- Veritabanında kullanılan tabloların performans detaylarını getiren güzel bir komuttur..
     
    --- 08.12.2009.Salı ---
    -- Yedek Alma Kodu
    -- ALTER DATABASE Northwind
    -- SET RECOVERY FULL

     -- Yedek aldığım yer çoğu zaman aynı ise, bu yeri SQL'e kaydedebilirim. Şart değildir. Kullanım kolaylığıdır.
     

     -- system procedure (sp)
     

     -- SQL Kendi kendine yedek alırken klasör oluşturamaz. Bu nedenle C'de Yedek isimli bir klasör oluştur ve ardından backup işlemini yap..

     
    sp_addumpdevice 'DISK', MyDevice , 'C:\Yedek\NWFull.bak'

    SELECT * FROM sys.backup_devices

    BACKUP DATABASE Northwind TO MyDevice

    -- Device'sız yedek alma ise;
    BACKUP DATABASE Northwind TO DISK = 'C:\Yedek\NWManuel.bak'

    -- Back up ı periyodik olarak almak gerekir. Peki, pzt aldığım yedeği salı günü tekrar almak yerine aradaki farkı backup almak istersem, Differencial Backup kullanmam gerekir.

    INSERT into Northwind.dbo.Products (ProductName,UnitPrice)
                             values ('Dondurma',5)
                            

    BACKUP DATABASE Northwind TO DISK = 'C:\Yedek\NWFark.bak'
    WITH DIFFERENTIAL

    -- Transaction Log neden temizlenmeli..? INSERT, UPDATE, DELETE sorgularının
     çalışmaları durumunda, hangi sorgunun ne zaman çalıştığı ve nasıl işlem
     yaptığı .ldf uzantılı db dosyasında tutulur. Biz bu sorguları
     her çalıştırdığımızda log dosyasına işlenecektir. Bir süre sonra
     log dosyaları aşırı şişme göstereceğinden, bu tarz sorguların çalışma
     hızı düşecektir. Bu hızı tekrar yükseltmek için tek yapmak gereken LOG BACKUP almaktır.

       
       -- LOG Dosyasını Backup Yapalım..
     UPDATE Northwind.dbo.Products SET UnitPrice=10
     WHERE ProductID=81

     
     BACKUP LOG Northwind TO DISK = 'C:\Yedek\LogDosyasi.bak'

     
     -- Her GÜZEL ŞEYİN BİR SONU VARDIR: ;-)
     DROP DATABASE Northwind

        
     -- ama bazı şeyler geri alınabilir:

     
     RESTORE DATABASE Northwind FROM DISK= 'C:\Yedek\NWFull.bak' WITH NORECOVERY

     RESTORE DATABASE Northwind FROM DISK= 'C:\Yedek\NWFark.bak' WITH NORECOVERY

     RESTORE LOG Northwind FROM DISK= 'C:\Yedek\LogDosyasi.bak' WITH RECOVERY

    -- WITH NORECOVERY ve WITH RECOVERY Farkı;
    -- Yedeklemenin belirli bir sırası var. Hepsini birden çalıştıracağız ancak Full ve Differential olanları beklet en son LOG la beraber RECOVERY yap..
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Alıntıdır..



    < Bu mesaj bu kişi tarafından değiştirildi converttoint32 -- 27 Ocak 2013; 14:25:40 >




  • Merhabalar

    Youtube da SQL derslerini takip edebilirsiniz . kanala abone olursanız yeni videolarıda takip etmiş olursunuz . İyi çalışmalar







  • Yapay Zeka’dan İlgili Konular
    php uzamanı yardım istiyorum
    geçen yıl açıldı
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.