If you’re working with relational databases like PostgreSQL, there’s no escaping the essential SQL operation called INNER JOIN. It’s the bread and butter of combining data from multiple tables based on a related column. In this tutorial, we will focus solely on INNER JOIN, exploring its syntax, benefits, use-cases, and even common pitfalls.

What is an INNER JOIN?

An INNER JOIN returns records that have matching values in both tables being joined. If a record in the first table has no matching record in the second table, it won’t appear in the result set, and vice versa.


The basic syntax of an INNER JOIN operation is:

SELECT column1, column2, ...
FROM table1
ON table1.columnX = table2.columnY;

Example with tv_series and producers Tables

In addition to out tv_series table, let’s assume you have the following producers table.
To find out which producer is linked to which TV series, we can do the following:

Here’s a refresher on our tv_series table schema:

The producers table:

CREATE TABLE public.producers (
    id serial4 NOT NULL,
    tv_series_id int4 NOT NULL,
    name text NOT NULL,
    CONSTRAINT producers_pkey PRIMARY KEY (id),
    FOREIGN KEY (tv_series_id) REFERENCES tv_series(id)

Seeded with

INSERT INTO producers (tv_series_id, name)
VALUES (1, 'Vince Gilligan'),
    (1, 'Mark Johnson'),
    (2, 'Kevin S. Bright'),
    (2, 'Marta Kauffman'),
    (3, 'David Benioff'),
    (3, 'D. B. Weiss');

you can run the following SQL query:

SELECT AS series_name, AS producer_name
FROM tv_series
INNER JOIN producers
ON = producers.tv_series_id;
series_name producer_name
Breaking Bad Vince Gilligan
Friends Mark Johnson
Game of Thrones Kevin S. Bright
Stranger Things Marta Kauffman
The Office David Benioff
The Mandalorian D. B. Weiss

For example and might not be factually correct

Common Errors and Solutions

Error Message:

ERROR: column "some_column" is ambiguous


When both tables have columns with the same name, and you don’t specify which table’s column to use, PostgreSQL will throw this error.


To resolve this, always prefix the column name with the table name or alias: table_name.column_name or alias.column_name.


  1. Data Integrity: Since INNER JOIN only returns records that have matching values in both tables, you get a clean, related dataset.
  2. Performance: INNER JOINs are usually faster compared to other types of JOINs, especially when indexed columns are used in the JOIN condition.
  3. Simplicity: INNER JOINs are easy to read and understand, making your SQL code more maintainable.

Tips and Best Practices

  • Always check if the columns used in the JOIN condition are indexed; this can dramatically improve query performance.
  • Use column aliases for better readability.
  • Use table aliases to shorten your SQL query.
    Using aliases can simplify our query as shown below.
SELECT AS series_name, AS producer_name
FROM tv_series AS s
INNER JOIN producers AS p
ON = p.tv_series_id;


The INNER JOIN is a powerful tool in the SQL toolkit. Understanding how to use it effectively is crucial for data retrieval operations in relational databases like PostgreSQL. With the examples and best practices outlined above, you should be well on your way to mastering INNER JOINS. Stay tuned for more tutorials on other types of JOINs.

Leave a Reply