Learnitweb

inner join in Oracle

1. Overview

An inner join (sometimes called a simple join) is a join of two or more tables that returns only those rows that satisfy the join condition. An equi join is a subset of inner join that specifically uses the equality operator (=) in the join condition.

In Oracle, an INNER JOIN is used to retrieve rows from two or more tables where there is a match in the columns specified in the ON clause. It ensures that only the rows with matching values in both tables are included in the result set. This tutorial will guide you through understanding, writing, and optimizing INNER JOIN queries in Oracle.

2. Syntax of INNER JOIN

The basic syntax for an INNER JOIN in Oracle is:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT column_list
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
SELECT column_list FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
SELECT column_list
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
  • column_list: The columns you want to retrieve.
  • table1 and table2: The tables you are joining.
  • ON: The condition specifying the relationship between the columns in the tables.

3. Understanding INNER JOIN with an Example

For the example, we’ll use the following tables:

Employee

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
+-------------+------------+-----------+---------------+
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | DEPARTMENT_ID |
+-------------+------------+-----------+---------------+
| 101 | John | Doe | 1 |
+-------------+------------+-----------+---------------+
| 102 | Jane | Smith | 2 |
+-------------+------------+-----------+---------------+
| 103 | Sam | Brown | 3 |
+-------------+------------+-----------+---------------+
| 104 | Sue | Green | 2 |
+-------------+------------+-----------+---------------+
+-------------+------------+-----------+---------------+ | EMPLOYEE_ID | FIRST_NAME | LAST_NAME | DEPARTMENT_ID | +-------------+------------+-----------+---------------+ | 101 | John | Doe | 1 | +-------------+------------+-----------+---------------+ | 102 | Jane | Smith | 2 | +-------------+------------+-----------+---------------+ | 103 | Sam | Brown | 3 | +-------------+------------+-----------+---------------+ | 104 | Sue | Green | 2 | +-------------+------------+-----------+---------------+
+-------------+------------+-----------+---------------+
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | DEPARTMENT_ID |
+-------------+------------+-----------+---------------+
| 101         | John       | Doe       | 1             |
+-------------+------------+-----------+---------------+
| 102         | Jane       | Smith     | 2             |
+-------------+------------+-----------+---------------+
| 103         | Sam        | Brown     | 3             |
+-------------+------------+-----------+---------------+
| 104         | Sue        | Green     | 2             |
+-------------+------------+-----------+---------------+

Department

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
+---------------+-----------------+
| DEPARTMENT_ID | DEPARTMENT_NAME |
+---------------+-----------------+
| 1 | Human Resources |
+---------------+-----------------+
| 2 | Finance |
+---------------+-----------------+
| 3 | IT |
+---------------+-----------------+
+---------------+-----------------+ | DEPARTMENT_ID | DEPARTMENT_NAME | +---------------+-----------------+ | 1 | Human Resources | +---------------+-----------------+ | 2 | Finance | +---------------+-----------------+ | 3 | IT | +---------------+-----------------+
+---------------+-----------------+
| DEPARTMENT_ID | DEPARTMENT_NAME |
+---------------+-----------------+
| 1             | Human Resources |
+---------------+-----------------+
| 2             | Finance         |
+---------------+-----------------+
| 3             | IT              |
+---------------+-----------------+

Location

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
+---------------+-----------+
| DEPARTMENT_ID | LOCATION |
+---------------+-----------+
| 1 | New York |
+---------------+-----------+
| 2 | San Diego |
+---------------+-----------+
| 3 | Seattle |
+---------------+-----------+
+---------------+-----------+ | DEPARTMENT_ID | LOCATION | +---------------+-----------+ | 1 | New York | +---------------+-----------+ | 2 | San Diego | +---------------+-----------+ | 3 | Seattle | +---------------+-----------+
+---------------+-----------+
| DEPARTMENT_ID |  LOCATION |
+---------------+-----------+
| 1             | New York  |
+---------------+-----------+
| 2             | San Diego |
+---------------+-----------+
| 3             | Seattle   |
+---------------+-----------+

Inner join query

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT e.employee_id, e.first_name, d.department_name
FROM employee e
INNER JOIN department d
ON e.department_id = d.department_id;
SELECT e.employee_id, e.first_name, d.department_name FROM employee e INNER JOIN department d ON e.department_id = d.department_id;
SELECT e.employee_id, e.first_name, d.department_name
FROM employee e
INNER JOIN department d
ON e.department_id = d.department_id;

Output

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
+-------------+------------+-----------------+
| EMPLOYEE_ID | FIRST_NAME | DEPARTMENT_NAME |
+-------------+------------+-----------------+
| 101 | John | Human Resources |
+-------------+------------+-----------------+
| 102 | Jane | Finance |
+-------------+------------+-----------------+
| 103 | Sam | IT |
+-------------+------------+-----------------+
| 104 | Sue | Finance |
+-------------+------------+-----------------+
+-------------+------------+-----------------+ | EMPLOYEE_ID | FIRST_NAME | DEPARTMENT_NAME | +-------------+------------+-----------------+ | 101 | John | Human Resources | +-------------+------------+-----------------+ | 102 | Jane | Finance | +-------------+------------+-----------------+ | 103 | Sam | IT | +-------------+------------+-----------------+ | 104 | Sue | Finance | +-------------+------------+-----------------+
+-------------+------------+-----------------+
| EMPLOYEE_ID | FIRST_NAME | DEPARTMENT_NAME |
+-------------+------------+-----------------+
| 101         | John       | Human Resources |
+-------------+------------+-----------------+
| 102         | Jane       | Finance         |
+-------------+------------+-----------------+
| 103         | Sam        | IT              |
+-------------+------------+-----------------+
| 104         | Sue        | Finance         |
+-------------+------------+-----------------+

4. Joining Multiple Tables

You can join more than two tables in a single query. For example:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT e.employee_id, e.first_name, d.department_name
FROM employee e
INNER JOIN department d
ON e.department_id = d.department_id
INNER JOIN location l
on d.department_id = l.department_id;
SELECT e.employee_id, e.first_name, d.department_name FROM employee e INNER JOIN department d ON e.department_id = d.department_id INNER JOIN location l on d.department_id = l.department_id;
SELECT e.employee_id, e.first_name, d.department_name
FROM employee e
INNER JOIN department d
ON e.department_id = d.department_id
INNER JOIN location l
on d.department_id = l.department_id;

5. Using WHERE Clause with INNER JOIN

You can combine INNER JOIN with a WHERE clause to filter results further:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT e.employee_id, e.first_name, d.department_name
FROM employee e
INNER JOIN department d
ON e.department_id = d.department_id
where department_name = 'Finance';
SELECT e.employee_id, e.first_name, d.department_name FROM employee e INNER JOIN department d ON e.department_id = d.department_id where department_name = 'Finance';
SELECT e.employee_id, e.first_name, d.department_name
FROM employee e
INNER JOIN department d
ON e.department_id = d.department_id
where department_name = 'Finance';

6. Best Practices for INNER JOIN

  • Indexing: Ensure the columns used in the ON condition are indexed for better performance.
  • Minimize Columns: Retrieve only the columns you need to reduce overhead.
  • Use Aliases: Use table aliases to make your queries more readable.
  • Analyze Query Plans: Use tools like EXPLAIN PLAN to understand query performance.

7. INNER JOIN with Subqueries

You can use subqueries within an INNER JOIN to filter or aggregate data:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT e.first_name, d.department_name
FROM Employee e
INNER JOIN (
SELECT department_id, department_name
FROM department
WHERE department_id < 3
) d
ON e.department_id = d.department_id;
SELECT e.first_name, d.department_name FROM Employee e INNER JOIN ( SELECT department_id, department_name FROM department WHERE department_id < 3 ) d ON e.department_id = d.department_id;
SELECT e.first_name, d.department_name
FROM Employee e
INNER JOIN (
    SELECT department_id, department_name
    FROM department
    WHERE department_id < 3
) d
ON e.department_id = d.department_id;

Output

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
+-------------+-----------------+
| EMPLOYEE_ID | FIRST_NAME |
+-------------+-----------------+
| John | Human Resources |
+-------------+-----------------+
| Jane | Finance |
+-------------+-----------------+
| Sue | Finance |
+-------------+-----------------+
+-------------+-----------------+ | EMPLOYEE_ID | FIRST_NAME | +-------------+-----------------+ | John | Human Resources | +-------------+-----------------+ | Jane | Finance | +-------------+-----------------+ | Sue | Finance | +-------------+-----------------+
+-------------+-----------------+
| EMPLOYEE_ID |    FIRST_NAME   |
+-------------+-----------------+
| John        | Human Resources |
+-------------+-----------------+
| Jane        | Finance         |
+-------------+-----------------+
| Sue         | Finance         |
+-------------+-----------------+

8. Common Mistakes

  • Missing ON Clause: Forgetting to specify the join condition results in a syntax error.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT *
FROM Employees e
INNER JOIN Departments d; -- Error: Missing ON clause
SELECT * FROM Employees e INNER JOIN Departments d; -- Error: Missing ON clause
SELECT *
FROM Employees e
INNER JOIN Departments d; -- Error: Missing ON clause
  • Ambiguous Columns: When two tables have columns with the same name, always qualify them with the table name or alias.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT employee_id, department_id
FROM employee e
INNER JOIN department d
ON e.department_id = d.department_id;
SELECT employee_id, department_id FROM employee e INNER JOIN department d ON e.department_id = d.department_id;
SELECT employee_id, department_id
FROM employee e
INNER JOIN department d
ON e.department_id = d.department_id;
  • Unnecessary Joins: Avoid joining tables that are not needed for the result set.