آموزش دستور inner join در sql (به زبان ساده)
در این مطلب به زبان ساده این موضوع را یاد می گیرید اما ابتدا بطور خلاصه و با یک مثال آن را توضیح می دهیم و سپس توضیحات کامل با جزئیات بیشتر:
پاسخ مختصر و خلاصه
دستور INNER JOIN در SQL برای ترکیب ردیفهایی از دو جدول مختلف استفاده میشود که بر اساس یک شرط مشترک به هم پیوند داده میشوند. به زبان ساده، INNER JOIN ردیفهایی را که در هر دو جدول دارای مقادیر مشترک هستند، ترکیب میکند.
برای درک بهتر، فرض کنید دو جدول زیر را داریم:
جدول دانشجویان (Students)
StudentID | StudentName |
---|---|
1 | علی |
2 | زهرا |
3 | رضا |
4 | ندا |
جدول نمرات (Grades)
GradeID | StudentID | Grade |
---|---|---|
1 | 1 | A |
2 | 2 | B |
3 | 1 | C |
4 | 3 | B |
در اینجا، ستون StudentID در هر دو جدول وجود دارد و میتوانیم از آن برای پیوند دادن این دو جدول استفاده کنیم.
سینتکس INNER JOIN
سینتکس پایهای INNER JOIN به صورت زیر است:
SELECT ستونها
FROM جدول1
INNER JOIN جدول2
ON جدول1.ستون مشترک = جدول2.ستون مشترک;
مثال عملی
حالا میخواهیم نام دانشجویان و نمراتشان را با استفاده از INNER JOIN به دست آوریم:
SELECT Students.StudentName, Grades.Grade
FROM Students
INNER JOIN Grades
ON Students.StudentID = Grades.StudentID;
نتیجه اجرای این کوئری به شکل زیر خواهد بود:
StudentName | Grade |
---|---|
علی | A |
علی | C |
زهرا | B |
رضا | B |
توضیحات
SELECT Students.StudentName, Grades.Grade
: این قسمت انتخاب میکند که کدام ستونها را میخواهیم در خروجی ببینیم.FROM Students
: این قسمت مشخص میکند که جدول اصلی ما که میخواهیم از آن شروع کنیم، کدام است.INNER JOIN Grades
: این قسمت مشخص میکند که میخواهیم جدول نمرات را با جدول دانشجویان پیوند دهیم.ON Students.StudentID = Grades.StudentID
: این قسمت شرط پیوند را مشخص میکند، یعنی ردیفها بر اساس StudentIDهای مشترک ترکیب میشوند.
نکات اضافی
- اگر در هر دو جدول ردیفی با مقدار StudentID یکسان وجود نداشته باشد، آن ردیفها در نتیجه ظاهر نخواهند شد.
- INNER JOIN فقط ردیفهایی را بازمیگرداند که در هر دو جدول شرط پیوند را برآورده میکنند.
این توضیح سادهای از دستور INNER JOIN بود. امیدوارم کمک کرده باشد! در ادامه بطور کامل این دستور کاربردی و مهم را یاد می گیرید:
توضیحات کامل
SQL مخفف عبارت Structured Query Language به معنای زبان پرس و جو ساختاریافته است. SQL یک زبان پایگاه داده استاندارد برای ایجاد، نگهداری و بازیابی داده ها از پایگاه داده های رابطه ای مانند MySQL، Oracle و … می باشد.
join ترکیبی از حاصلضرب های دکارتی دو جدول را به دست آورده و سپس فرآیند انتخاب انجام می شود. در واقع در SQL از دستور join برای مقایسه و ترکیب و در نهایت برگرداندن ردیف هایی از دو یا چند جدول (بر اساس شرایط خاصی) استفاده می شود. Inner Join تفاوتی با join ندارد و از نظر خروجی و عملکرد مشابه هستند.
در این آموزش ابتدا درباره Inner Join در MySQL و سپسSQL Server بحث خواهیم کرد.
در کنار این مطلب حتما دانلود کنید: دانلود رایگان آموزش کامل sql (فیلم+جزوه pdf)
مراحل پیاده سازی Inner Join در MySQL
مرحله 1: ایجاد پایگاه داده
یک پایگاه داده به نام geeks با دستور CREATE با کد زیر ایجاد می کنیم.
CREATE DATABASE geeks;
مرحله 2: استفاده از پایگاه داده
دستور USE را برای انتخاب پایگاه داده و کار با آن می تویسیم.
USE geeks;
مرحله 3: اضافه کردن جدول ها
2 جدول با ویژگی های زیر به پایگاه داده اضافه می کنیم:
1- جدول اول برای مشخصات استاد با نام professor است که حاوی شناسه استاد، نام استاد و حقوق خواهد بود.
2- جدول دوم برای دروس با نام teaches است که شامل شناسه درس، شناسه استاد و نام درس است. شناسه استاد در جدول teaches کلید خارجی محسوب می شود.
با استفاده از کدهای زیر این جدول ها را به پایگاه داده انتخاب شده اضافه می کنیم:
جدول professor:
CREATE TABLE professor(
ID int,
Name varchar(20),
Salary int
);
جدول teaches:
CREATE TABLE teaches(
course_id int,
prof_id int,
course_name varchar(20)
);
مرحله 4: شرح جدول ها
می توانیم برای اطمینان از ساخت صحیح جدول ها، شرح هر جدول را با استفاده از دستور DESCRIBE در SQL به دست آوریم.
جدول professor:
DESCRIBE professor
خروجی
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
ID |
int |
YES | NULL | ||
Name |
varchar(20) |
YES | NULL | ||
Salary |
int |
YES | NULL |
جدول teaches:
DESCRIBE teaches
خروجی
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
course_id |
int |
YES | NULL | ||
prof_id |
int |
YES | NULL | ||
course_name |
varchar(20) |
YES | NULL |
مرحله 5: اضافه کردن ردیف ها
با استفاده از دستور INSERT ردیف های داده را به ترتیب زیر در دو جدول وارد می کنیم.
اضافه کردن ردیف های جدول professor:
INSERT INTO professor VALUES (1, ‘Rohan’, 57000);
INSERT INTO professor VALUES (2, ‘Aryan’, 45000);
INSERT INTO professor VALUES (3, ‘Arpit’, 60000);
INSERT INTO professor VALUES (4, ‘Harsh’, 50000);
INSERT INTO professor VALUES (5, ‘Tara’, 55000);
خروجی
اضافه کردن ردیف های جدول teaches:
INSERT INTO teaches VALUES (1, 1, ‘English’);
INSERT INTO teaches VALUES (1, 3, ‘Physics’);
INSERT INTO teaches VALUES (2, 4, ‘Chemistry’);
INSERT INTO teaches VALUES (2, 5, ‘Mathematics’);
خروجی
مرحله 6: وضعیت فعلی جدول ها
برای اطمینان از داده های ورودی جدول و تأیید آنها از دستور SELECT برای انتخاب همه داده های جدول استفاده می کنیم.
جدول professor:
SELECT * FROM professor;
خروجی
ID | Name | Salary |
---|---|---|
1 | Rohan | 57000 |
2 | Aryan | 45000 |
3 | Arpit | 60000 |
4 | Harsh | 50000 |
5 | Tara | 55000 |
جدول teaches:
SELECT * FROM teaches;
خروجی
course_id | prof_id | course_name |
---|---|---|
1 | 1 | English |
1 | 3 | Physics |
2 | 4 | Chemistry |
2 | 5 | Mathematics |
مرحله 7: دستور INNER JOIN
با استفاده از Inner Join می توانیم اطلاعات موجود در دو جدول را بر اساس یک (یا چند) شرط ترکیب کنیم.
ساختار کلی:
SELECT comma_separated_column_names
FROM table1 INNER JOIN table2 ON condition
بعد از SELECT نام ستون های مورد نظر از جدول ها نوشته شده و با کاما از یکدیگر جدا می شوند.
در قسمت های table1 و table2 به ترتیب نام جدول اول و دوم نوشته می شود.
قسمت condition نیز برای نوشن شرایط است. از این قسمت برای ارتباط بین جدول ها استفاده می شود.
مثال زیر را در نظر بگیرید:
SELECT teaches.course_id, teaches.prof_id, professor.Name, professor.Salary
FROM professor INNER JOIN teaches ON professor.ID = teaches.prof_id;
ستون های teaches.course_id و teaches.prof_id از جدول درس و ستون های professor.Name و professor.Salary از جدول استاد براساس شرط professor.ID = teaches.prof_id انتخاب می شوند.
خروجی
دستور Inner Join حاصلضرب دکارتی دو جدول را به دست آورده سپس ردیف هایی از ستون های مشخص شده که شرط در آنها برقرار است را به عنوان نتیجه برمی گرداند و سایر ردیف ها که شرایط لازم را برآورده نمی کنند در جدول نتیجه جایی ندارند.
course_id | prof_id | Name | Salary |
---|---|---|---|
1 | 1 | Rohan | 57000 |
1 | 3 | Arpit | 60000 |
2 | 4 | Harsh | 50000 |
2 | 5 | Tara | 55000 |
Inner Join در SQL Server
در تصویر زیر ساختار Inner Join در SQL Server برای دو جدول نشان داده شده است. در اینجا نیز می توانید از Inner Join یا JOIN برای اجرای Inner Join استفاده کنید. اگر فقط از کلمه کلیدی JOIN استفاده می کنید، نتیجه همان Inner JOIN را در SQL Server برمی گرداند.
چه زمانی از Inner JOIN در SQL Server استفاده می کنیم؟
اگر می خواهید تمام ردیف های جدول چپ را انتخاب کنید که مقدار کلید خارجی آنها غیر تهی است بنابراین باید از Inner Join استفاده کنید. به طور ساده تر همانطور که گفتیم برای بازیابی ستون های مشخص از هر دو جدول که شرط (ها) در ردیف متناظر آنها برقرار است باید از Inner Join استفاده کنید.
نحوه اجرای Inner Join در SQL Server
نحوه اجرای Inner Join در SQL Server را با یک مثال توضیح می دهیم. فرض می کنیم پایگاه داده ساخته شده و حالا دو جدول با نام های Company و Candidate می سازیم و ردیف های داده زیر را در آنها وارد خواهیم کرد.
جدول Company دو ستون به نام های CompanyId و CompanyName دارد و جدول Candidate حاوی سه ستون CandidateId، FullName و CompanyId است که CompanyId کلید خارجی آن محسوب می شود.
CREATE TABLE Company
پایگاه داده SQL Server رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی بلافاصله ... دانلود:
(
CompanyId TinyInt Identity Primary Key,
CompanyName Nvarchar(50) NULL
)
GO
INSERT Company VALUES(‘DELL’)
INSERT Company VALUES(‘HP’)
INSERT Company VALUES(‘IBM’)
INSERT Company VALUES(‘Microsoft’)
GO
CREATE TABLE Candidate
(
CandidateId tinyint identity primary key,
FullName nvarchar(50) NULL,
CompanyId tinyint REFERENCES Company(CompanyId)
)
GO
INSERT Candidate VALUES(‘Ron’,1)
INSERT Candidate VALUES(‘Pete’,2)
INSERT Candidate VALUES(‘Steve’,3)
INSERT Candidate VALUES(‘Steve’,NULL)
INSERT Candidate VALUES(‘Ravi’,1)
INSERT Candidate VALUES(‘Raj’,3)
INSERT Candidate VALUES(‘Kiran’,NULL)
GO
حالا می خواهیم برای بازیابی داده ها از ستون های CandidateId، FullName، CompanyId و CompanyName از دو جدول یک کوئری بنویسیم. خروجی کوئری باید مطابق زیر باشد.
برای به دست آوردن نتایج تصویر بالا از Inner Join به شکل زیر استفاده می کنیم:
SELECT Cand.CandidateId,
Cand.FullName,
Cand.CompanyId,
Comp.CompanyName
FROM Candidate Cand
INNER JOIN Company Comp
ON Cand.CompanyId = Comp.CompanyId;
خروجی کوئری بالا 5 ردیف دارد. 2 ردیف در ستون CompanyId در جدول Candidate با مقدار NULL حذف شده اند.
به جای کلمه کلیدی INNER JOIN می توانیم از JOIN همانند زیر استفاده کنیم. JOIN و INNER JOIN مشابه هستند اما همیشه بهتر است از INNER JOIN استفاده کنید زیرا به طور صریح هدف شما را مشخص می کند.
SELECT Cand.CandidateId,
Cand.FullName,
Cand.CompanyId,
Comp.CompanyName
FROM Candidate Cand
JOIN Company Comp
ON Cand.CompanyId = Comp.CompanyId
استفاده از INNER JOIN برای سه جدول در SQL Server:
در اینجا نحوه استفاده از INNER JOIN برای سه جدول را بررسی می کنیم. جدول سوم Address را به دو جدول قبلی در پایگاه داده اضافه می کنیم.
برای ایجاد و پر کردن جدول Address از اسکریپت SQL زیر استفاده می کنیم.
CREATE TABLE Address
(
AddressId INT IDENTITY PRIMARY KEY,
CandidateId tinyint REFERENCES Company(CompanyId),
Country VARCHAR(50),
State VARCHAR(50),
City VARCHAR(50),
)
GO
INSERT INTO Address Values (1, ‘India’, ‘Odisha’, ‘BBSR’);
INSERT INTO Address Values (2, ‘India’, ‘Maharashtra’, ‘Mumbai’);
INSERT INTO Address Values (3, ‘India’, ‘Maharashtra’, ‘Pune’);
INSERT INTO Address Values (4, ‘India’, ‘Odisha’, ‘Cuttack’);
GO
ساختار کلی Inner Join برای سه جدول در SQL Server به فرم زیر است:
در این مثال پیوند سه جدول در SQL Server به شکل زیر نوشته می شود:
SELECT Cand.CandidateId,
Cand.FullName,
Cand.CompanyId,
Comp.CompanyName,
Addr.Country,
Addr.State,
Addr.City
FROM Candidate Cand
ON Cand.CompanyId = Comp.CompanyId
INNER JOIN Address Addr
ON Addr.CandidateId = Cand.CandidateId;
با اجرای کوئری بالا خروجی زیر را دریافت خواهید کرد. فقط سه رکورد به دست آمده است، زیرا هر سه رکورد در هر سه جدول وجود دارد.
علاوه بر این می توانید برای پیوند سه جدول از انواع مختلف Join استفاده کنید. به عنوان مثال در کوئری زیر برای پیوند اول بین جدول های Candidate و Company از Inner JOIN و برای پیوند دوم بین جدوهای Candidate و Address از LEFT JOIN استفاده کرده ایم.
SELECT Cand.CandidateId,
Cand.FullName,
Cand.CompanyId,
Comp.CompanyName,
Addr.Country,
Addr.State,
Addr.City
FROM Candidate Cand
INNER JOIN Company Comp
ON Cand.CompanyId = Comp.CompanyId
LEFT JOIN Address Addr
ON Addr.CandidateId = Cand.CandidateId;
خروجی
حتما دانلود کنید: آموزش پایگاه داده از صفر تا صد با 23 درس رایگان+ جزوه PDF