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 |