דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. האנטומיה של שאילתת SQL- תגובות

האנטומיה של שאילתת SQL- תגובות

מתוזמן נעוץ נעול הועבר תכנות
27 פוסטים 4 כותבים 311 צפיות 3 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • nigunN nigun

    @yossiz
    קודם כל תודה רבה על המדריך.

    לא הבנתי את ההבדל בין HAVING לWHERE
    אתה יכול להרחיב על זה טיפה יותר?

    yossizY מנותק
    yossizY מנותק
    yossiz
    כתב ב נערך לאחרונה על ידי
    #2

    @nigun אין הבדל בפעולה עצמה. כל ההבדל הוא במיקום בקו הייצור שבו זה מתבצע.
    כל פעולה מתבצעת על התוצאה של הפעולה הקודמת.
    WHERE מסנן את השורות של הטבלה שהתקבלה מה-FROM (כולל ה-JOIN-ים).
    HAVING מסנן את הטבלה שמתקבלת אחרי הקיבוץ של GROUP BY.

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    nigunN תגובה 1 תגובה אחרונה
    3
    • yossizY yossiz

      @nigun אין הבדל בפעולה עצמה. כל ההבדל הוא במיקום בקו הייצור שבו זה מתבצע.
      כל פעולה מתבצעת על התוצאה של הפעולה הקודמת.
      WHERE מסנן את השורות של הטבלה שהתקבלה מה-FROM (כולל ה-JOIN-ים).
      HAVING מסנן את הטבלה שמתקבלת אחרי הקיבוץ של GROUP BY.

      nigunN מנותק
      nigunN מנותק
      nigun
      כתב ב נערך לאחרונה על ידי nigun
      #3

      @yossiz
      ולמה זה משנה?
      עריכה: מצאתי כאן תשובה

      מייל: nigun@duck.com

      yossizY תגובה 1 תגובה אחרונה
      1
      • nigunN nigun

        @yossiz
        ולמה זה משנה?
        עריכה: מצאתי כאן תשובה

        yossizY מנותק
        yossizY מנותק
        yossiz
        כתב ב נערך לאחרונה על ידי
        #4

        @nigun אה, עכשיו אני מבין במה אתה מתקשה.
        התשובה היא שלפני הקיבוץ אי אפשר לסנן לפי תוצאה של פונקציה שמסכמת את כל השורות המקובצות.

        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

        nigunN תגובה 1 תגובה אחרונה
        1
        • yossizY yossiz

          @nigun אה, עכשיו אני מבין במה אתה מתקשה.
          התשובה היא שלפני הקיבוץ אי אפשר לסנן לפי תוצאה של פונקציה שמסכמת את כל השורות המקובצות.

          nigunN מנותק
          nigunN מנותק
          nigun
          כתב ב נערך לאחרונה על ידי
          #5

          @yossiz
          בתיעוד של מיקרוסופט לSQL כתוב
          HAVING Specifies a search condition for a group or an aggregate

          משמע שזה משמש גם בשביל GROUP BY וגם בשביל שאר הערכים שמתקבלים מתוך פונקציה.
          האם זה אומר שיש אופציה שישתמשו בHAVING בלי GROUP BY?

          מייל: nigun@duck.com

          yossizY תגובה 1 תגובה אחרונה
          0
          • nigunN nigun

            @yossiz
            בתיעוד של מיקרוסופט לSQL כתוב
            HAVING Specifies a search condition for a group or an aggregate

            משמע שזה משמש גם בשביל GROUP BY וגם בשביל שאר הערכים שמתקבלים מתוך פונקציה.
            האם זה אומר שיש אופציה שישתמשו בHAVING בלי GROUP BY?

            yossizY מנותק
            yossizY מנותק
            yossiz
            כתב ב נערך לאחרונה על ידי yossiz
            #6

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

            משמע שזה משמש גם בשביל GROUP BY וגם בשביל שאר הערכים שמתקבלים מתוך פונקציה.

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

            האם זה אומר שיש אופציה שישתמשו בHAVING בלי GROUP BY?

            אפשר, אבל זה עושה קיפול מובן (implicit) של כל השורות לשורה אחת

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            nigunN dovidD 2 תגובות תגובה אחרונה
            0
            • yossizY yossiz

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

              משמע שזה משמש גם בשביל GROUP BY וגם בשביל שאר הערכים שמתקבלים מתוך פונקציה.

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

              האם זה אומר שיש אופציה שישתמשו בHAVING בלי GROUP BY?

              אפשר, אבל זה עושה קיפול מובן (implicit) של כל השורות לשורה אחת

              nigunN מנותק
              nigunN מנותק
              nigun
              כתב ב נערך לאחרונה על ידי
              #7

              @yossiz אמר בהאנטומיה של שאילתת SQL- תגובות:

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

              group or aggregate

              האם זה אומר שיש אופציה שישתמשו בHAVING בלי GROUP BY?

              אפשר, אבל זה עושה קיפול מובן (implicit) של כל השורות לשורה אחת

              לא הבנתי
              נראה לי שאני צריך לנסות על טבלה אמיתית וזהו.

              מייל: nigun@duck.com

              תגובה 1 תגובה אחרונה
              0
              • nigunN מנותק
                nigunN מנותק
                nigun
                כתב ב נערך לאחרונה על ידי
                #8

                עכשיו נראה לי שעכשיו אני מבין
                פשוט לא שייך לעשות aggregate אם אין group (אולי אפשר אבל אין לזה משמעות)

                וחוץ מזה השאילתא

                SELECT * FROM info GROUP BY user WHERE id > 10000;
                

                לא תעבוד, כי אי אפשר לעשות WHERE אחרי הGROUP.

                אבל השאילתא

                SELECT * FROM info GROUP BY user HAVING id > 10000;
                

                תעבוד.
                וכנ"ל

                SELECT * FROM info  HAVING id > 10000;
                

                אז השאלה שלי עכשיו, למה לא להשתמש תמיד בHAVING ?

                מייל: nigun@duck.com

                yossizY OdedDvirO 2 תגובות תגובה אחרונה
                0
                • nigunN nigun

                  עכשיו נראה לי שעכשיו אני מבין
                  פשוט לא שייך לעשות aggregate אם אין group (אולי אפשר אבל אין לזה משמעות)

                  וחוץ מזה השאילתא

                  SELECT * FROM info GROUP BY user WHERE id > 10000;
                  

                  לא תעבוד, כי אי אפשר לעשות WHERE אחרי הGROUP.

                  אבל השאילתא

                  SELECT * FROM info GROUP BY user HAVING id > 10000;
                  

                  תעבוד.
                  וכנ"ל

                  SELECT * FROM info  HAVING id > 10000;
                  

                  אז השאלה שלי עכשיו, למה לא להשתמש תמיד בHAVING ?

                  yossizY מנותק
                  yossizY מנותק
                  yossiz
                  כתב ב נערך לאחרונה על ידי yossiz
                  #9

                  @nigun אמר בהאנטומיה של שאילתת SQL- תגובות:

                  אבל השאילתא
                  SELECT * FROM info GROUP BY user HAVING id > 10000;
                  תעבוד.

                  ב-postgres זה לא יעבוד. גם במנועים אחרים אם זה יעבוד (ואני לא בטוח שזה חוקי בשום מנוע) לא יהיה לזה שום משמעות כי ה-id לא מוגדר אם לא עשית קיבוץ לפי id.

                  וכנ"ל
                  SELECT * FROM info HAVING id > 10000;

                  אז השאלה שלי עכשיו, למה לא להשתמש תמיד בHAVING ?

                  כנ"ל. HAVING בלי GROUP BY עושה קיבוץ אוטומטי של כל השורות לשורה אחת. אם כן ל-id אין משמעות

                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                  nigunN תגובה 1 תגובה אחרונה
                  1
                  • yossizY yossiz

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

                    משמע שזה משמש גם בשביל GROUP BY וגם בשביל שאר הערכים שמתקבלים מתוך פונקציה.

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

                    האם זה אומר שיש אופציה שישתמשו בHAVING בלי GROUP BY?

                    אפשר, אבל זה עושה קיפול מובן (implicit) של כל השורות לשורה אחת

                    dovidD מחובר
                    dovidD מחובר
                    dovid
                    ניהול
                    כתב ב נערך לאחרונה על ידי
                    #10

                    @yossiz אמר בהאנטומיה של שאילתת SQL- תגובות:

                    קיפול מובן (implicit)

                    מתרגמים את זה בד"כ "קמפול משתמע" או "קמפול מרומז".

                    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                    תגובה 1 תגובה אחרונה
                    2
                    • yossizY yossiz

                      @nigun אמר בהאנטומיה של שאילתת SQL- תגובות:

                      אבל השאילתא
                      SELECT * FROM info GROUP BY user HAVING id > 10000;
                      תעבוד.

                      ב-postgres זה לא יעבוד. גם במנועים אחרים אם זה יעבוד (ואני לא בטוח שזה חוקי בשום מנוע) לא יהיה לזה שום משמעות כי ה-id לא מוגדר אם לא עשית קיבוץ לפי id.

                      וכנ"ל
                      SELECT * FROM info HAVING id > 10000;

                      אז השאלה שלי עכשיו, למה לא להשתמש תמיד בHAVING ?

                      כנ"ל. HAVING בלי GROUP BY עושה קיבוץ אוטומטי של כל השורות לשורה אחת. אם כן ל-id אין משמעות

                      nigunN מנותק
                      nigunN מנותק
                      nigun
                      כתב ב נערך לאחרונה על ידי
                      #11

                      @yossiz
                      שתי השאליתות עבדו לי יופי בMYSQL

                      מייל: nigun@duck.com

                      yossizY תגובה 1 תגובה אחרונה
                      1
                      • nigunN nigun

                        @yossiz
                        שתי השאליתות עבדו לי יופי בMYSQL

                        yossizY מנותק
                        yossizY מנותק
                        yossiz
                        כתב ב נערך לאחרונה על ידי
                        #12

                        @nigun נראה שאתה צודק.
                        http://sqlfiddle.com/#!9/5ccdef/6/0
                        זו התנהגות לא סטנדרטית של mysql ועדיף לא להשתמש בה.

                        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                        nigunN תגובה 1 תגובה אחרונה
                        0
                        • yossizY yossiz

                          @nigun נראה שאתה צודק.
                          http://sqlfiddle.com/#!9/5ccdef/6/0
                          זו התנהגות לא סטנדרטית של mysql ועדיף לא להשתמש בה.

                          nigunN מנותק
                          nigunN מנותק
                          nigun
                          כתב ב נערך לאחרונה על ידי
                          #13

                          @yossiz
                          למה לא סטנדרתית
                          בתיעוד של SQL שהבאתי למעלה כתוב
                          When GROUP BY is not used, HAVING behaves like a WHERE clause

                          מייל: nigun@duck.com

                          yossizY תגובה 1 תגובה אחרונה
                          0
                          • nigunN nigun

                            עכשיו נראה לי שעכשיו אני מבין
                            פשוט לא שייך לעשות aggregate אם אין group (אולי אפשר אבל אין לזה משמעות)

                            וחוץ מזה השאילתא

                            SELECT * FROM info GROUP BY user WHERE id > 10000;
                            

                            לא תעבוד, כי אי אפשר לעשות WHERE אחרי הGROUP.

                            אבל השאילתא

                            SELECT * FROM info GROUP BY user HAVING id > 10000;
                            

                            תעבוד.
                            וכנ"ל

                            SELECT * FROM info  HAVING id > 10000;
                            

                            אז השאלה שלי עכשיו, למה לא להשתמש תמיד בHAVING ?

                            OdedDvirO מנותק
                            OdedDvirO מנותק
                            OdedDvir
                            כתב ב נערך לאחרונה על ידי
                            #14

                            @nigun אמר בהאנטומיה של שאילתת SQL- תגובות:

                            אז השאלה שלי עכשיו, למה לא להשתמש תמיד בHAVING ?

                            מבחינת יעילות, לענ"ד אין להשתמש ב HAVING אם אפשר להשתמש ב- WHERE, מפני שה-WHERE הוא מסנן מוקדם ברמת השורה, ומתבצע לפני הקיבוץ, וכך הקיבוץ מתבצע על קבוצה קטנה יותר (תוצאת ה-WHERE) לעומת זאת ה-HAVING הוא מסנן מאוחר ברמת קבוצה, ויתבצע על כל הרשומות.

                            nigunN תגובה 1 תגובה אחרונה
                            3
                            • OdedDvirO OdedDvir

                              @nigun אמר בהאנטומיה של שאילתת SQL- תגובות:

                              אז השאלה שלי עכשיו, למה לא להשתמש תמיד בHAVING ?

                              מבחינת יעילות, לענ"ד אין להשתמש ב HAVING אם אפשר להשתמש ב- WHERE, מפני שה-WHERE הוא מסנן מוקדם ברמת השורה, ומתבצע לפני הקיבוץ, וכך הקיבוץ מתבצע על קבוצה קטנה יותר (תוצאת ה-WHERE) לעומת זאת ה-HAVING הוא מסנן מאוחר ברמת קבוצה, ויתבצע על כל הרשומות.

                              nigunN מנותק
                              nigunN מנותק
                              nigun
                              כתב ב נערך לאחרונה על ידי
                              #15

                              @OdedDvir
                              אני שואל על מקרה שאין בו קיבוץ.

                              מייל: nigun@duck.com

                              תגובה 1 תגובה אחרונה
                              0
                              • nigunN nigun

                                @yossiz
                                למה לא סטנדרתית
                                בתיעוד של SQL שהבאתי למעלה כתוב
                                When GROUP BY is not used, HAVING behaves like a WHERE clause

                                yossizY מנותק
                                yossizY מנותק
                                yossiz
                                כתב ב נערך לאחרונה על ידי
                                #16

                                @nigun זה היה נכון ב-SQL Server 2005, בתיעוד של הגירסה העדכנית כתוב כמו שאני כתבתי:

                                When GROUP BY is not used, there is an implicit single, aggregated group.

                                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                nigunN תגובה 1 תגובה אחרונה
                                1
                                • yossizY yossiz

                                  @nigun זה היה נכון ב-SQL Server 2005, בתיעוד של הגירסה העדכנית כתוב כמו שאני כתבתי:

                                  When GROUP BY is not used, there is an implicit single, aggregated group.

                                  nigunN מנותק
                                  nigunN מנותק
                                  nigun
                                  כתב ב נערך לאחרונה על ידי nigun
                                  #17

                                  @yossiz
                                  אז איך יראה התוצאה בSQL Server 2019
                                  (לא הבנתי מה זה implicit).

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

                                  מייל: nigun@duck.com

                                  OdedDvirO yossizY 2 תגובות תגובה אחרונה
                                  0
                                  • nigunN nigun

                                    @yossiz
                                    אז איך יראה התוצאה בSQL Server 2019
                                    (לא הבנתי מה זה implicit).

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

                                    OdedDvirO מנותק
                                    OdedDvirO מנותק
                                    OdedDvir
                                    כתב ב נערך לאחרונה על ידי OdedDvir
                                    #18

                                    @nigun אמר בהאנטומיה של שאילתת SQL- תגובות:

                                    (לא הבנתי מה זה implicit).

                                    התרגום הוא "בלתי מפורש", דהיינו שנוצר קיבוץ בלתי מפורש עם קבוצה אחת
                                    (כאילו השתמשנו בפירוש ב GROUP BY)

                                    תגובה 1 תגובה אחרונה
                                    1
                                    • nigunN nigun

                                      @yossiz
                                      אז איך יראה התוצאה בSQL Server 2019
                                      (לא הבנתי מה זה implicit).

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

                                      yossizY מנותק
                                      yossizY מנותק
                                      yossiz
                                      כתב ב נערך לאחרונה על ידי
                                      #19

                                      @nigun אמר בהאנטומיה של שאילתת SQL- תגובות:

                                      אז איך יראה התוצאה בSQL Server 2019

                                      לא תראה תוצאה כי השאילתה לא חוקית כי אסור להזכיר עמודה שהוא לא חלק מה-group by אם לא על ידי פונקצית aggregation.
                                      דוד תרגם את המילה implicit כ"משתמע" או "מרומז"

                                      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                      OdedDvirO nigunN 2 תגובות תגובה אחרונה
                                      2
                                      • yossizY yossiz

                                        @nigun אמר בהאנטומיה של שאילתת SQL- תגובות:

                                        אז איך יראה התוצאה בSQL Server 2019

                                        לא תראה תוצאה כי השאילתה לא חוקית כי אסור להזכיר עמודה שהוא לא חלק מה-group by אם לא על ידי פונקצית aggregation.
                                        דוד תרגם את המילה implicit כ"משתמע" או "מרומז"

                                        OdedDvirO מנותק
                                        OdedDvirO מנותק
                                        OdedDvir
                                        כתב ב נערך לאחרונה על ידי
                                        #20

                                        @yossiz אמר בהאנטומיה של שאילתת SQL- תגובות:

                                        דוד תרגם את המילה implicit כ"משתמע" או "מרומז"

                                        לא שמתי לב...

                                        תגובה 1 תגובה אחרונה
                                        0
                                        • yossizY yossiz

                                          @nigun אמר בהאנטומיה של שאילתת SQL- תגובות:

                                          אז איך יראה התוצאה בSQL Server 2019

                                          לא תראה תוצאה כי השאילתה לא חוקית כי אסור להזכיר עמודה שהוא לא חלק מה-group by אם לא על ידי פונקצית aggregation.
                                          דוד תרגם את המילה implicit כ"משתמע" או "מרומז"

                                          nigunN מנותק
                                          nigunN מנותק
                                          nigun
                                          כתב ב נערך לאחרונה על ידי
                                          #21

                                          @yossiz
                                          יצאתי מבולבל

                                          @yossiz אמר בהאנטומיה של שאילתת SQL- תגובות:

                                          לא תראה תוצאה כי השאילתה לא חוקית כי אסור להזכיר עמודה שהוא לא חלק מה-group by אם לא על ידי פונקצית aggregation.

                                          @yossiz אמר בהאנטומיה של שאילתת SQL- תגובות:

                                          אפשר, אבל זה עושה קיפול מובן (implicit) של כל השורות לשורה אחת

                                          יש תוצאה או לא?
                                          ואיך נכנס לכאן implicit?

                                          מייל: nigun@duck.com

                                          yossizY תגובה 1 תגובה אחרונה
                                          1
                                          תגובה
                                          • תגובה כנושא
                                          התחברו כדי לפרסם תגובה
                                          • מהישן לחדש
                                          • מהחדש לישן
                                          • הכי הרבה הצבעות


                                          • 1
                                          • 2
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום