مرکزی مواد پر جائیں
ماڈیول 4 · سبق 4 از 4کورس میں 16/57~12 min
ماڈیول اسباق (4/4)

دوسرے کے اندر ایک سوال: ذیلی سوالات

آپ نے ایکسٹریکٹ، فلٹر، گروپ، جوائن اور ٹرانسفارم کرنے کا طریقہ سیکھ لیا ہے۔ وہاں ایک آخری بنیادی خیال ہے: ایک سوال دوسرے کے اندر ڈالنا۔ یہ ہیں۔ subqueries کہا جاتا ہے اور یہ وہ قدم ہیں جو آپ کو سوالات کے جوابات دینے دیتے ہیں۔ جیسے _"اوسط سے زیادہ کون کماتا ہے؟" _ یا "کون سے محکموں میں کوئی ہے۔ کسی پروجیکٹ کو تفویض کیا گیا؟".

بنیادی نحو

ذیلی استفسار ایک 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 میں استعمال کرتا ہے گویا آپ نے اسے ہاتھ سے لکھا ہے۔ یہ بالکل فائدہ ہے: آپ کرتے ہیں پہلے سے اوسط جاننے کی ضرورت نہیں، ایس کیو ایل آپ کے لیے اس کی گنتی کرتا ہے۔

تین سب سے عام "قسم"

1. ایک واحد قدر واپس کرنے والی سبکیوری

مندرجہ بالا مثال: ذیلی سوال ایک قطار، ایک کالم (کہا جاتا ہے۔ scalar)۔ آپ اسے =، >، < وغیرہ کے ساتھ استعمال کرتے ہیں۔

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.m4.l4.e1
کوششیں: 0لوڈ ہو رہا ہے…

کمپنی کی اوسط سے سختی سے زیادہ کمانے والے ملازمین کا پہلا نام (first_name)، آخری نام (last_name) اور تنخواہ (تنخواہ) تلاش کریں۔ تین کالم۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

بدل دیں؟ ذیلی سوال کے ساتھ ملازمین سے AVG (تنخواہ) کا انتخاب کریں - یہ حد کے طور پر استعمال کرنے کے لیے ایک نمبر واپس کرتا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#sql.m4.l4.e2
کوششیں: 0لوڈ ہو رہا ہے…

ان محکموں کے نام (departments.name) کی فہرست بنائیں جن میں کم از کم ایک ملازم ہے جس کی تنخواہ 50000 سے زیادہ ہے۔ IN کے ساتھ ذیلی سوال استعمال کریں۔ حروف تہجی کے مطابق ترتیب دیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

اندرونی ذیلی استفسار ان محکموں کی آئی ڈی لوٹاتا ہے جن کے ملازمین کی تنخواہ> 50000 ہے۔ پھر بیرونی استفسار پر WHERE id IN (...)۔

3 کوششوں کے بعد حل دستیاب ہے۔