60  SQL KÜME-SET Komutları

set-operations-union-intersect-except

60.1 SQL- UNION - Birleşim

  • Birden fazla SELECT komutundan gelen farklı (DISTINCT) sonuçları birleştirir.

  • UNION sorgu sonucundaki mükerrer kayıtları tekilleştirdiği için performans etkilenir.

Aşağıdaki örneğe bakınız:

SELECT c.FirstName FROM Customer c

59 satır

Müşteri (Customer) tablomuzda 59 satır var.

SELECT e.FirstName FROM Employee e

8 satır

Çalışanlar (Employees) tablomuzda 8 satır bulunmaktadır.

SELECT c.FirstName FROM Customer c
UNION
SELECT e.FirstName FROM Employee e

63 satır

Ancak tüm ilk adları UNION kullanarak birleştirdiğimizde 59+8 = 67 satır değil 63 satır elde ederiz. UNION set operatörü sonuçtan yinelenenleri kaldırır. Burada 4 yinelenen ilk ad var..

  • UNION ALL mükerrer kayıtlar ile ilgili işlem yapmadığı için daha hızlı çalışır.

  • Performans açısından mümkün olan her yerde UNION ALL kullanılmalıdır.

SELECT c.FirstName FROM Customer c
UNION ALL
SELECT e.FirstName FROM Employee e

67 satır

UNION ALL kullandığımızda 59+8 = 67 satır elde ederiz. Sonuç kümesini bir alt sorgu kullanarak sıralarsak, yinelenenleri daha net görebiliriz. Aşağıdaki sorguda, alt sorgudan kullanıyoruz.

SELECT * FROM
(
SELECT c.FirstName FROM Customer c
UNION ALL
SELECT e.FirstName FROM Employee e
)
ORDER BY FirstName

union all duplicate results
  • Kolon takma isimleri ilk sorguda yazılmalıdır.
  • Kolon sayıları birleştirilen tüm sorgularda aynı olmalıdır.

Eğer aşağıdaki sorguyu çalıştırırsak, hata alırız.

SELECT c.FirstName,c.LastName FROM Customer c
UNION ALL
SELECT e.FirstName FROM Employee e
SQL Error [1]: [SQLITE_ERROR] SQL error or missing database (SELECTs to the left and right of UNION ALL do not have the same number of result columns)
  • Kolon veri yapıları ya örtük çevirime (Implicit Conversion) uygun olmalıdır, yada açıkça çevirilmelidir (Explicit Conversion).
  • Örneğin SELECT cast( GETDATE() as varchar(12))

Bu, dinamik veri türlerini kullanması nedeniyle sqlite’da daha az bir sorundur.

Ancak oracle ve sqlserver’da, veriler örtük olarak dönüştürülemezse sorgularınız hata döndürebilir.

60.2 EXCEPT

İkinci sonuç kümesi birinci sonuç kümesinden çıkarılır. EXCEPT anahtar sözcüğü SQL standardıdır.

SELECT c.FirstName FROM Customer c
EXCEPT
SELECT e.FirstName FROM Employee e

55 satır

SELECT e.FirstName FROM Employee e
EXCEPT
SELECT c.FirstName FROM Customer c

6 satır.

EXCEPT ifadesi için UNION konusunda anlatılan, 2 sorgudaki kolon sayısının ve veri yapılarının aynı olması kısıtı aynen geçerlidir.

60.3 INTERSECT

Her iki sonuç kümesinin kesişimi (intersection) çıktıyı oluşturur.

SELECT c.FirstName FROM Customer c
INTERSECT
SELECT e.FirstName FROM Employee e

2 satır

Yani Müşteri ve Çalışan tablolarında sadece 2 isim aynıdır.

INTERSECT ifadesi için UNION konusunda anlatılan, 2 sorgudaki kolon sayısının ve veri yapılarının aynı olması kısıtı aynen geçerlidir.

60.3.1 Intersect için örnek sorular

60.3.1.1 İki farklı tabloda ortak kolon adları

Aşağıdaki iki tabloyu düşünün: Employee ve Customer. Employee ve Customer tablolarında hangi isimlerin ortak olduğunu bulacak bir sorgu yazın.

erDiagram
    Employee {
        int employee_id
        text employee_name
    }
    Customer {
        int customer_id
        text customer_name
    }  

Bu soru, iç birleştirme (inner join) kullanılarak da çözülebilir ancak küme işlemi kesişiminin anlaşılması daha kolaydır. Aşağıdaki sorgu, cevabımızı verecektir

SELECT employee_name FROM Employee;
INTERSECT
SELECT customer_name FROM Customer;

Chinook Örnek

Benzer bir örneği Chinook veritabanı için çalıştırırsak, aşağıdaki sorguyu çalıştırırız.

SELECT c.FirstName from Customer c
INTERSECT
SELECT e.FirstName from Employee e 

sonuçlar aşağıda iki isimdir.

Robert
Steve

60.4 Oracle MINUS

Except ifadesi, SQL standardıdır. Ancak Oracle ayrıca MINUS anahtar sözcüğünü de kabul eder. İşlevselliği aynıdır. Oracle ayrıca ALL’ı EXCEPT ALL ve MINUS ALL olarak kabul eder, böylece çoğaltılmış olanlar kaldırılmaz, UNION ALL ile aynıdır. Aşağıdaki Oracle öğretici Set işlemleri’ye bakın

60.5 Diğer öğreticiler