erDiagram Employee { int employee_id text employee_name } Customer { int customer_id text customer_name }
60 SQL KÜME-SET Komutları
- UNION [ALL] - BİRLEŞİM
- EXCEPT/MINUS - FARK
- INTERSECT - KESİŞİM
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
- 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.
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