HiveQL - Chọn-Tham gia

JOIN là một mệnh đề được sử dụng để kết hợp các trường cụ thể từ hai bảng bằng cách sử dụng các giá trị chung cho mỗi bảng. Nó đượ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.

Cú pháp

join_table:

   table_reference JOIN table_factor [join_condition]
   | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference
   join_condition
   | table_reference LEFT SEMI JOIN table_reference join_condition
   | table_reference CROSS JOIN table_reference [join_condition]

Thí dụ

Chúng ta sẽ sử dụng hai bảng sau trong chương này. Hãy xem xét bảng sau có tên CUSTOMERS ..

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
| 1  | Ramesh   | 32  | Ahmedabad | 2000.00  |  
| 2  | Khilan   | 25  | Delhi     | 1500.00  |  
| 3  | kaushik  | 23  | Kota      | 2000.00  | 
| 4  | Chaitali | 25  | Mumbai    | 6500.00  | 
| 5  | Hardik   | 27  | Bhopal    | 8500.00  | 
| 6  | Komal    | 22  | MP        | 4500.00  | 
| 7  | Muffy    | 24  | Indore    | 10000.00 | 
+----+----------+-----+-----------+----------+

Hãy xem xét một bảng ORDERS khác như sau:

+-----+---------------------+-------------+--------+ 
|OID  | DATE                | CUSTOMER_ID | AMOUNT | 
+-----+---------------------+-------------+--------+ 
| 102 | 2009-10-08 00:00:00 |           3 | 3000   | 
| 100 | 2009-10-08 00:00:00 |           3 | 1500   | 
| 101 | 2009-11-20 00:00:00 |           2 | 1560   | 
| 103 | 2008-05-20 00:00:00 |           4 | 2060   | 
+-----+---------------------+-------------+--------+

Có các kiểu nối khác nhau được đưa ra như sau:

  • JOIN
  • THAM GIA BÊN NGOÀI TRÁI
  • THAM GIA ĐÚNG
  • THAM GIA NGOÀI TRỜI ĐẦY ĐỦ

THAM GIA

Mệnh đề JOIN được sử dụng để kết hợp và truy xuất các bản ghi từ nhiều bảng. JOIN giống như OUTER JOIN trong SQL. Điều kiện JOIN sẽ được đưa ra bằng cách sử dụng các khóa chính và khóa ngoại của bảng.

Truy vấn sau thực hiện JOIN trên bảng KHÁCH HÀNG và LỆNH, đồng thời truy xuất các bản ghi:

hive> SELECT c.ID, c.NAME, c.AGE, o.AMOUNT 
FROM CUSTOMERS c JOIN ORDERS o 
ON (c.ID = o.CUSTOMER_ID);

Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:

+----+----------+-----+--------+ 
| ID | NAME     | AGE | AMOUNT | 
+----+----------+-----+--------+ 
| 3  | kaushik  | 23  | 3000   | 
| 3  | kaushik  | 23  | 1500   | 
| 2  | Khilan   | 25  | 1560   | 
| 4  | Chaitali | 25  | 2060   | 
+----+----------+-----+--------+

THAM GIA BÊN NGOÀI TRÁI

HiveQL LEFT OUTER JOIN trả về tất cả các hàng từ bảng bên trái, ngay cả khi không có hàng nào phù hợp trong bảng bên phải. Điều này có nghĩa là, nếu mệnh đề ON khớp với các bản ghi 0 (không) trong bảng bên phải, thì JOIN vẫn trả về một hàng trong kết quả, nhưng với NULL trong mỗi cột từ bảng bên phải.

LEFT JOIN trả về tất cả các giá trị từ bảng bên trái, cộng với các giá trị đã so khớp từ bảng bên phải hoặc NULL trong trường hợp không có vị từ JOIN phù hợp.

Truy vấn sau thể hiện THAM GIA LEFT OUTER giữa bảng CUSTOMER và ORDER:

hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE 
FROM CUSTOMERS c 
LEFT OUTER JOIN ORDERS o 
ON (c.ID = o.CUSTOMER_ID);

Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:

+----+----------+--------+---------------------+ 
| ID | NAME     | AMOUNT | DATE                | 
+----+----------+--------+---------------------+ 
| 1  | Ramesh   | NULL   | NULL                | 
| 2  | Khilan   | 1560   | 2009-11-20 00:00:00 | 
| 3  | kaushik  | 3000   | 2009-10-08 00:00:00 | 
| 3  | kaushik  | 1500   | 2009-10-08 00:00:00 | 
| 4  | Chaitali | 2060   | 2008-05-20 00:00:00 | 
| 5  | Hardik   | NULL   | NULL                | 
| 6  | Komal    | NULL   | NULL                | 
| 7  | Muffy    | NULL   | NULL                | 
+----+----------+--------+---------------------+

THAM GIA ĐÚNG

HiveQL RIGHT OUTER JOIN trả về tất cả các hàng từ bảng bên phải, ngay cả khi không có hàng nào phù hợp trong bảng bên trái. Nếu mệnh đề ON khớp với các bản ghi 0 (không) trong bảng bên trái, thì JOIN vẫn trả về một hàng trong kết quả, nhưng với NULL trong mỗi cột từ bảng bên trái.

RIGHT JOIN trả về tất cả các giá trị từ bảng bên phải, cộng với các giá trị đã so khớp từ bảng bên trái hoặc NULL trong trường hợp không có vị từ nối phù hợp.

Truy vấn sau thể hiện THAM GIA RIGHT OUTER giữa bảng CUSTOMER và ORDER.

notranslate "> hive> CHỌN c.ID, c.NAME, o.AMOUNT, o. NGÀY TỪ KHÁCH HÀNG c ĐÚNG ĐƠN HÀNG THAM GIA NGOÀI TRỜI o ON (c.ID = o.CUSTOMER_ID);

Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:

+------+----------+--------+---------------------+ 
| ID   | NAME     | AMOUNT | DATE                | 
+------+----------+--------+---------------------+ 
| 3    | kaushik  | 3000   | 2009-10-08 00:00:00 | 
| 3    | kaushik  | 1500   | 2009-10-08 00:00:00 | 
| 2    | Khilan   | 1560   | 2009-11-20 00:00:00 | 
| 4    | Chaitali | 2060   | 2008-05-20 00:00:00 | 
+------+----------+--------+---------------------+

THAM GIA NGOÀI TRỜI ĐẦY ĐỦ

HiveQL FULL OUTER JOIN kết hợp các bản ghi của cả bảng ngoài bên trái và bên phải đáp ứng điều kiện JOIN. Bảng đã kết hợp chứa tất cả các bản ghi từ cả hai bảng hoặc điền vào giá trị NULL cho các kết quả khớp bị thiếu ở một trong hai bên.

Truy vấn sau minh họa FULL OUTER JOIN giữa bảng CUSTOMER và ORDER:

hive> SELECT c.ID, c.NAME, o.AMOUNT, o.DATE 
FROM CUSTOMERS c 
FULL OUTER JOIN ORDERS o 
ON (c.ID = o.CUSTOMER_ID);

Khi thực hiện thành công truy vấn, bạn sẽ thấy phản hồi sau:

+------+----------+--------+---------------------+ 
| ID   | NAME     | AMOUNT | DATE                | 
+------+----------+--------+---------------------+ 
| 1    | Ramesh   | NULL   | NULL                | 
| 2    | Khilan   | 1560   | 2009-11-20 00:00:00 | 
| 3    | kaushik  | 3000   | 2009-10-08 00:00:00 | 
| 3    | kaushik  | 1500   | 2009-10-08 00:00:00 | 
| 4    | Chaitali | 2060   | 2008-05-20 00:00:00 | 
| 5    | Hardik   | NULL   | NULL                | 
| 6    | Komal    | NULL   | NULL                |
| 7    | Muffy    | NULL   | NULL                |  
| 3    | kaushik  | 3000   | 2009-10-08 00:00:00 | 
| 3    | kaushik  | 1500   | 2009-10-08 00:00:00 | 
| 2    | Khilan   | 1560   | 2009-11-20 00:00:00 | 
| 4    | Chaitali | 2060   | 2008-05-20 00:00:00 | 
+------+----------+--------+---------------------+