BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN
İleri SQL(Alt Sorgular, IN, ANY, ALL, İlintili Sorgular, UNION, INTERSECT, EXCEPT, Hareket/İşlem (Transaction))
Konular
Alt Sorgu
UNION ve UNION ALL
INTERSECT
EXCEPT
Hareket/İşlem (Transaction)
Alt Sorgu
Burada verilen örnekler NorthWind veritabanının aşağıdaki şeması ile ilgilidir.
WHERE ile Alt Sorgu (Tek Değer Döndüren) Kullanımı
WHERE ifadesinde yalnızca =, !=, <, >, <=, >= gibi operatörler kullanılıyor ise alt sorgular sonucunda tek alan ve tek satır dönmeli ve veri tipi uygun olmalı. Aksi halde hata verir.
WHERE ifadesinde yalnızca =, !=, <, > gibi operatörler kullanılıyor ise alt sorgular sonucunda tek alan ve tek satır dönmeli ve veri tipi uygun olmalı. Aksi halde hata verir.
Çoklu satır fonksiyonlarından geriye tek değer döndürüldüğü için alt sorgu içerisinde bu tür fonksiyonlar kullanılabilir.
Alt sorgudaki koşul içerisinde birincil anahtar kullanılarak alt sorgudan tek değer döndürülmesi garanti edilebilir.
= ANY ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarından her hangi birisine eşit olup olmadığını araştırmak için kullanılır.
> ANY ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarının her hangi birisinden büyük olup olmadığını araştırmak için kullanılır.
< ANY ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarının her hangi birisinden küçük olup olmadığını araştırmak için kullanılır.
SELECT*FROM"products"WHERE"UnitPrice"> ANY (SELECT"UnitPrice"FROM"suppliers"INNER JOIN"products"ON"suppliers"."SupplierID"="products"."SupplierID"WHERE"suppliers"."CompanyName"='Tokyo Traders');
ALL ile Alt Sorgu Kullanımı
İki türü mevcuttur.
> ALL
< ALL
> ALL ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarının tamamından büyük olup olmadığını araştırmak için kullanılır.
< ALL ifadesi, sorgulanan değerin, alt sorgudan dönen değerler kümesinin elemanlarının tamamından küçük olup olmadığını araştırmak için kullanılır.
SELECT*FROM"products"WHERE"UnitPrice"> ALL (SELECT"UnitPrice"FROM"suppliers"INNER JOIN"products"ON"suppliers"."SupplierID"="products"."SupplierID"WHERE"suppliers"."CompanyName"='Tokyo Traders');
SELECT"SupplierID",SUM("UnitsInStock") AS"toplam", SQRT(SUM(("UnitsInStock" - (SELECT AVG("UnitsInStock") FROM "products")) ^ 2) / COUNT("UnitsInStock")) AS "standartSapma"
FROM"products"GROUP BY"SupplierID";
Standart sapma hesaplanırken “Toplam” takma ismi kullanılmamalı.
İlintili (Correlated) Sorgu
İç içe döngülerdeki gibi dış sorgunun her bir satırı iç sorguya gönderilerek iç sorgunun çalıştırılması sağlanır.
Aşağıdaki örneğin çalışması şu adımlardan oluşur;
Dış sorgunun birinci satırı seçilir.
İç sorgu çalıştırılır ve dış sorguda seçilen satırın SupplierID değerine sahip olan tüm kayıtların UnitPrice alanlarındaki değerlerin aritmetik ortalaması hesaplanır.
Dış sorgunun birinci satırının UnitPrice alanındaki değer, alt sorguda hesaplanan ortalamadan büyük ise seçilen birinci satır sonuç kümesine eklenir. Değilse eklenmez.
Dış sorgunun ikinci satırı seçilir ve aynı işlem yapılır.
Bu işlemler dış sorgunun tüm satırları için tekrarlanır.
Hareket/işlem (transaction) veritabanı yönetim sistemlerinin önemli özelliklerinden birisidir.
ACID ile belirtilen ozellikleri destekler.
ACID ifadesi, Atomicity, Consistency, Isolation ve Durability kelimelerinin ilk harflerinin birleşiminden oluşur. Detayları aşağıda anlatılmıştır.
Atomicity (Atomiklik): Hareket/işlem (transaction) kapsamındaki alt işlemlerin tamamı bir bütün olarak ele alınır. Ya alt işlemlerin tamamı başarılı olarak çalıştırılır, ya da herhangi birinde hata varsa tamamı iptal edilir ve veritabanı eski kararlı haline döndürülür.
Consistency (Tutarlılık): Herhangi bir kısıt ihlal edilirse roll back işlemiyle veritabanı eski kararlı haline döndürülür.
Isolation (Yalıtım): İşlemler birbirlerini (ortak kaynak kullanımı durumunda) etkilemezler. Kullanılan ortak kaynak işlem tarafından, işlem tamamlanana kadar, kilitlenir.
Durability (Mukavemet): Sistem tarafından bir hata meydana gelmesi durumunda tamamlanmamış olan işlem sistem çalışmaya başladıktan sonra mutlaka tamamlanır.
BEGIN; -- Harekete (transaction) başla.INSERT INTO"order_details" ("OrderID", "ProductID", "UnitPrice", "Quantity", "Discount")VALUES (10248, 11, 20, 2, 0);-- Yukarıdaki sorguda hata mevcutsa ilerlenilmez.-- Aşağıdaki sorguda hata mevcutsa bu noktadan geri sarılır (rollback).-- Yani yukarıdaki sorguda yapılan işlemler geri alınır.UPDATE"products"SET"UnitsInStock"="UnitsInStock"-2WHERE"ProductID"=11;-- Her iki sorgu da hatasız bir şekilde icra edilirse her ikisini de işlet ve -- veritabanının durumunu güncelle.COMMIT; -- Hareketi (transaction) tamamla.
BEGIN;UPDATE Hesap SET bakiye = bakiye -100.00WHERE adi ='Ahmet';SAVEPOINT my_savepoint;UPDATE Hesap SET bakiye = bakiye +100.00WHERE adi ='Mehmet';-- Parayı Mehmet'e değil Ayşe'ye gönderROLLBACKTO my_savepoint;UPDATE Hesap SET bakiye = bakiye +100.00WHERE adi ='Ayşe';COMMIT;