چه موقع از join ها استفاده میشه و چه موقع از کوئری های تو در تو؟

پرسیده شده
فعالیت 1469 روز پیش
دیده شده 2093 بار
0

سلام دوستان

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

 

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 های تو در تو مشکل حل میشه 

فایل پیوست

amir tavakolian
amir tavakolian

7 اردیبهشت 99

9

مورد تایید استاد

حذف شده

سلام.

بنظر میاد در اکثر موارد 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 ای قرار بگیره، دیگه کوئری هیچ رکوردی رو بعنوان نتیجه برنمیگردونه.

فایل پیوست

محسن موحد

توسط

محسن موحد

8 اردیبهشت 99