PostgreSQL Subquery
PostgreSQL Subquery
A PostgreSQL Subquery is a query nested inside another query. This feature is essential for performing complex queries, retrieving data based on calculations or conditions, and breaking down large queries into simpler parts.
Syntax
SELECT column1, column2, ...
FROM table_name
WHERE column_name operator (SELECT column_name
FROM table_name
WHERE condition);
The Subquery has the following components:
column1, column2, ...: The columns to retrieve in the outer query.table_name: The name of the table to retrieve data from.column_name: The column to compare in the subquery.operator: The comparison operator (e.g., =, <, >, IN) to use in the outer query.condition: The condition to filter rows in the subquery.
Example PostgreSQL Subquery Queries
Let's look at some examples of PostgreSQL Subquery queries:
1. Subquery in WHERE Clause
SELECT first_name, last_name
FROM employees
WHERE salary > (SELECT AVG(salary)
FROM employees);
This query retrieves the first_name and last_name of employees whose salary is greater than the average salary of all employees.
2. Subquery in FROM Clause
SELECT department_name, avg_salary
FROM (SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id) AS dept_avg
JOIN departments ON dept_avg.department_id = departments.id;
This query retrieves the department_name and average salary of each department by using a subquery in the FROM clause.
3. Subquery in SELECT Clause
SELECT first_name, last_name,
(SELECT department_name
FROM departments
WHERE departments.id = employees.department_id) AS department_name
FROM employees;
This query retrieves the first_name and last_name of employees along with their department_name by using a subquery in the SELECT clause.
Full Example
Let's go through a complete example that includes creating tables, inserting data, and using subqueries in different parts of a query.
Step 1: Creating Tables
This step involves creating tables named employees and departments to store employee and department data.
CREATE TABLE departments (
id SERIAL PRIMARY KEY,
department_name VARCHAR(100)
);
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
salary NUMERIC(10, 2),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(id)
);
In this example, we create two tables: departments with columns for id and department_name, and employees with columns for id, first_name, last_name, salary, and department_id.

Step 2: Inserting Data into the Tables
This step involves inserting some sample data into the departments and employees tables.
INSERT INTO departments (department_name)
VALUES ('HR'), ('Finance'), ('Engineering');
INSERT INTO employees (first_name, last_name, salary, department_id)
VALUES ('John', 'Doe', 50000, 1),
('Jane', 'Smith', 60000, 2),
('Jim', 'Brown', 55000, 3);
Here, we insert data into the departments table with department names and into the employees table with employee details including their department IDs.

Step 3: Using Subqueries
This step involves querying the employees and departments tables using subqueries.
Subquery in WHERE clause
SELECT first_name, last_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
Subquery in FROM clause
SELECT department_name, avg_salary
FROM (SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id) AS dept_avg
JOIN departments ON dept_avg.department_id = departments.id;
Subquery in SELECT clause
SELECT first_name, last_name,
(SELECT department_name
FROM departments
WHERE departments.id = employees.department_id) AS department_name
FROM employees;
These queries demonstrate the use of subqueries in different parts of a query to retrieve specific data from the employees and departments tables.
Conclusion
The PostgreSQL Subquery feature is a powerful tool for performing complex queries and retrieving specific data based on conditions or calculations. Understanding how to use subqueries and their syntax is essential for effective data manipulation and retrieval in PostgreSQL.