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 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 3
Kayıtları Seçmek En Basit Seçme İşlemi: SELECT alan1[,alan2,alan3,... *] FROM tablo_ismi; 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 FROM tblurun Gerektiğinde, tekrarlayan kayıtlar DISTINCT ile tek satıra indirgenebilir: SELECT DISTINCT LEFT(urunAd,4) FROM tblurun 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 6
Aritmetik İşaretler İşaret Karşılık Aritmetik İşlem + Toplama - Çıkartma * Çarpma / Bölme % Mod (Bazı Sistemlerde MOD da kullanılır) 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 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 CEILING (9.501) DEGREES (radian) Sayının derece karşılığını verir. SELECT DEGREES (PI()/2) 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) ROUND (sayı, adet) SIN (Radyan) 0-1 arasında yalancı rastsal sayı üretir. Baslama değeri isteğe bağlıdır. Basamak yuvarlamak için kullanılır. Verilen adet kadar sondan basamak yuvarlar. Radyan cinsinden verilen açının Sinüsünü hesaplar SELECT RAND (3) SELECT (9.501,-1) SELECT SIN (PI()/2) SQRT (sayi) Verilen sayının karekökünü hesaplar SELECT SQRT(4) 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 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 IS NULL IS NOT NULL Metin karşılaştırma operatörü Bir değerin NULL olduğuna bakmak için Bir değerin NULL olmadığına bakmak için 11
Birden Fazla Şartla Satır Süzmek Birden fazla şart Mantıksal Operatörlerle yan yana getirilebilir OPERATÖR NOT AND OR Ne zaman doğrudur? Yanlış ise Her ikisi de doğru ise 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 12
Bay Doğru: XXX OR 1=1 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 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;? 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! 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!!! 17
Baştan N kayıt 18
Karakter Karşılaştırmaları Sabit olan string ifade ve tarih 'string' şeklinde ' arasında verilir 19
LIKE Deyimi ve JOKER Karakterler Joker karakterler sadece LIKE ile karşılaştırılırken kullanılabilir! Joker Karakter İşlevi % Standart SQL'de birden fazla harf veya rakamın yerini tutar. _ Standart SQL'de bir tek harf veya rakam yerini tutar [HARF] [^HARF] [A-Z] Herhangi bir harf yerine gelebilecek harfleri belirtir. Herhangi bir harf yerine gelemeyecek harfleri belirtir. A ile Z arasıdaki harfleri ifade eder 20
İçinde geçen Karakteri Bulmak İlk iki harfi A veya K olan markaların listesi 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%'? 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') 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' ) 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) 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 markakod EXISTS = ANY IN (SELECT markakod FROM tblmarka WHERE MarkaKod<10) 26
İlintili Alt Sorgular SELECT urunkod, urunad, listefiyat FROM tblurun WHERE EXISTS( SELECT * FROM tblsiparisdetay WHERE tblsiparisdetay.urunkod=tblurun.urunkod ) 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 28
Konu Akışı Basit Sorgular Tabloları Birlikte Sorgulamak ve Özetlemek İleri Veri Yönetim Teknikleri 29
Ders :Tabloları Birlikte Sorgulamak ve Özetlemek Klasik JOIN INNER JOIN OUTER JOIN LEFT RIGHT FULL CROSS JOIN GRUPSAL FONKSIYONLAR ve GRUPLAMAK
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 INNER JOIN OUTER JOIN CROSS JOIN WHERE cümleciği ile yapılan birleştirme. SQL Server, bu ifadeyi bir INNER JOIN gibi ele alır. İki tablo birlikte sorgulanırken, her iki tabloda da sadece uyuşan kayıtlar sonuçta yeralabilir. İ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 İ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.
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
Tabloları Birlikte Sorgulamak-2 Marka Tablosu Ürün 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
Tabloları Birlikte Sorgulamak-3 OUTER JOIN TIPI Açıklama LEFT RIGHT FULL Soldaki tabloda yer alan kayıtlar, sağdaki tabloda karşılıkları olmasa bile getirilirler 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ı olmasıdır. 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. TabloABC 1 2 3 4 TabloDEF 3 4 1 3 1 3 2 6 SELECT tabloabc.sütun1, tablodef. sütun2 FROM tabloabc LEFT JOIN tablodef soldaki tablo sağdaki tablo sonuçta yeralmaz
CROSS JOIN
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
Verileri Gruplamak Gruplamalı Fonksiyonlar GROUP BY deyimi Gruplanmış Verileri Özetlemek
Gruplamalı Fonksiyonlar Fonksiyon AVG (sutun-ismi) Kullanım amacı Verilen sütun ismindeki değerlerin grup başı ortalamasını bulur. COUNT (sutun-ismi *) MAX (sutun-ismi) MIN (sutun-ismi) SUM (sutun-ismi) (sutun- VARIANCE ismi) æ (sutun- COUNT_BIG ismi *) STDEV (sutun-ismi) æ Verilen bir sütuna veya bütün satırlara bakarak grup başı satır sayısını hesaplar. COUNT fonksiyonundan farkı bigint sonuç döndürmesidir. Daha fazla sayıda satırdan oluşan tablolarda kullanılabilir. Verilen sütundaki değerlerden, her bir grup için en yüksek olanları bulur. Verilen sütundaki değerlerden, her bir grup için en düşük olanları bulur. Verilen sütun ismindeki değerlerin grup başı toplamını bulur. Verilen sütundaki değerlerden, her bir grup için varyans hesabı yapar 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.
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ı?
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ı?
GROUP BY ve JOIN Kullanımı
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
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
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.
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
Seçilmiş Verileri Özetlemek
Sıralanmış Verileri Özetlemek 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 48
Konu Akışı Basit Sorgular Tabloları Birlikte Sorgulamak ve Özetlemek İleri Veri Yönetim Teknikleri 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 50
<NULL> Hiyerarşik Veri Modeli(İlişkisel Domain) Bilgisayar Cocuk Kitaplari Hukuk. Programlama Veritabanı İşletim Sistemleri Grafik.. SQL Server 2000 SQL Server 2005 Access 51
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>) Kendini çağırma işlemi, ikinci SELECT boş sonuç seçtiğinde sona erer Biriktirme veya ifadenin sonuna OPTION (MAXRECURSION 2); Default 100 iterasyon 0 verilirse, iterasyon sınırı yok! Tanımlama 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 ROW_NUMBER Soyad sehir 1 1 7 1 NTILE_4 Leylagil Kırşehir 2 2 1 1 Burma Mardin 2 2 9 1 Surma Mardin 2 2 6 2 Kirko Mardin 2 2 4 2 Doğru Mardin 6 3 8 3 Peker Rize 7 4 3 3 Davacı Sakarya 7 4 2 4 Camcı Sakarya 9 5 5 4 Furkan 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 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 SELECT D.* FROM tablo PIVOT(MIN(Deger) FOR Ozellik IN ([Numara],[Renk])) D 1 Numara 40 SORU: En alttaki satır da olsa idi, PIVOT işleminin sonucu değişir miydi? 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 SELECT * FROM iller CROSS APPLY dbo.ilinilceleri(ilkod) OUTER Sonuc 08 Artvin <null> <null> ilkod il 6 Ankara 7 Antalya 8 Artvin 9 Aydın ilcekod ilcead 56 Altındağ 57 Çankaya 58 Etimesgut ilkod 80 Merkez-Doğu Antalya 81 Akseki ilinilceleri(ilkod) 61
Veri Yönetimi ve Cursorler Veri Eklemek Verileri Güncellemek Verileri Silmek Cursor'lerle Çalışmak
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')
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
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 )
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
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
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
Cursorler'le Çalışmak 1. 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. 2. 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. 3. 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. 4. Cursor'ü Kapatma: İşi biten Cursor CLOSE deyimi ile kapatılır. Ancak Cursor halen tanımlıdır. Gerektiğinde yeniden açılabilir. 5. Cursor'ü Hafızadan silme: DEALLOCATE deyimi ile Cursor tanımı da hafızadan silinebilir.
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)
Ö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; 71
Ödev 8-9.10.Unitelere ait bütün «Veritabanı Atölye» alıştırmaları 72
Sonuç Verileri sorgulamak, veritabanları ile iletişimimizi artırır. Verileri değiştirmek ve yönetmek için bir çok ifade mevcuttur. 73