PostgreSQL - JOINS
PostgreSQL Joinsmệnh đề được sử dụng để kết hợp các bản ghi từ hai hoặc nhiều bảng trong cơ sở dữ liệu. JOIN là một phương tiện để kết hợp các trường từ hai bảng bằng cách sử dụng các giá trị chung cho mỗi bảng.
Các loại tham gia trong PostgreSQL là -
- THAM GIA CROSS
- THAM GIA INNER
- THAM GIA NGOÀI TRÁI
- THAM GIA ĐÚNG NGƯỜI RA NGOÀI
- THAM GIA NGOÀI TRỜI ĐẦY ĐỦ
Trước khi tiếp tục, chúng ta hãy xem xét hai bảng, CÔNG TY và BỘ PHẬN. Chúng ta đã thấy các câu lệnh INSERT để điền vào bảng COMPANY. Vì vậy, hãy để chúng tôi giả sử danh sách các bản ghi có sẵn trong bảng 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
Một bảng khác là DEPARTMENT, có định nghĩa sau:
CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
Đây là danh sách các câu lệnh INSERT để điền vào bảng 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 );
Cuối cùng, chúng tôi có danh sách các bản ghi sau đây có sẵn trong bảng DEPARTMENT -
id | dept | emp_id
----+-------------+--------
1 | IT Billing | 1
2 | Engineering | 2
3 | Finance | 7
THAM GIA CROSS
CROSS JOIN khớp mọi hàng của bảng đầu tiên với mọi hàng của bảng thứ hai. Nếu bảng đầu vào có các cột x và y tương ứng thì bảng kết quả sẽ có các cột x + y. Bởi vì các CROSS JOIN có khả năng tạo ra các bảng cực kỳ lớn, nên phải cẩn thận để chỉ sử dụng chúng khi thích hợp.
Sau đây là cú pháp của CROSS JOIN:
SELECT ... FROM table1 CROSS JOIN table2 ...
Dựa trên các bảng trên, chúng ta có thể viết CROSS JOIN như sau:
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
Truy vấn đã cho ở trên sẽ tạo ra kết quả sau:
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
THAM GIA INNER
INNER JOIN tạo một bảng kết quả mới bằng cách kết hợp các giá trị cột của hai bảng (table1 và table2) dựa trên vị từ nối. Truy vấn so sánh từng hàng của bảng1 với từng hàng của bảng2 để tìm tất cả các cặp hàng thỏa mãn vị từ nối. Khi vị từ nối được thỏa mãn, các giá trị cột cho mỗi cặp hàng phù hợp của bảng1 và bảng2 được kết hợp thành một hàng kết quả.
INNER JOIN là kiểu nối phổ biến nhất và là kiểu nối mặc định. Bạn có thể sử dụng từ khóa INNER tùy ý.
Sau đây là cú pháp của INNER JOIN:
SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;
Dựa trên các bảng trên, chúng ta có thể viết INNER JOIN như sau:
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Truy vấn đã cho ở trên sẽ tạo ra kết quả sau:
emp_id | name | dept
--------+-------+------------
1 | Paul | IT Billing
2 | Allen | Engineering
THAM GIA NGOÀI TRÁI
OUTER JOIN là một phần mở rộng của INNER JOIN. Chuẩn SQL định nghĩa ba loại THAM GIA NGOÀI TRỜI: LEFT, RIGHT, FULL và PostgreSQL hỗ trợ tất cả những điều này.
Trong trường hợp LEFT OUTER JOIN, một phép nối bên trong được thực hiện trước. Sau đó, đối với mỗi hàng trong bảng T1 không thỏa mãn điều kiện nối với bất kỳ hàng nào trong bảng T2, một hàng đã nối sẽ được thêm vào với các giá trị rỗng trong các cột của T2. Do đó, bảng đã nối luôn có ít nhất một hàng cho mỗi hàng trong T1.
Sau đây là cú pháp của LEFT OUTER JOIN -
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
Dựa trên các bảng trên, chúng ta có thể viết một phép nối bên trong như sau:
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Truy vấn đã cho ở trên sẽ tạo ra kết quả sau:
emp_id | name | dept
--------+-------+------------
1 | Paul | IT Billing
2 | Allen | Engineering
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |
THAM GIA ĐÚNG NGƯỜI RA NGOÀI
Đầu tiên, một phép nối bên trong được thực hiện. Sau đó, đối với mỗi hàng trong bảng T2 không thỏa mãn điều kiện nối với bất kỳ hàng nào trong bảng T1, một hàng đã nối sẽ được thêm vào với các giá trị rỗng trong các cột của T1. Đây là câu chuyện của một phép nối bên trái; bảng kết quả sẽ luôn có một hàng cho mỗi hàng trong T2.
Sau đây là cú pháp của RIGHT OUTER JOIN -
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
Dựa trên các bảng trên, chúng ta có thể viết một phép nối bên trong như sau:
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Truy vấn đã cho ở trên sẽ tạo ra kết quả sau:
emp_id | name | dept
--------+-------+--------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | | Finance
THAM GIA NGOÀI TRỜI ĐẦY ĐỦ
Đầu tiên, một phép nối bên trong được thực hiện. Sau đó, đối với mỗi hàng trong bảng T1 không thỏa mãn điều kiện nối với bất kỳ hàng nào trong bảng T2, một hàng đã nối sẽ được thêm vào với các giá trị rỗng trong các cột của T2. Ngoài ra, đối với mỗi hàng của T2 không thỏa mãn điều kiện nối với bất kỳ hàng nào trong T1, một hàng đã nối có giá trị rỗng trong các cột của T1 sẽ được thêm vào.
Sau đây là cú pháp của FULL OUTER JOIN -
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
Dựa trên các bảng trên, chúng ta có thể viết một phép nối bên trong như sau:
testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Truy vấn đã cho ở trên sẽ tạo ra kết quả sau:
emp_id | name | dept
--------+-------+---------------
1 | Paul | IT Billing
2 | Allen | Engineering
7 | | Finance
| James |
| David |
| Paul |
| Mark |
| Teddy |
| James |