SQL Hospital

Apprendre les requêtes SQL en sauvant l'hôpital Saint-Requête.

Premier jour de stage en cardiologie. À l'hôpital SQL, tout est dans la base de données, et on lui parle en SQL. L'hôpital est en crise : des doses impossibles, quarante alarmes en dix nuits, des portes qui se verrouillent. Trois pannes à régler, une enquête à mener, et une attestation à la clé. Comptez environ une heure et demie.

Votre avatar

L'adresse sert uniquement à enregistrer votre progression et vos temps par étape, pour que l'enseignant puisse adapter le cours. Vous pourrez reprendre plus tard avec la même adresse.

SQL Hospital

Hôpital Saint-Requête Prologue 0:00
Ctrl + Entrée pour exécuter

Schéma des tables (diagramme entité-association)

Notation « patte d'oie » : plusieurs lignes  ·  exactement une  ·  zéro ou une (la colonne peut être NULL). Une colonne xxx_id contient le id d'une ligne de la table xxx : c'est ce qu'on suit avec JOIN.

Aide-mémoire SQL

SELECT * FROM patienttoutes les colonnes de la table patient
SELECT nom, age FROM patientseulement les colonnes nom et age (noms exacts en bas de l'écran)
SELECT * FROM patient WHERE age > 70garder les lignes qui respectent la condition ; un nombre s'écrit sans apostrophes
SELECT * FROM alarme WHERE lieu = 'hall'du texte : entre apostrophes simples, majuscules et minuscules comptent
SELECT * FROM alarme WHERE date_heure > '2026-09-16 00:00'une date est un texte année-mois-jour heure:minute ; elle se compare comme un nombre
SELECT * FROM prescription WHERE dose_mg > 2000 AND soignant_id = 13plusieurs conditions : AND (les deux), OR (l'une ou l'autre) ; comparaisons > < >= <= <>
SELECT * FROM prescription WHERE medicament LIKE 'para%'motif : % remplace n'importe quelle suite de caractères ('%ine' = finit par ine, '%cuisine%' = contient)
SELECT * FROM patient ORDER BY age DESCtrier (ASC croissant par défaut, DESC décroissant)
SELECT DISTINCT lieu FROM alarmechaque valeur une seule fois
SELECT * FROM alarme WHERE statut IS NULLcase vide (jamais = NULL)
SELECT COUNT(*) FROM alarmecompter les lignes ; aussi SUM(colonne), AVG, MIN, MAX
SELECT lieu, COUNT(*) FROM alarme GROUP BY lieuun compte par valeur de lieu
SELECT nom, ROUND(poids_kg * 2, 1) AS double FROM patientcolonne calculée ; ROUND arrondit ; AS lui donne un nom ; écrire 10000.0 (avec .0) évite la division entière
SELECT patient.nom, sejour.chambre FROM sejour JOIN patient ON sejour.patient_id = patient.idrelier deux tables par le numéro ; table.colonne quand le nom existe des deux côtés
SELECT patient.nom, sejour.chambre FROM patient LEFT JOIN sejour ON sejour.patient_id = patient.idpareil, mais garde aussi les lignes de gauche sans correspondance (NULL à droite)
SELECT * FROM patient WHERE age = (SELECT MAX(age) FROM patient)sous-requête entre parenthèses, calculée d'abord
substr(date_heure, 12, 2)2 caractères à partir du 12e : l'heure d'une date texte ('02' dans '2026-09-16 02:03')
INSERT INTO soignant (id, nom, prenom, metier, service_id) VALUES (22, 'Dupont', 'Camille', 'stagiaire', 2)ajouter une ligne : les colonnes, puis les valeurs dans le même ordre
UPDATE prescription SET dose_mg = 500 WHERE id = 27modifier ; plusieurs colonnes : SET a = 1, b = 2 ; sans WHERE, toutes les lignes changent !
DELETE FROM alarme WHERE type = 'test'supprimer (même avertissement)