SQLite Join

SQLite'sJoinThe clause is used to combine records from tables in two or more databases. JOIN is a means of combining fields from two tables by means of common values.

SQL defines three main types of joins:

  • Cross Join - CROSS JOIN

  • Inner Join - INNER JOIN

  • Outer Join - OUTER JOIN

Before we continue, let's assume there are two tables, COMPANY and DEPARTMENT. We have already seen the INSERT statements used to populate the COMPANY table. Now let's assume the list of records in the COMPANY table is as follows:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

The other table is DEPARTMENT, defined as follows:

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

Below are the INSERT statements to populate the DEPARTMENT table:

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 );

Finally, we have the following list of records in the DEPARTMENT table:

ID          DEPT        EMP_ID
----------  ----------  ----------
1           IT Billing  1
2           Engineerin  2
3           Finance     7

Cross Join - CROSS JOIN

A CROSS JOIN matches each row of the first table with each row of the second table. If the two input tables have x and y rows respectively, the result table has x*y rows. Since CROSS JOIN can potentially produce very large tables, it must be used with caution, only when appropriate.

The operation of a cross join returns the Cartesian product of all data rows from the two joined tables. The number of data rows returned equals the number of data rows in the first table that meet the query conditions multiplied by the number of data rows in the second table that meet the query conditions.

Below is the syntax for CROSS JOIN:

SELECT ... FROM table1 CROSS JOIN table2 ...

Based on the tables above, we can write a CROSS JOIN as follows:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

The above query will produce the following result:

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Paul        Engineerin
7           Paul        Finance
1           Allen       IT Billing
2           Allen       Engineerin
7           Allen       Finance
1           Teddy       IT Billing
2           Teddy       Engineerin
7           Teddy       Finance
1           Mark        IT Billing
2           Mark        Engineerin
7           Mark        Finance
1           David       IT Billing
2           David       Engineerin
7           David       Finance
1           Kim         IT Billing
2           Kim         Engineerin
7           Kim         Finance
1           James       IT Billing
2           James       Engineerin
7           James       Finance

Inner Join - INNER JOIN

INNER JOIN creates a new result table by combining the column values of two tables (table1 and table2) based on the join predicate. The query compares each row in table1 with each row in table2, finding all matching pairs of rows that satisfy the join predicate. When the join predicate is satisfied, the column values of each matching pair of rows A and B are combined into a result row.

INNER JOIN is the most common type of join and is the default join type. The INNER keyword is optional.

Below is the syntax for INNER JOIN:

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...

To avoid redundancy and keep the wording shorter, you can useUSINGexpression to declare the INNER JOIN condition. This expression specifies a list of one or more columns:

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...

NATURAL JOIN is similar toJOIN...USINGexcept that it automatically tests for equality between values in every column that exists in both tables:

SELECT ... FROM table1 NATURAL JOIN table2...

Based on the tables above, we can write an INNER JOIN as follows:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

The above query will produce the following result:

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineerin
7           James       Finance

Outer Join - OUTER JOIN

OUTER JOIN is an extension of INNER JOIN. Although the SQL standard defines three types of outer joins: LEFT, RIGHT, and FULL, SQLite only supportsLEFT OUTER JOIN。

The way OUTER JOIN declares conditions is the same as INNER JOIN, using the ON, USING, or NATURAL keywords. The initial result table is computed in the same way. Once the primary join calculation is complete, OUTER JOIN merges in any unjoined rows from one or both tables, using NULL values for the outer join columns, and appends them to the result table.

Below is the syntax for LEFT OUTER JOIN:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

To avoid redundancy and keep the wording shorter, you can useUSINGexpression to declare the OUTER JOIN condition. This expression specifies a list of one or more columns:

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...

Based on the tables above, we can write an OUTER JOIN as follows:

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

The above query will produce the following result:

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineerin
            Teddy
            Mark
            David
            Kim
7           James       Finance
Other extensions