מדריך SQL – GROUP BY & HAVING
פונקציות צבירה, כמו COUNT, SUM, AVG וכד', מחזירות את תוצאת החישוב על כל העמודות בטבלה. על מנת לאפשר לנו לבצע חישובים אלו על קבוצות מסויימות, נוצרה פונקציית GROUP BY.
לדוגמא, כיצד נציג, עבור כל סופר, את כמות הספרים שכתב?
אם נכתוב:
SELECT COUNT(Title) FROM Titles
נקבל את סה"כ הספרים בטבלה.
השאילתה
SELECT Author,COUNT(Title) FROM Titles, Authors, Title_Author WHERE Titles.ISBN = Title_Author.ISBN AND Authors.AU_ID = Title_Author.AU_ID
תיתן לנו שגיאה, כי בשורת ה-SELECT ביקשנו להציג את העמודה Author, אך לא ציינו לפי מה לבצע את ה-COUNT
לכן, הדרך הנכונה לכתוב זאת היא:
SELECT Author,COUNT(Title) FROM Titles, Authors, Title_Author WHERE Titles.ISBN = Title_Author.ISBN AND Authors.AU_ID = Title_Author.AU_ID GROUP BY Author
אם נוסיף גם פסוקית ORDER BY, נקבל רשימה של כל הסופרים וכמה ספרים כתב כל אחד, ממויינת לפי מס' הספרים:
SELECT Author,COUNT(Title) FROM Titles, Authors, Title_Author WHERE Titles.ISBN = Title_Author.ISBN AND Authors.AU_ID = Title_Author.AU_ID GROUP BY Author ORDER BY Count(Title)
הערה:
כל עמודה שאנו רוצים להציג בשאילתת SELECT הכוללת גם פונקציית צבירה, חייבת להופיע בפסוקית ה-GROUP BY.
HAVING
בשאילתה רגילה, השתמשנו ב-WHERE כדי להציג רק רשומות העונות על תנאי מסויים.
באמצעות HAVING, אנו יכולים להתנות את התוצאות של פונקציית הצבירה.
בשאילתה אחת יכולות להופיע פסויקיות WHERE ן-HAVING. אלו אינן סותרות אחת את השנייה.
לדוגמא, כדי להציג לכל מו"ל את מספר הספרים שפירסם, נכתוב:
SELECT Name, COUNT(Titles.PubID) FROM Titles, Publishers WHERE Titles.PubID = Publishers.PubID GROUP BY Name ORDER BY COUNT(Titles.PubID)
אך אם נרצה להציג רק את אלו שהוציאו לאור לפחות 10 ספרים, נכתוב:
SELECT Name, COUNT(Titles.PubID) FROM Titles, Publishers WHERE Titles.PubID = Publishers.PubID GROUP BY Name HAVING COUNT(Titles.PubID)>=10 ORDER BY COUNT(Titles.PubID)
תגובות בפייסבוק