ماڈیول اسباق (2/4)
ہر چیز کو بائیں طرف رکھنا: LEFT Join
پچھلے سبق کے INNER JOIN کا ایک اہم ضمنی اثر ہے: یہ
قطروں کو گراتا ہے جن کا کوئی مماثلت نہیں ہے۔ اگر کسی ملازم کے پاس کوئی محکمہ نہ ہو۔
(department_id ہے NULL)، وہ نتیجہ سے غائب ہو جاتے ہیں۔
کبھی کبھی ایسا ہی ہوتا ہے جو آپ چاہتے ہیں۔ اکثر، اگرچہ، ایسا نہیں ہے: HR رپورٹ میں
تمامملازمین کو دیکھنا ضروری ہے، بشمول وہ لوگ جو محکمہ نہیں ہیں،
اور جانتے ہیں کہ وہ کون ہیں۔ LEFT JOIN کے لیے یہی ہے (مکمل طور پر، LEFT OUTER JOIN)۔
یہ کیسے کام کرتا ہے۔
SELECT columns
FROM table_a
LEFT JOIN table_b ON table_a.x = table_b.y;انگریزی میں پڑھیں: "table_a کی تمام قطاریں رکھیں؛ ہر ایک کے لیے کوشش کریں
table_b سے ایک قطار منسلک کریں؛ اگر کوئی مماثلت نہیں ہے تو، سے کالم بھریں۔
table_b کے ساتھ NULL"۔
کلیدی لفظ LEFT ہے: اس کا مطلب ہے "بائیں میز"، یعنی لکھا ہوا
FROM کے بعد۔ اس کی تمام قطاریں ہمیشہ زندہ رہتی ہیں۔
-- All employees, including those without a department:
SELECT e.first_name,
e.last_name,
d.name AS dipartimento
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id;ہمارے ڈیٹاسیٹ میں یہ استفسار 10 قطاریں (ہر ایک ملازم) لوٹاتا ہے۔ اینڈریا
کوسٹا، جس کے پاس department_id = NULL ہے، dipartimento = NULL کے ساتھ ظاہر ہوتا ہے
غائب ہونے کے بجائے.
"کوئی میچ نہیں" قطاریں تلاش کرنا
ایک بہت مفید نتیجہ: کے کالم پر IS NULL کے ساتھ فلٹر کرکے
دائیں ہاتھ کی میز پر آپ کو بالکل قطاریں ملتی ہیں بغیر کوئی میچ:
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE d.id IS NULL;یہ چال حقیقی دنیا میں ہر وقت استعمال ہوتی ہے: "مجھے بغیر نمبر کے آرڈر تلاش کریں۔ صارف"، "مصنوعات بغیر کسی جائزے کے"، "وہ صارف جنہوں نے کبھی لاگ ان نہیں کیا میں"
اسے آزمائیں
ان ملازمین کا پہلا نام (first_name) اور آخری نام (last_name) واپس کریں جن کے پاس کوئی محکمہ تفویض نہیں ہے۔ ایک یا زیادہ قطاریں، دو کالم۔
اشارہ دکھائیں۔
d.id IS NULL کے ساتھ WHERE کو مکمل کریں — آپ کو وہ قطاریں چاہیں جہاں بائیں شمولیت کو مماثل شعبہ نہیں ملا۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
تمام محکموں (departments.name) اور ان کے آگے ملازمین کی تعداد درج کریں، بشمول وہ محکمے جن میں ملازمین نہیں ہیں (ان کے لیے 0 دکھائیں)۔ اشارہ: محکموں سے شروع کریں اور ملازمین کے ساتھ بایاں جوائن کریں، پھر GROUP BY + COUNT کریں۔
اشارہ دکھائیں۔
جب کوئی مماثلت نہ ہو تو 0 شمار کرنے کے لیے COUNT(e.id) (نہ کہ COUNT(*)) کا استعمال کریں: NULL کے ساتھ بائیں جوائن کی قطار کی وجہ سے COUNT(*) 1 شمار کرے گا۔
3 کوششوں کے بعد حل دستیاب ہے۔