מדריך 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)

תגיות: , , , , , ,

תגובות בפייסבוק