Sorguları Çözmek İçin Alt Sorgular
Alt sorgu, en iyi şekilde bir sorgu içindeki sorgu olarak tanımlanır. Alt sorgular, sorgu çalışma zamanında yürütülürken gerçekte geliştirilen ölçütler için veri satırları seçen sorgular yazmanıza olanak tanır. Daha resmi olarak, başka bir SELECT ifadesinin tümcelerinden birinin içinde bir SELECT ifadesinin kullanılmasıdır. Aslında, bir alt sorgu başka bir alt sorgu içinde, başka bir alt sorgunun içinde vb. Yer alabilir. Bir alt sorgu ayrıca INSERT, UPDATE ve DELETE ifadelerinin içine yerleştirilebilir. Alt sorgular parantez içine alınmalıdır.
Bir alt sorgu, tek bir değer döndürmesi şartıyla bir ifadeye izin verilen herhangi bir yerde kullanılabilir. Bu, tek bir değer döndüren bir alt sorgunun, FROM yan tümce listesinde bir nesne olarak da listelenebileceği anlamına gelir. Bu, bir satır içi görünüm olarak adlandırılır çünkü bir alt sorgu, bir FROM yan tümcesinin parçası olarak kullanıldığında, sanal bir tablo veya görünüm gibi ele alınır. Alt sorgu, ana sorgunun FROM yan tümcesi, WHERE yan tümcesi veya HAVING yan tümcesine yerleştirilebilir.
Oracle, bir WHERE yan tümcesinde 255 alt sorgu düzeyinin en fazla yuvalanmasına izin verir. Bir FROM yan tümcesinde ifade edilen iç içe geçmiş alt sorgular için bir sınır yoktur. Pratikte, 255 düzey sınırı gerçekten bir sınır değildir çünkü üç veya dört düzeyden fazla iç içe geçmiş alt sorgularla karşılaşmak nadirdir.
Bir alt sorgu SELECT ifadesi, normal veya dış sorguyu başlatmak için kullanılan SELECT deyimine çok benzer. Bir alt sorgunun tam sözdizimi şöyledir:
( SELECT [DISTINCT] subquery_select_parameter
FROM {table_name | view_name}
{table_name | view_name} ...
[WHERE search_conditions]
[GROUP BY column_name [,column_name ] ...]
[HAVING search_conditions] )
Alt Sorgu Türleri
Single Row Sub Query: Tek satır çıktı döndüren alt sorgu. WHERE koşullarında kullanıldıklarında tek satır karşılaştırma operatörlerinin kullanımını işaretlerler.
Multiple row sub query: Birden çok satır çıktısı döndüren alt sorgu. IN, ANY, ALL gibi çoklu satır karşılaştırma operatörlerinden yararlanırlar. Birden çok sütunu döndüren alt sorgular da olabilir.
Correlated Sub Query: İlişkili alt sorgular, dış sorgu tarafından sağlanan verilere bağlıdır. Bu alt sorgu türü ayrıca, belirtilen kriterleri karşılayan veri satırlarının varlığını test etmek için EXISTS işlecini kullanan alt sorguları da içerir.
Tek Sıralı Alt Sorgu
Dış sorgunun sonuçları tek, bilinmeyen bir değere dayandığında tek satırlı bir alt sorgu kullanılır. Bu sorgu türü resmi olarak "tek satır" olarak adlandırılsa da, ad, sorgunun birden çok sütun döndürdüğünü, ancak yalnızca bir sonuç satırı döndürdüğünü belirtir. Ancak, tek satırlı bir alt sorgu, dış sorguya yalnızca bir sütundan oluşan yalnızca bir sonuç satırı döndürebilir.
Aşağıdaki SELECT sorgusunda, iç SQL yalnızca bir satır, yani şirket için minimum maaş döndürür. Sırasıyla, tüm çalışanların maaşını karşılaştırmak için bu değeri kullanır ve yalnızca maaşı asgari ücrete eşit olanları gösterir.
SELECT first_name, salary, department_id
FROM employees
WHERE salary = (SELECT MIN (salary)
FROM employees);
HAVING yan tümcesi, bir sorgunun grup sonuçlarının bazı koşullara göre kısıtlanması gerektiğinde kullanılır. Bir alt sorgunun sonucunun bir grup işleviyle karşılaştırılması gerekiyorsa, iç sorguyu dış sorgunun HAVING yan tümcesine iç içe yerleştirmelisiniz.
SELECT department_id, MIN (salary)
FROM employees
GROUP BY department_id
HAVING MIN (salary) < (SELECT AVG (salary) FROM employees)
Çoklu Satır Alt Sorgu
Birden çok satırlı alt sorgular, üst sorguya birden fazla sonuç satırı döndürebilen iç içe geçmiş sorgulardır. Çok satırlı alt sorgular en yaygın olarak WHERE ve HAVING yan tümcelerinde kullanılır. Birden çok satır döndürdüğü için, küme karşılaştırma operatörleri (IN, ALL, HERY) tarafından ele alınmalıdır. IN operatörü önceki bölümde tartışılanla aynı anlama sahipken, ANY operatörü belirtilen bir değeri alt sorgu tarafından döndürülen her bir değerle karşılaştırır. TÜMÜ, bir değeri bir alt sorgu tarafından döndürülen her değerle karşılaştırır.
Aşağıdaki sorgu, tek satırlı alt sorgu birden çok satır döndürdüğünde hatayı gösterir.
SELECT first_name, department_id
FROM employees
WHERE department_id = (SELECT department_id FROM employees WHERE LOCATION_ID = 100)
department_id = (select
*
ERROR at line 4:
ORA-01427: single-row subquery returns more than one row
Çoklu Satır operatörlerinin kullanımı
[> TÜMÜ] Alt sorgu tarafından döndürülen en yüksek değerden fazla
[<ALL] Alt sorgu tarafından döndürülen en düşük değerden az
[<ANY] Alt sorgu tarafından döndürülen en yüksek değerden az
[> ANY] Alt sorgu tarafından döndürülen en düşük değerden fazla
[= ANY] Alt sorgu tarafından döndürülen herhangi bir değere eşittir (IN ile aynı)
Yukarıdaki SQL, aşağıdaki gibi IN operatörü kullanılarak yeniden yazılabilir.
SELECT first_name, department_id
FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE LOCATION_ID = 100)
Yukarıdaki sorguda, IN alt sorgudan döndürülen departman kimlikleriyle eşleşir, ana sorgudakilerle karşılaştırır ve koşulu karşılayan çalışanın adını döndürür.
Yukarıdaki sorgu için bir birleştirme daha iyi bir çözüm olabilir, ancak örnekleme amacıyla alt sorgu içinde kullanılmıştır.
İlişkili Alt Sorgu
Dış sorgunun iç sorgu tarafından sağlanan değerlere bağlı olduğu normal bir alt sorgunun aksine, ilişkili bir alt sorgu, iç sorgunun dış sorgu tarafından sağlanan değerlere bağlı olduğu bir alt sorgudur. Bu, ilişkili bir alt sorguda, dış sorgu tarafından seçilebilecek her satır için iç sorgunun tekrar tekrar yürütüldüğü anlamına gelir.
İlişkili alt sorgular, karmaşık yönetim sorularını yanıtlayan sonuç tabloları oluşturabilir.
Aşağıdaki SELECT sorgusunu göz önünde bulundurun. Daha önce ele alınan alt sorgulardan farklı olarak, bu SELECT deyimindeki alt sorgu, ana sorgudan bağımsız olarak çözümlenemez. Dış sorgunun, satırların çalışan tablosundan e1 takma adıyla seçildiğini belirttiğine dikkat edin. İç sorgu, çalışan tablosunun çalışan departmanı numarası sütununu (Departman Numarası) diğer ad e2 ile diğer tablo adı e1 için aynı sütunla karşılaştırır.
SELECT EMPLOYEE_ID, salary, department_id
FROM employees E
WHERE salary > (SELECT AVG(salary)
FROM EMP T
WHERE E.department_id = T.department_id)
Çoklu Sütun Alt Sorgusu
Çok sütunlu bir alt sorgu, dış sorguya birden fazla sütun döndürür ve dış sorgunun FROM, WHERE veya HAVING yan tümcesinde listelenebilir. Örneğin, aşağıdaki sorgu, mevcut maaşı 1000-2000 aralığında olan ve 10 veya 20 numaralı departmanda çalışanlar için çalışanın geçmiş detaylarını gösterir.
SELECT first_name, job_id, salary
FROM emp_history
WHERE (salary, department_id) in (SELECT salary, department_id
FROM employees
WHERE salary BETWEEN 1000 and 2000
AND department_id BETWEEN 10 and 20)
ORDER BY first_name;
Dış sorgunun FROM yan tümcesinde çok sütunlu bir alt sorgu kullanıldığında, dış sorgunun diğer yan tümceleri tarafından başvurulabilen geçici bir tablo oluşturur. Bu geçici tablo daha resmi olarak satır içi görünüm olarak adlandırılır. Alt sorgunun sonuçları, FROM yan tümcesinde diğer tablolar gibi ele alınır. Geçici tablo gruplanmış veriler içeriyorsa, gruplanmış alt kümeler bir tablodaki ayrı veri satırları olarak değerlendirilir. Aşağıdaki sorgudaki FROM yan tümcesini göz önünde bulundurun. Alt sorgu tarafından oluşturulan satır içi görünüm, ana sorgu için veri kaynağıdır.
SELECT *
FROM (SELECT salary, department_id
FROM employees
WHERE salary BETWEEN 1000 and 2000);