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
















Hiç yorum yok:

fatihuzuner.com