Modül dersleri (4/4)
UNION, KESİŞTİ, HARİÇ (ve ÇAPRAZ KATIL)
Şu ana kadar verileri yatay olarak birleştirdiniz: JOIN sütunları ekler
ilgili satırlardan. SQL aynı zamanda başka bir operatör ailesi de sunmaktadır.
verileri dikey olarak birleştirerek iki SELECTs sonucunu şu şekilde ele alır:
setler: UNION, INTERSECT, EXCEPT. Ayrıca CROSS JOIN adresini de tekrar ziyaret ediyoruz.
kartezyen çarpım.
CROSS JOIN: her satırla her satır
CROSS JOIN'da ON yoktur: mümkün olan her kombinasyonu üretir
iki tablo arasındaki satırlar (kartezyen çarpım). A n satıra ve B'ye sahipse
m satır var, sonuçta n × m var.
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM customers c
CROSS JOIN products p;12 müşteri × 16 ürün = 192 satır. Gerçek verilerde nadiren kullanılır (bu pahalı!), ancak aşağıdakiler için faydalıdır:
- "hepsi herkese karşı" kombinasyonlarının oluşturulması (örneğin bir uyumluluk matrisi);
- bir tabloyu küçük bir sabitler/parametreler tablosuyla eşleştirmek.
BİRLİK ve BİRLİK HEPSİ
UNION iki SELECT'in sonuçlarını aynı sayı ve ile ekler
sütun türü:
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';Tüzük:
- iki
SELECTs aynı sayıda sütuna sahip olmalı ve uyumlu olmalıdır türleri; UNION(ALLolmadan) yinelenenleri kaldırır — etkili bir şekilde Nihai sonuç hakkındaDISTINCT;UNION ALLkopyaları da tutar ve çok daha hızlıdır çünkü tekilleştirme için sıralama/karma işlemini önler.
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM customers c JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.email
FROM customers c JOIN reviews r ON r.customer_id = c.id;KESİŞTİ ve HARİÇ
INTERSECT yalnızca her iki sonuçta da bulunan satırları tutar; EXCEPT
birincinin ikincide olmayan satırlarını tutar (küme
"fark").
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;
-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;INTERSECT ve EXCEPT ayrıca varsayılan olarak kopyaları da kaldırır; the
INTERSECT ALL / EXCEPT ALL çeşitleri bunu yapmaz.
Kendin dene
OPPURE'ün kaliteli bir e-posta adresine (kopyalanmış) sahip istemci e-postasını gönderin. Una koloni: e-posta. E-posta başına Ordina.
İpucu göster
Aynı e-posta sütununu döndüren iki SELECT arasındaki UNION. ORDER BY, nihai sonucun sonuna gider.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
İstemciden gelen e-postayı, hiç bir zaman sıfırlanmadan düzenli olarak alın. ABD HARİÇ. Una koloni: e-posta. E-posta başına Ordina.
İpucu göster
EXCEPT yalnızca sol SELECT'te sağda bulunmayan satırları tutar.
3 denemeden sonra çözüm mevcut