Slayt 1 - Verivizyon
Transkript
Slayt 1 - Verivizyon
HAFTA 4 “Veritabanını Sorgulamak ve SQL" Yaşar GÖZÜDELİ ygozudeli@verivizyon.com http://blog.verivizyon.com/ygozudeli «BM364» Veritabanı Uygulamaları Konu Akışı Basit Sorgular Tabloları Birlikte Sorgulamak ve Özetlemek İleri Veri Yönetim Teknikleri www.verivizyon.com 2 Basit Sorgular SELECT Türetilmiş Sütun Matematiksel Fonksiyonlar WHERE ile Satır Filtrelemek NULL ile değer kıyaslamak Aralık Sorgulamak: BETWEEN Sıralamak: ORDER BY Joker Sorgular: LIKE Karakter ve Tarih Fonksiyonları Alt Sorgular IN/NOT IN – EXISTS/NOT EXISTS SOME/ANY/ALL www.verivizyon.com 3 Kayıtları Seçmek En Basit Seçme İşlemi: SELECT alan1[,alan2,alan3,..... | *] FROM tablo_ismi; www.verivizyon.com 4 Sadece Bazı Sütunları Seçmek Gerektiğinde bir tabloda yer alan sütunlardan sadece bir kısmı seçilebilir SELECT urunKod, urunad, ListeFiyat Gerektiğinde, tekrarlayan kayıtlar DISTINCT ile tek satıra FROM tblUrun indirgenebilir: SELECT DISTINCT LEFT(urunAd,4) FROM tblUrun www.verivizyon.com 5 Türetilmiş Sütunlar Bazen, aritmetik işlemlerle sütunlardan ve sabitlerden yeni sütunlar türetilebilir SELECT urunKod, urunAd, listeFiyat*KDVoran FROM tblUrun www.verivizyon.com 6 Aritmetik İşaretler İşaret Karşılık Aritmetik İşlem + Toplama - Çıkartma * Çarpma / Bölme % Mod (Bazı Sistemlerde MOD da kullanılır) www.verivizyon.com 7 Sütuna Takma Ad Vermek Sütun adı veya türetme tanımından sonra bir boşluk bırakıp takma ad yazılabilir. SELECT urunKod,urunAd, listeFiyat*KDVoran KDV FROM tblUrun Sütun adı veya türetmeden sonra AS deyimi daha sonra takma ad yazılabilir SELECT urunKod,urunAd, listeFiyat*KDVoran AS KDV FROM tblUrun Sütun adı veya türetme tanımından önce takma ad yazılıp = ile (normal programlama dillerindeki atama işlemi) takma ad verilebilir. SELECT urunKod,urunAd, KDV = listeFiyat*KDVoran FROM tblUrun www.verivizyon.com 8 Matematiksel Fonksiyonlar Fonksiyon Kullanım Amacı Örnek ABS (sayı) Sayının mutlak değerini bulur. SELECT ABS (-0.19) ASIN (sayi) Sinüs değeri verilen sayının Açı karşılığını bulur. SELECT ASIN (1) CEILING (sayı) Ondalıklı sayıyı tavana yuvarlar. SELECT (9.501) CEILING DEGREES (radian) Sayının derece karşılığını verir. SELECT (PI()/2) DEGREES EXP (sayi) Sayının üssünü hesaplar. FLOOR (sayi) Ondalıklı sayıyı tabana yuvarlar. SELECT FLOOR (9.501) PI() Virgülden sonra 16 hanelik pi sayısı SELECT PI() RADIANS (aci) Verilen açının radyanını hesaplar SELECT RADIANS (180) RAND (baslama) 0-1 arasında yalancı rastsal sayı üretir. Baslama değeri isteğe bağlıdır. SELECT RAND (3) ROUND (sayı, adet) Basamak yuvarlamak için kullanılır. Verilen adet kadar sondan basamak yuvarlar. SELECT (9.501,-1) SIN (Radyan) Radyan cinsinden verilen açının Sinüsünü hesaplar SELECT SIN (PI()/2) SQRT (sayi) Verilen sayının karekökünü hesaplar SELECT SQRT(4) www.verivizyon.com ROUND 9 WHERE ile Satır Filtreleme Bazen sonuçta bütün satırların yer alması istenmez=Selection SELECT sutun-ismi1[,sutun-ismi2,..... | *] FROM tablo_ismi WHERE şart ifadeleri www.verivizyon.com 10 Karşılaştırma İşaretleri İşaret Karşılığı = Eşittir > Büyüktür < Küçüktür >= Büyüktür veya Eşittir (Büyük-Eşit) <= Küçüktür Veya Eşittir (Küçük-Eşit) <> Eşit Değildir != Eşit Değildir LIKE Metin karşılaştırma operatörü IS NULL Bir değerin NULL olduğuna bakmak için IS NOT NULL Bir değerin NULL olmadığına bakmak için www.verivizyon.com 11 Birden Fazla Şartla Satır Süzmek Birden fazla şart Mantıksal Operatörlerle yan yana getirilebilir OPERATÖR Ne zaman doğrudur? NOT Yanlış ise AND Her ikisi de doğru ise OR Herhangi biri doğru ise Parantezler kaldırılırsa ne olur? SELECT urunKod, urunAd FROM tblUrun WHERE (listeFiyat<100 OR listeFiyat>1000) AND urunKod>2700 www.verivizyon.com 12 Bay Doğru: XXX OR 1=1 www.verivizyon.com 13 NULL Karşılaştırma SQL'de herhangi bir değerin NULL olup olmadığı IS operatörü ile karşılaştırılır. NOT ile kullanılabilir (IS NOT NULL) SELECT sutunlar FROM tablo-ismi WHERE test-sutunu IS [NOT] NULL www.verivizyon.com 14 Aralık Sorgulama SELECT ifadesi WHERE sutun-ismi BETWEEN alt-sinir AND ust-sinir SELECT urunKod, urunAd, ListeFiyat FROM tblUrun WHERE listeFiyat BETWEEN 500 AND 100; www.verivizyon.com ? 15 Kayıtları Sıralamak ORDER BY her zaman en sonda SELECT sutun-ismi FROM tablo-ismi WHERE sartlar ..... ORDER BY sutun1 [DESC|ASC][,sutun2 [DESC|ASC]… SELECT urunKod,urunAd, listeFiyat*(1+KDVoran) AS KDV FROM tblUrun WHERE listeFiyat<500 ORDER BY markaKod, 3 DESC •Seçilmemiş bir sütuna göre sıralama yapılabilir! www.verivizyon.com 16 Dönen Kayıt Sayısını Sınırlamak İki yöntem: TOP n ile en baştan n kayıt seçilir SQL Server 2000'de sadece SELECT'lerde Daha etkin SET ROWCOUNT 100 Oturum Parametresi SELECT dışında INSERT,UPDATE,DELETE ile de kullanılabilir SET ROWCOUNT 0 (eski haline geri döndürmek için) 2005 destekler ama takip eden sürümlerde kaldırılabilir!!! www.verivizyon.com 17 Baştan N kayıt www.verivizyon.com 18 Karakter Karşılaştırmaları Sabit olan string ifade ve tarih 'string' şeklinde ' arasında verilir www.verivizyon.com 19 LIKE Deyimi ve JOKER Karakterler Joker karakterler sadece LIKE ile karşılaştırılırken kullanılabilir! İşlevi Joker Karakter % Standart SQL'de birden fazla harf veya rakamın yerini tutar. _ Standart SQL'de bir tek harf veya rakam yerini tutar [HARF] Herhangi bir harf yerine gelebilecek harfleri belirtir. [^HARF] Herhangi bir harf yerine gelemeyecek harfleri belirtir. [A-Z] A ile Z arasıdaki harfleri ifade eder www.verivizyon.com 20 İçinde geçen Karakteri Bulmak İlk iki harfi A veya K olan markaların listesi www.verivizyon.com 21 Metinleri Ulamak Metinler için + işareti ulama işlevini yerine getirir: SELECT kullaniciKod, isim + ' ' + soyad as kullanici FROM tblKullanici SELECT kullaniciKod, isim + '''' + soyad as kullanici FROM tblKullanici WHERE isim='%yaşar%' www.verivizyon.com ? 22 Karakter Fonksiyonları Fonksiyon Kullanım amacı Örnek CHAR (ASCIIKod) ASCII kod'u verilen karakteri döndürür. SELECT CHAR (39) CHARINDEX (bul, metin, baslangic) Metin içerisinde bulunacak metni, baslangic'tan itibaren arar. Bulursa yerini, bulamazsa 0 değerini döndürür. SELECT CHARINDEX ('@', 'email@mail', 1) LEFT (metin, n) Metnin baştan n harfini alır SELECT LEFT ('ilk üç harfi', 3) LEN (metin) Metinin uzunluğunu verir. SELECT LEN ('çok uzun') LOWER (metin) Metni küçük harflere çevirir SELECT LOWER ('BüYükKüçük') LTRIM (metin) Metnin başındaki beyaz ASCII karakterleri siler SELECT TRIM ('başta boşluk var') REPLACE(metin, bul, degistir) Metnin içinde bulduğunun yerine, değiştirilecek ifadeyi yerleştirir. SELECT REPLACE ('takatukaları takatukacıya takatukalat', 'taka', 'ayakkabı') REVERSE (metin) Metni, tersten döndürür SELECT REVERSE ('tersten oku') RIGHT (metin, n) Metinin sonundan n harfini alır. SELECT RIGHT ('son üç harf', 3) RTRIM (metin) Metnin sonundaki beyaz ASCII karakterleri siler SELECT TRIM (sonda boşluk var ') SUBSTRING (metin, basla, adet) Metinin, başla ile verilen harfinden itibaren adet kadar harfini verir. SELECT SUBSTRING ('bir parça harf almak', 5, 7 ) UPPER (metin) Metni BÜYÜK harflere çevirir SELECT UPPER ('BüYükKüçük') www.verivizyon.com 23 IN ve NOT IN Bir ifadenin eldeki bir grup veri içerisinde olup olmadığına bakmak için kullanılır: SELECT urunKod, urunAd,MarkaKod FROM tblUrun WHERE markaKod = 1 OR markaKod = 2 OR markaKod = 3 --- yerine SELECT urunKod, urunAd,MarkaKod FROM tblUrun WHERE markaKod IN(1,2,3) SELECT markaKod FROM tblMarka WHERE marka='vestel' SELECT * FROM tblUrun WHERE markaKod IN( SELECT markaKod FROM tblMarka WHERE marka='vestel' ) www.verivizyon.com 24 Çok Sonuç Döndüren Alt Sorgular Doğrudan Matematiksel Karşılaştırma işaretleri ile bağlanamaz! IN-NOT IN-EXISTS-NOT EXISTS ile bağlanabilir SELECT urunKod, urunAd, listeFiyat FROM tblUrun WHERE markaKod IN(SELECT markaKod FROM tblMarka WHERE MarkaKod<10) Karşılaştırma işaretleri ile bağlanmak için {ANY-SOME | ALL } Kullanılabilir SELECT urunKod, urunAd, listeFiyat FROM tblUrun WHERE markaKod < ALL (SELECT markaKod FROM tblMarka WHERE MarkaKod<10) www.verivizyon.com 25 EXISTS ve NOT EXISTS Bir alt sorgunun satır döndürüp döndürmediğini test etmek için kullanılır SELECT urunKod, urunAd, listeFiyat FROM tblUrun WHERE IN (SELECT markaKod FROM tblMarka WHERE markaKod EXISTS = ANY MarkaKod<10) www.verivizyon.com 26 İlintili Alt Sorgular SELECT urunKod, urunAd, listeFiyat FROM tblUrun WHERE EXISTS( SELECT * FROM tblSiparisDetay WHERE tblSiparisDetay.urunKod=tblurun.UrunKod ) www.verivizyon.com 27 Türetilmiş Tablo Alt sorgular hep WHERE veya SELECT'den sonra mı kullanılır?? bir sorgunun içerisinde başka bir alt sorgu, yeni tablo değişkene aktarılıp buradan yeniden sorgulanabilir En fazla olan markadan kaç adet ürün var? SELECT MAX(grup.adet) FROM ( SELECT markaKod, COUNT(*) as adet FROM tblUrun GROUP BY markaKod ) AS grup www.verivizyon.com 28 Konu Akışı Basit Sorgular Tabloları Birlikte Sorgulamak ve Özetlemek İleri Veri Yönetim Teknikleri www.verivizyon.com 29 Ders :Tabloları Birlikte Sorgulamak ve Özetlemek Klasik JOIN INNER JOIN OUTER JOIN LEFT RIGHT FULL CROSS JOIN GRUPSAL FONKSIYONLAR ve GRUPLAMAK www.verivizyon.com Tabloları Birlikte Sorgulamak Normalizasyon kuralları ile parçalanan tablolardan bir tek rapor elde etmek gerektiğinde JOIN kullanılır En fazla 255 tablo bir defada JOIN edilebilir(SQL Server 2000) Klasik JOIN=INNER JOIN JOIN Türü Açıklama Klasik JOIN WHERE cümleciği ile yapılan birleştirme. SQL Server, bu ifadeyi bir INNER JOIN gibi ele alır. INNER JOIN İki tablo birlikte sorgulanırken, her iki tabloda da sadece uyuşan kayıtlar sonuçta yeralabilir. OUTER JOIN İki tablo birlikte sorgulanırken, tablolardan herhangi birinde veya sadece birinde yer alan kayıtları sorgulamak için kullanılır. LEFT, RIGHT ve FULL olmak üzere 3 alt türden oluşur CROSS JOIN İki tablonun kartezyen çarpımını bulmak için kullanılır. Aslında WHERE kısmında ilişki şartı yeralmayan Klasik JOIN de bir çeşit CROSS JOIN'dir. www.verivizyon.com Klasik JOIN FROM'dan sonra iki veya daha fazla tablo adı WHERE'de geçiş yapılacak sütunlar eşitlenir SELECT tblUrun.urunKod, tblUrun.uruAd, tblUrun.listeFiyat, tblMarka.Marka FROM tblUrun, tblMarka WHERE tblUrun.markaKod=tblMarka.markaKod www.verivizyon.com Tabloları Birlikte Sorgulamak-2 Ürün Tablosu Marka Tablosu Her bir ürün ve markası SELECT U.urunKod, U.urunAd,U.ListeFiyat,M.Marka FROM urun U INNER JOIN marka M ON M.MarkaKod=U.MarkaKod www.verivizyon.com Tabloları Birlikte Sorgulamak-3 OUTER JOIN TIPI Açıklama TabloABC LEFT Soldaki tabloda yer alan kayıtlar, sağdaki tabloda karşılıkları olmasa bile getirilirler RIGHT Sağdaki tabloda yer alan kayıtlar, soldaki tabloda karşılıkları olmasa bile getirilirler. Aslında LEFT JOIN ile aynıdır. Tek değişen, tabloların ifadede geçiş sıralarının farklı TabloDEF 1 3 2 4 3 1 4 3 1 3 2 olmasıdır. FULL Her iki tablodaki karşılıklı olarak eşit satırı olmayan kayıtlar getirilirler. Yani LEFT JOIN ile RIGHT JOIN'in bileşiminden ibaret bir sonuç döndürür. 6 SELECT tabloABC.sütun1, FROM tabloABC soldaki tablo www.verivizyon.com tabloDEF. sütun2 LEFT JOIN tabloDEF sağdaki tablo sonuçta yeralmaz CROSS JOIN www.verivizyon.com Tablo ve Sorguları Düşeyde Birleşirmek İki tablo veya iki sorgu tek sorgu gibi yapılabilir ALL kullanılırsa ortak veriler tekrarlar SELECT ifadesi1 UNION [ALL] SELECT ifadesi2 SQL Server 2005'den itibaren INTERSECT EXCEPT www.verivizyon.com Verileri Gruplamak Gruplamalı Fonksiyonlar GROUP BY deyimi Gruplanmış Verileri Özetlemek www.verivizyon.com Gruplamalı Fonksiyonlar Kullanım amacı Fonksiyon AVG (sutun-ismi) Verilen sütun ismindeki değerlerin grup başı ortalamasını bulur. COUNT (sutun-ismi|*) Verilen bir sütuna veya bütün satırlara bakarak grup başı satır sayısını hesaplar. COUNT_BIG ismi|*) (sutun- COUNT fonksiyonundan farkı bigint sonuç döndürmesidir. Daha fazla sayıda satırdan oluşan tablolarda kullanılabilir. MAX (sutun-ismi) Verilen sütundaki değerlerden, her bir grup için en yüksek olanları bulur. MIN (sutun-ismi) Verilen sütundaki değerlerden, her bir grup için en düşük olanları bulur. SUM (sutun-ismi) Verilen sütun ismindeki değerlerin grup başı toplamını bulur. VARIANCE ismi) æ (sutun- Verilen sütundaki değerlerden, her bir grup için varyans hesabı yapar STDEV (sutun-ismi) æ æ: Verilen sütundaki değerlerden, her bir grup için standart sapmayı hesaplar. SQL Server Tarafından standardın dışında sağlanan fonksiyonları göstermektedir. www.verivizyon.com Gruplamalı Fonksiyonlar Bütün ürünlerin en ucuz ürünü? Bütün ürünlerin en pahalı ürünü? Bütün ürünlerin ürün sayısı? Bütün ürünlerin ortalama fiyatı? Bütün ürünlerin TL fiyat toplamı? www.verivizyon.com Gruplamalı Fonksiyonlar Her markanın en ucuz ürünü? Her markanın en pahalı ürünü? Her markadaki ürün sayısı? Her markanın ortalama fiyatı? Bütün ürünlerin en pahalısı? www.verivizyon.com GROUP BY ve JOIN Kullanımı www.verivizyon.com Soru Liste fiyatı 50 birim'dan daha pahalı ürünler için her bir marka grubunda ortalama birim fiyatı raporlayın. Sonuçta, 16'dan daha az ürün içeren markalar yeralmasın. Daha Fazla ürünü olan marka daha üstte yer alsın www.verivizyon.com Gruplanmış Verileri Özetlemek CUBE deyimi, GROUP BY deyiminden sonra birden fazla sütun adı varsa, bu sütun adlarının her birine ait toplamlarla birlikte, kombinasyonlarının da toplamlarını bulur www.verivizyon.com Gruplanmış Verileri Özetlemek-2 • İçten dışa doğru toplam hesaplayarak gider • Neticede bir önceki örnekten farklı olarak, her bir para birimine ait toplam kaç adet ürün bulunduğunu gösteren satırlar yer almayacaktır. www.verivizyon.com GROUPING ile Özetleri Düzenlemek GROUPING, CUBE veya ROLLUP deyimi ile birlikte kullanılan bir Gruplamalı Fonksiyon'dur. Bir satır, ROLLUP veya CUBE deyimi tarafından türetilmiş ise 1, türetilmemiş ise 0 değeri döndürür. ROLLUP ile elde edilen sonuçların daha anlaşılır gösterilmesi www.verivizyon.com Seçilmiş Verileri Özetlemek www.verivizyon.com Sıralanmış Verileri Özetlemek www.verivizyon.com GROUP BY'dan sonra gelen sütun adı için COMPUTE BY çalıştırılabilir! Tabloları Birlikte Sorgulamak Tabloya Takma Ad SELF JOIN INNER JOIN OUTER JOIN LEFT, RIGHT,FULL CROSS JOIN FARK/KESİŞİM/BİRLEŞİM BULMAK www.verivizyon.com 48 Konu Akışı Basit Sorgular Tabloları Birlikte Sorgulamak ve Özetlemek İleri Veri Yönetim Teknikleri www.verivizyon.com 49 İleri Veri Yönetim Teknikleri CTE ve Rekürsif Sorgular Rütbeleme Fonksiyonları Analitik Fonksiyonlar Veri Değişimini Yönetmek ve Cursor’ler www.verivizyon.com 50 <NULL> Hiyerarşik Veri Modeli(İlişkisel Domain) Bilgisayar Programlama Veritabanı Cocuk Kitaplari İşletim Sistemleri SQL Server 2000 SQL Server 2005 Access… 51 Hukuk…. Grafik….. Common Table Expressions SQL-99 standardının bir parçası Genel olarak CTE kalıbı: WITH <CTEismi> ( <sütun-listesi> ) AS ( <CTE>) <SELECT|INERT|UPDATE|DELETE… FROM… CTEismi> Derived tabloya benzer, geçici bir resultset Rekürsif veya rekürsif olmayan modda çalıştırılabilir. Birkaç CTE aynı WITH cümleciği içerisinde bir T-SQL cümlesi olarak tanımlanabilir. Rekürsif değil iken: Sorguyu Derived tablolar kullanarak daha rahat ve okunabilir yazmak mümkün 52 Rekürsif CTE <CTE>, kendine referans içerdiğinde rekürsif olur. Rekürsif modda CTE (<rekürsif-olmayan SELECT> UNION ALL <SELECT CTEye referans>) Tanımlama Kendini çağırma işlemi, ikinci SELECT boş sonuç Biriktirme seçtiğinde sona erer veya ifadenin sonuna OPTION (MAXRECURSION 2); Default 100 iterasyon 0 verilirse, iterasyon sınırı yok! 53 CTE'li Rekürsif Sorgulama WITH ReyonCTE(reyonKod,reyonAd,AnaReyonKod) AS( SELECT reyonKod,reyonAd,AnaReyonKod FROM tblReyon WHERE anaReyonKod IS NULL UNION ALL SELECT cocuk.reyonKod,cocuk.ReyonAd, cocuk.AnaReyonKod FROM tblReyon as cocuk JOIN ReyonCTE as ana ON cocuk.anaReyonKod=ana.ReyonKod ) SELECT * FROM ReyonCTE --OPTION(MAXRECURSION 4) 54 Rütbeleme(Satır Sıralatma) Fonksiyonları Sayı türetirler. Genelde bu sayı sıralamada kullanılır. ROW_NUMBER() :Kayıtlara artan satır numarası türetir RANK(): Rütbeleme. Eşit değerli ise eşit bir sayı, atlanan değerleri korur DENSE_RANK():Ters Sırada, atlanan değerleri korumaz NTILE(<expression>): n=SatirSayisi/GrupSayisi verildiğinde sıradan n farklı grup türetir Genel Sentaks <rutbeleme fonksiyonu> OVER([<parcalama cumlesi>]<order_by_cumlesi>) SELECT ve ORDER BY cümlelerinde kullanılabilir 55 Rütbeleme Fonksiyonları SELECT RANK() OVER(ORDER BY sehir) as RANK, DENSE_RANK() OVER(ORDER BY sehir) as DENSE_RANK, ROW_NUMBER() OVER(ORDER BY soyad) as ROW_NUM, NTILE(4) OVER(ORDER BY sehir) as NTILE_4, soyad, sehir FROM Personel ORDER BY sehir 56 Rütbeleme Fonksiyonları Sonuç RANK DENSE_RANK 1 2 2 2 2 6 7 7 9 1 2 2 2 2 3 4 4 5 7 1 9 6 4 8 3 2 5 ROW_NUMBER 1 NTILE_4 1 1 2 2 3 3 4 4 Soyad sehir Leylagil Burma Surma Kirko Doğru Peker Davacı Camcı Furkan Kırşehir Mardin Mardin Mardin Mardin Rize Sakarya Sakarya Tokat 57 Kayıtları Sayfalandırmak SELECT urunKod,urunAd,listeFiyat FROM tblUrun ORDER BY urunKod OFFSET 100 ROWS FETCH NEXT 10 ROW ONLY 58 Analitik Fonksiyonlar • • • • • SQL-2003 ve SQL-2008 kayitlari okurken: siralama, gruplama kiyaslama gibi ek işlevler FOKSİYON Açıklama(Belli bir sütuna göre sıralanmış kayıtlar için) LAG bir önceki satıra erişim sağlar. LEAD bir sonraki satıra erişim sağlar. FIRST_VALUE İlk kaydın değerine erişim sağlar LAST_VALUE İlk kaydın değerine erişim sağlar www.verivizyon.com 59 Yeni İlişkisel Operatörler:PIVOT İsim-Değer Çiftlerini Sabitlemek-Açık Şema urunKod Ozellik Deger 1 Numara 42 1 Renk Kahve 2 Boy 32 2 Bel 27 2 Renk Buz Mavi 1 Numara 40 SORU: En alttaki satır da olsa idi, PIVOT işleminin sonucu değişir miydi? SELECT D.* FROM tablo PIVOT(MIN(Deger) FOR Ozellik IN ([Numara],[Renk])) D urunKod Numara Renk 1 42 Kahve 2 <null> Buz Mavi 60 Yeni İlişkisel Operatörler: APPLY ilKod il ilceKod ilceAd 06 Ankara 56 Altındağ 06 Ankara 57 Çankaya 06 Ankara 58 Etimesgut 07 Antalya 80 Merkez-Antalya 07 Antalya 81 Akseki 08 Artvin <null> <null> Sonuc SELECT * FROM iller CROSS APPLY dbo.ilinIlceleri(ilKod) OUTER ilKod ilKod il ilceKod ilceAd 6 Ankara 56 Altındağ 57 Çankaya 58 Etimesgut 7 Antalya 8 Artvin 80 Merkez-Doğu Antalya 9 Aydın 81 Akseki ilinIlceleri(ilKod) 61 Veri Yönetimi ve Cursorler Veri Eklemek Verileri Güncellemek Verileri Silmek Cursor'lerle Çalışmak www.verivizyon.com Veri Eklemek Bir sorgunun sonucu yeni bir tabloda saklanabilir Olmayan bir tabloyu oluşturup saklamak için SELECT title_id,title,type INTO #geciciKitap FROM titles Var olan bir tabloya eklemek için INSERT INTO #geciciKitap SELECT title_id,title,type FROM titles WHERE type='business' OR type='psychology' OR title_id IN('BU2075','BU7832','MC2222','MC3021') www.verivizyon.com Veri Güncellemek Aynı UPDATE cümlesinde sadece bir tek tablodaki veriler değiştirilebilir Birden fazla tablodaki veriler birleştirilerek bir cümle kurulabilir! En az bir defa satınalınmış ürünlerimize %2 zam yapalım UPDATE tablo-ismi SET sutun-ismi=deger|ifade FROM tablo-ismi JOIN tablo2 ON birlestirme-ifadesi WHERE .... UPDATE tblUrun SET listeFiyat=listeFiyat * 1.02 FROM tblUrun U JOIN tblSiparisDetay SD ON SD.urunKod=U.UrunKod UPDATE tblUrun U, tblSiparisDetay SD SET U.listeFiyat=U.listeFiyat * 1.02 WHERE SD.urunKod=U.UrunKod www.verivizyon.com Verileri Güncellemek Alt Sorgularla da başka tablolar üstünden şartlar koşarak veriler güncellenebilir Hiç satılmamış ürünlerin fiyatlarını %2 indirelim UPDATE tblUrun SET listeFiyat=listeFiyat * 0.98 WHERE NOT EXISTS( SELECT * FROM tblSiparisDetay WHERE tblSiparisDetay.UrunKod=tblurun.urunKod ) www.verivizyon.com Verileri Silmek Aynı DELETE ifadesinde sadece bir tablodaki veriler silinebilir Aynı anda birden fazla tablo birleştirilerek şartlar kontrol edilebilir Bugüne kadar hiç sipariş edilmemiş ürünlerden, fiyatları 10birim'in altında olanları, silelim DELETE FROM tablo-ismi FROM tablo-ismi JOIN tablo2 ON birlestirme-ifadesi WHERE sartlar... DELETE FROM tblUrun FROM tblUrun U RIGHT JOIN tblSiparisDetay SD ON SD.urunKod=U.urunKod WHERE U.listeFiyat<10 AND SD.urunKod IS NULL www.verivizyon.com Verileri Silmek Alt Sorgu ile Veriler Silinebilir Access'de bu yolla silinebilir DELETE FROM tblUrun U WHERE NOT EXISTS( SELECT * FROM tblSiparisDetay SD WHERE SD.urunKod=U.urunKod ) AND U.listeFiyat<10 www.verivizyon.com Cursorler'le Çalışmak Neden Cursor Gerekir? Bir resultset'te sadece o an için bulunulan pozisyondaki satırda veya takip eden satırlarda yer alan verilere erişmek Bir sogu sonucunda dönen değerlerden her bir satırı ayrı ayrı değerlendirip duruma göre veri değiştirmek Trigger veya Stored Procedure'lerin bir resultset'e satır satır erişimini sağlamak Ortakzamanlı çalışmada, diğer kullanıcılar tarafından yapılan değişikliklerin görünebilirlik seviyesini ayarlamak için www.verivizyon.com Cursorler'le Çalışmak 1. 2. 3. 4. 5. Cursor Değişken Tanımlama: Bir SELECT ifadesi için, bir değişken tanımlanır ve bu seçme işleminin sonucunu tutacak bir Cursor tanımlanmış olur. Cursor'ü Açma: Cursor tanımlama aşamasında belirtilen SELECT işlemi gerçekleştirilir ve Cursor ilk satırı gösterecek şekilde ayarlanmış olur. Satır satır erişme ile ilgili işlemler: FETCH deyimi kullanılarak, bir döngü yardımıyla satırlara erişilebilir. Bu aşamada değişiklik veya okuma yapılması mümkündür. Cursor'ü Kapatma: İşi biten Cursor CLOSE deyimi ile kapatılır. Ancak Cursor halen tanımlıdır. Gerektiğinde yeniden açılabilir. Cursor'ü Hafızadan silme: DEALLOCATE deyimi ile Cursor tanımı da hafızadan silinebilir. www.verivizyon.com Yeni Satır Var Mı? FETCH cursorIsmi INTO degiskenListesi İfadesi ile bir satırın içeriği değişkenlere aktarılır Hemen arkasından @@FETCH_STATUS değişkeni okunursa, yapılan işlemlere bakılır 0 Bir önceki FETCH komutu başarı ile gerçekleştirlidi. -1 Bir önceki FETCH komutunda bir hata ile karşılaşıldı. -2 Resultset’teki tüm kayıtlar bittiği için en sona gelindi, daha fazla kayıt yer almıyor. (end of resultset) www.verivizyon.com Örnek Cursor DECLARE @urunKod INT, @urunAd VARCHAR(500); DECLARE cSonuc CURSOR FOR SELECT urunKod,urunAd FROM tblUrun; OPEN cSonuc; FETCH NEXT FROM cSonuc INTO @urunKod,@urunAd PRINT @urunAd; WHILE @@FETCH_STATUS=0 BEGIN FETCH NEXT FROM cSonuc INTO @urunKod,@urunAd PRINT @urunAd; END CLOSE cSonuc; DEALLOCATE cSonuc; www.verivizyon.com 71 Ödev 8-9.10.Unitelere ait bütün «Veritabanı Atölye» alıştırmaları www.verivizyon.com 72 Sonuç Verileri sorgulamak, veritabanları ile iletişimimizi artırır. Verileri değiştirmek ve yönetmek için bir çok ifade mevcuttur. www.verivizyon.com 73