தொகுதி பாடங்கள் (4/4)
வடிகட்டுதல் குழுக்கள்: HAVING
ஒரு குழுவிற்கு ஒரு முடிவைப் பெற்றவுடன் (முந்தைய பாடம்), நீங்கள் அடிக்கடி விரும்புவீர்கள்
நிபந்தனையை பூர்த்தி செய்யும் குழுக்களை மட்டும் வைத்திருங்கள்: பல துறைகள்
2 நபர்களை விட, சராசரி பட்ஜெட் 100 ஆயிரத்திற்கு மேல் உள்ள திட்டங்கள், பயனர்கள்
குறைந்தது 10 ஆர்டர்கள். இதைச் செய்ய WHERE ** போதாது**.
ஏன் எங்கே போதாது
WHERE அட்டவணை வரிசைகளை, முன் திரட்டலுக்கு வடிகட்டுகிறது. அதனால் பார்க்க முடியாது
COUNT(*) அல்லது AVG(...) இன் முடிவு: WHERE ரன்களுக்குள், அவை
மதிப்புகள் இன்னும் கணக்கிடப்படவில்லை.
-- ERROR: COUNT(*) doesn't exist yet when WHERE is evaluated
SELECT department_id, COUNT(*) AS count
FROM employees
WHERE COUNT(*) > 2 -- ❌ doesn't work
GROUP BY department_id;பின் திரட்டலை வடிகட்ட, ஒரு பிரத்யேக ஷரத்து உள்ளது: HAVING.
தொடரியல்
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM table
GROUP BY grouping_column
HAVING condition_on_aggregate;-- Departments with more than 2 employees:
SELECT department_id, COUNT(*) AS count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 2;HAVING GROUP BY க்கு WHERE என்றால் FROM: அதே யோசனை
("வடிகட்டி"), ஆனால் மொத்தத்தில் குழுப்படுத்திய பிறகு பயன்படுத்தப்பட்டது.
உட்பிரிவுகளின் தர்க்கரீதியான வரிசை
WHERE மற்றும் HAVING ஐ மீண்டும் ஒருபோதும் குழப்ப வேண்டாம், எந்த வரிசையை நினைவில் கொள்க
SQL அவற்றை மனரீதியாக செயல்படுத்துகிறது:
FROM/JOIN— ஆதாரங்களை இணைப்பதன் மூலம் தொடக்க அட்டவணையை உருவாக்குகிறது.WHERE— நீங்கள் கவலைப்படாத வரிசைகளைக் குறைக்கிறது.GROUP BY— மீதமுள்ள வரிசைகளை குழுக்களாக சேகரிக்கிறது.HAVING— நீங்கள் கவலைப்படாத குழுக்களைக் குறைக்கிறது.SELECT— இறுதி நெடுவரிசைகளை (தொகுப்புகள் உட்பட) கணக்கிடுகிறது.ORDER BY/LIMIT— மறுவரிசைப்படுத்தி வெட்டு.
முக்கிய குறிப்புகள்:
WHEREஇல் நீங்கள் அட்டவணை நெடுவரிசைகளை மட்டுமே பயன்படுத்த முடியும்;HAVINGஇல் நீங்கள் ** நெடுவரிசைகள் மற்றும் கூட்டுத்தொகுப்புகளைப் பயன்படுத்தலாம்**.
-- Classic combo: filter first, group, filter the groups, sort.
SELECT d.name, AVG(e.salary) AS average
FROM employees AS e
JOIN departments AS d ON e.department_id = d.id
WHERE e.hired_on >= '2018-01-01' -- filter rows
GROUP BY d.name
HAVING AVG(e.salary) > 35000 -- filter groups
ORDER BY average DESC;முயற்சி செய்து பாருங்கள்
ஒவ்வொரு துறைக்கும், பெயர் (departments.name) மற்றும் பணியாளர் எண்ணிக்கையைக் காட்டவும், ஆனால் குறைந்தது 2 பணியாளர்களைக் கொண்ட துறைகளுக்கு மட்டும். இரண்டு நெடுவரிசைகள், ஒரு தகுதித் துறைக்கு ஒரு வரிசை.
குறிப்பைக் காட்டு
'குறைந்தது 2' நிபந்தனை COUNT(*) >= 2 ஆக உள்ளது.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
மதிப்பாய்வு பயிற்சி
சராசரி சம்பளம் 35000க்கு மேல் உள்ள துறைகளை (departments.name) காட்டவும். 2018 முதல் பணியமர்த்தப்பட்ட பணியாளர்களை மட்டும் கருத்தில் கொள்ளவும். இரண்டு நெடுவரிசைகள்: பெயர் மற்றும் சராசரி. சராசரி இறக்கத்தின்படி வரிசைப்படுத்தவும்.
குறிப்பைக் காட்டு
வரிசைகளை எங்கு வடிகட்டுகிறது (2018 முதல் பணியமர்த்தப்பட்ட பணியாளர்கள்), குழுக்களை வடிகட்டுவது (சராசரி > 35000).
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்