Skip to main content

PostgreSQL Commands

Creating 100 PostgreSQL queries is extensive, but here's a collection of essential and commonly-used queries grouped by categories, including table management, CRUD operations, data filtering, joins, aggregations, transactions, and functions. These should cover most basics and intermediate skills.

Table Management

  1. Create a Table

    CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    department VARCHAR(50),
    salary NUMERIC(10, 2)
    );
  2. Add a Column

    ALTER TABLE employees ADD COLUMN hire_date DATE;
  3. Modify Column Data Type

    ALTER TABLE employees ALTER COLUMN age TYPE SMALLINT;
  4. Rename a Column

    ALTER TABLE employees RENAME COLUMN department TO dept;
  5. Drop a Column

    ALTER TABLE employees DROP COLUMN hire_date;
  6. Rename a Table

    ALTER TABLE employees RENAME TO staff;
  7. Drop a Table

    DROP TABLE IF EXISTS employees;
  8. Add a Unique Constraint

    ALTER TABLE employees ADD CONSTRAINT unique_name UNIQUE (name);
  9. Add a Foreign Key

    ALTER TABLE employees ADD CONSTRAINT fk_dept FOREIGN KEY (dept) REFERENCES departments(dept_name);
  10. Create a New Schema

    CREATE SCHEMA company_data;

Basic Insert, Update, Delete

  1. Insert Data

    INSERT INTO employees (name, age, dept, salary) VALUES ('Alice', 30, 'IT', 50000);
  2. Insert Multiple Rows

    INSERT INTO employees (name, age, dept, salary) VALUES
    ('Bob', 35, 'HR', 45000),
    ('Charlie', 28, 'Finance', 55000);
  3. Update Data

    UPDATE employees SET salary = 60000 WHERE name = 'Alice';
  4. Delete Data

    DELETE FROM employees WHERE name = 'Charlie';
  5. Upsert Data (Insert on Conflict)

    INSERT INTO employees (id, name, age, dept, salary)
    VALUES (1, 'Alice', 30, 'IT', 50000)
    ON CONFLICT (id) DO UPDATE SET salary = EXCLUDED.salary;

Basic Select Queries

  1. Select All Columns

    SELECT * FROM employees;
  2. Select Specific Columns

    SELECT name, dept FROM employees;
  3. Select with WHERE

    SELECT * FROM employees WHERE dept = 'Finance';
  4. Select with ORDER BY

    SELECT * FROM employees ORDER BY salary DESC;
  5. Select with LIMIT

    SELECT * FROM employees LIMIT 10;
  6. Select with OFFSET

    SELECT * FROM employees OFFSET 5;
  7. Select Distinct Values

    SELECT DISTINCT dept FROM employees;
  8. Select with LIKE

    SELECT * FROM employees WHERE name LIKE 'A%';
  9. Select with BETWEEN

    SELECT * FROM employees WHERE salary BETWEEN 40000 AND 60000;
  10. Select with IN

    SELECT * FROM employees WHERE dept IN ('IT', 'HR');
  11. Select with IS NULL

    SELECT * FROM employees WHERE dept IS NULL;
  12. Select with NOT IN

    SELECT * FROM employees WHERE dept NOT IN ('IT', 'HR');

Aggregation Queries

  1. Count Rows

    sql
    Copy code
    SELECT COUNT(*) FROM employees;

  2. Average Salary

    sql
    Copy code
    SELECT AVG(salary) FROM employees;

  3. Sum of Salaries

    sql
    Copy code
    SELECT SUM(salary) FROM employees;

  4. Maximum Salary

    sql
    Copy code
    SELECT MAX(salary) FROM employees;

  5. Minimum Salary

    sql
    Copy code
    SELECT MIN(salary) FROM employees;

  6. Group By Department

    sql
    Copy code
    SELECT dept, COUNT(*) FROM employees GROUP BY dept;

  7. Group By with Aggregate Function

    sql
    Copy code
    SELECT dept, AVG(salary) AS avg_salary FROM employees GROUP BY dept;

  8. Group By with HAVING

    sql
    Copy code
    SELECT dept, COUNT(*) FROM employees GROUP BY dept HAVING COUNT(*) > 5;

Joins

  1. Inner Join

    sql
    Copy code
    SELECT e.name, e.salary, d.manager
    FROM employees e
    INNER JOIN departments d ON e.dept = d.dept_name;

  2. Left Join

    sql
    Copy code
    SELECT e.name, d.manager
    FROM employees e
    LEFT JOIN departments d ON e.dept = d.dept_name;

  3. Right Join

    sql
    Copy code
    SELECT e.name, d.manager
    FROM employees e
    RIGHT JOIN departments d ON e.dept = d.dept_name;

  4. Full Outer Join

    sql
    Copy code
    SELECT e.name, d.manager
    FROM employees e
    FULL OUTER JOIN departments d ON e.dept = d.dept_name;

  5. Self Join

    sql
    Copy code
    SELECT e1.name, e2.name AS coworker
    FROM employees e1
    JOIN employees e2 ON e1.dept = e2.dept AND e1.id != e2.id;

  6. Cross Join

    sql
    Copy code
    SELECT e.name, p.project
    FROM employees e
    CROSS JOIN projects p;

Transactions

  1. Begin Transaction

    sql
    Copy code
    BEGIN;

  2. Commit Transaction

    sql
    Copy code
    COMMIT;

  3. Rollback Transaction

    sql
    Copy code
    ROLLBACK;

  4. Savepoint in Transaction

    sql
    Copy code
    SAVEPOINT my_savepoint;

  5. Rollback to Savepoint

    sql
    Copy code
    ROLLBACK TO SAVEPOINT my_savepoint;

Data Types and Casting

  1. Cast to Integer

    sql
    Copy code
    SELECT '123'::INTEGER;

  2. Cast to Date

    sql
    Copy code
    SELECT '2024-01-01'::DATE;

  3. Extract Part of Date

    sql
    Copy code
    SELECT EXTRACT(YEAR FROM CURRENT_DATE);

  4. Convert Data Type

    sql
    Copy code
    SELECT CAST(salary AS NUMERIC(12, 2)) FROM employees;

Subqueries

  1. Subquery in SELECT

    sql
    Copy code
    SELECT name, (SELECT AVG(salary) FROM employees) AS avg_salary FROM employees;

  2. Subquery in WHERE

    sql
    Copy code
    SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);

  3. Subquery in FROM

    sql
    Copy code
    SELECT dept, avg_salary FROM (SELECT dept, AVG(salary) AS avg_salary FROM employees GROUP BY dept) AS dept_avg;

  4. Correlated Subquery

    sql
    Copy code
    SELECT name FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE dept = e.dept);

Window Functions

  1. Row Number

    sql
    Copy code
    SELECT name, ROW_NUMBER() OVER (ORDER BY salary DESC) FROM employees;

  2. Rank

    sql
    Copy code
    SELECT name, RANK() OVER (ORDER BY salary DESC) FROM employees;

  3. Dense Rank

    sql
    Copy code
    SELECT name, DENSE_RANK() OVER (ORDER BY salary DESC) FROM employees;

  4. Lead

    sql
    Copy code
    SELECT name, salary, LEAD(salary) OVER (ORDER BY salary) AS next_salary FROM employees;

  5. Lag

    sql
    Copy code
    SELECT name, salary, LAG(salary) OVER (ORDER BY salary) AS prev_salary FROM employees;

  6. Moving Average

    sql
    Copy code
    SELECT name, AVG(salary) OVER (ORDER BY age ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS moving_avg FROM employees;

Conditional Expressions

  1. CASE Statement

    sql
    Copy code
    SELECT name, salary, CASE WHEN salary > 50000 THEN 'High' ELSE 'Low' END AS salary_level FROM employees;

  2. COALESCE

    sql
    Copy code
    SELECT name, COALESCE(dept, 'Not Assigned') FROM employees;

  3. NULLIF

    sql
    Copy code
    SELECT NULLIF(salary, 0) FROM employees;

Conditional Expressions (continued)

  1. Using GREATEST Function

    sql
    Copy code
    SELECT name, GREATEST(salary, 50000) AS adjusted_salary FROM employees;

  2. Using LEAST Function

    sql
    Copy code
    SELECT name, LEAST(salary, 100000) AS capped_salary FROM employees;

  3. CASE with Multiple Conditions

    sql
    Copy code
    SELECT name,
    CASE
    WHEN salary > 80000 THEN 'High'
    WHEN salary BETWEEN 50000 AND 80000 THEN 'Medium'
    ELSE 'Low'
    END AS salary_category
    FROM employees;

Advanced Subqueries

  1. EXISTS Clause

    sql
    Copy code
    SELECT name FROM employees e WHERE EXISTS (SELECT 1 FROM departments d WHERE d.manager = e.name);

  2. NOT EXISTS Clause

    sql
    Copy code
    SELECT name FROM employees e WHERE NOT EXISTS (SELECT 1 FROM projects p WHERE p.employee_id = e.id);

  3. IN with Subquery

    sql
    Copy code
    SELECT name FROM employees WHERE dept IN (SELECT dept_name FROM departments WHERE region = 'East');

  4. Correlated Subquery with UPDATE

    sql
    Copy code
    UPDATE employees e SET salary = salary * 1.1 WHERE salary < (SELECT AVG(salary) FROM employees WHERE dept = e.dept);

  5. Correlated Subquery in DELETE

    sql
    Copy code
    DELETE FROM employees e WHERE e.salary < (SELECT AVG(salary) FROM employees WHERE dept = e.dept);

  6. Array Subquery

    sql
    Copy code
    SELECT ARRAY(SELECT name FROM employees WHERE dept = 'Finance') AS finance_team;

Text Functions

  1. Concatenate Strings

    sql
    Copy code
    SELECT name || ' works in ' || dept AS description FROM employees;

  2. Substring Extraction

    sql
    Copy code
    SELECT SUBSTRING(name FROM 1 FOR 3) AS initials FROM employees;

  3. Uppercase Conversion

    sql
    Copy code
    SELECT UPPER(name) AS uppercase_name FROM employees;

  4. Lowercase Conversion

    sql
    Copy code
    SELECT LOWER(name) AS lowercase_name FROM employees;

  5. Length of a String

    sql
    Copy code
    SELECT name, LENGTH(name) AS name_length FROM employees;

  6. Replace Substring

    sql
    Copy code
    SELECT REPLACE(name, 'a', '@') AS modified_name FROM employees;

  7. Trim Whitespace

    sql
    Copy code
    SELECT TRIM(' ' FROM name) AS trimmed_name FROM employees;

  8. Split String into Array

    sql
    Copy code
    SELECT STRING_TO_ARRAY(name, ' ') FROM employees;

  9. Position of Substring

    sql
    Copy code
    SELECT POSITION('a' IN name) AS first_a_position FROM employees;

Date/Time Functions

  1. Current Date

    sql
    Copy code
    SELECT CURRENT_DATE;

  2. Current Time

    sql
    Copy code
    SELECT CURRENT_TIME;

  3. Current Timestamp

    sql
    Copy code
    SELECT CURRENT_TIMESTAMP;

  4. Extract Year

    sql
    Copy code
    SELECT EXTRACT(YEAR FROM hire_date) AS hire_year FROM employees;

  5. Date Difference in Days

    sql
    Copy code
    SELECT name, AGE(hire_date) AS days_since_hired FROM employees;

  6. Add Interval to Date

    sql
    Copy code
    SELECT name, hire_date + INTERVAL '1 year' AS next_anniversary FROM employees;

  7. Truncate Date

    sql
    Copy code
    SELECT DATE_TRUNC('month', hire_date) AS hire_month FROM employees;

  8. Date Part

    sql
    Copy code
    SELECT name, DATE_PART('day', hire_date) AS hire_day FROM employees;

  9. Date Formatting

    sql
    Copy code
    SELECT TO_CHAR(hire_date, 'YYYY-MM-DD') AS formatted_hire_date FROM employees;

Array Functions

  1. Creating an Array

    sql
    Copy code
    SELECT ARRAY['Finance', 'IT', 'HR'] AS departments;

  2. Array Length

    sql
    Copy code
    SELECT ARRAY_LENGTH(ARRAY['Finance', 'IT', 'HR'], 1);

  3. Access Array Element

    sql
    Copy code
    SELECT (ARRAY['Finance', 'IT', 'HR'])[1] AS first_department;

  4. Array Concatenation

    sql
    Copy code
    SELECT ARRAY[1, 2, 3] || ARRAY[4, 5, 6] AS combined_array;

  5. Unnest Array

    sql
    Copy code
    SELECT unnest(ARRAY['Finance', 'IT', 'HR']) AS dept;

User-Defined Functions

  1. Create a Simple Function

    sql
    Copy code
    CREATE FUNCTION calculate_bonus(salary NUMERIC) RETURNS NUMERIC AS $$
    BEGIN
    RETURN salary * 0.1;
    END;
    $$ LANGUAGE plpgsql;

  2. Using the Function

    sql
    Copy code
    SELECT name, calculate_bonus(salary) AS bonus FROM employees;

  3. Create Function with Conditional Logic

    sql
    Copy code
    CREATE FUNCTION get_performance_bonus(salary NUMERIC) RETURNS NUMERIC AS $$
    BEGIN
    IF salary > 50000 THEN
    RETURN salary * 0.15;
    ELSE
    RETURN salary * 0.1;
    END IF;
    END;
    $$ LANGUAGE plpgsql;

  4. Aggregate Function with Filter

    sql
    Copy code
    SELECT AVG(salary) FILTER (WHERE dept = 'IT') AS avg_it_salary FROM employees;

  5. Using CTE with Recursive Query

WITH RECURSIVE dept_hierarchy AS ( SELECT dept_id, dept_name, parent_id FROM departments WHERE parent_id IS NULL UNION ALL SELECT d.dept_id, d.dept_name, d.parent_id FROM departments d JOIN dept_hierarchy dh ON d.parent_id = dh.dept_id ) SELECT * FROM dept_hierarchy;   

This list covers a wide range of PostgreSQL functionality, from basic table management and data manipulation to more advanced array handling, date operations, and user-defined functions. This should give you a robust foundation for working with PostgreSQL!