PostgreSQL - เข้าร่วม
PostgreSQL Joinsอนุประโยคใช้เพื่อรวมระเบียนจากตารางสองตารางขึ้นไปในฐานข้อมูล JOIN เป็นวิธีการรวมฟิลด์จากสองตารางโดยใช้ค่าร่วมกันสำหรับแต่ละตาราง
ประเภทการเข้าร่วมใน PostgreSQL คือ -
- CROSS เข้าร่วม
- การเข้าร่วมภายใน
- ด้านซ้ายเข้าร่วม
- เข้าร่วมด้านนอกที่ถูกต้อง
- เข้าร่วมเต็มรูปแบบภายนอก
ก่อนที่เราจะดำเนินการต่อขอให้เราพิจารณาตารางสองตาราง บริษัท และแผนก เราได้เห็นคำสั่ง INSERT เพื่อเติมข้อมูลตาราง COMPANY แล้ว ดังนั้นให้เราถือว่ารายการบันทึกที่มีอยู่ในตาราง COMPANY -
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
ตารางอื่นคือ DEPARTMENT มีคำจำกัดความดังต่อไปนี้ -
CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
นี่คือรายการคำสั่ง INSERT เพื่อเติมข้อมูลตาราง DEPARTMENT -
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 );
ในที่สุดเรามีรายการบันทึกต่อไปนี้ในตาราง DEPARTMENT -
id | dept | emp_id
----+-------------+--------
1 | IT Billing | 1
2 | Engineering | 2
3 | Finance | 7
CROSS เข้าร่วม
CROSS JOIN จะจับคู่ทุกแถวของตารางแรกกับทุกแถวของตารางที่สอง หากตารางอินพุตมีคอลัมน์ x และ y ตามลำดับตารางผลลัพธ์จะมีคอลัมน์ x + y เนื่องจาก CROSS JOINs มีศักยภาพในการสร้างตารางขนาดใหญ่มากจึงต้องใช้ความระมัดระวังในการใช้งานเมื่อเหมาะสมเท่านั้น
ต่อไปนี้เป็นไวยากรณ์ของ CROSS JOIN -
SELECT ... FROM table1 CROSS JOIN table2 ...
จากตารางด้านบนเราสามารถเขียน CROSS JOIN ได้ดังนี้ -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
แบบสอบถามที่ระบุข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -
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
การเข้าร่วมภายใน
INNER JOIN สร้างตารางผลลัพธ์ใหม่โดยการรวมค่าคอลัมน์ของสองตาราง (table1 และ table2) โดยยึดตามเพรดิเคตเข้าร่วม แบบสอบถามเปรียบเทียบแต่ละแถวของ table1 กับแต่ละแถวของ table2 เพื่อค้นหาคู่ของแถวทั้งหมดซึ่งตรงตามเงื่อนไขการรวม เมื่อเข้าร่วมเพรดิเคตเป็นที่พอใจแล้วค่าของคอลัมน์สำหรับแต่ละคู่ของแถวของ table1 และ table2 ที่ตรงกันจะรวมกันเป็นแถวผลลัพธ์
INNER JOIN เป็นประเภทการเข้าร่วมที่พบบ่อยที่สุดและเป็นประเภทเริ่มต้นของการเข้าร่วม คุณสามารถใช้คำหลักภายในหรือไม่ก็ได้
ต่อไปนี้เป็นไวยากรณ์ของ INNER JOIN -
SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;
จากตารางด้านบนเราสามารถเขียน INNER JOIN ได้ดังนี้ -
testdb=# 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 | Engineering
ด้านซ้ายเข้าร่วม
OUTER JOIN เป็นส่วนเสริมของ INNER JOIN มาตรฐาน SQL กำหนดการเข้าร่วมภายนอกสามประเภท: LEFT, RIGHT และ FULL และ PostgreSQL รองรับสิ่งเหล่านี้ทั้งหมด
ในกรณีของ LEFT OUTER JOIN การรวมภายในจะดำเนินการก่อน จากนั้นสำหรับแต่ละแถวในตาราง T1 ที่ไม่ตรงตามเงื่อนไขการรวมกับแถวใด ๆ ในตาราง T2 แถวที่รวมจะถูกเพิ่มด้วยค่า null ในคอลัมน์ของ T2 ดังนั้นตารางที่เข้าร่วมจะมีอย่างน้อยหนึ่งแถวสำหรับแต่ละแถวใน T1
ต่อไปนี้เป็นไวยากรณ์ของ LEFT OUTER JOIN -
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
จากตารางด้านบนเราสามารถเขียนการรวมภายในได้ดังนี้ -
testdb=# 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 | Engineering
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |
เข้าร่วมด้านนอกที่ถูกต้อง
ขั้นแรกให้ทำการรวมภายใน จากนั้นสำหรับแต่ละแถวในตาราง T2 ที่ไม่ตรงตามเงื่อนไขการรวมกับแถวใด ๆ ในตาราง T1 แถวที่รวมจะถูกเพิ่มด้วยค่า null ในคอลัมน์ของ T1 นี่คือการสนทนาของการเข้าร่วมทางซ้าย ตารางผลลัพธ์จะมีแถวสำหรับแต่ละแถวใน T2 เสมอ
ต่อไปนี้เป็นไวยากรณ์ของ RIGHT OUTER JOIN -
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
จากตารางด้านบนเราสามารถเขียนการรวมภายในได้ดังนี้ -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
แบบสอบถามที่ระบุข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -
emp_id | name | dept
--------+-------+--------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | | Finance
เข้าร่วมเต็มรูปแบบภายนอก
ขั้นแรกให้ทำการรวมภายใน จากนั้นสำหรับแต่ละแถวในตาราง T1 ที่ไม่ตรงตามเงื่อนไขการรวมกับแถวใด ๆ ในตาราง T2 แถวที่รวมจะถูกเพิ่มด้วยค่า null ในคอลัมน์ของ T2 นอกจากนี้สำหรับแต่ละแถวของ T2 ที่ไม่เป็นไปตามเงื่อนไขการรวมกับแถวใด ๆ ใน T1 จะมีการเพิ่มแถวที่เข้าร่วมที่มีค่า null ในคอลัมน์ของ T1
ต่อไปนี้เป็นไวยากรณ์ของ FULL OUTER JOIN -
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
จากตารางด้านบนเราสามารถเขียนการรวมภายในได้ดังนี้ -
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
แบบสอบถามที่ระบุข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -
emp_id | name | dept
--------+-------+---------------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | | Finance
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |