Ana içeriğe geç
Modül 5 · Ders 4 ders 4Kurstaki 20/57~12 min
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.

SQL
-- 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ü:

SQL
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 (ALL olmadan) yinelenenleri kaldırır — etkili bir şekilde Nihai sonuç hakkında DISTINCT;
  • UNION ALL kopyaları da tutar ve çok daha hızlıdır çünkü tekilleştirme için sıralama/karma işlemini önler.
SQL
-- 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").

SQL
-- 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

Egzersiz#sql.m5.l4.e1
Denemeler: 0Yükleniyor…

OPPURE'ün kaliteli bir e-posta adresine (kopyalanmış) sahip istemci e-postasını gönderin. Una koloni: e-posta. E-posta başına Ordina.

Düzenleyici yükleniyor…
İ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

Egzersiz#sql.m5.l4.e2
Denemeler: 0Yükleniyor…

İ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.

Düzenleyici yükleniyor…
İpucu göster

EXCEPT yalnızca sol SELECT'te sağda bulunmayan satırları tutar.

3 denemeden sonra çözüm mevcut