It follows the same running order as the MySQL course, but every lesson brings in something only PostgreSQL has. DISTINCT ON, = ANY(array), the FILTER clause, keyset pagination, JSONB, SKIP LOCKED, MERGE, and Buffers in EXPLAIN. Thirty lessons ending at a design where whatever a constraint can protect is not re-protected in the application.
The 30 lessons are grouped into six chapters. Working through them in order is the best way, but you are welcome to read only the part you are stuck on right now. Note: SQL cannot run inside the browser. Install PostgreSQL 18 (16 and 17 behave almost identically), load the sample data from lesson 1, and try it there.
Connecting with psql, creating a schema and tables, and taking back the row you just inserted with RETURNING. It starts from the fact that what MySQL calls a database is a schema here.
DISTINCT ON, which writes "one row per category" in a single statement, = ANY(array) so you never build IN placeholders again, how one NULL inside NOT IN empties the result, and how to stop using OFFSET.
From the FILTER clause that retires counting with CASE WHEN, through GROUP BY and HAVING, duplication in joins, LATERAL, EXISTS, and how WITH stopped being an optimisation fence.
Window frames, the trap where timestamptz meets BETWEEN, UPSERT with ON CONFLICT and bulk loading with COPY, and the fact that even TRUNCATE can be rolled back.
Isolation levels and the aborted transaction, a job queue that needs no more than SKIP LOCKED, numeric and uuidv7, what does not apply inside jsonb, constraints and normalisation.
Index types and when they apply, why EXPLAIN is read through Buffers rather than time, VACUUM and statistics, roles, privileges and backups, and finally driving it from an application with psycopg.
Once you have finished all 30 lessons, see the same material through MySQL in Database Fundamentals with MySQL. To drive it from an application, continue with FastAPI or Django. Membership unlocks every course.