איחוד (UNION)
חלק מהיחידה יסודות במסלול ה-SQL של Coddy. שיעור 48 מתוך 72.
איחודים שונים מצירופים. צירופים משתמשים בתנאים כדי לשלב טבלאות, אבל איחודים פשוט מוסיפים טבלה אחת מעל האחרת. כדי להשתמש ב-UNION נכתוב:
SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2שתי פקודות ה־SELECT חייבות לציית לכללים הבאים:
- מספר השדות צריך להיות שווה
- הסדר חשוב
- העמודות באותו מיקום חייבות להתאים בסוגי הנתונים
לדוגמה, נניח שיש לנו את הטבלאות הבאות:
germany_people
| id | name |
| 1 | Lena |
| 2 | Leonie |
england_people
| id | name |
| 1 | George |
| 2 | Lena |
הבעיה: אנחנו רוצים ליצור טבלה אחת גדולה עם כל השמות שיש לנו.
SELECT name from germany_people
UNION
SELECT name from england_peopleתוצאה:
| name |
| Lena |
| Leonie |
| George |
UNION מחזיר רק ערכים ייחודיים, ואילו UNION ALL מחזיר את כל הרשומות כפי שהן:
SELECT name from germany_people
UNION ALL
SELECT name from england_peopleתוצאה:
| name |
| Lena |
| Leonie |
| George |
| Lena |
אפשר גם לשלב את UNION ALL עם פונקציות צבירה, עם GROUP BY ועם ORDER BY כדי לסכם נתונים בכמה טבלאות. הטריק הוא לעטוף את UNION ALL בתוך שאילתת משנה, ואז להחיל עליה קיבוץ ומיון.
לדוגמה, נניח שאנחנו רוצים לספור כמה פעמים כל שם מופיע בשתי הטבלאות:
SELECT name, COUNT(*) AS total_count
FROM (
SELECT name FROM germany_people
UNION ALL
SELECT name FROM england_people
) AS combined
GROUP BY name
ORDER BY total_count DESCתוצאה:
| name | total_count |
| Lena | 2 |
| Leonie | 1 |
| George | 1 |
כאן משתמשים ב־UNION ALL (ולא ב־UNION) כדי להשאיר כפילויות כמו Lena. אחרת הן היו מוסרות לפני הספירה. שאילתת המשנה ממזגת את כל השורות, ואז GROUP BY + COUNT מסכמים אותן. ORDER BY ממיין את התוצאה הסופית.
אתגר
קלהטבלאות והעמודות הזמינות:
sales_2009:product_id,quantity_soldsales_2010:product_id,quantity_soldsales_2011:product_id,quantity_sold
יש 3 טבלאות מכירות.
מצאו את סכום המכירות של כל מוצר בכל הטבלאות יחד.
התוצאה צריכה לכלול את product_id ואת סך המכירות.
תנו לעמודה הזו את השם total_sales.
מיינו את התוצאות לפי סך המכירות בסדר יורד.
נסו בעצמכם
-- אחד את שלוש הטבלאות לתוצאה אחת, תוך שמירה על כל השורות
SELECT product_id, ____ AS total_sales
FROM (
SELECT * FROM sales_2009
____
SELECT * FROM sales_2010
____
SELECT * FROM sales_2011
)
-- שורה אחת לכל מוצר, עם הסכום הכולל הגבוה ביותר תחילה
GROUP BY ____
ORDER BY ____ DESC;השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
2תנאים
יסודות התנאיםמילת המפתח ANDמילת המפתח ORמילת המפתח NOTשילוב של תנאים מרוביםסוגרייםערכים בוליאניים3פורמט החזרה ספציפי
ערכי Nullמיון תוצאות – חלק 1מיון תוצאות – חלק 2סיכום – חברת אבטחת סייברהגבלת מספר הרשומותסיכום – מפעל כלי רכב6אתגרי מבוא
חזרה – בחירות לפרלמנטחזרה – מעצר חשוד בידי המשטרהחזרה – כלי משקה בברחזרה – מהנדסים עמודות חדשותתרגלו בעצמכם: SQL אונליין