TEST TECHNIQUE SQL
NOTE
Candidat :
Date :
Durée : 15 Minutes / 20
I. Requêtes & Sélection II. Jointures (Joins)
1. Quelle commande permet de récupé- 5. Vous voulez toutes les lignes de la table
rer uniquement des lignes uniques (sans A, et seulement les correspondances de
doublons) ? la table B. Quelle jointure utiliser ?
INNER JOIN
SELECT UNIQUE
LEFT JOIN
SELECT DISTINCT
RIGHT JOIN
SELECT DIFFERENT
FULL OUTER JOIN
SELECT ONLY
6. Si Table A a 10 lignes et Table B a 5
2. Dans l’ordre d’exécution logique de SQL, lignes, combien de lignes retourne un
quelle clause est traitée en PREMIER ? CROSS JOIN (Produit Cartésien) ?
15 lignes
SELECT
10 lignes
WHERE
50 lignes
FROM
0 ligne
ORDER BY
7. Quelle jointure utiliser pour trouver les
3. Comment filtrer les noms qui com- clients qui N’ONT PAS passé de com-
mencent par ’A’ ? mande ?
INNER JOIN avec une clause WHERE.
WHERE nom LIKE 'A%'
LEFT JOIN en filtrant sur [Link] IS
WHERE nom = 'A*' NULL.
WHERE nom STARTS WITH 'A' CROSS JOIN.
WHERE nom LIKE '%A' FULL JOIN.
4. Quelle est la différence entre UNION et 8. Qu’arrive-t-il si vous faites une jointure
UNION ALL ? sur une colonne contenant des valeurs
NULL ?
Aucune différence. Les NULL correspondent entre eux (NULL
UNION supprime les doublons, UNION ALL = NULL).
garde tout (et est plus rapide). Les NULL ne correspondent jamais
UNION ALL trie les résultats, pas UNION. (même à un autre NULL).
UNION permet de joindre des tables hori- SQL renvoie une erreur.
zontalement. Cela dépend de la base de données.
1
III. Agrégation & Groupement La première colonne de la table.
9. Quelle est la différence fondamentale 14. À quoi sert une Clé Étrangère (Foreign
entre WHERE et HAVING ? Key) ?
WHERE filtre avant le groupement, HAVING À améliorer la vitesse des SELECT.
filtre après l’agrégation. À garantir l’intégrité référentielle (empê-
HAVING est obsolète. cher d’insérer un orphelin).
WHERE ne marche qu’avec des nombres. À crypter les données.
HAVING s’utilise sans GROUP BY. À stocker des données venant de l’étran-
ger.
10. Que retourne COUNT(*) par rapport à
COUNT(colonne) ? 15. Pourquoi créer un Index sur une colonne
?
C’est exactement la même chose.
Pour accélérer les opérations d’écriture
COUNT(*) compte les lignes (y compris (INSERT/UPDATE).
NULL), COUNT(col) ignore les NULLs de
Pour accélérer les opérations de lecture
cette colonne.
(SELECT/WHERE).
COUNT(*) est plus lent.
Pour économiser de l’espace disque.
COUNT(colonne) compte les valeurs dis-
Pour trier physiquement la table.
tinctes.
16. Quel est l’inconvénient principal d’avoir
11. Si vous faites un SELECT A, MAX(B) FROM trop d’index sur une table ?
Table, que manque-t-il obligatoirement ?
Les requêtes SELECT deviennent lentes.
Une clause ORDER BY.
Les opérations INSERT, UPDATE, DELETE
Une clause GROUP BY A. deviennent plus lentes.
Une clause WHERE. La base de données plante plus souvent.
Rien, la requête est valide. Il n’y a aucun inconvénient.
12. Quelle fonction permet de remplacer une 17. Quelle est la différence entre DELETE et
valeur NULL par une valeur par défaut (ex: TRUNCATE ?
0) ?
TRUNCATE supprime la table elle-même.
ISNULL() ou COALESCE() DELETE est plus rapide.
REPLACE() TRUNCATE est une opération DDL (rapide,
NULLIF() réinitialise ID), DELETE est DML (ligne par
ligne, logué).
CHANGE()
DELETE ne peut pas avoir de clause WHERE.
IV. Structure & Performance 18. À quoi sert une CTE (Common Table Ex-
pression / WITH ...) ?
13. Qu’est-ce qu’une Clé Primaire (Primary
À créer une table temporaire physique.
Key) ?
À rendre le code plus lisible en nommant
N’importe quelle colonne indexée. une sous-requête temporaire.
Une colonne (ou groupe) qui identifie de À exporter les données.
façon unique chaque ligne (Non NULL + C’est une vieille syntaxe obsolète.
Unique).
Une colonne qui fait le lien vers une 19. Quel type de donnée est le plus optimisé
autre table. pour stocker une date ?
2
VARCHAR(10) (ex: ’2023-01-01’) classement (1, 2, 3...) des ventes par ven-
deur ?
INT (ex: 20230101)
DATE ou DATETIME RANK() ou ROW_NUMBER()
TEXT COUNT()
SUM()
20. Quelle fonction utiliser pour obtenir un GROUP_ID()
3
CORRIGÉ & EXPLICATIONS
Ne pas consulter avant la fin du test.
X Q1 : SELECT DISTINCT. Permet de dédou- X Q11 : Une clause GROUP BY A. Règle d’or
blonner les résultats. : tout ce qui n’est pas dans une fonction
d’agrégation (SUM, MAX...) doit être dans
X Q2 : FROM. SQL commence par identifier le GROUP BY.
la source des données avant de filtrer ou
sélectionner. X Q12 : COALESCE(). Standard ANSI. IS-
NULL est spécifique à certains moteurs
X Q3 : LIKE ’A%’. Le symbole % est le joker (SQL Server).
(wildcard) standard en SQL pour ”n’im-
X Q13 : Unique + Not Null. Elle sert d’iden-
porte quelle chaîne”.
tifiant strict.
X Q4 : UNION supprime les doublons. X Q14 : Intégrité référentielle. Elle em-
UNION ALL empile tout bêtement, ce qui pêche, par exemple, de supprimer un
évite une opération de tri coûteuse. À pri- Client s’il a encore des Commandes, ou
vilégier si on sait qu’il n’y a pas de dou- de créer une Commande pour un Client
blons. qui n’existe pas.
X Q5 : LEFT JOIN. Garde tout ce qui est à X Q15 : Accélérer la lecture. Comme l’in-
gauche (Table A), et met NULL si pas de dex d’un livre, cela permet d’aller direc-
correspondance à droite. tement à la ligne sans scanner toute la
table.
X Q6 : 50 lignes. Le produit cartésien mul-
tiplie le nombre de lignes (10 x 5). X Q16 : Ralentit l’écriture. À chaque IN-
SERT/UPDATE, le moteur doit mettre à
X Q7 : LEFT JOIN avec IS NULL. C’est la mé- jour la table ET tous les index associés.
thode standard pour trouver les ”orphe-
lins” ou les non-correspondances. X Q17 : TRUNCATE est DDL (Rapide). Il
désalloue les pages de données d’un
X Q8 : Les NULL ne correspondent ja- coup. DELETE scanne ligne par ligne et
mais. En SQL, NULL n’est pas une valeur, écrit tout dans le journal de transaction.
c’est une absence de valeur. NULL = NULL
X Q18 : Lisibilité. Une CTE (Common Table
renvoie ”Unknown”, pas ”True”.
Expression) permet de définir une ”vue
temporaire” au début de la requête pour
X Q9 : WHERE avant, HAVING après. On
simplifier la logique principale.
filtre les lignes brutes avec WHERE, puis
on groupe, puis on filtre les résultats X Q19 : DATE. Toujours utiliser le type natif
agrégés avec HAVING (ex: Total > 100). pour profiter des fonctions de date et du
tri chronologique correct.
X Q10 : COUNT(*) compte tout.
COUNT(col) ignore les NULLs, ce qui peut X Q20 : ROW_NUMBER() / RANK(). Ce
fausser les résultats si on voulait juste sont des ”Window Functions” essentielles
compter les lignes. pour l’analytique avancée.