4 Ekim 2015 Pazar

EXISTS ve NOT EXISTS kullanımı

EXISTS VE NOT EXISTS KOMUTLARI : İki tablo'yu eşitleme ve arasındaki kayıt farklılıkları bulmak için kullanılan bir komuttur. Hem EXISTS hemde NOT EXISTS şeklinde kullanılır. Bu komutlar SUBSELECT tarzında kullanılır.

Örnek kodla eşitleme aşağıdaki gibidir.

WHERE EXISTS ( subquery );

Örnek kodla eşit olmayan aşağıdaki gibidir.

WHERE NOT EXISTS ( subquery );

Bir örnek yapalım SELECT ile;

SELECT *
FROM customers
WHERE EXISTS (SELECT *
              FROM order_details
              WHERE customers.customer_id = order_details.customer_id);
Yukarıda yapılan şey WHERE'den sonra EXISTS denilmiş, yani uyanları istemiş. Sonrasında parantez içinde SELECT, FROM ve WHERE kullanılmış. WHERE tarafında yapılması gereken tek bir işlem kaldı, oda üstteki SELECT * FROM'da yer alan tablonun ID'isi ile ikinci tablosunu ID'si eşitlemekle istenilen yapılmış olur.

SELECT *
FROM customers
WHERE NOT EXISTS (SELECT *
              FROM order_details
              WHERE customers.customer_id = order_details.customer_id);
NOT EXISTS'te de aslında değişen bir şey yok. Yukarıdaki açıklama birebir aynı bir eşitleme yapılmalı, sadece başına NOT EXISTS denmeli. Neden? çünkü bir eşit olmayanları istiyoruz. Hepsi bu kadar.

Yine DELETE, UPDATE ve INSERT'lerle de bu işlemler yapılabilir.

INSERT EXISTS örneği;

INSERT INTO contacts
(contact_id, contact_name)
SELECT supplier_id, supplier_name
FROM suppliers
WHERE EXISTS (SELECT *
              FROM order_details
              WHERE suppliers.supplier_id = order_details.supplier_id);

UPDATE EXISTS örneği;

UPDATE suppliers
SET supplier_name = (SELECT customers.name
                     FROM customers
                     WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.name
              FROM customers
              WHERE customers.customer_id = suppliers.supplier_id);

DELETE EXISTS örneği;

DELETE FROM suppliers
WHERE EXISTS (SELECT *
              FROM order_details
              WHERE suppliers.supplier_id = order_details.supplier_id);

Yukarıdaki örnekleri anladığınızı düşünüyorum. Sorun yaşarsanız benimle iletişime geçin.

2 Ekim 2015 Cuma

İç Select - SubQuery - SubSelect Nedir

İç Select Nedir - SubQuery Nedir - SubSelect Nedir

İç Select olarak söylediğimiz şeyin gerçek adı, SubQuery yada tam olarak SubSelect'tir. SubSelect ile JOIN'ler arasında ne fark var? Böyle sorduğunuz düşünülürse, çok fark var. Ama bunu anlatmak bazen bir hayli zor olabiliyor.

Ama siz uygulamalar yapa yapa arasındaki birden fazla farkı anlayacaksınız. Ayrıca ben burada anlatmaya kalksam paragraflar yetmez. Ben tek bir örnekle anlatmam gerekirse, tek bir örnek "mesela JOIN'lemekten kurtuluyorsunuz, ve sadece o alanı alıyorsunız.". Demem o  ki uygulama yapmadan arasındaki onca farkı anlamanız mümkün değil.

SubSelect işlemleri 3 kısımda da kullanılır. Nedir bu alanlar?

1. SELECT katmanında,
2. FROM katmanında,
3. WHERE katmanında.

Bizde bunlar için her birine 1 örnek yapalım. Oracle tarafından hazırlanmış standart örnekleri şöyledir;

SELECT SUBSELECT : Aşağıda yapılmak istenen nedir? SELECT ile FROM arasında tablo sorguya genel istenilenlerin dışında bir alan çekmek için kullanılmış.

SELECT tbls.owner, tbls.table_name,
  (SELECT COUNT(column_name) AS total_columns
   FROM all_tab_columns cols
   WHERE cols.owner = tbls.owner
   AND cols.table_name = tbls.table_name) subquery2
FROM all_tables tbls;

FROM SUBSELECT : Aşağıda yapılmak istenen çok kullanılan bir yapı değil. Hiç yoktan ben hiç ama hiç kullanmadım. Fakat iki tablo yan yana çağrılmış, ama 2. tablo SubSelect ile oluşturulmuş ve gruplama yapılmış. Sonrasında da baştaki SELECT içine taşınmış. Ardından bu tabloların ID'lerini de WHERE alanında eşitlik getirmişler. Anlayacağınız 2. tablo gruplu olduğundan WHERE'e ise gruplamalı bir eşitlik sağlanmış. Sonuç olarak gruplamalı veriler getirilmek istendiği için yapılmış. Bunu ilerleyen zamanlarda kullanmanızı isterim. Bana kalırsa hiç kullanmayın. Gerek yok da.

SELECT suppliers.name, subquery1.total_amt
FROM suppliers,
 (SELECT supplier_id, SUM(orders.amount) AS total_amt
  FROM orders
  GROUP BY supplier_id) subquery1
WHERE subquery1.supplier_id = suppliers.supplier_id;

WHERE SUBSELECT :  Dönen sonucu WHERE'de eşitlemek istenmiş. Ama tek fark ilk tablonun eşitliği SubSelect'in dışında, ikinci tablonun verisi de SubSelect'in içinde olmasıdır.

SELECT * 
FROM all_tables tabs
WHERE tabs.table_name IN (SELECT cols.table_name
                          FROM all_tab_columns cols
                          WHERE cols.column_name = 'SUPPLIER_ID');

Başta da dediğim gibi, SUBSELECT biraz farklıdır. Kullanılmak istendiği katmanlar ve kullanılmak istenilen amaca göre farklılıklar gösterir. Ayrıca JOIN'lemeden çok ama çok farklıdır. Bu farkı yaşayarak öğrenmenizi istiyorum. Aski halde ben anlatmakta, sizlerde anlamakta güçlük çekersiniz.

Benimle iletişime geçin. djvuslatdj@gmail.com
















SQL'e Giriş

Merhaba diyerek başlayalım. Bu sayfada SQL Dersleri yapmaya çabalayacağım. Sizlerden dönüşlerde bekliyorum. Öğrenmek istediğiniz her şeyi sorabilir siniz?

Sizlerin bütün merak ettiğiniz şeyleri sormanızı bekliyorum. Biliniz ki içtenlikle cevap vereceğim. Klasik şeyleri bahsetmemeyi hedefliyorum. Şimdilik bu kadar.
fatihuzuner.com