دستور CROSS JOIN در MYSQL

ali.2

Active Member
اصولا وقتی عبارت
SELECT * FROM table1 CROSS JOIN table2​
را اجرا کنیم باید هر رکورد از جدول table1 با تمام رکوردهای جدول table2 ترکیب شده و نتیجه به عنوان خروجی نمایش داده شود.به عنوان مثال فرض کنیم دو جدول products و stores را داشته باشیم:
جدول products
price
product_name
id
699.00​
iPhone​
1​
599.00​
iPad​
2​
1299.00​
Macbook Pro​
3​
جدول stores
store_name
id
North​
1​
South​
2​
دستور
SELECT * FROM products CROSS JOIN stores​
خروجی زیر را برمیگرداند که مطابق انتظار است.
IMG_20221118_020246.JPG
اما چرا عبارت
SELECT * FROM stores CROSS JOIN products​
خروجی بر خلاف انتظار تولید میکند?
IMG_20221118_021326.JPG
ترتیب سطرها باید به شکل زیر میبود:
price
product_name
id
store_name
id
699.00​
iPhone​
1​
North​
1​
599.00​
iPad​
2​
North​
1​
1299.00​
Macbook Pro​
3​
North​
1​
699.00​
iPhone​
1​
South​
2​
599.00​
iPad​
2​
South​
2​
1299.00​
Macbook Pro​
3​
South​
2​

آیا این یک باگ در mysql میباشد?
 

the_king

مدیرکل انجمن
اصولا وقتی عبارت
SELECT * FROM table1 CROSS JOIN table2​
را اجرا کنیم باید هر رکورد از جدول table1 با تمام رکوردهای جدول table2 ترکیب شده و نتیجه به عنوان خروجی نمایش داده شود.به عنوان مثال فرض کنیم دو جدول products و stores را داشته باشیم:
جدول products
price
product_name
id
699.00​
iPhone​
1​
599.00​
iPad​
2​
1299.00​
Macbook Pro​
3​
جدول stores
store_name
id
North​
1​
South​
2​
دستور
SELECT * FROM products CROSS JOIN stores​
خروجی زیر را برمیگرداند که مطابق انتظار است.
اما چرا عبارت
SELECT * FROM stores CROSS JOIN products​
خروجی بر خلاف انتظار تولید میکند?
ترتیب سطرها باید به شکل زیر میبود:
price
product_name
id
store_name
id
699.00​
iPhone​
1​
North​
1​
599.00​
iPad​
2​
North​
1​
1299.00​
Macbook Pro​
3​
North​
1​
699.00​
iPhone​
1​
South​
2​
599.00​
iPad​
2​
South​
2​
1299.00​
Macbook Pro​
3​
South​
2​

آیا این یک باگ در mysql میباشد?
نه، باگ نیست. مساله اینجا است که انتظار هیچ ترتیبی رو نباید داشته باشید. چون SELECT ئه ORDER BY نداره، این اختیار رو به MYSQL داده اید که با هر ترتیبی که بخواد خروجی بده. وقتی در یک کوئری ترتیب خاصی رو مشخص نکرده باشید سیستم مدیریت پایگاه داده میتونه کوئری رو با هر ترتیب دلخواهی که طبق الگوریتم اش راحت تر و سریعتر بدست میاد تحویل بده، حالا ممکنه اون خروجی با ترتیب دلخواه شما جور دربیاد یا درنیاد اما به هر حال در زبان SQL اگر بخواهید خروجی با ترتیب خاصی ایجاد بشه باید اون ترتیب رو مشخص کنید. اگر از ORDER BY استفاده نکنید نباید انتظار ترتیب خاصی رو داشته باشید.

MYSQL دستش باز بوده که یک سطر از stores بخونه و با همه سطر های products ترکیب کنه و ... یا برعکس یک سطر از products بخونه و با همه سطر های stores ترکیب کنه و ... فرقشون در اینه که هر سطر اولین جدول فقط یکبار خونده میشه ولی سطر های جدول دوم باید چند بار خونده بشه.

احتمالا از دید MYSQL واکشی یک سطر از products و ترکیب اش با همه سطرهای stores هزینه کمتری داره تا واکشی یک سطر از stores و ترکیب اش با همه سطر های products. چون داده یک سطر products بیشتر از یک سطر stores بوده و یکبار خوندن products بهتر از اینه که چند بار خونده بشه.
برای همین واکشی رو از products شروع کرده که داده بیشتری داره.
اما فرضا SQL Server ممکنه این مقایسه رو انجام نداده باشه و طبق انتظار شما با جدول stores شروع کنه، ولی به هر حال هیچکدوم کار اشتباهی انجام نداده اند، مادامی که ترتیب در کوئری مشخص نشده باشه هر ترتیبی قابل قبول خواهد بود و نمیشه ایرادی بهش گرفت.
 

جدیدترین ارسال ها

بالا