PostgreSQL - JOINS
PostgreSQL Joinsyan tümcesi, bir veritabanındaki iki veya daha fazla tablodaki kayıtları birleştirmek için kullanılır. BİRLEŞTİRME, her biri için ortak olan değerleri kullanarak iki tablodan alanları birleştirmek için bir araçtır.
PostgreSQL'deki Birleştirme Türleri -
- CROSS JOIN
- İÇ BİRLEŞTİRME
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- TAM DIŞ KATILIM
Devam etmeden önce iki tabloyu, ŞİRKET ve BÖLÜMÜ ele alalım. COMPANY tablosunu doldurmak için INSERT ifadeleri gördük. Öyleyse, COMPANY tablosunda bulunan kayıtların listesini varsayalım -
id | name | age | address | salary | join_date
----+-------+-----+-----------+--------+-----------
1 | Paul | 32 | California| 20000 | 2001-07-13
3 | Teddy | 23 | Norway | 20000 |
4 | Mark | 25 | Rich-Mond | 65000 | 2007-12-13
5 | David | 27 | Texas | 85000 | 2007-12-13
2 | Allen | 25 | Texas | | 2007-12-13
8 | Paul | 24 | Houston | 20000 | 2005-07-13
9 | James | 44 | Norway | 5000 | 2005-07-13
10 | James | 45 | Texas | 5000 | 2005-07-13
Başka bir tablo DEPARTMENT, aşağıdaki tanıma sahip -
CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
DEPARTMENT tablosunu doldurmak için INSERT deyimlerinin listesi aşağıdadır -
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 );
Son olarak, DEPARTMENT tablosunda bulunan aşağıdaki kayıtların listesine sahibiz -
id | dept | emp_id
----+-------------+--------
1 | IT Billing | 1
2 | Engineering | 2
3 | Finance | 7
CROSS JOIN
CROSS JOIN, ilk tablonun her satırını ikinci tablonun her satırıyla eşleştirir. Giriş tablolarında sırasıyla x ve y sütunları varsa, ortaya çıkan tablonun x + y sütunları olacaktır. CROSS JOIN'lerin çok büyük tablolar oluşturma potansiyeli olduğundan, bunları yalnızca uygun olduğunda kullanmaya özen gösterilmelidir.
Aşağıdaki CROSS JOIN sözdizimidir -
SELECT ... FROM table1 CROSS JOIN table2 ...
Yukarıdaki tablolara dayanarak aşağıdaki gibi bir CROSS JOIN yazabiliriz -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
Yukarıda verilen sorgu aşağıdaki sonucu verecektir -
emp_id| name | dept
------|-------|--------------
1 | Paul | IT Billing
1 | Teddy | IT Billing
1 | Mark | IT Billing
1 | David | IT Billing
1 | Allen | IT Billing
1 | Paul | IT Billing
1 | James | IT Billing
1 | James | IT Billing
2 | Paul | Engineering
2 | Teddy | Engineering
2 | Mark | Engineering
2 | David | Engineering
2 | Allen | Engineering
2 | Paul | Engineering
2 | James | Engineering
2 | James | Engineering
7 | Paul | Finance
7 | Teddy | Finance
7 | Mark | Finance
7 | David | Finance
7 | Allen | Finance
7 | Paul | Finance
7 | James | Finance
7 | James | Finance
İÇ BİRLEŞTİRME
Bir INNER JOIN, iki tablonun sütun değerlerini (tablo1 ve tablo2) birleştirme koşuluna göre birleştirerek yeni bir sonuç tablosu oluşturur. Sorgu, birleştirme koşulunu karşılayan tüm satır çiftlerini bulmak için tablo1'in her satırını her tablo2 satırıyla karşılaştırır. Birleştirme koşulu karşılandığında, eşleşen her tablo1 ve tablo2 satır çifti için sütun değerleri bir sonuç satırında birleştirilir.
INNER JOIN, en yaygın birleştirme türüdür ve varsayılan birleştirme türüdür. INNER anahtar kelimesini isteğe bağlı olarak kullanabilirsiniz.
INNER JOIN sözdizimi aşağıdadır -
SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;
Yukarıdaki tablolara dayanarak, aşağıdaki gibi bir INNER JOIN yazabiliriz -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Yukarıda verilen sorgu aşağıdaki sonucu verecektir -
emp_id | name | dept
--------+-------+------------
1 | Paul | IT Billing
2 | Allen | Engineering
LEFT OUTER JOIN
OUTER JOIN, INNER JOIN'in bir uzantısıdır. SQL standardı üç tip OUTER JOIN tanımlar: LEFT, RIGHT ve FULL ve PostgreSQL bunların hepsini destekler.
LEFT OUTER JOIN durumunda, önce bir iç birleştirme gerçekleştirilir. Daha sonra, T1 tablosundaki T2 tablosundaki herhangi bir satırla birleştirme koşulunu karşılamayan her satır için, T2'nin sütunlarına boş değerlerle birleştirilmiş bir satır eklenir. Böylece, birleştirilmiş tablo her zaman T1'deki her satır için en az bir satıra sahiptir.
Aşağıda LEFT OUTER JOIN'in sözdizimi verilmiştir -
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
Yukarıdaki tablolara dayanarak, aşağıdaki gibi bir iç birleşim yazabiliriz -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Yukarıda verilen sorgu aşağıdaki sonucu verecektir -
emp_id | name | dept
--------+-------+------------
1 | Paul | IT Billing
2 | Allen | Engineering
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |
RIGHT OUTER JOIN
İlk olarak, bir iç birleştirme gerçekleştirilir. Daha sonra, T1 tablosundaki herhangi bir satırla birleştirme koşulunu karşılamayan tablo T2'deki her satır için, T1 sütunlarına boş değerlerle birleştirilmiş bir satır eklenir. Bu, bir sol birleşmenin tersidir; sonuç tablosunda her zaman T2'deki her satır için bir satır bulunur.
Aşağıdaki sözdizimi RIGHT OUTER JOIN -
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
Yukarıdaki tablolara dayanarak, aşağıdaki gibi bir iç birleşim yazabiliriz -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Yukarıda verilen sorgu aşağıdaki sonucu verecektir -
emp_id | name | dept
--------+-------+--------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | | Finance
TAM DIŞ KATILIM
İlk olarak, bir iç birleştirme gerçekleştirilir. Daha sonra, T1 tablosundaki T2 tablosundaki herhangi bir satırla birleştirme koşulunu karşılamayan her satır için, T2'nin sütunlarına boş değerlerle birleştirilmiş bir satır eklenir. Ek olarak, T1'deki herhangi bir satırla birleştirme koşulunu karşılamayan her T2 satırı için, T1 sütunlarında boş değerlere sahip bir birleştirilmiş satır eklenir.
FULL OUTER JOIN'in sözdizimi aşağıdadır -
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
Yukarıdaki tablolara dayanarak, aşağıdaki gibi bir iç birleşim yazabiliriz -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Yukarıda verilen sorgu aşağıdaki sonucu verecektir -
emp_id | name | dept
--------+-------+---------------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | | Finance
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |