JOIN
Supported Join Types
The join combines columns from two or more tables into a single result set. Databend supports the following join types:
- Inner Join
- Natural Join
- Cross Join
- Left Join
- Right Join
- Full Outer Join
- Left / Right Semi Join
- Left / Right Anti Join
Example Tables
Unless explicitly specified, the join examples on this page are created based on the following tables:
Table "vip_info": This table stores the VIP client information.
| Client_ID | Region | 
|---|---|
| 101 | Toronto | 
| 102 | Quebec | 
| 103 | Vancouver | 
Table "purchase_records": This table lists the purchase records for all the clients.
| Client_ID | Item | QTY | 
|---|---|---|
| 100 | Croissant | 2,000 | 
| 102 | Donut | 3,000 | 
| 103 | Coffee | 6,000 | 
| 106 | Soda | 4,000 | 
Table "gift": This table lists the gift options for the VIP clients.
| Gift | 
|---|
| Croissant | 
| Donut | 
| Coffee | 
| Soda | 
Inner Join
The inner join returns the rows that meet the join conditions in the result set.
Syntax
SELECT select_list
FROM table_a
    [INNER] JOIN table_b
        ON join_condition_1
    [[INNER] JOIN table_c
        ON join_condition_2]...
The keyword INNER is optional.
When you join two tables on a common column with the equal operator, you can use the keyword USING to simplify the syntax.
SELECT select_list
FROM table_a
    JOIN table_b
        USING join_column_1
    [JOIN table_c
        USING join_column_2]...
Examples
The following example returns the purchase records of the VIP clients:
SELECT purchase_records.client_id,
       purchase_records.item,
       purchase_records.qty
FROM   vip_info
       INNER JOIN purchase_records
               ON vip_info.client_id = purchase_records.client_id; 
For the definitions of the tables in the example, see Example Tables.
Output:
|102|Donut|3000
|103|Coffee|6000
Natural Join
The natural join joins two tables based on all columns in the two tables that have the same name.
Syntax
SELECT select_list
FROM table_a
    NATURAL JOIN table_b
    [NATURAL JOIN table_c]...
Examples
The following example returns the purchase records of the VIP clients:
SELECT purchase_records.client_id,
       purchase_records.item,
       purchase_records.qty
FROM   vip_info
       NATURAL JOIN purchase_records; 
For the definitions of the tables in the example, see Example Tables.
Output:
|102|Donut|3,000
|103|Coffee|6,000
Cross Join
The cross join returns a result set that includes each row from the first table joined with each row from the second table.
Syntax
SELECT select_list
FROM table_a
    CROSS JOIN table_b
Examples
The following example returns a result set that assigns each gift option to each VIP client:
SELECT *
FROM   vip_info
       CROSS JOIN gift; 
For the definitions of the tables in the example, see Example Tables.
Output:
101|Toronto|Croissant
101|Toronto|Donut
101|Toronto|Coffee
101|Toronto|Soda
102|Quebec|Croissant
102|Quebec|Donut
102|Quebec|Coffee
102|Quebec|Soda
103|Vancouver|Croissant
103|Vancouver|Donut
103|Vancouver|Coffee
103|Vancouver|Soda
Left Join
The left join returns all records from the left table, and the matching records from the right table. The result is NULL records from the right side, if there is no match.
Syntax
SELECT select_list
FROM table_a
    LEFT [OUTER] JOIN table_b
        ON join_condition
The keyword OUTER is optional.
Examples
The following example returns the purchase records of all VIP clients, the purchase records will be NULL if the VIP client has no purchases:
SELECT vip_info.client_id,
       purchase_records.item,
       purchase_records.qty
FROM   vip_info
       LEFT JOIN purchase_records
              ON vip_info.client_id = purchase_records.client_id; 
For the definitions of the tables in the example, see Example Tables.
Output:
|101|NULL|NULL
|102|Donut|3000
|103|Coffee|6000
Right Join
The right join returns all records from the right table, and the matching records from the left table. The result is NULL records from the left side, if there is no match.
Syntax
SELECT select_list
FROM table_a
    RIGHT [OUTER] JOIN table_b
        ON join_condition
The keyword OUTER is optional.
Examples
Imagine we have the following tables:
The following example returns all vip_info of all purchase_records, the vip_info will be NULL if purchase_record does not have the corresponding vip_info.
SELECT vip_info.client_id,
       vip_info.region
FROM   vip_info
       RIGHT JOIN purchase_records
               ON vip_info.client_id = purchase_records.client_id; 
For the definitions of the tables in the example, see Example Tables.
Output:
NULL|NULL
102|Quebec
103|Vancouver
NULL|NULL
Full Outer Join
The full outer join returns all rows from both tables, matching up the rows wherever a match can be made and placing NULLs in the places where no matching row exists.
Syntax
SELECT select_list
FROM   table_a
       FULL OUTER JOIN table_b
                    ON join_condition
The keyword OUTER is optional.
Examples
The following example returns all matched and unmatched rows from both tables:
SELECT vip_info.region,
       purchase_records.item
FROM   vip_info
       FULL OUTER JOIN purchase_records
                    ON vip_info.client_id = purchase_records.client_id;
For the definitions of the tables in the example, see Example Tables.
Output:
Toronto|NULL
Quebec|Donut
Vancouver|Coffee
NULL|Croissant
NULL|Soda
Left / Right Semi Join
The left semi join returns rows from the left table that have a matching row in the right table. The right semi join returns rows from the right table that have a matching row in the left table.
Syntax
-- Left Semi Join
SELECT select_list
FROM   table_a
       LEFT SEMI JOIN table_b
                    ON join_condition
-- Right Semi Join
SELECT select_list
FROM   table_a
       RIGHT SEMI JOIN table_b
                    ON join_condition
Examples
The following example returns the VIP clients (Client_ID & Region) who have a purchase record:
SELECT *
FROM   vip_info
       LEFT SEMI JOIN purchase_records
                    ON vip_info.client_id = purchase_records.client_id;
For the definitions of the tables in the example, see Example Tables.
Output:
102|Quebec
103|Vancouver
The following example returns the purchase records (Client_ID, Item, and QTY) of the VIP clients:
SELECT *
FROM   vip_info
       RIGHT SEMI JOIN purchase_records
                    ON vip_info.client_id = purchase_records.client_id;
For the definitions of the tables in the example, see Example Tables.
Output:
|102|Donut|3000
|103|Coffee|6000
Left / Right Anti Join
The left anti join returns rows from the left table that have NO matching row in the right table. The right anti join returns rows from the right table that have NO matching row in the left table.
Syntax
-- Left Anti Join
SELECT select_list
FROM   table_a
       LEFT ANTI JOIN table_b
                    ON join_condition
-- Right Anti Join
SELECT select_list
FROM   table_a
       RIGHT ANTI JOIN table_b
                    ON join_condition
Examples
The following example returns the VIP clients (Client_ID & Region) who have NO purchase records:
SELECT *
FROM   vip_info
       LEFT ANTI JOIN purchase_records
                    ON vip_info.client_id = purchase_records.client_id;
For the definitions of the tables in the example, see Example Tables.
Output:
101|Toronto
The following example returns the purchase records (Client_ID, Item, and QTY) of non-VIP clients:
SELECT *
FROM   vip_info
       RIGHT ANTI JOIN purchase_records
                    ON vip_info.client_id = purchase_records.client_id;
For the definitions of the tables in the example, see Example Tables.
Output:
|100|Croissant|2000
|106|Soda|4000