PracticU

פקודת Select בתוך Select

בלי כתוביותעם כתוביות
PracticU › קורס DBA אפליקטיבי - שפת SQL למתחילים › פקודת Select בתוך Select
מילון מושגים:
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.

פקודת Select בתוך Select
שאילתה בתוך שאילתה, או subquery, מאפשרת להשתמש בתוצאה של שאילתה פנימית בתוך שאילתה חיצונית, בלי להעתיק ידנית מספרים מהתוצאה.
השלבים העיקריים
1. הבעיה: רוצים להציג הזמנות שסכומן גדול מ-15,000. הסכום לא נמצא בטבלת ההזמנות, אלא מחושב מתוך Order Details, ולכן צריך לחשב אותו קודם.
2. השאילתה הפנימית: מחשבת לכל הזמנה את הסכום, ומחזירה רק את מספרי ההזמנות שסכומן גדול מ-15,000, בעזרת GROUP BY ו-HAVING.
3. השאילתה החיצונית: מסננת את ההזמנות לפי OrderID IN, כשהתוצאה של הפנימית נמצאת בתוך הסוגריים. השאילתה הפנימית רצה קודם, ואחר כך החיצונית.
4. עדכון אוטומטי: כשנכנסות הזמנות חדשות, התוצאה מתעדכנת לבד, כי לא כותבים מספרים ידנית.
5. קישור לשורה הנוכחית: בלי קישור, השאילתה הפנימית מחשבת את כל ההזמנות לכל שורה בחיצונית. מוסיפים כינויים (o1 לחיצונית ו-od לפנימית) ומשווים od.OrderID = o1.OrderID, כך שהפנימית מחשבת רק את ההזמנה של השורה הנוכחית.
פקודות והגדרות
WHERE OrderID IN (SELECT OrderID FROM [Order Details] GROUP BY OrderID HAVING SUM(Quantity * UnitPrice) > 15000), WHERE od.OrderID = o1.OrderID.
שימו לב
הקישור בין השאילתות חוסך עבודה, כי הפנימית מסננת מראש את מה שלא רלוונטי. זה חשוב כשצריך להתייחס לנתון מטבלה אחרת שקשורה לשורה הנוכחית.
השיעור מסתיים ביכולת לכתוב שאילתה פנימית שמחזירה רשימה, להשתמש בה בתוך WHERE, ולקשר אותה לשורה הנוכחית כשצריך.

פרקי ההרצאה: פקודת Select בתוך Select

  1. 00:00

    מבוא: שאילתה בתוך שאילתה

  2. 00:55

    הדרישה: הזמנות שסכומן מעל 15,000

  3. 01:34

    טבלת Order Details וסיכום ההזמנה

  4. 02:48

    קיבוץ הפריטים לפי מספר הזמנה

  5. 04:10

    סינון ההזמנות לפי הסכום הכולל

  6. 05:30

    חיבור השאילתות בעזרת IN

  7. 06:52

    העברת תוצאת השאילתה הפנימית לחיצונית

  8. 08:48

    למה השאילתה הפנימית רצה שוב ושוב

תמלול ההרצאה: פקודת Select בתוך Select

הטקסט המלא של הדקות הראשונות בהרצאה «פקודת Select בתוך Select» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:00

    שלום וברוכים הבאים להרצאה על סלקט בתוך סלקט, איך לעשות שאילתה בתוך שאילתה. זה משהו מאוד נהוג ומאוד מקובל. למעשה זה מתחרה של ג'וין.

  2. 00:11

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

  3. 00:25

    וזה כולל את כל ההרצאות שיש לנו באתר שזה מאוד יפה. יפה. אז יש לנו מתחברים לאתר מתחברים לשרת sql ואנחנו רוצים לעשות סלקט בתוך סלקט למה שנרצה לעשות בתוך סלקט בתוך סלקט כן אז בואו נעשה דוגמה שאנחנו רוצים להראות את כל ההזמנות כל ההזמנות אנחנו רוצים להראות בואו נעשה פה כוכבית שיהיה לנו

  4. 00:57

    ככה פחות מקום הבוס התקשר אליי ואמר לי יוני תראה לנו את כל ההזמנות אני עושה לו סלקט כוכבית for מורדרס אבל רק אלו שסכום ההזמנה שלהם, שסכום ההזמנה שלהם גדול מ-15,000.

  5. 01:16

    זאת אומרת, יש פה לכל הזמן, הוא רוצה לראות את השורות האלו, אבל הוא לא רוצה לראות 830 שורות. הוא רוצה לראות את השורות האלו כמו שהן, כך הוא רוצה לראות אותן.

  6. 01:29

    אבל מה? שאני אסנן לו אלו שהם, אז סך הכל ההזמנה מתחת ל-15,000 דולר. עכשיו פה אין סכום הזמנה, סכום ההזמנה נמצא במקום אחר, Order Details.

  7. 01:44

    בואו נראה מה יש לנו בתוך אורדר דיטלס. סלקט כוכבית from order details. עכשיו אני שם סוגריים מרובעים כי הוא חושב שאורדר זה מילה שמורה אז הוא צובע לי אותה בכחול. אתם רואים הוא עושה את המילת אורדר בכחול.

  8. 02:02

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

  9. 02:14

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

  10. 02:25

    ויש לנו בעצם רשימת פירוט לכל הזמנה. מה זה נותן לנו? יש לנו בעצם, כמו בהרצאה של גרופביי, הסברנו איך לעשות בעצם לכל הזמנה פה למעלה, אתם רואים הזמנה 148, לקחת את שלושת השורות ולעשות אותן כשורה אחת, שורה אחת שאומרת סכום ההזמנה.

  11. 02:47

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

  12. 03:17

    ההזמנה זה למעשה קוונטיטי כפול יוניט פרייס תעשה סכום לאחר שאתה מכפיל את שתי עמודות לחצתי על תף אחד צבעתי את שם הטבלה לחצתי על תף אחד ואז הוא נתן לי רשימת עמודות כתבתי לו תקשיב תעשה עמודת unit price כפול quantity כמות כפול מחיר ועל כל הקבוצה תפעיל לי סכום מה זה קבוצה מחולק לפי הזמנות ככה קיבלנו בעצם משלוש שורות שורה אחת אתם רואים

  13. 03:53

    הזמנה 2048 שורה אחת 2049 שורה אחת מצוין יופי זה בדיוק מה שרציתי לא יופי עכשיו נשאר לי רק איכשהו לקשר אותם. הבוס אמר להראות לו את השורות האלו, שעבור ההזמנות, נניח 10,248, רק מעל 15,000.

  14. 04:17

    כמה סכום ההזמנה? סכום ההזמנה פה 440, לא מתאים לי. אז פה אני אומר לו כזה דבר, הווינג, תסנן לי את אלו שהסכום שלהם, יותר נכון תשאיר לי את אלו שהסכום שלהם 15,000.

  15. 04:35

    רק יישארו פה למטה עכשיו רק תוצאות, רק שורות שנותנות לי אמת. היא תן לי אמת פה רק אלו שהם סכום הזמנה גדול מ-15,000 בואו נראה בואו נראה צובע בכחול עושה אקזיקיוט שלוש הזמנות יופי אני צריך להראות לבוס רק שלוש הזמנות מצוין עכשיו איך אני אקשר את הסלקט הזה לסלקט הזה יופי אז אני למעשה רוצה לחבר ביניהם אז אני אראה לכם כמה

  16. 05:19

    שיטות לחבר ביניהם השיטה שהיא בעצם הכי מקובלת והכי טובה לא מבחינת הביצועים, אבל הכי טובה ככה מבחינת היום-יום.

  17. 05:32

    נכתוב דבר כזה, תעשה לי את הסלקט הגדול של כל ההזמנות האלו, where, איפה, עבור כל שורה orderid in רשימה כלשהי.

  18. 05:50

    מה זה רשימה? 10865.10981.11300 ומשהו. אתם רואים? תיקח את כל השורות ותעבור שורה-שורה, תבדוק האם מורדר איידי אין רשימה הזאת אם הוא ברשימה האם התוצאה של הבדיקה שלך אמת אם מורדר איידי ברשימה הזאת השורה נשארת במסך אם לא היא עפה מהתוצאות בואו נראה שזה באמת עובד באמת קיבלנו פה שלוש שורות במקום כל מה שהיה לנו אבל מה הבעיה מחר בבוקר תיכנס

  19. 06:34

    עוד הזמנה או שאולי בלילה תיכנס עוד הזמנה אני רוצה שאילתא אוניברסלית לא שאילתא שאני צריך להעתיק ידנית מספרי הזמנות כן אז למעשה במקום שאני אכתוב את זה עדנית אני לוקח את כל זה ושימו לב בסוגריים שלו נותן לו את הסלקט הזה.

  20. 06:58

    הרי הסלקט הזה הוא זה שנתן לי את התוצאה נכון? שימו לב אני הכנסתי את הסלקט הזה בסוגריים של האין שלו. אתם מבינים?

  21. 07:09

    במקום שאני אכתוב את זה עדנית הוא כתב את זה עבורי. הסלקט הפנימי הוציא את ההזמנות שהמחיר שלהם מעל 15,000 שקל ומעביר אותם לסלקט הראשי. למעשה במערכת מתבצעת קודם כל פקודות של הסוגריים הפנימיות ואחרי שהפקודות של הסוגריים הפנימיות נגמרות יוצאת תוצאה שאני רוצה בתוצאה שיהיה רק אורדר

  22. 07:40

    איי-די כי אורדר איי-די אין אורדר איי-די אני לא צריך את הסכום כרגע במסך השאילתה הפנימית תחזיר לי את ההזמנות של סכום ההזמנה הגדול מ-15,000 השאילתה הפנימית תחזיר לי הזמנות של סכום ההזמנה הגדול מ-15,000 בואו נראה שזה באמת עובד הנה באמת החזיר לי את שלושת אלו ושלושת אלו יעברו כתוצאה לסלקט הראשי.

  23. 08:09

    הבנתם איזה יופי? וגם אם מחר בבוקר תיכנס עוד הזמנה, התוצאות האלו כל הזמן יתעדכנו, כי אני לא כותב שום דבר ידנית, כאילו אני לא מעתיק מספרי הזמנות.

  24. 08:20

    הסלקט הפנימי מחזיר לסלקט החיצוני רשימת הזמנות שגדולות מ-15,000, והסלקט החיצוני מסנן את התוצאות לפי מה שהוא צריך.

  25. 08:33

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

  26. 08:46

    ויש לי שאלה, תראו מה אנחנו אומרים לו כל פעם לעשות. עבור כל שורה בסלקט הזה, עבור כל שורה, הוא מבצע את כל התהליך הזה שוב שוב ושוב.

  27. 08:58

    למה? כי where עובר שורה שורה בסלקט הראשי, עובר שורה שורה ובודק האם התוצאות פה הן בפנים. ולא רק שהוא עושה את זה שורה שורה, הוא גם עושה לי סתם קבוצות מיותרות.

  28. 09:14

    מה הוא עושה לי קבוצות על דברים שלא קשורים לשאילתה ראשית? תחשבו שהשאילתה הראשית נמצאת עכשיו בשורה, בואו תסתכלו, השאילתה הראשית, תחשבו על הביצועים דקה, נמצאת בשורה הזאת.

  29. 09:27

    אין לי מה לעשות, תחשבו שאני בודק את השאילתה הפנימית. אני עכשיו בשורה הזאת, בבדיקות. הוואר עובר שורה-שורה, הגיע נניח לשורה הזאת. מה יקרה פה? הוואר יבדוק האם אורדר איי-די, האם המספר הזה נמצא בתוצאות האלו.

  30. 09:44

    מה זה התוצאות האלו? הוא לקח את כל Order Details, חילק אותם לקבוצות לפי כל ה-Order IDs, חישב את כל ה-15,000 גדול, והחזיר לי תוצאה של כולם.

  31. 10:01

    זאת אומרת, הוא עושה את זה שוב, שוב ושוב, אבל זה לא רלוונטי, כי אני נמצא בשורה הזאת. אני רוצה להגיד לו, תקשיב, אל תעשה לי את זה עבור כל השורות.

לקורס המלא: קורס SQL ו‑DBA אפליקטיבי

ההרצאה הקודמת: פקודת Select עם Group By

ההרצאה הבאה: פקודת Insert

הרצאות קשורות מקורסים אחרים

  • פקודת break בתוך לולאה
  • פקודת ls בלינוקס
  • פקודת Foreach
  • המרה של Web Element ל-Select

קורסים נוספים במסלול

  • קורס NoSQL - MongoDB
  • קורס SSIS
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI