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

ఒక ప్రశ్న లోపల మరొక ప్రశ్న: ఉపప్రశ్నలు

మీరు సంగ్రహించడం, ఫిల్టర్ చేయడం, సమూహం చేయడం, చేరడం మరియు రూపాంతరం చేయడం ఎలాగో నేర్చుకున్నారు. అక్కడ ఒక చివరి ప్రాథమిక ఆలోచన: ఒక ప్రశ్నను మరొకదానిలో ఉంచడం. ఇవి ** సబ్‌క్వెరీలు** అని పిలుస్తారు మరియు అవి ప్రశ్నలకు సమాధానం ఇవ్వడానికి మిమ్మల్ని అనుమతించే దశ "సగటు కంటే ఎవరు సంపాదిస్తారు?" లేదా "ఏ విభాగాల్లో ఎవరైనా ఉన్నారు ప్రాజెక్ట్‌కి కేటాయించబడిందా?".

ప్రాథమిక వాక్యనిర్మాణం

సబ్‌క్వెరీ అనేది SELECT కుండలీకరణాల్లో చుట్టబడి, సింగిల్ స్థానంలో ఉపయోగించబడుతుంది విలువ లేదా మరొక ప్రశ్నలోని విలువల జాబితా:

SQL
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM   employees
WHERE  salary > (SELECT AVG(salary) FROM employees);

ఇంజిన్ మొదట సబ్‌క్వెరీని నడుపుతుంది — SELECT AVG(salary) FROM employees ఒకే సంఖ్యని అందిస్తుంది — ఆపై ఆ సంఖ్యను బయటి WHEREలో ఉపయోగిస్తుంది మీరు చేతితో వ్రాసినట్లు. ఇది ఖచ్చితంగా ప్రయోజనం: మీరు చేయండి ముందుగా సగటు తెలుసుకోవలసిన అవసరం లేదు, SQL మీ కోసం దాన్ని గణిస్తుంది.

మూడు అత్యంత సాధారణ "రకాలు"

1. సబ్‌క్వెరీ ఒకే విలువను అందిస్తుంది

ఎగువ ఉదాహరణ: సబ్‌క్వెరీ ఒక అడ్డు వరుస, ఒక నిలువు వరుస (అని పిలుస్తారు స్కేలార్). మీరు దీన్ని =, >, < మొదలైన వాటితో ఉపయోగిస్తారు.

SQL
-- Employee with the highest salary:
SELECT first_name, last_name
FROM   employees
WHERE  salary = (SELECT MAX(salary) FROM employees);

2. సబ్‌క్వెరీ జాబితాను తిరిగి ఇస్తుంది

సబ్‌క్వెరీ ఒక నిలువు వరుస, అనేక వరుసలను ఉత్పత్తి చేస్తుంది. మీరు దీన్ని ఉపయోగించుకోండి IN (...):

SQL
-- Departments that have at least one employee:
SELECT name
FROM   departments
WHERE  id IN (SELECT DISTINCT department_id
              FROM employees
              WHERE department_id IS NOT NULL);

3. సబ్‌క్వెరీ "టేబుల్"గా (FROM)

FROMలోని పట్టిక స్థానంలో సబ్‌క్వెరీ కూడా తీసుకోవచ్చు. ఇది ఉపయోగకరంగా ఉంటుంది అగ్రిగేట్‌లను ముందుగా గణించి, ఆపై వాటిని ఫిల్టర్ చేయండి లేదా చేరండి:

SQL
-- Departments with average salary above 40000:
SELECT d.name, medie.stipendio_medio
FROM   departments AS d
JOIN  (SELECT department_id, AVG(salary) AS stipendio_medio
       FROM employees
       GROUP BY department_id) AS medie
   ON d.id = medie.department_id
WHERE  medie.stipendio_medio > 40000;

సబ్‌క్వెరీ లేదా చేరాలా? ఏది ఎప్పుడు ఉపయోగించాలి

తరచుగా అదే ఫలితాన్ని JOIN లేదా సబ్‌క్వెరీతో పొందవచ్చు. నియమం:

  • ఒక టేబుల్ యొక్క మరొక ఆస్తి ఆధారంగా ఫిల్టర్ చేయడానికి ("డిపార్ట్‌మెంట్‌లను కలిగి ఉన్న ఉద్యోగులు..."), IN (subquery) చాలా చదవగలిగేది.
  • ఫలితంగా బహుళ పట్టికల నుండి ** నిలువు వరుసలను కలపడానికి**, JOINని ఉపయోగించండి.
  • మొత్తాన్ని గణించడానికి మరియు దానిని థ్రెషోల్డ్‌గా ఉపయోగించడానికి ("పైన సగటు"), స్కేలార్ సబ్‌క్వెరీ అనేది సహజ ఎంపిక.

ఆచరణలో మీరు రెండింటినీ చూస్తారు: SQL ఇంజిన్ తరచుగా వాటిని ఒకే విధంగా ఆప్టిమైజ్ చేస్తుంది మార్గం. ఉత్తమంగా చదివే ఫారమ్‌ను ఎంచుకోండి.

దీనిని ప్రయత్నించండి

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

కంపెనీ సగటు కంటే ఖచ్చితంగా ఎక్కువ సంపాదించే ఉద్యోగుల మొదటి పేరు (మొదటి_పేరు), చివరి పేరు (చివరి_పేరు) మరియు జీతం (జీతం) కనుగొనండి. మూడు నిలువు వరుసలు.

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

భర్తీ చేయాలా? ఉద్యోగుల నుండి SELECT AVG(జీతం) అనే సబ్‌క్వెరీతో — ఇది థ్రెషోల్డ్‌గా ఉపయోగించడానికి ఒకే సంఖ్యను అందిస్తుంది.

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

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

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

50000 కంటే ఎక్కువ జీతం కలిగిన కనీసం ఒక ఉద్యోగి ఉన్న శాఖల పేరు (departments.name) జాబితా చేయండి. INతో సబ్‌క్వెరీని ఉపయోగించండి. అక్షర క్రమంలో ఆర్డర్ చేయండి.

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

జీతం > 50000 ఉన్న ఉద్యోగులు ఉన్న డిపార్ట్‌మెంట్‌ల ఐడిలను అంతర్గత సబ్‌క్వెరీ అందిస్తుంది. ఆపై బయటి ప్రశ్నలో ఎక్కడ ఐడి (...) ఉంటుంది.

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