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

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

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

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

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

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

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

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

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

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

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

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

                        @nigun אתה צודק, סתרתי את עצמי. כי לא בדקתי את ההתנהגות של כל המנועים וניסיתי לנחש מה יהיה ההתנהגות של mysql, הניחוש לא יצא כל כך מוצלח 🙂

                        יש תוצאה או לא?

                        אין.

                        ואיך נכנס לכאן implicit?

                        כי לא עשית קיבוץ בפירוש על ידי GROUP BY אז הקיבוץ הוא "לא מפורש" או "מרומז" או "משתמע" או איך שתקרא לזה... מזה שעשית סינון על התוצאה של הקיבוץ על ידי HAVING.

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

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

                          @nigun אתה צודק, סתרתי את עצמי. כי לא בדקתי את ההתנהגות של כל המנועים וניסיתי לנחש מה יהיה ההתנהגות של mysql, הניחוש לא יצא כל כך מוצלח 🙂

                          יש תוצאה או לא?

                          אין.

                          ואיך נכנס לכאן implicit?

                          כי לא עשית קיבוץ בפירוש על ידי GROUP BY אז הקיבוץ הוא "לא מפורש" או "מרומז" או "משתמע" או איך שתקרא לזה... מזה שעשית סינון על התוצאה של הקיבוץ על ידי HAVING.

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

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

                          כי לא עשית קיבוץ בפירוש על ידי GROUP BY אז הקיבוץ הוא "לא מפורש" או "מרומז" או "משתמע" או איך שתקרא לזה... מזה שעשית סינון על התוצאה של הקיבוץ על ידי HAVING.

                          אז implicit זה סיבת השגיאה?

                          מייל: nigun@duck.com

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

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

                            כי לא עשית קיבוץ בפירוש על ידי GROUP BY אז הקיבוץ הוא "לא מפורש" או "מרומז" או "משתמע" או איך שתקרא לזה... מזה שעשית סינון על התוצאה של הקיבוץ על ידי HAVING.

                            אז implicit זה סיבת השגיאה?

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

                            @nigun בא נעשה פה סדר,
                            יש שינוי התנהגות בין mysql ל-sql server ו-postgres במקרה של HAVING בלי קיבוץ
                            mysql מתייחס לזה כ-where
                            השניים האחרים מתייחסים לזה כרמז שאתה רוצה קיבוץ ולכן כל השורות מתקפלות לשורה אחת מקובץ. זה ברור? ב-mysql תקבל שורות מרובות (אם יש יותר משורה אחת שעונה על הקריטיריונים), בשניים האחרים אתה לא תקבל יותר משורה אחת!!!
                            זה הבדל ראשון
                            עכשיו במקרה של שורה מקובצת מכמה שורות, יש גם הבדלי התנהגות בין המנועים אם מותר להזכיר שם עמודה שהוא לא חלק מהקיבוץ (למרות שאין לו ערך מוגדר אחרי הקיבוץ).
                            mysql מתייחס לזה בצורה סלחנית ומתיר את זה. (איזה ערך מוחזר? הרי השורה מקובצת מכמה שורות? אני לא יודע...)
                            postgres ו-sql server זורקים שגיאה.
                            אלו היסודות ואידך פירושא זיל גמור.

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

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

                              @nigun בא נעשה פה סדר,
                              יש שינוי התנהגות בין mysql ל-sql server ו-postgres במקרה של HAVING בלי קיבוץ
                              mysql מתייחס לזה כ-where
                              השניים האחרים מתייחסים לזה כרמז שאתה רוצה קיבוץ ולכן כל השורות מתקפלות לשורה אחת מקובץ. זה ברור? ב-mysql תקבל שורות מרובות (אם יש יותר משורה אחת שעונה על הקריטיריונים), בשניים האחרים אתה לא תקבל יותר משורה אחת!!!
                              זה הבדל ראשון
                              עכשיו במקרה של שורה מקובצת מכמה שורות, יש גם הבדלי התנהגות בין המנועים אם מותר להזכיר שם עמודה שהוא לא חלק מהקיבוץ (למרות שאין לו ערך מוגדר אחרי הקיבוץ).
                              mysql מתייחס לזה בצורה סלחנית ומתיר את זה. (איזה ערך מוחזר? הרי השורה מקובצת מכמה שורות? אני לא יודע...)
                              postgres ו-sql server זורקים שגיאה.
                              אלו היסודות ואידך פירושא זיל גמור.

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

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

                              mysql מתייחס לזה בצורה סלחנית ומתיר את זה. (איזה ערך מוחזר? הרי השורה מקובצת מכמה שורות? אני לא יודע...)
                              postgres ו-sql server זורקים שגיאה.

                              https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
                              אני מבין שהתוצאה עקבית (כל עוד אין שינוי שורות בטבלה) אך בלתי צפויה. זה בפועל חוסך גם ביצועים (אל תחפש לא MAX ולא MIN, תביא משהו וזהו) והמון תחביר מייגע... אבל השאילתה לא הכי קריאה והגיונית.

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

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

                                mysql מתייחס לזה בצורה סלחנית ומתיר את זה. (איזה ערך מוחזר? הרי השורה מקובצת מכמה שורות? אני לא יודע...)
                                postgres ו-sql server זורקים שגיאה.

                                https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
                                אני מבין שהתוצאה עקבית (כל עוד אין שינוי שורות בטבלה) אך בלתי צפויה. זה בפועל חוסך גם ביצועים (אל תחפש לא MAX ולא MIN, תביא משהו וזהו) והמון תחביר מייגע... אבל השאילתה לא הכי קריאה והגיונית.

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

                                @dovid תודה. חיפשתי קצת בתיעוד ומשום מה לא הצלחתי למצוא את זה.

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

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

                                לא מצאתי רמז לזה שהתוצאה עקבית. וגם לא ברור לי מה היתרון בזה שזה עקבי אם היא בלתי צפויה.

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

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

                                  @dovid תודה. חיפשתי קצת בתיעוד ומשום מה לא הצלחתי למצוא את זה.

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

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

                                  לא מצאתי רמז לזה שהתוצאה עקבית. וגם לא ברור לי מה היתרון בזה שזה עקבי אם היא בלתי צפויה.

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

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

                                  לא מצאתי רמז לזה שהתוצאה עקבית. וגם לא ברור לי מה היתרון בזה שזה עקבי אם היא בלתי צפויה.

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

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


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

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

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