سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ amir tavakolian
چه موقع از join‌ها استفاده میشه و چه موقع از کوئری‌های تو در تو؟
محسن موحد حل شده توسط محسن موحد

سلام دوستان

زمانی که بخوایم اسم کارمندی  که بالای ۴۰ هزار فروخته  رو از دیتابیس بگیریم به نظرتون کدوم کوئری مناسب‌تر هستش 

 

Select first_name from employee where id in (select works_with.emp_id from works_with where works_with.total_sale > 40000)

اینکه بیایم از select‌های تو در تو استفاده کنیم

select Employee.first_name from Employee INNER JOIN Works_With ON Employee.id = Works_With.id
WHERE Works_With.total_sale > 40000

یا اینکه از جوین‌ها استفاده کنیم ؟

 

در کل؛ چه موقع از join‌ها استفاده میشه و چه موقع از select‌های تو در تو؟ 

 

برداشتی که من داشتم این هستش که؛ زمانی که بخوایم اسم و فامیل و total_sale  رو از جداول بگیریم باید از join استفاده بشه  ولی زمانی که بخوایم اسامی افرادی که بالای مثلا ۲۰۰۰۰ فروش داشتند رو بگیریم از select تو در تو استفاده میشه.

 

مثلا این سوال:

آیدی تمام مشتریانی که از ما خریدی نکردند:

SELECT CustomerID FROM Customers where CustomerID not in (select CustomerID from Orders) ;

اینجا دیگه از join نیازی نیست استفاده بشه و با select‌های تو در تو مشکل حل میشه 

سلام.

بنظر میاد در اکثر موارد JOIN گزینه ای مناسب از لحاظ سرعت و پرفورمنس هست مگر در مواردی که در حجم بالای دیتا و استفاده از JOIN نامناسب باعث بشه نتیجه ی برگشتی همراه با داده‌های زائدی باشن.

type کد اول که از sub-query استفاده شده از نوع index هست که در این مورد تقریبا همه ی سطرهای جداول اسکن میشن. داخل کوئری هم از in استفاده شده که خودش مثل OR‌های متوالی هست.

سایت dev.mysql اینجا گفته شده که جوین سرعت بالاتری داره نسبت به همون دستور نوشته شده بصورت sub-query و اونهارو با LEFT JOIN بازنویسی کرده.

منطقی هم هست، چون JOIN از کلید خارجی بهره برده و یک سطر از جدول در مقابل سطرهای متناظر با جدول دیگر قرار گرفته و WHERE چک میشود که بمراتب سرعت جستجو رو بالاتر میبره.

 

در مورد این کوئری هم:

SELECT CustomerID FROM Customers where CustomerID not in (select CustomerID from Orders);

حالا در اینجا که CustomerID هیچ وقت null نمیشه ولی بدونید اگر در مجموعه داده ی داخل not in مقدار NULL ای قرار بگیره، دیگه کوئری هیچ رکوردی رو بعنوان نتیجه برنمیگردونه.

بهترین پاسخ
محسن موحد ۰۸ اردیبهشت ۱۳۹۹، ۰۱:۰۶