DbSchema | How to Implement JOINS in PostgreSQL?
Table of Contents
- Introduction
- Prerequisites
- What is a Join?
- Usage of Joins
- Advantages and Limitations of Using Joins
- Restrictions on Using Joins
- Types of Joins
- Implementing Joins in psql
- Implementing Joins in DbSchema
- Conclusion
- References
Introduction
When working with relational databases, the ability to combine data from multiple tables is crucial. This is where the concept of joins comes into play. In this article, we will explore how to implement joins in psql (PostgreSQL's command-line interface) and DbSchema, a popular database management and design tool.
Prerequisites
Before diving into the implementation of joins, ensure that you have the following prerequisites in place:
- A PostgreSQL database installed and running.
- psql (PostgreSQL command-line interface) installed or access to a tool like DbSchema that supports SQL querying.
For installation and establishing connection refer to PostgreSQL-How to create a database?
What is a Join?
In database management systems, a join is a method to combine rows from two or more tables based on a related column between them. It allows us to query and retrieve data from multiple tables as if they were a single table.
Usage of Joins
Joins are commonly used in the following scenarios:
- Retrieving related data from multiple tables.
- Combining data to generate meaningful reports.
- Filtering data based on specific conditions that involve multiple tables.
Advantages and Limitations of Using Joins
Advantages:
Advantages of using joins include:
- Simplifies querying by combining related data from multiple tables.
- Reduces data redundancy by storing data in normalized form.
- Allows for efficient data retrieval and analysis.
Limitations:
Limitations of using joins include:
- Performance impact on large datasets if not properly optimized.
- Complexity increases as the number of tables and conditions grow.
- May require careful consideration of indexing and query optimization techniques.
Restrictions on Using Joins
While joins offer powerful data retrieval capabilities, there are a few restrictions to keep in mind:
- Joining tables requires a common column or relationship between them.
- Columns used for joining tables should have the same data type or compatible data types.
- Join conditions should be well-defined to avoid unexpected results or Cartesian products.
Types of Joins
| Join Type | Description |
|---|---|
| Inner Join | Returns only the matching rows from both tables. |
| Left Join | Returns all rows from the left table and the matching rows from the right table. |
| Right Join | Returns all rows from the right table and the matching rows from the left table. |
| Full Outer Join | Returns all rows from both tables, including unmatched rows. |
Cross Join | Returns the Cartesian product of both tables, combining every row from the left table with every row from the right table. |
Natural Join | Performs a join based on columns with the same name in both tables. |
Self Join | Joins a table with itself, treating it as two separate tables, typically using aliases. |
Implementing Joins in psql
To implement Joins in psql follow the steps mentioned below:
-
Launchthe psql command-line interface. -
Connectto your PostgreSQL database. For establishing connection refer to PostgreSQL-How to create a database? -
Writethe join query using theJOINkeyword and the appropriate join condition.
Sample Database:
basket_a Table:
| a integer | fruit_a character varying(100) |
|---|---|
| 1 | Apple |
| 2 | Orange |
| 3 | Banana |
| 4 | Cucumber |
basket_b Table:
| b integer | fruit_b character varying(100) |
|---|---|
| 1 | Orange |
| 2 | Apple |
| 3 | Watermelon |
| 4 | Pear |

Inner Join
The inner join selects records that have matching values in both tables.
SELECT *
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
Example:
SELECT
a,
fruit_a,
b,
fruit_b
FROM
basket_a
INNER JOIN basket_b
ON fruit_a = fruit_b;
Result from Query:
Following is the result obtained by executing query on the sample database
| a integer | fruit_a character varying(100) | b integer | fruit_b character varying(100) |
|---|---|---|---|
| 1 | Apple | 2 | Apple |
| 2 | Orange | 1 | Orange |

Left Join
The left join returns all records from the left table and the matching records from the right table.
SELECT *
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
Example:
SELECT
a,
fruit_a,
b,
fruit_b
FROM
basket_a
LEFT JOIN basket_b
ON fruit_a = fruit_b;
Result from Query:
Following is the result obtained by executing query on the sample database
| a integer | fruit_a character varying(100) | b integer | fruit_b character varying(100) |
|---|---|---|---|
| 1 | Apple | 2 | Apple |
| 2 | Orange | 1 | Orange |
| 3 | Banana | [null] | [null] |
| 2 | Orange | [null] | [null] |

Right Join
The right join returns all records from the right table and the matching records from the __left table`.
SELECT *
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
Example:
SELECT
a,
fruit_a,
b,
fruit_b
FROM
basket_a
RIGHT JOIN basket_b ON fruit_a = fruit_b;
Result from Query:
Following is the result obtained by executing query on the sample database
| a integer | fruit_a character varying(100) | b integer | fruit_b character varying(100) |
|---|---|---|---|
| 2 | Orange | 1 | Orange |
| 1 | Apple | 2 | Apple |
| [null] | [null] | 3 | Watermelon |
| [null] | [null] | 4 | Pear |

Full Outer Join
The full outer join returns all records from both tables, including unmatched records.
SELECT *
FROM table1
FULL OUTER JOIN table2
ON table1.column = table2.column;
Example:
SELECT
a,
fruit_a,
b,
fruit_b
FROM
basket_a
FULL OUTER JOIN basket_b
ON fruit_a = fruit_b;
Result from Query:
Following is the result obtained by executing query on the sample database
| a integer | fruit_a character varying(100) | b integer | fruit_b character varying(100) |
|---|---|---|---|
| 2 | Apple | 2 | Apple |
| 1 | Orange | 1 | Orange |
| 3 | Banana | [null] | [null] |
| 4 | Cucumber | [null] | [null] |
| [null] | [null] | 3 | Watermelon |
| [null] | [null] | 4 | Pear |

Cross Join
The cross join returns the Cartesian product of both tables.
Sample Database:
customer Table:
| customer_id | customer_name | customer_address |
|---|---|---|
| 1 | John Smith | Avenue 1, Boston |
| 2 | Jane Doe | Stew 21, New York |
| 3 | Alice Brown | Avias 11, Paris |
| 4 | Bob Johnson | Trento 2, Milan |
invoice Table:
| invoice_id | invoice_number | customer_id | total_amount |
|---|---|---|---|
| 1 | INV-001 | 1 | 100.00 |
| 2 | INV-002 | 2 | 150.00 |
| 3 | INV-003 | 3 | 200.00 |
| 4 | INV-004 | 4 | 75.00 |
SELECT *
FROM table1
CROSS JOIN table2;
Example:
SELECT * FROM customer
CROSS JOIN
invoice;
Result from Query:
Following is the result obtained by executing query on the sample database
| customer_id | customer_name | customer_address | invoice_id | invoice_number | total_amount |
|---|---|---|---|---|---|
| 1 | John Smith | Street 1, Paris | 1 | INV-001 | 100.00 |
| 1 | John Smith | Street 1, Paris | 2 | INV-002 | 150.00 |
| 1 | John Smith | Street 1, Paris | 3 | INV-003 | 200.00 |
| 1 | John Smith | Street 1, Paris | 4 | INV-004 | 75.00 |
| 2 | Jane Doe | Street 1, Paris | 1 | INV-001 | 100.00 |
| 2 | Jane Doe | Street 1, Paris | 2 | INV-002 | 150.00 |
| 2 | Jane Doe | Street 1, Paris | 3 | INV-003 | 200.00 |
| 2 | Jane Doe | Street 1, Paris | 4 | INV-004 | 75.00 |
| 3 | Alice Brown | Av 4, Milan | 1 | INV-001 | 100.00 |
| 3 | Alice Brown | Av 4, Milan | 2 | INV-002 | 150.00 |
| 3 | Alice Brown | Av 4, Milan | 3 | INV-003 | 200.00 |
| 3 | Alice Brown | Av 4, Milan | 4 | INV-004 | 75.00 |
| 4 | Bob Johnson | Bouv 8, Lion | 1 | INV-001 | 100.00 |
| 4 | Bob Johnson | Bouv 8, Lion | 2 | INV-002 | 150.00 |
| 4 | Bob Johnson | Bouv 8, Lion | 3 | INV-003 | 200.00 |
| 4 | Bob Johnson | Bouv 8, Lion | 4 | INV-004 | 75.00 |

Natural Join
The natural join performs a join based on columns with the same name in both tables.
Sample Database:
products Table:
| product_id | product_name | category_id | price |
|---|---|---|---|
| 1 | iPhone | 1 | 999 |
| 2 | Samsung S21 | 1 | 899 |
| 3 | Sony TV | 2 | 1499 |
| 4 | MacBook Pro | 3 | 1999 |
categories Table:
| category_id | category_name |
|---|---|
| 1 | Phones |
| 2 | TVs |
| 3 | Laptops |
SELECT *
FROM table1
NATURAL JOIN table2;
Example:
SELECT * FROM products
NATURAL JOIN categories;
Result from Query:
Following is the result obtained by executing query on the sample database
| product_id | product_name | category_id | price | category_name |
|---|---|---|---|---|
| 1 | iPhone | 1 | 999 | Phones |
| 2 | Samsung S21 | 1 | 899 | Phones |
| 3 | Sony TV | 2 | 1499 | TVs |
| 4 | MacBook Pro | 3 | 1999 | Laptops |

Self Join
The self join allows a table to be joined with itself.
Sample Database:
employee Table:
| employee_id | first_name | last_name | manager_id |
|---|---|---|---|
| 1 | John | Smith | NULL |
| 2 | Jane | Doe | 1 |
| 3 | Alice | Brown | 1 |
| 4 | Bob | Johnson | 2 |
SELECT *
FROM table1 AS t1
JOIN table1 AS t2
ON t1.column = t2.column;
Example:
SELECT
e.first_name || ' ' || e.last_name employee,
m .first_name || ' ' || m .last_name manager
FROM
employee e
INNER JOIN employee m ON m .employee_id = e.manager_id
ORDER BY
manager;
Result from Query:
Following is the result obtained by executing query on the sample database
| employee | manager |
|---|---|
| John Smith | NULL |
| Jane Doe | John Smith |
| Alice Brown | John Smith |
| Bob Johnson | Jane Doe |
Implementing Joins in DbSchema
DbSchema is a database management and design tool that supports SQL querying.
To implement Joins in DbSchema follow the steps mentioned below:
Inner Join
OpenDbSchema and connect to your PostgreSQL database.Createa new SQL Editor window.Writethe inner join query and execute it.
Left Join
OpenDbSchema and connect to your PostgreSQL database.Createa new SQL Editor window.Writethe left join query and execute it.
Right Join
OpenDbSchema and connect to your PostgreSQL database.Createa new SQL Editor window.Writethe right join query and execute it.
Full Outer Join
OpenDbSchema and connect to your PostgreSQL database.Createa new SQL Editor window.Writethe full outer join query and execute it.
Cross Join
OpenDbSchema and connect to your PostgreSQL database.Createa new SQL Editor window.Writethe cross join query and execute it.
Natural Join
OpenDbSchema and connect to your PostgreSQL database.Createa new SQL Editor window.Writethe natural join query and execute it.
Self Join
OpenDbSchema and connect to your PostgreSQL database.Createa new SQL Editor window.Writethe self join query and execute it.
Implement JOINS and Visually Manage PostgreSQL using DbSchema
DbSchema is a PostgreSQL client and visual designer. DbSchema has a free Community Edition, which can be downloaded here.
Implement JOINS
- Start the application and connect to the Postgres database.
- Navigate to
SQL Editorand create a new SQL Editor window. - Write the desired Join query and execute the query.
Conclusion
Joins are an essential aspect of working with relational databases. They enable us to combine data from multiple tables, providing a powerful way to retrieve and analyze data. By understanding the different types of joins and how to implement them in psql and DbSchema, you can enhance your data querying capabilities and perform complex operations efficiently.
References
- PostgreSQL Documentation: https://www.postgresql.org/docs/
- DbSchema Documentation: https://dbschema.com/documentation/
Remember to consult the official documentation of the tools you are using for the most up-to-date and detailed information.