Menu
Coddy logo textTech

איחוד (UNION)

חלק מהיחידה יסודות במסלול ה-SQL של Coddy. שיעור 48 מתוך 72.

איחודים שונים מצירופים. צירופים משתמשים בתנאים כדי לשלב טבלאות, אבל איחודים פשוט מוסיפים טבלה אחת מעל האחרת. כדי להשתמש ב-UNION נכתוב:

SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2

שתי פקודות ה־SELECT חייבות לציית לכללים הבאים:

  • מספר השדות צריך להיות שווה
  • הסדר חשוב
  • העמודות באותו מיקום חייבות להתאים בסוגי הנתונים

לדוגמה, נניח שיש לנו את הטבלאות הבאות:

germany_people

idname
1Lena
2Leonie

england_people

idname
1George
2Lena

הבעיה: אנחנו רוצים ליצור טבלה אחת גדולה עם כל השמות שיש לנו.

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

תוצאה:

nametotal_count
Lena2
Leonie1
George1

כאן משתמשים ב־UNION ALL (ולא ב־UNION) כדי להשאיר כפילויות כמו Lena. אחרת הן היו מוסרות לפני הספירה. שאילתת המשנה ממזגת את כל השורות, ואז GROUP BY + COUNT מסכמים אותן. ORDER BY ממיין את התוצאה הסופית.

challenge icon

אתגר

קל

הטבלאות והעמודות הזמינות:

  • sales_2009: product_id, quantity_sold
  • sales_2010: product_id, quantity_sold
  • sales_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;
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: SQL אונליין