آموزش SQL JOIN با مثال (Inner، Left، Right، Full)
با دو جدول کوچک، کوئریهای روشن و نتیجههای دقیق، JOINهای INNER، LEFT، RIGHT، FULL، CROSS و SELF را یاد بگیرید.
- INNER JOIN: فقط ردیفهایی که در هر دو جدول مطابقت دارند.
- LEFT JOIN: همه ردیفهای جدول چپ و ردیفهای مطابق (در نبود مطابقت NULL).
- RIGHT JOIN: همه ردیفهای جدول راست و ردیفهای مطابق.
- FULL JOIN: همه ردیفهای هر دو جدول، تا جای ممکن جفتشده.
- بر اساس کلید join کنید، از نام مستعار جدول استفاده کنید و برای ستونهای join ایندکس بسازید.
پایگاههای داده واقعی همهچیز را در یک جدول نگه نمیدارند. مشتریها در یک جدولاند و سفارشها در جدول دیگر. برای پاسخ به «کدام مشتریها این ماه سفارش دادهاند؟» باید آنها را ترکیب کرد و SQL JOIN دقیقاً همین کار را میکند.
این راهنما عملی است. JOIN مبتدیها را گیج میکند، چون همان دو جدول بسته به نوع join نتیجههای متفاوتی میدهند. با دادههای کوچک و ملموس، موضوع ساده میشود.
آموزش SQL JOIN: جدولهای نمونه
customers
| id | name |
|---|---|
| 1 | Asha |
| 2 | Ben |
| 3 | Chitra |
orders
| id | customer_id | total |
|---|---|---|
| 101 | 1 | 250 |
| 102 | 1 | 120 |
| 103 | 2 | 90 |
| 104 | 9 | 40 |
Chitra هیچ سفارشی ندارد و سفارش 104 به مشتریای (9) اشاره میکند که وجود ندارد. این دو حالت مرزی تفاوت انواع join را نشان میدهند.
INNER JOIN
INNER JOIN فقط ردیفهایی را برمیگرداند که شرط در هر دو جدول برقرار باشد. ردیفهای بدون جفت حذف میشوند.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;
نتیجه: Asha (101)، Asha (102)، Ben (103). Chitra و سفارش 104 حذف میشوند. وقتی فقط دادههای مرتبط لازم است، مثل سفارشها همراه با مشخصات مشتری، از آن استفاده کنید. نوشتن JOIN بهتنهایی یعنی INNER JOIN.
LEFT JOIN
LEFT JOIN همه ردیفهای جدول چپ را نگه میدارد و ردیفهای مطابق از راست را اضافه میکند. هر جا مطابقتی نباشد، ستونهای سمت راست NULL میشوند.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
نتیجه: Asha (101)، Asha (102)، Ben (103)، Chitra (NULL, NULL). حالا Chitra دیده میشود.
نکته سریع: برای یافتن مشتریهایی که هرگز سفارش ندادهاند، سمت راست را روی NULL فیلتر کنید: WHERE o.id IS NULL مقدار Chitra را برمیگرداند. تسترها از این برای یافتن رکوردهای یتیم یا گمشده استفاده میکنند.
RIGHT JOIN و FULL JOIN
RIGHT JOIN قرینه LEFT JOIN است و همه ردیفهای جدول راست را نگه میدارد. بیشتر افراد ترتیب جدولها را عوض میکنند و از LEFT JOIN استفاده میکنند، چون خواندنش طبیعیتر است.
SELECT c.name, o.id AS order_id
FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;
نتیجه شامل سفارش 104 با نام مشتری NULL است. FULL (OUTER) JOIN همه ردیفهای هر دو جدول را برمیگرداند: Chitra بدون سفارش و سفارش 104 بدون مشتری.
SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id;
PostgreSQL و SQL Server از آن پشتیبانی میکنند. MySQL نه؛ LEFT JOIN و RIGHT JOIN را با UNION ترکیب کنید. برای مطالعه بیشتر، راهنمای PostgreSQL یک آموزش روشن درباره join دارد.
| Join | فقط ردیفهای چپ | فقط ردیفهای راست | ردیفهای مطابق |
|---|---|---|---|
| INNER | خیر | خیر | بله |
| LEFT | بله | خیر | بله |
| RIGHT | خیر | بله | بله |
| FULL | بله | بله | بله |
CROSS JOIN و SELF JOIN
CROSS JOIN هر ردیف یک جدول را با هر ردیف جدول دیگر جفت میکند: سه مشتری و چهار سفارش دوازده ردیف میدهند. کمکاربرد است، اما برای تولید ترکیبها، مثل داده آزمایشی برای هر اندازه و رنگ، مفید است.
SELECT c.name, o.id
FROM customers c
CROSS JOIN orders o;
SELF JOIN یک جدول را با خودش و با نام مستعار join میکند، مثلاً برای یافتن مدیر هر کارمند.
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
SQL JOIN: خطاهای رایج و نکتههای عملکرد
- فراموش کردن شرط ON ناخواسته CROSS JOIN میسازد و تعداد ردیفها منفجر میشود.
- فیلتر کردن جدول راست در WHERE پس از LEFT JOIN آن را به INNER JOIN تبدیل میکند؛ شرط را در ON بگذارید.
- نام ستونهای مبهم: پیش از ستونها نام مستعار جدول را بنویسید.
- join روی ستونهای غیریکتا ردیفها را چند برابر و مجموعها را متورم میکند.
- برای ستونهای join ایندکس بسازید، فقط ستونهای لازم را انتخاب کنید و کوئریهای کند را با
EXPLAINبررسی کنید.
چرا join برای تسترها مهم است
مهندسان QA از join استفاده میکنند تا بررسی کنند دادهای که از طریق رابط کاربری یا API ساخته شده درست به پایگاه داده رسیده است و رکوردهای یتیم را پیدا کنند. آن را همراه راهنمای تست API با Postman (انگلیسی) بخوانید. برای مبانی به آموزش SQL برای مبتدیها (انگلیسی) و برای ذخیرهسازهای داده جدید به پایگاه داده برداری (انگلیسی) نگاه کنید. برای اجرای محلی پایگاه داده، آموزش Docker (انگلیسی) را ببینید.
جمعبندی
SQL JOIN در یک خط: INNER فقط مطابقها را نگه میدارد، LEFT همه سمت چپ، RIGHT همه سمت راست و FULL همهچیز را. با دو جدول کوچک تمرین کنید تا بتوانید پیش از اجرای کوئری نتیجه را پیشبینی کنید؛ سپس سه جدول را join کنید و join را با GROUP BY ترکیب کنید.
پرسشهای متداول
تفاوت INNER JOIN و LEFT JOIN چیست؟
INNER JOIN فقط ردیفهای مطابق در هر دو جدول را برمیگرداند. LEFT JOIN همه ردیفهای جدول چپ را برمیگرداند و ستونهای راستِ بدون مطابقت را با NULL پر میکند.
کدام SQL JOIN سریعتر است؟
هیچ نوعی همیشه سریعترین نیست. عملکرد به ایندکسها، اندازه جدولها و طرح اجرا بستگی دارد. برای ستونهای join ایندکس بسازید و طرح اجرا را بررسی کنید.
آیا MySQL از FULL OUTER JOIN پشتیبانی میکند؟
خیر. در MySQL برای گرفتن همان نتیجه، LEFT JOIN و RIGHT JOIN را با UNION ترکیب کنید.
SELF JOIN برای چه کاری است؟
SELF JOIN ردیفهای یک جدول را با هم مقایسه میکند، مثلاً یافتن مدیر هر کارمند در یک جدول employees.
چرا join من ردیفهای تکراری برمیگرداند؟
تکراریها وقتی ایجاد میشوند که ستون join در یکی از جدولها یکتا نباشد. کلیدهایتان را بررسی کنید یا پیش از join دادهها را تجمیع کنید.
به یادگیری ادامه دهید (مقالههای انگلیسی)
در تست، WordPress یا SEO کمک میخواهید؟
ما به تیمها کمک میکنیم نرمافزار بهتری ارائه دهند و سایتهایشان را رشد دهند. بگویید روی چه کاری کار میکنید تا گام بعدی را پیشنهاد دهیم.