ورود

View Full Version : تفاوت where و join



eli 202
شنبه 19 دی 1388, 13:24 عصر
سلام دوستان.
کسی می دونه تفاوت where و join در متصل کردن دو جدول چیه؟
ممنون میشم پاسخ بدین.

Hamid.Kad
شنبه 19 دی 1388, 20:53 عصر
کسی می دونه تفاوت where و join در متصل کردن دو جدول چیه؟
اگر منظورتون در چگونگی انجام عمل پیونده، در واقع هیچی. و این از قدرت شگفت انگیز optimizer هست. در واقع بخش بهینه ساز (که یکی از کارهای اصلیش بهینه سازی پیوندها است) اونقدر هوشمند هست که بفهمه کاربر با نوشتن Where میخواد join بزنه و سعی میکنه حتی الامکان یک روش (نزدیک به ) بهینه رو انتخاب کنه. اگر Execution Plan این دو روش رو بررسی کنید میبینید که دقیقاً یکی هستند
اگر هم منظورتون نوشتن دستوراته که مشخصه...

AminSobati
شنبه 19 دی 1388, 22:52 عصر
سلام دوست عزیزم،
بر طبق منطق زبان SQL، اجرای Join مقدم بر اجرای Where هستش. این موضوع در Inner Join تفاوتی حاصل نمیکنه و شما میتونین شرط Where رو به Join ببرین و با شرط Join اون رو AND کنین. اما در مورد Outer Join اینطور نیست. چون باز طبق استاندارد SQL، بعد از اجرای ON، رکوردهایی که حذف شدن به Result برمیگردن و بعد Where اجرا میشه (در Outer Join).
اما وقتی به دنیای RDBMSها میایم، ممکنه عینا طبق منطق SQL عمل نشه و برای بهینه سازی، تقدم ها و تاخرها ترتیبشون بهم بخوره

eli 202
دوشنبه 21 دی 1388, 10:18 صبح
سلام دوست عزیزم،
بر طبق منطق زبان SQL، اجرای Join مقدم بر اجرای Where هستش. این موضوع در Inner Join تفاوتی حاصل نمیکنه و شما میتونین شرط Where رو به Join ببرین و با شرط Join اون رو AND کنین. اما در مورد Outer Join اینطور نیست. چون باز طبق استاندارد SQL، بعد از اجرای ON، رکوردهایی که حذف شدن به Result برمیگردن و بعد Where اجرا میشه (در Outer Join).
اما وقتی به دنیای RDBMSها میایم، ممکنه عینا طبق منطق SQL عمل نشه و برای بهینه سازی، تقدم ها و تاخرها ترتیبشون بهم بخوره


ممنونم از پاسخ مفیدتون.میشه خواهش کنم درباره outer join یکم توضیح بدین؟

hozouri
دوشنبه 21 دی 1388, 11:00 صبح
Outer Join به 2 دسته تقسیم میشه :
1. Left Outer Join
2. Right Outer Join

حالا کاری که انجام میده :
در Left Outer Join تمام اطلاعات(سطر ها) جدولی که نام آن ابتدا (سمت چپ) آمده است لیست میشود با توجه به شرط در قسمت ON اگر آن رکورد پیدا شود اطلاعات آن را در جواب اضافه می نماید (تا اینجا کار Join دقیقاً انجام می شود) ولی اگر آن اطلاعات در جدول دوم وجود نداشته باشد به ازای فیلدها مقادیر Null گذاشته میشود.

Right Outer Join هم دقیقاً همین کار رو انجام میده ولی در ابتده جدول سمت راست رو لیست می کنه و سپس جدول دوم (سمت چپ) رو چک می نه که اگر اطلاعات رو پیدا نکنه به ازای فیلد ها مقادیر Null میزاره.

esmit61
دوشنبه 21 دی 1388, 12:17 عصر
بر طبق منطق زبان SQL، اجرای Join مقدم بر اجرای Where هستش. این موضوع در Inner Join تفاوتی حاصل نمیکنه و شما میتونین شرط Where رو به Join ببرین و با شرط Join اون رو AND کنین. اما در مورد Outer Join اینطور نیست
ممنون از توضیحتون. جناب ثباتی، Outer Join رو چجوری میشه با Where پیاده سازی کرد ؟

eli 202
دوشنبه 21 دی 1388, 18:31 عصر
Outer Join به 2 دسته تقسیم میشه :
1. Left Outer Join
2. Right Outer Join

حالا کاری که انجام میده :
در Left Outer Join تمام اطلاعات(سطر ها) جدولی که نام آن ابتدا (سمت چپ) آمده است لیست میشود با توجه به شرط در قسمت ON اگر آن رکورد پیدا شود اطلاعات آن را در جواب اضافه می نماید (تا اینجا کار Join دقیقاً انجام می شود) ولی اگر آن اطلاعات در جدول دوم وجود نداشته باشد به ازای فیلدها مقادیر Null گذاشته میشود.

Right Outer Join هم دقیقاً همین کار رو انجام میده ولی در ابتده جدول سمت راست رو لیست می کنه و سپس جدول دوم (سمت چپ) رو چک می نه که اگر اطلاعات رو پیدا نکنه به ازای فیلد ها مقادیر Null میزاره.

پس left outer join , right outer join همون left join , right join هست؟ من فکر کردم تفاوتی بینشونه؟

hozouri
سه شنبه 22 دی 1388, 08:42 صبح
پس left outer join , right outer join همون left join , right join هست؟ من فکر کردم تفاوتی بینشونه؟

بله دقیقاً یکی هستند در مباحث SQL به Join هم Inner Join گفته می شود.

AminSobati
سه شنبه 22 دی 1388, 22:28 عصر
- در حقیقت FULL OUTER JOIN نام کلاسیک این عمل هست ولی در SQL Server میتونین مختصرا OUTER JOIN بنویسین.
- توضیح Outer Join: منطقا وقتی دو جدول با هم Inner Join میشن، ابتدا باید حاصل ضربشون (Cross Join) بدست بیاد و بعد بر اساس شرط ON فیلتر بشن. بعد Where انجام میشه. به همین دلیل شرط Where رو در Inner Join میشه به قسمت ON برد و با هم ANDشون کرد. دقت بفرمایید که این دو جدول "منطقا" در هم ضرب میشن. در Outer Join بعد از ON و قبل از Where عملی اتفاق میافته به نام Preserve کردن (به معنی حفظ کردن). وقتی Left Join انجام میدین و به جدول سمت چپ اشاره میکنین، یعنی قصد دارین اون جدول Preserve بشه به این معنی که اگر به موجب شرط ON رکوردی ازش حذف شد، مجددا به Result برگرده ولی با توجه به اینکه این رکوردهای حذف شده با هیچ رکوردی در طرف دیگر Join نتونستن Match بشن، پس هر فیلدی از جدول طرف مقابل براشون NULL بدست میاد. بعد از Preserve شدن، شرط Where اجرا میشه.
- در خصوص بازنویسی Outer Join با Where: این کار برای همه Queryها امکان پذیر نیست، چون منطق کار اجازه نمیده. ولی در مثالی که مطرح میکنم Outer Join استفاده شده برای پیدا کردن مشتریهایی که سفارش نداشته اند. این مورد رو میشه با Where بازنویسی کرد:



use Northwind
go

select * from Customers c left join orders o
on c.CustomerID=o.CustomerID
where o.OrderID is null
go

select * from Customers c
where not exists (select * from orders o where c.CustomerID=o.CustomerID)

محمد سلیم آبادی
چهارشنبه 23 دی 1388, 01:51 صبح
تفاوت where و join در متصل کردن دو جدول چیه؟
inner join دارای دو syntax استاندارد است:
ANSI/ISO SQL-92 (استفاده از کلید واژه ی Join و on)
ANSI SQL-89 (استفاده از کاراکتر کاما بین جداول و فیلتر کردن سطرها با ماده ی where)
استاندارد اول از کلید واژه ی INNER JOIN استفاده می کند که کلمه ی INNER اختیاری است بدلیل اینکه این join پیشفرص است.
Syntax استاندارد اولی امن تر است یکی از دلایل آن این است که شما هیچ وقت نمی توانید شرط اتصال را فراموش کنین.
از نظر عملکرد هر دو روش یکسان هستند.

Outer Join رو چجوری میشه با Where پیاده سازی کرد ؟
راجب به اتصال خارجی، این join دارای سه فاز (مرحله ی منطقی) است: 1.ضرب دکارتی 2.فیلتر کردن سطرها 3.اضافه کردن سطرهای خارجی.
برای نوشتن یک کوئری مشابه outer join شما ابتدا باید دو جدول را با یکدیگر join کنین سپس با سطرهایی که match نشدن اجتماع کنین.
بطور مثال کوئری زیر معادل left outer join است:


select *
from t1
left join t2
on t1.id = t2.id

-- Equivalence
select *
from t1, t2
where t1.id = t2.id
union all
select t1.*, null
from t1
where not exists
(select *
from t2
where t2.id = t1.id)

محمد سلیم آبادی
چهارشنبه 23 دی 1388, 01:56 صبح
- - در خصوص بازنویسی Outer Join با Where: این کار برای همه Queryها امکان پذیر نیست، چون منطق کار اجازه نمیده. ولی در مثالی که مطرح میکنم Outer Join استفاده شده برای پیدا کردن مشتریهایی که سفارش نداشته اند. این مورد رو میشه با Where بازنویسی کرد:



use Northwind
go

select * from Customers c left join orders o
on c.CustomerID=o.CustomerID
where o.OrderID is null
go

select * from Customers c
where not exists (select * from orders o where c.CustomerID=o.CustomerID)


در واقع این روش جایگزین except است و هیچ ربطی به یک روش معادل left outer join ندارد.

AminSobati
چهارشنبه 23 دی 1388, 11:01 صبح
select *
from t1
left join t2
on t1.id = t2.id

-- Equivalence
select *
from t1, t2
where t1.id = t2.id
union all
select t1.*, null
from t1
where not exists
(select *
from t2
where t2.id = t1.id)



یک برنامه نویس با تجربه نمیتونه تصور کنه به جای کوئری:



select *
from t1
full join t2
on t1.id = t2.id


بنویسه:



select *
from t1, t2
where t1.id = t2.id
union all
select t1.*, null
from t1
where not exists
(select *
from t2
where t2.id = t1.id)
union all
select t2.*, null
from t2
where not exists
(select *
from t1
where t2.id = t1.id)


کوئری آخر به این شکل نمره میگیره:

Cost of Development: حداقل 4 برابر بیشتر
East of Understanding: کمتر از نصف
Change Management & Maintenance Cost: حداقل دو برابر بیشتر
Readability: بسیار ضعیف

ولی برای تمرین و سرگرمی بد نیست

محمد سلیم آبادی
چهارشنبه 23 دی 1388, 11:19 صبح
ولی برای تمرین و سرگرمی بد نیست
هیچ وقت یک برنامه نویس با تجربه نمیاد این کار رو بکنه! این فقط جواب سوال بود. و باید بدونید که outer join در ANSI SQL-92 معرفی شده پس قبل از آن هیچ outer join وجود نداره.

تصور نمی کنید کوئری که در زیر نوشتین یک اشکالی داره؟


select *
from t1, t2
where t1.id = t2.id
union all
select t1.*, null
from t1
where not exists
(select *
from t2
where t2.id = t1.id)
union all
select null, t2.*
from t2
where not exists
(select *
from t1
where t2.id = t1.id)

AminSobati
چهارشنبه 23 دی 1388, 11:42 صبح
تستش نکردم، ولی در کل داستان فرقی حاصل نمیکنه

محمد سلیم آبادی
جمعه 03 اردیبهشت 1389, 17:13 عصر
داشتم صفحات کتاب Celko را پیمایش می کردم که به OUTER JOIN برخورد کردم. برام جالب بود چون روشی که استفاده کرده بود دقیقه همون کاری بود که من کرده بودم.

http://www.barnamenevis.org/forum/attachment.php?attachmentid=47691&stc=1&d=1272285594

AminSobati
جمعه 03 اردیبهشت 1389, 20:14 عصر
برای سال 89 روش خوبیه!