SQLలో నెస్టెడ్ ప్రశ్నలు

SQL భాష ఒక ప్రశ్నను మరొక ప్రశ్నలో గూడు కట్టుకోవడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది చాలా పెద్ద ప్రశ్నను వ్రాయడం సాధ్యపడుతుంది, ఇది పెద్ద మరియు సంక్లిష్టమైన పనిని చేస్తుంది, అయినప్పటికీ కోడ్ యొక్క రీడబిలిటీ బాగా తగ్గింది.

సబ్‌క్వెరీల ద్వారా ఎన్ని విలువలు అందించబడతాయి అనేదానిపై ఆధారపడి, వాటిని వర్తించే ప్రాంతం మారుతుంది. మొత్తం మూడు ఎంపికలు ఉన్నాయి:

  • సబ్‌క్వెరీ ఒక సింగిల్ విలువను (ఒక నిలువు వరుస మరియు ఒక అడ్డు వరుస) అందిస్తుంది.
  • సబ్‌క్వెరీ విలువల జాబితాను అందిస్తుంది (ఒక నిలువు వరుసతో పట్టిక).
  • సబ్‌క్వెరీ ఒక టేబుల్‌ని అందిస్తుంది (అనేక నిలువు వరుసలు, అడ్డు వరుసల సంఖ్య).

ఒక్కో సందర్భంలో ఒక్కో ఉదాహరణ చూద్దాం.

స్కేలార్ ఫలితంతో సబ్‌క్వెరీ

కంపెనీ సగటు కంటే ఎక్కువ జీతం ఉన్న ఉద్యోగుల పట్టిక నుండి మా ఉద్యోగులందరి జాబితాను కనుగొనండి. మనం ఎలా చేయగలం?

ఉద్యోగుల వేతనాన్ని మనం ముందుగానే తెలుసుకుంటే సగటుతో పోల్చడం ద్వారా ఉద్యోగులను సులభంగా ఫిల్టర్ చేయవచ్చు. అదే సమయంలో, కంపెనీ ఉద్యోగుల సగటు జీతం లెక్కించేందుకు అనుమతించే ప్రశ్నను మేము ఇప్పటికే వ్రాసాము. దానిని గుర్తుంచుకుందాం:

SELECT AVG(salary) FROM employee 

అప్పుడు MySQL మాకు విలువను అందించింది: 76833.3333 .

సగటు కంటే ఎక్కువ జీతం ఉన్న ఉద్యోగులందరి జాబితాను ఇప్పుడు ఎలా కనుగొనాలి? ఇది కూడా చాలా సులభం:

 SELECT * FROM employee 
   WHERE salary > 76833.3333 

ఈ ప్రశ్న యొక్క ఫలితం ఇలా ఉంటుంది:

id పేరు వృత్తి జీతం
1 ఇవనోవ్ ఇవాన్ ప్రోగ్రామర్ 100000
2 పెట్రోవ్ పీటర్ ప్రోగ్రామర్ 80000
4 రాబినోవిచ్ మోయిషా దర్శకుడు 200000

ఇప్పుడు మేము 76833 విలువకు బదులుగా మొదటి అభ్యర్థనను భర్తీ చేయడం ద్వారా రెండు అభ్యర్థనలను కలుపుతాము:

   SELECT * FROM employee 
   WHERE salary > (SELECT AVG(salary) FROM employee) 

ఈ ప్రశ్న యొక్క ఫలితం ఒకే విధంగా ఉంటుంది:

id పేరు వృత్తి జీతం
1 ఇవనోవ్ ఇవాన్ ప్రోగ్రామర్ 100000
2 పెట్రోవ్ పీటర్ ప్రోగ్రామర్ 80000
4 రాబినోవిచ్ మోయిషా దర్శకుడు 200000

విలువల జాబితాతో ఉపప్రశ్న

ఒకప్పుడు మేము ఒక పనిని కలిగి ఉన్నామని మీకు గుర్తుందా - ఒక టేబుల్ నుండి అన్ని రికార్డులను కనుగొనడం, దాని కోసం మరొకదాని నుండి సంబంధిత రికార్డులు లేవు?

ఈ చిత్రం కూడా ఉంది:

నేను తప్పుగా భావించకపోతే, పని క్రింది విధంగా ఉంటుంది: టాస్క్ టేబుల్‌లో టాస్క్‌లు లేని ఉద్యోగుల పట్టిక నుండి ఉద్యోగులందరి జాబితాను ప్రదర్శించండి .

రెండు దశల్లో పరిష్కారాన్ని కూడా కనుగొంటాం.

ముందుగా, టాస్క్ టేబుల్‌లో టాస్క్‌లను కలిగి ఉన్న ఉద్యోగులందరి ఐడిని తిరిగి ఇచ్చే ప్రశ్నను వ్రాస్దాం. కేవలం రెండు విషయాలు గుర్తుంచుకోండి:

  • నకిలీలను తొలగించండి - DISTINCT కీవర్డ్ ఉపయోగించండి.
  • ఫలితం నుండి NULL విలువలను తీసివేయండి.
SELECT DISTINCT employee_id FROM task 
   WHERE employee_id IS NOT NULL

మరియు ఇక్కడ మేము అటువంటి అభ్యర్థన యొక్క అందమైన ఫలితాన్ని పొందాము:

ఉద్యోగ గుర్తింపు
1
2
5
4
6

1,2,5,4,6: 1,2,5,4,6 అనే క్రమంలో సౌలభ్యం కోసం తాత్కాలికంగా వ్రాస్దాం. ఇప్పుడు రెండవ ప్రశ్నను వ్రాద్దాం - ఉద్యోగుల పట్టికకు, ఇది మొదటి జాబితాలో లేని ఉద్యోగుల జాబితాను అందిస్తుంది:

SELECT * FROM employee  
WHERE id NOT IN (1,2,5,4,6)

మరియు ఈ ప్రశ్న యొక్క ఫలితం:

id పేరు వృత్తి జీతం వయస్సు చేరుతున్న తేదీ
3 ఇవనోవ్ సెర్గీ టెస్టర్ 40000 ముప్పై 2014-01-01

మరియు ఇప్పుడు, మునుపటి ఉదాహరణలో వలె, మీరు ID జాబితాకు బదులుగా మొదటి అభ్యర్థన యొక్క భాగాన్ని భర్తీ చేయడం ద్వారా రెండు అభ్యర్థనలను కలపవచ్చు.

 SELECT * FROM employee 
   WHERE id NOT IN ( 
      	SELECT DISTINCT employee_id FROM task 
      	WHERE employee_id IS NOT NULL 
   )