فصل بیست و چهارم :
JOINS در SQLite
عبارت Join برای ترکیب کردن رکورد های 2 و یا چند جدول در دیتابیس بکار میرود.فرض کنید بخواهید لیستی داشته باشید که 2 ستون ان از جدولی باشند و 3 ستون دیگر ان ددر جدولی دیگر . برای اینکار باد جداولی که میخواهم بروی انها join بزنیم عامل مشترکی بین خود داشته باشند. مثلا کلید اصلی یک جدول را در جدول دیگر ذخیره کرده باشیم.
SQLite از سه نوع اصلی join پشتیبانی میکند:
-
The CROSS JOIN
-
The INNER JOIN
-
The OUTER JOIN
قبل ازاینکه ادامه بدهیم جدول COMPANY را بخاطر بیاورید که حاوی رکورد های ذیل بود
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
و رکورد های ذیل را در ان ذخیره میکنیم:
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );
پس این جدول حاوی رکورد های ذیل خواهد بود:
ID DEPT EMP_ID
---------- ---------- ----------
1 IT Billing 1
2 Engineerin 2
3 Finance 7
The CROSS JOIN
حاصل این join در واقع ضرب کارتزین رکورد های دو جدول در هم است. این join تمامی سطر های جدول اول را با تمامی سطر های جدول دوم ترکیب میکند اگر جدول اول x تا رکورد داشته باشد و جدول دوم y تا رکورد ، نتیجه cross join بین این دو جدول جدولی خواهد بود با x*y رکورد. چون این نوع join نتایج بسیار بزرگی را تولید میکند لذا بایستی با احتیاط از ان استفاده کرد.
SELECT ... FROM table1 CROSS JOIN table2 ...
و با توجه به دو جدول موجود ما می شود :
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
که نتیجه ان معادل است با :
EMP_ID NAME DEPT
---------- ---------- ----------
1 Paul IT Billing
2 Paul Engineerin
7 Paul Finance
1 Allen IT Billing
2 Allen Engineerin
7 Allen Finance
1 Teddy IT Billing
2 Teddy Engineerin
7 Teddy Finance
1 Mark IT Billing
2 Mark Engineerin
7 Mark Finance
1 David IT Billing
2 David Engineerin
7 David Finance
1 Kim IT Billing
2 Kim Engineerin
7 Kim Finance
1 James IT Billing
2 James Engineerin
7 James Finance
The INNER JOIN
در نتیجه این نوع join جدولی حاصل میشود که رکورد های ان ترکیبی از ستونهای دو و یا چند جدول بوده بشرطی که عامل ارتباط دهنده بین رکورد های دو یا چند جدول باهم برابر باشند .
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
در قسمت conditional expression شرطی را مشخص میکینمی که فصل مشترک دو جدول ویا همان عامل ارتباط دهنده دو جدول است.
فرض کنید می خواهیم دو جدول table1 و Table2 را با هم inner join بزنیم . در هنگام اجرا کوئری ما هر سطر دول 1 را با هر سطر جدول 2 مقایسه میکند و اگر ان شرطی که در conditional expression مشخص کردیم در هر دو تامین شد انگاه ان سطر ها باهم ترکیب شده و در نتیجه join ظاهر خواهند شد.
مثال ذیل را ببنیید موضوع واضح تر میشود.
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
نتیجه :
EMP_ID NAME DEPT
---------- ---------- ----------
1 Paul IT Billing
2 Allen Engineerin
7 James Finance
یعنی دو جدول COMPANY و DEPARTMENT را با هم join بزن و اگر سطری را در دو جدول پیدا کردی که مقدار ستون ID از جدول COMPANY با مقدار ستون EMP_ID از جدول DEPARTMENT با هم برابر بودند. از آن دو سطر فیلد های emp_id و DEPT را از جدول DEPARTMENT و فیلدNAME را از جدول COMPANY با هم ترکیب کن و تک تک سطر های نتیجه رو بساز.
برای جلوگیری از تایپ اقلام تکراری و در نتیجه parse سریعتر می توان از عبارت using استفاده کرد
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
و لیست ستونهایی که باید باهم مقایسه شوند را در آن براحتی نوشت.
NATURAL JOIN
هم مانند join و using هست و تفاوت ان در این است که بطور اتوماتیک مساوی بودن مقادیر تک تک ستونهای دو جدول را با هم بررسی میکند .
SELECT ... FROM table1 NATURAL JOIN table2...
The OUTER JOIN
این نوع join در واقع برگرفته ار inner join می باشد. در اس کیوال استاندارد سه نوع outer join وجود دارد که عبارتند از LEFT و RIGHT و FULL ولیکن SQLite تنها از LEFT OUTER JOIN پشتیبانی میکند.
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
تمای رکورد های جدول 1 را لیست میکند و از جدول 2 تنها رکورد هایی را می آورد که conditional_expression در آنها صدق کند
عبارت using در این نوع join نیز کاربرد دارد
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...
مثال :
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
EMP_ID NAME DEPT
---------- ---------- ----------
1 Paul IT Billing
2 Allen Engineerin
Teddy
Mark
David
Kim
7 James Finance
تفاوت را با نتیجه inner join مقایسه کنید .
مفاهیم و موضوعات این فصل عبارتند از :
-
CROSS JOIN در SQLite
-
INNER JOIN در SQLite
-
OUTER JOIN در SQLite