ضرب دکارتی Cartesian در SQL

ضرب دکارتی (Cartesian Product) در SQL زمانی اتفاق می‌افتد که دو جدول بدون هیچ شرطی (بدون استفاده از WHERE یا JOIN) با هم ترکیب شوند. در این حالت، هر سطر از جدول اول با هر سطر از جدول دوم ترکیب می‌شود و نتیجه تعداد سطرهای جدول اول ضرب در تعداد سطرهای جدول دوم خواهد بود.

مثال:

فرض کنید دو جدول به نام‌های A و B داریم:

جدول A:

idname
1Ali
2Reza

جدول B:

idcity
1Tehran
2Mashhad

اگر بخواهیم ضرب دکارتی این دو جدول را انجام دهیم، کوئری SQL به صورت زیر خواهد بود:

SELECT * FROM A, B;

یا به صورت مدرن‌تر:

SELECT * FROM A CROSS JOIN B;

نتیجه:

idnameidcity
1Ali1Tehran
1Ali2Mashhad
2Reza1Tehran
2Reza2Mashhad

نکات مهم:

  1. تعداد سطرهای نتیجه: تعداد سطرهای نتیجه برابر است با تعداد سطرهای جدول اول ضرب در تعداد سطرهای جدول دوم. در مثال بالا، ۲ سطر در جدول A و ۲ سطر در جدول B داریم، بنابراین نتیجه ۴ سطر خواهد داشت.
  2. کاربرد: ضرب دکارتی معمولاً زمانی استفاده می‌شود که نیاز داریم تمام ترکیب‌های ممکن بین سطرهای دو جدول را ایجاد کنیم. با این حال، در بسیاری از موارد، استفاده از JOIN با شرط مناسب بهتر است تا از ایجاد نتایج ناخواسته جلوگیری شود.
  3. هزینه محاسباتی: ضرب دکارتی می‌تواند بسیار پرهزینه باشد، به خصوص اگر جداول بزرگ باشند، زیرا تعداد سطرهای نتیجه به سرعت افزایش می‌یابد.

مثال با CROSS JOIN:

SELECT * FROM A CROSS JOIN B;

این کوئری همان نتیجه قبلی را تولید می‌کند، اما استفاده از CROSS JOIN واضح‌تر است و نشان می‌دهد که قصد انجام ضرب دکارتی دارید.

توضیحات بیشتر راجع به ضرب کارتزین

در اینجا توضیحات بیشتری درباره ضرب دکارتی (Cartesian Product) در SQL ارائه می‌دهم تا مفهوم آن را بهتر درک کنید.


ضرب دکارتی چیست؟

ضرب دکارتی یک عمل ریاضی است که در آن هر عضو از یک مجموعه با هر عضو از مجموعه دیگر ترکیب می‌شود. در پایگاه داده و SQL، این مفهوم زمانی اتفاق می‌افتد که دو جدول بدون هیچ شرطی (WHERE یا JOIN) با هم ترکیب شوند. نتیجه این عمل، ترکیب هر سطر از جدول اول با هر سطر از جدول دوم است.


مثال ساده

فرض کنید دو جدول داریم:

جدول A (کاربران):

idname
1Ali
2Reza

جدول B (شهرها):

idcity
1Tehran
2Mashhad

اگر ضرب دکارتی این دو جدول را انجام دهیم، کوئری SQL به صورت زیر خواهد بود:

SELECT * FROM A, B;

یا به صورت مدرن‌تر:

SELECT * FROM A CROSS JOIN B;

نتیجه ضرب دکارتی

نتیجه این کوئری به صورت زیر خواهد بود:

idnameidcity
1Ali1Tehran
1Ali2Mashhad
2Reza1Tehran
2Reza2Mashhad

تعداد سطرهای نتیجه

تعداد سطرهای حاصل از ضرب دکارتی برابر است با تعداد سطرهای جدول اول × تعداد سطرهای جدول دوم.
در مثال بالا:

  • جدول A دارای ۲ سطر است.
  • جدول B دارای ۲ سطر است.
  • بنابراین، نتیجه ضرب دکارتی دارای ۲ × ۲ = ۴ سطر خواهد بود.

کاربرد ضرب دکارتی

ضرب دکارتی در SQL معمولاً در موارد زیر استفاده می‌شود:

  1. ایجاد تمام ترکیب‌های ممکن: زمانی که نیاز دارید تمام ترکیب‌های ممکن بین سطرهای دو جدول را ایجاد کنید.
  2. تولید داده‌های تست: برای ایجاد داده‌های تستی با ترکیب‌های مختلف.
  3. محاسبات ماتریسی: در برخی موارد، ضرب دکارتی برای انجام محاسبات ماتریسی یا ترکیب داده‌ها استفاده می‌شود.

مثال کاربردی

فرض کنید می‌خواهید تمام ترکیب‌های ممکن بین کاربران و شهرها را ایجاد کنید تا ببینید هر کاربر می‌تواند در کدام شهرها باشد. در این حالت، ضرب دکارتی مفید است.

SELECT A.name, B.city
FROM A
CROSS JOIN B;

نتیجه:

namecity
AliTehran
AliMashhad
RezaTehran
RezaMashhad

هزینه محاسباتی ضرب دکارتی

ضرب دکارتی می‌تواند بسیار پرهزینه باشد، به خصوص اگر جداول بزرگ باشند. زیرا:

  • تعداد سطرهای نتیجه به سرعت افزایش می‌یابد.
  • اگر جدول اول ۱۰۰۰ سطر و جدول دوم ۱۰۰۰ سطر داشته باشد، نتیجه ۱,۰۰۰,۰۰۰ سطر خواهد داشت!
  • بنابراین، استفاده از ضرب دکارتی باید با دقت انجام شود.

تفاوت ضرب دکارتی با JOIN

  • ضرب دکارتی: هیچ شرطی برای ترکیب سطرها وجود ندارد. هر سطر از جدول اول با هر سطر از جدول دوم ترکیب می‌شود.
  • JOIN: معمولاً با یک شرط (ON یا WHERE) انجام می‌شود و فقط سطرهایی که شرط را برآورده می‌کنند، ترکیب می‌شوند.

مثال با INNER JOIN:

SELECT A.name, B.city
FROM A
INNER JOIN B ON A.id = B.id;

در این حالت، فقط سطرهایی که id آنها در دو جدول یکسان است، ترکیب می‌شوند.


جمع‌بندی

  • ضرب دکارتی هر سطر از یک جدول را با هر سطر از جدول دیگر ترکیب می‌کند.
  • تعداد سطرهای نتیجه برابر است با تعداد سطرهای جدول اول × تعداد سطرهای جدول دوم.
  • از ضرب دکارتی برای ایجاد تمام ترکیب‌های ممکن استفاده می‌شود.
  • استفاده از آن باید با دقت انجام شود، زیرا می‌تواند منجر به نتایج بسیار بزرگ و پرهزینه شود.

دیدگاه شما

نشانی ایمیل شما منتشر نخواهد شد.