మాడ్యూల్ పాఠాలు (4/4)
వడపోత సమూహాలు: HAVING
మీరు ఒక్కో సమూహానికి (మునుపటి పాఠం) ఫలితాన్ని పొందిన తర్వాత, మీరు తరచుగా కోరుకుంటారు
** షరతును సంతృప్తిపరిచే సమూహాలను మాత్రమే ఉంచండి**: మరిన్ని విభాగాలు
2 మంది కంటే ఎక్కువ మంది, సగటు బడ్జెట్ 100k కంటే ఎక్కువ ఉన్న ప్రాజెక్ట్లు, వినియోగదారులు
కనీసం 10 ఆర్డర్లు. దీన్ని చేయడానికి WHERE ** సరిపోదు**.
ఎందుకు ఎక్కడ సరిపోదు
WHERE టేబుల్ అడ్డు వరుసలను, before అగ్రిగేషన్ని ఫిల్టర్ చేస్తుంది. కాబట్టి అది చూడదు
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 మంది ఉద్యోగులు ఉన్న విభాగాలకు మాత్రమే. రెండు నిలువు వరుసలు, ఒక్కో అర్హత విభాగానికి ఒక అడ్డు వరుస.
సూచనను చూపించు
HAVINGలో 'కనీసం 2' షరతు COUNT(*) >= 2 అవుతుంది.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
వ్యాయామం సమీక్షించండి
సగటు జీతం 35000 కంటే ఎక్కువ ఉన్న డిపార్ట్మెంట్లను (departments.name) చూపండి. 2018 నుండి నియమించబడిన ఉద్యోగులను మాత్రమే పరిగణించండి. రెండు నిలువు వరుసలు: పేరు మరియు సగటు. సగటు అవరోహణ ద్వారా క్రమబద్ధీకరించండి.
సూచనను చూపించు
అడ్డు వరుసలను ఎక్కడ ఫిల్టర్ చేస్తుంది (2018 నుండి నియమించబడిన ఉద్యోగులు), సమూహాలను ఫిల్టర్ చేస్తుంది (సగటు > 35000).
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది