Start here › Chapter 00
The job posting, decoded
This course was not written from a syllabus. It was written backwards from five real Italian SQL / Database Developer postings, so that every chapter can point at the line it answers — and so that the chapters that answer no line have to justify themselves.
Five postings collected in September 2026 from Indeed Italia, Glassdoor, Experis and Jooble,
for roles titled SQL Developer, Database Developer, Programmatore SQL
Server and Sviluppatore PL/SQL junior. The exact wording is quoted below. See
docs/ADVERTS.md in the repository for the full text of each.
The lines, and what each one really means
Job adverts are written by someone who is not the person you will work for, usually by pasting three older adverts together. Read literally they are intimidating. Read properly they are a short list of things a team is tired of not having.
| The line | What it actually means | Chapter |
|---|---|---|
| Ottima conoscenza del linguaggio SQL | You can write a join, a group-by and a window function without looking them up, and you know
what NULL does to each of them. This is the whole of Part 2. |
08, 13 |
| Solida conoscenza di MS SQL Server (versione ≥ 2008) | You have used one engine deeply enough to know it has a buffer pool, a transaction log and a query optimiser, and you can name the T-SQL spellings. | 01, 44 |
| Ottima conoscenza del linguaggio MS T-SQL | Procedural SQL: variables, TRY…CATCH, temp tables, and why a cursor is usually
the wrong answer. |
45 |
| Esperienza in sviluppo PL/SQL a livello junior | The same skills spelled the Oracle way. Worth an afternoon; the concepts transfer entirely. | 45 |
| Progettazione e modellazione di basi dati relazionali | You can take a paragraph of business description and produce tables, keys and constraints that make the wrong state unrepresentable. | 02–05 |
| Ottimizzazione e tuning delle query | The single most common reason this role exists. Something is slow, and nobody on the team can read a plan. This is the whole of Part 4. | 25–29 |
| Sviluppo di stored procedure, viste, funzioni e trigger | The codebase has business logic inside the database. You will be maintaining it whether or not you think that was a good idea. | 33 |
| Esperienza nello sviluppo ETL con SSIS | Data arrives from somewhere else in a shape nobody controls, nightly, and must land without duplicating itself when the job is re-run. | 20, 40 |
| Reporting con SSRS e Power BI | Somebody in finance needs a number. Your job is the view underneath the report, and making it fast enough that the report opens. | 16, 39 |
| Gestione di backup, restore e manutenzione | You are partly the DBA. Nobody will say so at the interview. | 41 |
| Almeno 3 anni su ambienti di produzione | You have been on the wrong end of a deadlock, a full disk, or a migration that locked a table at 09:00. Most of this is learnable without the scar. | 21–23, 42 |
| Conoscenza dei principi di sicurezza dei dati e GDPR | You will not write an injectable query, and you know why a table of Italian customers is a legal object as well as a technical one. | 34, 35 |
| Eccellenti capacità di problem solving, proattività | Nobody will hand you a specification. You will be handed “the report is wrong”. | 48 |
| Metodologia Agile/Scrum | There is a stand-up. You will be asked what you did yesterday. Say it in two sentences. | 47 |
| Buona conoscenza dell'inglese tecnico | You can read documentation and a Stack Overflow answer. Almost nobody is tested on spoken English for these roles in Italy. | — |
The three sentences that are really one sentence
Imagine a shop with a very big cupboard. Everything the shop knows lives in that cupboard: who ordered what, how much things cost, which parcel went out on Tuesday. The advert is the shop saying three things. Find things in the cupboard quickly. Put things in the cupboard without breaking what is already there. Tell us when the cupboard is about to fall over. Everything else in this course is one of those three.
Strip the buzzwords and every posting reduces to three responsibilities:
- Read paths. Retrieve correct data at acceptable latency — which is query formulation (Part 2), physical design (Part 4) and knowing what the optimiser will do with both.
- Write paths. Change data without violating an invariant and without two concurrent sessions producing a state neither intended — constraints (Part 1), transactions and isolation (Part 3).
- Operability. The system tells you when it is unhealthy, and can be restored when it is not — backup, monitoring and safe schema change (Parts 5 and 6).
The most common failure in a junior SQL interview is not a missing feature — it is
answering the syntax question and stopping there. Asked “what is the
difference between WHERE and HAVING?”, the weak answer is “HAVING
filters groups”. The strong answer adds why: WHERE runs before grouping
so it can use an index and reduces the rows the aggregate has to touch; HAVING
runs after, on rows that already cost you the work. Same fact, and one of them tells the
interviewer you understand the machine.
Which engine should you learn?
The postings name four, and Italian shops in practice run three of them: Microsoft SQL Server (dominant in gestionali and manufacturing ERP), Oracle (banks, insurance, large public-sector), and MySQL/MariaDB (everything with a web front end). PostgreSQL is growing fast and is what new projects start on.
Learn the standard deeply and one dialect fluently. About 85% of what you write is portable; the differences are a lookup table you internalise in a week (chapter 44 is that table). This course writes standard SQL by default and flags dialect-specific spellings inline like this:
-- PORTABLE HALF. These five lines run unchanged on SQL Server, PostgreSQL,
-- MySQL, Oracle and SQLite. About 85% of what you write is like this.
SELECT customer_id, -- the grouping key: one output row per customer
SUM(total_cents) AS spend -- adds the cents of every order in that group
FROM orders -- the one table this query reads
WHERE placed_at >= DATE '2026-01-01' -- typed literal: DATE '…' is a date, not text
GROUP BY customer_id; -- collapses the rows; SUM() runs once per group
-- DIALECT HALF. One question — "the first ten" — and four keyword spellings.
SELECT ... FETCH FIRST 10 ROWS ONLY; -- the standard: Oracle 12c+, PostgreSQL, DB2
SELECT ... LIMIT 10; -- PostgreSQL, MySQL, MariaDB, SQLite
SELECT TOP (10) ...; -- SQL Server, and it goes BEFORE the column list
WHERE ROWNUM <= 10; -- Oracle legacy, and NOT equivalent — see below
DATE '2026-01-01'— a typed literal. Without theDATEprefix this is the string'2026-01-01', and the engine converts it to a date because the column is one. That conversion is usually right and occasionally not: it depends on the session's date format, which is why the explicit spelling exists.SUM(total_cents)— INTEGER in, INTEGER out. Cents stay cents; nothing here can produce a fraction, which is exactly why money is stored this way (chapter 03).WHERE ROWNUM <= 10— the trap. Oracle assignsROWNUMas rows are produced, beforeORDER BYsorts them, so this returns ten arbitrary rows and then sorts those ten.FETCH FIRSTsorts first. They only agree when there is noORDER BY, and then neither is meaningful.
Open the playground — a real SQL engine, in your browser, with the reference order-fulfilment database loaded. Run this and read the shape of the answer before you read the rest of this course:
SELECT status, -- one output row per distinct status value
COUNT(*) AS n, -- COUNT(*) counts ROWS, and is never NULL
SUM(total_cents) / 100.0 AS eur -- cents → euros: /100.0 keeps the fraction
FROM orders -- the table; read first, before anything else
GROUP BY status -- what "each" means: collapse rows by status
ORDER BY n DESC; -- biggest group first; n is the SELECT alias
SUM(total_cents) / 100.0— the whole reason for the.0. The sum is an INTEGER; dividing it by the INTEGER100would truncate (1250 / 100is12, not12.5). The literal100.0is a REAL, so the engine widens the whole expression to REAL and keeps the cents.ORDER BY n— legal, and worth noticing:ORDER BYruns afterSELECT, so it can see the aliasn. WritingWHERE n > 5instead would be an error, becauseWHEREruns before the alias exists (chapter 06).
How to use this course
- Read a chapter with the switch on “Both”. The 🧒 box builds the intuition; the 🎓 box is the sentence you would say to an interviewer.
- Reread it with the switch on “🧒 Simple” and try to produce the professional version out loud before you reveal it. That is the whole trick — the switch is not a display preference, it is a retrieval exercise.
- Take the test at the bottom. Every question you answer enters a spaced repetition schedule; Review brings them back on the day you are about to forget them.
- Once a week, do the viva — no options, you say the answer, then mark yourself against the model.
- Before a real interview, run the simulator. It has a clock, it does not let you go back, and it opens with mi parli di lei.
- An advert is a list of things a team is tired of not having, not a specification of you.
- Every posting reduces to three responsibilities: read paths, write paths, operability.
- Answer the syntax question, then answer the why. The second half is the interview.
- Learn the standard deeply and one dialect fluently; the differences are a week's lookup table.
- “3 years in production” means “has been on the wrong end of a deadlock”. Most of that is learnable without the scar.
- If a requirement is genuinely missing from your experience, say so in one sentence and say what you would do about it. Hedging is what loses the room, not the gap.
Interview questions this chapter answers
Which databases have you worked with?
Name one you know deeply and be specific about what you did in it — “SQL Server: I wrote the reporting views and tuned the two slowest ones from 40s to under a second”. Then name the others honestly with the level attached: “I read PL/SQL comfortably, I have not shipped a package.” A precise small answer beats a vague large one every time.
Why do you want to work with databases rather than application code?
Because the data outlives every application written on top of it, so the decisions made here are the expensive ones. It is also the layer where correctness is checkable — a constraint either holds or it does not.
You have no commercial experience. Why should we take you?
Point at something concrete you built and can be questioned on. This course ships a reference database — a real order-fulfilment schema with a state machine, optimistic concurrency and a transactional outbox — precisely so that you have an answer to this that is not a sentence about being a fast learner.