SQL שאילתות חלק שלישי, החוג למדעי המחשב, מכללת הדסה
פונקציות הקבצה Aggregate Functions ב- SQL קיימות מספר פונקציות המבצעות חישובים על נתוני המסד. הפונקציות העיקריות הן: :count() מנייה של מספר ערכים בקבוצה :min() מציאת הערך המינימלי בקבוצה :max() מציאת הערך המקסימלי בקבוצה :sum() חישוב סכום האיברים בקבוצה :avg() חישוב ממוצע איברי הקבוצה. ו max כבר פגשנו( )את min 2
פונקציות הקבצה Aggregate Functions ההקבצה היא חלוקת יחס לתת קבוצות של שורות באמצעות פסוק.group-by בשאילתה שעושה שימוש בפונקציות הקבצה ובהקבצה )חלוקת יחס התוצאה לתת קבוצות( יש לציין: איזו פונקציה יש להפעיל ועל איזו תכונה על איזה שורות ובאיזה יחסים לאילו קבוצות תחולקנה השורות, כלומר על פי אילו תכונות תקבענה הקבוצות השונות. כל השורות שיש להן אותו ערך בתכונה זו תקובצנה יחד. הפונקציה תופעל על כל קבוצה. 3
פונקציות הקבצה-דוגמה 1 נניח שהיחס stud כולל גם את מגדר התלמיד, את ציון הפסיכומטרי ואת שנת הלימודים. כדי למצוא את ממוצע הפסיכומטרי של שנה א' בחלוקה למגדרים שונים נכתוב: select gender, avg(psycho) from stud where stud_year=1 group by gender 4
פונקציות הקבצה-דוגמה 1 יחס התוצאה יהיה: gender True False avg Avg1 avg2 order by gender order by avg(psycho) ניתן להוסיף פסוקית מיון: או 5
פונקציות הקבצה-דוגמה 2 את ההקבצה ניתן לבצע לפי כמה קריטריונים: select gender, avg(psycho) as avg_psycho,stud_year from stud group by gender, stud_year order by stud_year, gender נקבל חלוקה לפי שנים ובכל שנה לפי מגדר 6
פונקציות הקבצה-דוגמה 2 gender avg_psycho stud_year False avg1 1 True avg2 1 False avg3 2 True avg4 2 False avg5 3 True avg6 3 יחס התוצאה יהיה: 7
פונקציות הקבצה-דוגמה 3 ניתן לחשב ממוצע של תכונה ביחס כולו מבלי לקבץ תוצאות: select avg(psycho) from stud תחזיר את הממוצע של כל התלמידים ביחס 8
פונקציות הקבצה-דוגמה 4 השימוש ב sum אנלוגי לגמרי לשימוש ב :avg select gender, sum(psycho) as sum_psycho,stud_year from stud group by gender, stud_year order by stud_year, gender הפעם נקבל את סכום ציוני הפסיכומטרי במקום את הממוצע: 9
פונקציות הקבצה-דוגמה 4 gender sum_psycho stud_year False sum1 1 True sum2 1 False sum3 2 True sum4 2 False sum5 3 True sum6 3 יחס התוצאה יהיה: 10
פונקציות הקבצה-דוגמה 4 פונקצית ה count מונה ערכים. כדי למנות כמה גברים וכמה נשים לומדים בכל שנתון נכתוב: select gender, count(id),stud_year from stud group by stud_year, gender gender count stud_year False num1 1 True num2 1 False num3 2 True num4 2 False num5 3 True num6 3 11
פונקציות הקבצה-דוגמה 4 נקבל אותה תוצאה גם אם נמנה לפי תכונה אחרת, למשל :gender select gender, count(gender),stud_year from stud group by stud_year, gender כל עוד לא חסרים ערכים, לא יהיה הבדל בתוצאה. אולם: אם בשורה כלשהי חסר ערך בתכונה לפיה מתבצעת המנייה, יתקבל פלט שגוי. 12
פונקציות הקבצה-דוגמה 4 נניח למשל שבשורה של תלמיד כלשהו בשנה 3 חסר ערך בתכונה.gender בפלט של: select gender, count(gender),stud_year from stud group by stud_year, gender תתקבל שורה נוספת 13
gender count stud_year False num1 1 True num2 1 False num3 2 True num4 2 False num5 3 True num6 3 0 3 פונקציות הקבצה-דוגמה 4 הפלט המתקבל: 14
פונקציות הקבצה- שימוש בפסוק having ניתן לסנן את הטבלה המלאה לפני פעולת ההקבצה. סינון לפני ההקבצה ייעשה על ידי פסוק where מתאים. פסוק having מאפשר לסנן קבוצת לאחר פעולת ההקבצה. פסוק having יופיע לאחר.group by 15
select stud_year, avg(psycho) from stud group by stud_year having avg(psycho)>600 פונקציות הקבצה-דוגמה 5 מה בין השאילתה: select stud_year, avg(psycho) from stud where psycho>600 group by stud_year והשאילתה: 16
פונקציות הקבצה-דוגמה 5 השאילתה הראשונה תחשב ממוצע על כל הנתונים ביחס. בתוצאה השאילתה תוחזרנה רק הקבוצות שממוצע הפסיכומטרי שלהן גבוה מ 600. השאילתה השנייה תסנן מראש את נתוני היחס ותחשב ממוצע עבור ציוני פסיכומטרי גבוהים מ 600. תוצאות החישוב תקובצנה לקבוצות לפי שנות לימוד. 17
פונקציות הקבצה-דוגמה 6 ניתן לבצע פונקציות הקבצה על יותר מיחס אחד. נרצה לקבל את ממוצע הציונים בקורס מבוא עבור תלמידי שנה א' וב' בלבד ולהציג את הממוצע בכל אחד מהשנתונים: select stud_year, avg(grade) from stud inner join grades on stud.id=grades.id where stud_year<=2 and course= intro group by stud_year 18
פונקציות הקבצה-דוגמה 7 שליפת מ.ז. וממוצע הציונים של התלמיד שממוצע הגבוה ביותר: ציוניו הוא select id, avg(grade) from grades group by id having avg(grade)>=all (select avg(grade) from grades group by id) 19
פונקציות הקבצה-דוגמה 8 ואם נרצה להוסיף את שמו: select grades.id, avg(grade), last, first from grades inner join stud on grades.id=stud.id group by grades.id, last, first having avg(grade)>=all (select avg(grade) from grades group by id) postgres מחייב שכל התכונות ב select תופענה ב group by או שתהיינה חלק מפונקציית הקבצה. 20
grades 21 פונקציות הקבצה-דוגמה 9 אפשרות נוספת: ליצור את המידע על התלמיד מתוך בלבד ורק אחר כך לצרף עם :stud select stud.id, last, first, avg from( select id, avg(grade) from grades group by id having avg(grade)>=all (select avg(grade) from grades group by id)) as excel (id, avg) inner join stud on excel.id=stud.id
פונקציות הקבצה-דוגמה 10 הפונקציה count מאפשרת לנסח באופן פשוט שאילתות שבאלגברה ניסחנו באמצעות חילוק: נמנה כמה ישויות קיימות מקבוצה מסוימת קיימות במחולק ונציג את הישות מהמחלק שנקשרת למספר הישויות שהתקבל. את פרטי התלמידים שלמדו את כל הקורסים הקיימים ביחס grades נשלוף באופן הבא 22
פונקציות הקבצה-דוגמה 10 select stud.id, last, first from grades inner join stud on grades.id=stud.id כדי לקבל את רשימת הקורסים עלינו לייצר רשימה בה כל קורס מופיע פעם אחת. אחרת count תמנה את מספר המופעים הכללי של התכונה group by stud.id having count(course)= (select count(course) from (select distinct course from grades) as gc) 23
פונקציות הקבצה-דוגמה 10 אפשר לכלול את distinct בפעולת המנייה: select stud.id, last, first from grades inner join stud on grades.id=stud.id group by stud.id having count(course)= (select count(distinct course) from grades) 24
ב) כוח הביטוי של SQL כוח הביטוי של SQL דומה לזה של אלגברת היחסים )ולכן גם לזה של תחשיב שורות היחס(. נראה זאת על ידי כך שנראה שלכל אחת מהפעולות הבסיסיות של האלגברה מקבילה ב :SQL בחירה: מיוצגת ב SQL על ידי פסוקית ה where השלכה: מיוצגת ב SQL על ידי פסוקית ה select מכפלה קרטזית: מיוצגת ב SQL על ידי פסוקית ה from שינוי שם: ניתן לביצוע בפסוקית ה from )למשל, g )from grades as איחוד: ניתן לבצע באמצעות פעולת ה union הפרש: ניתן לבצע באמצעות פעולה ה postgresql minus נקראת.)except 25