דילוג לתוכן המרכזי
מודול 5 · שיעור 4 מתוך 420/57 בקורס~12 min
שיעורי מודול (4/4)

UNION, INTERSECT, EXCEPT (ו-CROSS JOIN)

עד כה שילבת נתונים אופקי: JOIN מצרף עמודות משורות קשורות. SQL מציעה גם משפחה נוספת של אופרטורים משלב נתונים אנכית, מתייחס לתוצאות של שתי SELECTs כאל סטים: UNION, INTERSECT, EXCEPT. אנחנו גם מבקרים מחדש ב-CROSS JOIN, את מוצר קרטזי.

CROSS JOIN: כל שורה עם כל שורה

ל-CROSS JOIN אין ON: הוא מייצר כל שילוב אפשרי של שורות בין שתי טבלאות (מוצר קרטזי). אם ל-A יש n שורות וB יש m שורות, לתוצאה יש n × m.

SQL
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM   customers c
CROSS JOIN products p;

12 לקוחות × 16 מוצרים = 192 שורות. נעשה בו שימוש לעתים רחוקות על נתונים אמיתיים (זהו יקר!), אבל זה שימושי עבור:

  • יצירת שילובים של "הכל נגד כולם" (למשל מטריצת תאימות);
  • צימוד טבלה עם טבלה קטנה של קבועים / פרמטרים.

UNION ו UNION ALL

UNION מוסיף את התוצאות של שתי SELECTs עם אותו מספר ו סוג העמודות:

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

כללים:

  • שני SELECT חייבים להיות בעלי אותו מספר עמודות, עם תואם סוגים;
  • UNION (ללא ALL) מסיר כפילויות - ביצוע יעיל של DISTINCT על התוצאה הסופית;
  • UNION ALL שומר גם כפילויות, והוא הרבה יותר מהיר מכיוון שהוא נמנע ממיין/hash למניעת כפילויות.
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;

מצטלבים וחוץ מזה

INTERSECT שומר רק את השורות הנוכחות בשתי התוצאות; EXCEPT שומר את השורות של הראשון שלא נמצאות בשני (הסט "הבדל").

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 ו-EXCEPT מסירים גם כפילויות כברירת מחדל; את INTERSECT ALL / EXCEPT ALL גרסאות לא.

נסה זאת בעצמך

פעילות גופנית#sql.m5.l4.e1
ניסיונות: 0טוען...

שלח דוא"ל לקליינטי che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati). אונה קולונה: אימייל. אורדינה למייל.

טוען עורך...
הצג רמז

UNION בין שני SELECTs מחזיר את אותה עמודת דוא"ל. ה-ORDER BY הולך בסוף, על התוצאה הסופית.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#sql.m5.l4.e2
ניסיונות: 0טוען...

Trova le email dei clienti che hanno ordinato ma non hanno mai recensito nulla. ארה"ב למעט. אונה קולונה: אימייל. אורדינה למייל.

טוען עורך...
הצג רמז

EXCEPT שומר רק את השורות משמאל SELECT שאינן קיימות בימין.

הפתרון זמין לאחר 3 ניסיונות