×

JOINS در SQLite

فصل بیست و چهارم :

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

vatantop
نظرات و سوالات درج سوال/ نظر