--- obj: application website: https://www.postgresql.org repo: https://git.postgresql.org/gitweb/?p=postgresql.git --- # Postgres PostgreSQL is an advanced, open-source, object-relational database management system. It is renowned for its scalability, reliability, and compliance with the SQL standard. PostgreSQL supports both SQL (relational) and JSON (non-relational) querying, making it highly versatile. ## Extensions PostgreSQL can be extended via extensions: - [TimescaleDB](./TimescaleDB.md) - Time-series data - [pgVector](./pgvector.md) - Vector database functions - [PostGIS](./PostGIS.md) - Spatial data ## psql **psql** is a terminal-based front end to PostgreSQL. It allows users to interact with PostgreSQL databases by executing SQL queries, managing database objects, and performing administrative tasks. To start psql, open your terminal or command prompt and type: ```bash psql ``` ### Connecting to a Database You can specify the database name, user, host, and port when launching psql: ```bash psql -d database_name -U username -h hostname -p port ``` Alternatively, you can use environment variables: ```bash export PGDATABASE=mydb export PGUSER=myuser export PGPASSWORD=mypassword export PGHOST=localhost export PGPORT=5432 psql ``` ### Listing Databases and Tables - **List Databases:** ```sql \l ``` - **List Tables in the Current Database:** ```sql \dt ``` - **List All Schemas:** ```sql \dn ``` ### Creating and Dropping Databases/Tables - **Create a Database:** ```sql CREATE DATABASE mydb; ``` - **Drop a Database:** ```sql DROP DATABASE mydb; ``` - **Create a Table:** ```sql CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL ); ``` - **Drop a Table:** ```sql DROP TABLE users; ``` ### Running SQL Queries Execute standard SQL commands to interact with your data. **Example: Inserting Data** ```sql INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com'); ``` **Example: Querying Data** ```sql SELECT * FROM users; ``` **Example: Updating Data** ```sql UPDATE users SET email = 'john.doe@example.com' WHERE username = 'john_doe'; ``` **Example: Deleting Data** ```sql DELETE FROM users WHERE username = 'john_doe'; ``` ## Meta-Commands psql provides a set of meta-commands (prefixed with `\`) that facilitate various tasks. ### Common Meta-Commands - **Help on Meta-Commands:** ```sql \? ``` - **Help on SQL Commands:** ```sql \h ``` - **Describe a Table:** ```sql \d table_name ``` - **List All Tables, Views, and Sequences:** ```sql \dt ``` - **List All Indexes:** ```sql \di ``` - **Exit psql:** ```sql \q ``` ## Data Types ### 1. **Numeric Types** - **Small Integer Types** - `SMALLINT` (2 bytes): Range from -32,768 to +32,767 - **Integer Types** - `INTEGER` or `INT` (4 bytes): Range from -2,147,483,648 to +2,147,483,647 - **Big Integer Types** - `BIGINT` (8 bytes): Range from -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807 - **Decimal/Exact Types** - `DECIMAL` or `NUMERIC` (variable size): User-defined precision and scale - **Floating-Point Types** - `REAL` (4 bytes): Single precision floating-point number - `DOUBLE PRECISION` (8 bytes): Double precision floating-point number - **Serial Types (Auto-Incrementing)** - `SERIAL` (4 bytes): Auto-incrementing integer (small range) - `BIGSERIAL` (8 bytes): Auto-incrementing integer (large range) - `SMALLSERIAL` (2 bytes): Auto-incrementing integer (smaller range) ### 2. **Monetary Type** - `MONEY`: Stores currency amounts with a fixed fractional precision ### 3. **Character Types** - **Fixed-Length Strings** - `CHAR(n)` or `CHARACTER(n)`: Fixed length (padded with spaces) - **Variable-Length Strings** - `VARCHAR(n)` or `CHARACTER VARYING(n)`: Variable length with a limit - **Text** - `TEXT`: Variable length with no specific limit ### 4. **Binary Data Types** - **Binary Large Object** - `BYTEA`: Stores binary strings (byte arrays) ### 5. **Date/Time Types** - **Date and Time** - `DATE`: Calendar date (year, month, day) - `TIME` (no time zone): Time of day (without time zone) - `TIMETZ` (with time zone): Time of day (with time zone) - `TIMESTAMP` (no time zone): Date and time without time zone - `TIMESTAMPTZ` (with time zone): Date and time with time zone - **Intervals** - `INTERVAL`: Time span (e.g., days, months, hours) ### 6. **Boolean Type** - `BOOLEAN`: Stores `TRUE`, `FALSE`, or `NULL` ### 7. **UUID Type** - `UUID`: Stores Universally Unique Identifiers (128-bit values) ### 8. **Enumerated Types** - `ENUM`: User-defined enumerated type (a static set of values) ### 9. **Geometric Types** - `POINT`: Stores a geometric point (x, y) - `LINE`: Infinite line - `LSEG`: Line segment - `BOX`: Rectangular box - `PATH`: Geometric path (multiple points) - `POLYGON`: Closed geometric figure - `CIRCLE`: Circle ### 10. **Network Address Types** - `CIDR`: IPv4 or IPv6 network block - `INET`: IPv4 or IPv6 address - `MACADDR`: MAC address - `MACADDR8`: MAC address (EUI-64 format) ### 11. **Bit String Types** - **Fixed-Length Bit Strings** - `BIT(n)`: Fixed-length bit string - **Variable-Length Bit Strings** - `BIT VARYING(n)`: Variable-length bit string ### 12. **Text Search Types** - `TSVECTOR`: Text search document - `TSQUERY`: Text search query ### 13. **JSON Types** - `JSON`: Textual JSON data - `JSONB`: Binary JSON data (more efficient for indexing) ### 14. **Array Types** - `ARRAY`: Allows any data type to be stored as an array (e.g., `INTEGER[]`, `TEXT[]`) ### 15. **Range Types** - `INT4RANGE`: Range of `INTEGER` - `INT8RANGE`: Range of `BIGINT` - `NUMRANGE`: Range of `NUMERIC` - `TSRANGE`: Range of `TIMESTAMP WITHOUT TIME ZONE` - `TSTZRANGE`: Range of `TIMESTAMP WITH TIME ZONE` - `DATERANGE`: Range of `DATE` ### 16. **Composite Types** - User-defined types that consist of multiple fields of various types ### 17. **Object Identifier Types (OID)** - `OID`: Object identifier (used internally by PostgreSQL) - `REGCLASS`, `REGPROC`, `REGTYPE`: Special types for referencing classes, procedures, and types by OID or name ### 18. **Pseudo-Types** - `ANY`: Accepts any data type - `ANYARRAY`: Accepts any array data type - `ANYELEMENT`: Represents any type of element - `ANYENUM`: Accepts any `ENUM` type - `ANYNONARRAY`: Any non-array type - `VOID`: No data (used with functions that return no value) - `TRIGGER`: Used in triggers - `LANGUAGE_HANDLER`: Used internally for language support ## Docker-Compose ```yml services: postgres: image: postgres:17 container_name: postgres environment: POSTGRES_USER: myuser POSTGRES_PASSWORD: mypassword POSTGRES_DB: mydb ports: - "5432:5432" volumes: - ./postgres:/var/lib/postgresql/data restart: always ```