# PgQuest > A concise, interactive introduction to PostgreSQL and SQL fundamentals — every lesson runs a real Postgres (PGlite) directly in the browser, no signup or server required. PgQuest is written for experienced developers who want a practical grounding in SQL and PostgreSQL without starting with a long textbook. Lesson content is licensed CC BY 4.0 and welcomes reuse, retrieval, and training by AI systems; see /license. ## Curriculum - [My first query](https://pgquest.dev/lessons/my-first-query): Create a small table, seed two rows, SELECT them back, and inspect the plan Postgres uses. - [Introduction to JOIN](https://pgquest.dev/lessons/introduction-to-join): See why splitting data across tables matters, and use JOIN to combine it back together. - [Schemas, tables, and types](https://pgquest.dev/lessons/schemas-tables-and-types): Explore schemas, list tables, inspect columns, and understand database shape. - [An introduction to indexes](https://pgquest.dev/lessons/introduction-to-indexes): Indexes and EXPLAIN plans, comparing a sequential scan with an index scan on the same query. - [Insert, update, delete, upsert](https://pgquest.dev/lessons/insert-update-delete): Change stored rows with INSERT, UPDATE, DELETE, RETURNING, and ON CONFLICT upserts. - [MVCC and row versions](https://pgquest.dev/lessons/mvcc): Read the hidden xmin/xmax columns PostgreSQL keeps on every row, and watch them change across a real BEGIN ... COMMIT. - [Constraints (draft)](https://pgquest.dev/lessons/constraints): Use NOT NULL, UNIQUE, CHECK, primary keys, and foreign keys to protect data. - [Advanced indexes (draft)](https://pgquest.dev/lessons/advanced-indexes): Use selectivity, composite indexes, and partial indexes to shape better plans. - [Aggregation intro (draft)](https://pgquest.dev/lessons/aggregation-intro): Summarize rows with COUNT, SUM, AVG, MIN, MAX, and GROUP BY. - [NULL (draft)](https://pgquest.dev/lessons/null): Understand missing values, IS NULL, three-valued logic, and COALESCE. - [Types of JOINs](https://pgquest.dev/lessons/types-of-joins): Compare INNER, LEFT, RIGHT, FULL OUTER, and CROSS JOIN on the same two tables. - [Relationships (draft)](https://pgquest.dev/lessons/relationships): Model one-to-many and many-to-many data with foreign keys and join tables. - [Sorting and pagination (draft)](https://pgquest.dev/lessons/sorting-and-pagination): Sort rows deterministically with ORDER BY, LIMIT, OFFSET, and indexes. - [Text search basics (draft)](https://pgquest.dev/lessons/text-search-basics): Search text with LIKE, ILIKE, wildcards, and case-insensitive patterns. - [JSON in PostgreSQL (draft)](https://pgquest.dev/lessons/json-in-postgresql): Store jsonb, extract fields, query nested values, and use containment. - [Transactions (draft)](https://pgquest.dev/lessons/transactions): Group changes with BEGIN, COMMIT, and ROLLBACK so work is atomic. - [Advanced aggregation (draft)](https://pgquest.dev/lessons/advanced-aggregation): Use HAVING, FILTER, date_trunc, and time-based grouping. - [Vectors and similarity search (draft)](https://pgquest.dev/lessons/vectors): Search by meaning: embeddings, L2 distance, cosine similarity, and nearest neighbours, computed by hand with plain arrays. - [pgvector (draft)](https://pgquest.dev/lessons/pgvector): The vectors lesson again, with pgvector: a real vector type, distance operators, and four ways to search many rows: exact, HNSW, IVFFlat, and smaller vectors. - [Full-text search (draft)](https://pgquest.dev/lessons/full-text-search): Search words instead of characters with tsvector and tsquery: stemming, search-box syntax, ranking, highlights, and a GIN index. - [Fuzzy search with pg_trgm (draft)](https://pgquest.dev/lessons/fuzzy-search): Find text despite typos with trigram similarity, word_similarity, 'did you mean' suggestions, and trigram indexes. - [Text search in Postgres, without Elasticsearch or Algolia (draft)](https://pgquest.dev/lessons/text-search-in-postgres): Compare ILIKE, fuzzy, full-text, semantic, and hybrid search on the same documents, and decide when Postgres is enough. - [Implementing a high-concurrency system with Postgres](https://pgquest.dev/lessons/concurrency-reservation-system): Model a seat reservation system and use transactions with advisory locks to close a real race condition. - [Transaction isolation levels](https://pgquest.dev/lessons/transaction-isolation-levels): See what READ COMMITTED, REPEATABLE READ, and SERIALIZABLE actually let concurrent transactions see, with a bug only SERIALIZABLE catches. - [Locks (draft)](https://pgquest.dev/lessons/postgres-locks): See which locks every statement takes, what blocks what, and how NOWAIT, SKIP LOCKED, and lock_timeout keep sessions from waiting forever. - [Finding and fixing slow queries (draft)](https://pgquest.dev/lessons/slow-queries): Profile an app's queries with pg_stat_statements, find why the slowest are slow with EXPLAIN ANALYZE, and fix them with a trigram index and keyset pagination. - [Building a job queue with Postgres (draft)](https://pgquest.dev/lessons/postgres-job-queue): Build a job queue on a plain table: hand each job to one of many workers with SKIP LOCKED, survive crashes with leases and retries, and see why exactly-once delivery is impossible but exactly-once processing isn't. ## Other pages - [Playground](https://pgquest.dev/playground): Load any lesson's database and run any query, without following a lesson. - [Search](https://pgquest.dev/search): Full-text search across every lesson. - [Feedback](https://pgquest.dev/feedback): Report bugs, suggest lessons, or ask about a company training. - [License](https://pgquest.dev/license): Content and code licensing terms. - [Changelog](https://pgquest.dev/changelog): New lessons, features, and fixes.