ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 3 · 4లో పాఠం 4కోర్సులో 12/57~8 min
మాడ్యూల్ పాఠాలు (4/4)

వడపోత సమూహాలు: HAVING

మీరు ఒక్కో సమూహానికి (మునుపటి పాఠం) ఫలితాన్ని పొందిన తర్వాత, మీరు తరచుగా కోరుకుంటారు ** షరతును సంతృప్తిపరిచే సమూహాలను మాత్రమే ఉంచండి**: మరిన్ని విభాగాలు 2 మంది కంటే ఎక్కువ మంది, సగటు బడ్జెట్ 100k కంటే ఎక్కువ ఉన్న ప్రాజెక్ట్‌లు, వినియోగదారులు కనీసం 10 ఆర్డర్‌లు. దీన్ని చేయడానికి WHERE ** సరిపోదు**.

ఎందుకు ఎక్కడ సరిపోదు

WHERE టేబుల్ అడ్డు వరుసలను, before అగ్రిగేషన్‌ని ఫిల్టర్ చేస్తుంది. కాబట్టి అది చూడదు 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 మంది ఉద్యోగులు ఉన్న విభాగాలకు మాత్రమే. రెండు నిలువు వరుసలు, ఒక్కో అర్హత విభాగానికి ఒక అడ్డు వరుస.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

HAVINGలో 'కనీసం 2' షరతు COUNT(*) >= 2 అవుతుంది.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం సమీక్షించండి

వ్యాయామం#sql.m3.l4.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

సగటు జీతం 35000 కంటే ఎక్కువ ఉన్న డిపార్ట్‌మెంట్‌లను (departments.name) చూపండి. 2018 నుండి నియమించబడిన ఉద్యోగులను మాత్రమే పరిగణించండి. రెండు నిలువు వరుసలు: పేరు మరియు సగటు. సగటు అవరోహణ ద్వారా క్రమబద్ధీకరించండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

అడ్డు వరుసలను ఎక్కడ ఫిల్టర్ చేస్తుంది (2018 నుండి నియమించబడిన ఉద్యోగులు), సమూహాలను ఫిల్టర్ చేస్తుంది (సగటు > 35000).

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది