שיעורי מודול (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.
-- 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 עם אותו מספר ו
סוג העמודות:
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';כללים:
- שני
SELECTחייבים להיות בעלי אותו מספר עמודות, עם תואם סוגים; UNION(ללאALL) מסיר כפילויות - ביצוע יעיל שלDISTINCTעל התוצאה הסופית;UNION ALLשומר גם כפילויות, והוא הרבה יותר מהיר מכיוון שהוא נמנע ממיין/hash למניעת כפילויות.
-- 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
שומר את השורות של הראשון שלא נמצאות בשני (הסט
"הבדל").
-- 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 גרסאות לא.
נסה זאת בעצמך
שלח דוא"ל לקליינטי che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati). אונה קולונה: אימייל. אורדינה למייל.
הצג רמז
UNION בין שני SELECTs מחזיר את אותה עמודת דוא"ל. ה-ORDER BY הולך בסוף, על התוצאה הסופית.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
Trova le email dei clienti che hanno ordinato ma non hanno mai recensito nulla. ארה"ב למעט. אונה קולונה: אימייל. אורדינה למייל.
הצג רמז
EXCEPT שומר רק את השורות משמאל SELECT שאינן קיימות בימין.
הפתרון זמין לאחר 3 ניסיונות