Menu
CoddyTech

איחוד (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

תוצאה:

שם
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 אונליין