முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 3 · பாடம் 4 இன் 4பாடத்திட்டத்தில் 12/57~8 min
தொகுதி பாடங்கள் (4/4)

வடிகட்டுதல் குழுக்கள்: HAVING

ஒரு குழுவிற்கு ஒரு முடிவைப் பெற்றவுடன் (முந்தைய பாடம்), நீங்கள் அடிக்கடி விரும்புவீர்கள் நிபந்தனையை பூர்த்தி செய்யும் குழுக்களை மட்டும் வைத்திருங்கள்: பல துறைகள் 2 நபர்களை விட, சராசரி பட்ஜெட் 100 ஆயிரத்திற்கு மேல் உள்ள திட்டங்கள், பயனர்கள் குறைந்தது 10 ஆர்டர்கள். இதைச் செய்ய WHERE ** போதாது**.

ஏன் எங்கே போதாது

WHERE அட்டவணை வரிசைகளை, முன் திரட்டலுக்கு வடிகட்டுகிறது. அதனால் பார்க்க முடியாது COUNT(*) அல்லது AVG(...) இன் முடிவு: WHERE ரன்களுக்குள், அவை மதிப்புகள் இன்னும் கணக்கிடப்படவில்லை.

SQL
-- 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.

தொடரியல்

SQL
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM   table
GROUP BY grouping_column
HAVING   condition_on_aggregate;
SQL
-- 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 அவற்றை மனரீதியாக செயல்படுத்துகிறது:

  1. FROM / JOIN — ஆதாரங்களை இணைப்பதன் மூலம் தொடக்க அட்டவணையை உருவாக்குகிறது.
  2. WHERE — நீங்கள் கவலைப்படாத வரிசைகளைக் குறைக்கிறது.
  3. GROUP BY — மீதமுள்ள வரிசைகளை குழுக்களாக சேகரிக்கிறது.
  4. HAVING — நீங்கள் கவலைப்படாத குழுக்களைக் குறைக்கிறது.
  5. SELECT — இறுதி நெடுவரிசைகளை (தொகுப்புகள் உட்பட) கணக்கிடுகிறது.
  6. ORDER BY / LIMIT — மறுவரிசைப்படுத்தி வெட்டு.

முக்கிய குறிப்புகள்:

  • WHERE இல் நீங்கள் அட்டவணை நெடுவரிசைகளை மட்டுமே பயன்படுத்த முடியும்;
  • HAVING இல் நீங்கள் ** நெடுவரிசைகள் மற்றும் கூட்டுத்தொகுப்புகளைப் பயன்படுத்தலாம்**.
SQL
-- 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;

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#sql.m3.l4.e1
முயற்சிகள்: 0ஏற்றுகிறது…

ஒவ்வொரு துறைக்கும், பெயர் (departments.name) மற்றும் பணியாளர் எண்ணிக்கையைக் காட்டவும், ஆனால் குறைந்தது 2 பணியாளர்களைக் கொண்ட துறைகளுக்கு மட்டும். இரண்டு நெடுவரிசைகள், ஒரு தகுதித் துறைக்கு ஒரு வரிசை.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

'குறைந்தது 2' நிபந்தனை COUNT(*) >= 2 ஆக உள்ளது.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

மதிப்பாய்வு பயிற்சி

உடற்பயிற்சி#sql.m3.l4.e2
முயற்சிகள்: 0ஏற்றுகிறது…

சராசரி சம்பளம் 35000க்கு மேல் உள்ள துறைகளை (departments.name) காட்டவும். 2018 முதல் பணியமர்த்தப்பட்ட பணியாளர்களை மட்டும் கருத்தில் கொள்ளவும். இரண்டு நெடுவரிசைகள்: பெயர் மற்றும் சராசரி. சராசரி இறக்கத்தின்படி வரிசைப்படுத்தவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

வரிசைகளை எங்கு வடிகட்டுகிறது (2018 முதல் பணியமர்த்தப்பட்ட பணியாளர்கள்), குழுக்களை வடிகட்டுவது (சராசரி > 35000).

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்