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.

Where these came from

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 lineWhat it actually meansChapter
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

🧒 Simple

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.

🎓 Professional

Strip the buzzwords and every posting reduces to three responsibilities:

  1. 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.
  2. 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).
  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).
⚠ Trap

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.

The pragmatic answer

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:

The same question written twice: once in SQL every engine understands, and once in the four spellings of “give me the first ten rows”.
-- 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
Types and conversions in this example
  • DATE '2026-01-01' — a typed literal. Without the DATE prefix 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 assigns ROWNUM as rows are produced, before ORDER BY sorts them, so this returns ten arbitrary rows and then sorts those ten. FETCH FIRST sorts first. They only agree when there is no ORDER 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:

Your first query of the course: how many orders sit in each status, and what they are worth.
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
Types and conversions in this example
  • SUM(total_cents) / 100.0 — the whole reason for the .0. The sum is an INTEGER; dividing it by the INTEGER 100 would truncate (1250 / 100 is 12, not 12.5). The literal 100.0 is a REAL, so the engine widens the whole expression to REAL and keeps the cents.
  • ORDER BY n — legal, and worth noticing: ORDER BY runs after SELECT, so it can see the alias n. Writing WHERE n > 5 instead would be an error, because WHERE runs before the alias exists (chapter 06).

How to use this course

  1. Read a chapter with the switch on “Both”. The 🧒 box builds the intuition; the 🎓 box is the sentence you would say to an interviewer.
  2. 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.
  3. 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.
  4. Once a week, do the viva — no options, you say the answer, then mark yourself against the model.
  5. 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.
  1. An advert is a list of things a team is tired of not having, not a specification of you.
  2. Every posting reduces to three responsibilities: read paths, write paths, operability.
  3. Answer the syntax question, then answer the why. The second half is the interview.
  4. Learn the standard deeply and one dialect fluently; the differences are a week's lookup table.
  5. “3 years in production” means “has been on the wrong end of a deadlock”. Most of that is learnable without the scar.
  6. 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.