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

שאילתה בתוך אחר: שאילתות משנה

למדת כיצד לחלץ, לסנן, לקבץ, להצטרף ולשנות. שם הוא רעיון בסיסי אחרון: להכניס שאילתה בתוך אחר. אלו הם נקראות שאילתות משנה והן השלב שמאפשר לך לענות על שאלות כמו "מי מרוויח מעל הממוצע?" או "באיזה מחלקות יש מישהו הוקצה לפרויקט?".

התחביר הבסיסי

שאילתת משנה היא SELECT עטופה בסוגריים, בשימוש במקום יחיד ערך או רשימת ערכים בשאילתה אחרת:

SQL
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM   employees
WHERE  salary > (SELECT AVG(salary) FROM employees);

המנוע מריץ את שאילתת המשנה תחילה - SELECT AVG(salary) FROM employees מחזירה מספר בודד - ולאחר מכן משתמש במספר הזה ב-WHERE החיצוני כאילו כתבת את זה ביד. זה בדיוק היתרון: אתה כן לא צריך לדעת את הממוצע מראש, SQL מחשב אותו עבורך.

שלושת ה"סוגים" הנפוצים ביותר

1. שאילתת משנה המחזירה ערך בודד

הדוגמה למעלה: שאילתת המשנה מייצרת שורה אחת, עמודה אחת (נקראת סקלאר). אתה משתמש בו עם =, >, < וכן הלאה.

SQL
-- Employee with the highest salary:
SELECT first_name, last_name
FROM   employees
WHERE  salary = (SELECT MAX(salary) FROM employees);

2. שאילתת משנה מחזירה רשימה

שאילתת המשנה מייצרת עמודה אחת, שורות רבות. אתה משתמש בו עם IN (...):

SQL
-- Departments that have at least one employee:
SELECT name
FROM   departments
WHERE  id IN (SELECT DISTINCT department_id
              FROM employees
              WHERE department_id IS NOT NULL);

3. שאילתת משנה בתור "טבלה" (FROM)

שאילתת משנה יכולה גם לתפוס את מקומה של טבלה ב-FROM. זה שימושי ל לחשב מראש אגרגטים ולאחר מכן לסנן או להצטרף אליהם:

SQL
-- Departments with average salary above 40000:
SELECT d.name, medie.stipendio_medio
FROM   departments AS d
JOIN  (SELECT department_id, AVG(salary) AS stipendio_medio
       FROM employees
       GROUP BY department_id) AS medie
   ON d.id = medie.department_id
WHERE  medie.stipendio_medio > 40000;

שאילתת משנה או JOIN? מתי להשתמש באיזה

לעתים קרובות ניתן להשיג את אותה תוצאה עם JOIN או עם שאילתת משנה. הֲלָכָה לְמַעֲשֶׂה:

  • כדי סנן שורות של טבלה אחת על סמך מאפיין של אחר ("עובדים שהמחלקות שלהם..."), IN (subquery) קריא מאוד.
  • כדי לשלב עמודות ממספר טבלאות בתוצאה, השתמש ב-JOIN.
  • כדי לחשב מצטבר ולהשתמש בו כסף ("מעל ה- ממוצע"), שאילתת המשנה הסקלרית היא הבחירה הטבעית.

בפועל תראה את שניהם: מנוע ה-SQL מייעל אותם לרוב באותה מידה דרך. בחר את הטופס שנקרא הכי טוב.

נסה את זה

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

מצא שם פרטי (שם_שם), שם משפחה (שם_משפחה) ומשכורת (משכורת) של העובדים שמרוויחים בקפדנות יותר מהממוצע בחברה. שלושה עמודים.

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

להחליף? עם שאילתת המשנה SELECT AVG(salary) FROM working — היא מחזירה מספר בודד שישמש כסף.

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

סקירת התרגיל

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

רשום את השם (departments.name) של מחלקות שיש בהן לפחות עובד אחד עם שכר גבוה יותר מ-50000. השתמש בשאילתת משנה עם IN. סדר לפי אלפביתי.

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

תת השאילתה הפנימית מחזירה את המזהים של המחלקות שיש בהן עובדים עם שכר > 50000. לאחר מכן WHERE id IN (...) בשאילתה החיצונית.

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