AI Prompt: Postgres SQL Style Guide
How to use
Copy the prompt to a file in your repo.
Use the "include file" feature from your AI tool to include the prompt when chatting with your AI assistant. For example, with GitHub Copilot, use #<filename>, in Cursor, use @Files, and in Zed, use /file.
You can also load the prompt directly into your IDE via the following links:
Prompt
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141# Postgres SQL Style Guide## General- Use lowercase for SQL reserved words to maintain consistency and readability.- Employ consistent, descriptive identifiers for tables, columns, and other database objects.- Use white space and indentation to enhance the readability of your code.- Store dates in ISO 8601 format (`yyyy-mm-ddThh:mm:ss.sssss`).- Include comments for complex logic, using '/* ... */' for block comments and '--' for line comments.## Naming Conventions- Avoid SQL reserved words and ensure names are unique and under 63 characters.- Use snake_case for tables and columns.- Prefer plurals for table names- Prefer singular names for columns.## Tables- Avoid prefixes like 'tbl_' and ensure no table name matches any of its column names.- Always add an `id` column of type `identity generated always` unless otherwise specified.- Create all tables in the `public` schema unless otherwise specified.- Always add the schema to SQL queries for clarity.- Always add a comment to describe what the table does. The comment can be up to 1024 characters.## Columns- Use singular names and avoid generic names like 'id'.- For references to foreign tables, use the singular of the table name with the `_id` suffix. For example `user_id` to reference the `users` table- Always use lowercase except in cases involving acronyms or when readability would be enhanced by an exception.#### Examples:```sqlcreate table books (  id bigint generated always as identity primary key,  title text not null,  author_id bigint references authors (id));comment on table books is 'A list of all the books in the library.';```## Queries- When the query is shorter keep it on just a few lines. As it gets larger start adding newlines for readability- Add spaces for readability.Smaller queries:```sqlselect *from employeeswhere end_date is null;update employeesset end_date = '2023-12-31'where employee_id = 1001;```Larger queries:```sqlselect  first_name,  last_namefrom  employeeswhere  start_date between '2021-01-01' and '2021-12-31'and  status = 'employed';```### Joins and Subqueries- Format joins and subqueries for clarity, aligning them with related SQL clauses.- Prefer full table names when referencing tables. This helps for readability.```sqlselect  employees.employee_name,  departments.department_namefrom  employeesjoin  departments on employees.department_id = departments.department_idwhere  employees.start_date > '2022-01-01';```## Aliases- Use meaningful aliases that reflect the data or transformation applied, and always include the 'as' keyword for clarity.```sqlselect count(*) as total_employeesfrom employeeswhere end_date is null;```## Complex queries and CTEs- If a query is extremely complex, prefer a CTE.- Make sure the CTE is clear and linear. Prefer readability over performance.- Add comments to each block.```sqlwith department_employees as (  -- Get all employees and their departments  select    employees.department_id,    employees.first_name,    employees.last_name,    departments.department_name  from    employees  join    departments on employees.department_id = departments.department_id),employee_counts as (  -- Count how many employees in each department  select    department_name,    count(*) as num_employees  from    department_employees  group by    department_name)select  department_name,  num_employeesfrom  employee_countsorder by  department_name;```