Introduction
SQL (Structured Query Language) est un langage de programmation standard utilisé pour gérer et manipuler des bases de données. C'est une compétence fondamentale pour tout professionnel des données, car elle leur permet de récupérer et d'analyser efficacement les données stockées dans des bases de données. Par conséquent, SQL est un sujet courant lors des entretiens techniques pour les postes liés aux données tels que data analyst, data engineer et administrateur de base de données.
Question 01
Requête SQL pour trouver le n-ième salaire le plus élevé
Pour trouver le n-ième salaire le plus élevé, vous pouvez utiliser une sous-requête avec la fonction DENSE_RANK() pour calculer le classement dense de chaque salaire, puis filtrer les résultats pour n'inclure que les lignes dont le classement est égal à n.
SELECT
*
FROM
(
SELECT
nom_employe,
salaire,
DENSE_RANK() OVER (
ORDER BY
salaire DESC
) as rang_salaire
FROM
personnel
) sous_requete
WHERE
rang_salaire = n;
Vous pouvez égalemnet utiliser les clauses LIMIT et OFFSET pour trouver le n-ième salaire le plus élevé, comme indiqué ci-dessous :
SELECT
nom_employe,
salaire
FROM
personnel
ORDER BY
salaire DESC
LIMIT
1 OFFSET (n - 1);
Par exemple, pour trouver le troisième salaire le plus élevé, vous pouvez utiliser la requête suivante :
SELECT
nom_employe,
salaire
FROM
personnel
ORDER BY
salaire DESC
LIMIT
1 OFFSET 2;
Question 02
Comment optimiser les requêtes SQL pour améliorer les performances ?
Il existe plusieurs méthodes pour optimiser les requêtes SQL afin d'obtenir de meilleures performances, notamment :
- Indexation : La création d'index sur une colonne ou un groupe de colonnes peut considérablement accélérer les requêtes qui filtrent ces colonnes.
- Partitionnement : Diviser une grande table en parties plus petites peut améliorer les performances des requêtes qui n'ont besoin d'accéder qu'à un sous-ensemble des données.
- Normalisation : La normalisation consiste à organiser les données d'une base de données de manière à ce que chaque donnée ne soit stockée qu'à un seul endroit, réduisant la redondance et améliorant l'intégrité des données.
- Utilisation des types de données appropriés : L'utilisation des types de données corrects pour chaque colonne peut améliorer les performances des requêtes qui filtrent ou trient ces colonnes.
- Utilisation des types de JOIN appropriés : L'utilisation des bons types de JOIN (par exemple, INNER JOIN, OUTER JOIN, CROSS JOIN) peut améliorer les performances des requêtes qui joignent plusieurs tables.
- Utilisation des fonctions d'agrégation appropriées : L'utilisation des fonctions d'agrégation appropriées (par exemple, SUM, AVG, MIN, MAX) peut améliorer les performances des requêtes qui effectuent des calculs sur de grands ensembles de données. Certaines fonctions d'agrégation (par exemple, COUNT) sont plus efficaces que d'autres, il est donc important de choisir la fonction adaptée à votre requête.
Question 03
Comment utiliser les fonctions LAG et LEAD en SQL ? Pouvez-vous donner des exemples d'utilisation ?
Les fonctions LAG() et LEAD() sont des fonctions de fenêtrage en SQL qui vous permettent de comparer les valeurs d'une ligne avec les valeurs des lignes précédentes ou suivantes. Elles sont très utiles pour calculer des totaux cumulatifs ou comparer les valeurs d'une table avec les valeurs de la ligne précédente ou suivante.
La fonction LAG() nécessite deux paramètres : la colonne à retourner et le nombre de lignes à retourner. Par exemple :
SELECT
nom_employe,
salaire,
LAG(salaire, 1) OVER (
ORDER BY
salaire DESC
) as salaire_precedent
FROM
personnel;
La fonction LEAD() fonctionne de manière similaire, mais elle avance plutôt qu'elle ne recule. Par exemple :
SELECT
nom_employe,
salaire,
LEAD(salaire, 1) OVER (
ORDER BY
salaire DESC
) as salaire_suivant
FROM
personnel;
Question 04
Expliquez les concepts ETL et ELT en SQL.
ETL (Extract, Transform, Load/Extraction, Transformation, Chargement) est un processus en SQL utilisé pour extraire des données d'une ou plusieurs sources, transformer les données en un format adapté à l'analyse ou à d'autres utilisations, puis charger les données dans un système cible tel qu'un entrepôt de données ou un lac de données.
ELT (Extract, Load, Transform/Extraction, Chargement, Transformation) est similaire à ETL, mais la phase de transformation est exécutée après le chargement des données dans le système cible, et non avant. Cela permet au système cible d'exécuter la transformation, ce qui peut être plus efficace et plus évolutive que d'exécuter la transformation dans un outil ETL. Les architectures de données modernes utilisent généralement de puissants moteurs de traitement de données (comme Apache Spark ou Apache Flink) pour exécuter la phase de transformation.
Question 05
Expliquez la différence entre les clauses WHERE et HAVING en SQL.
Les clauses WHERE et HAVING sont toutes deux utilisées pour filtrer les lignes dans les instructions SELECT. La principale différence entre elles est que la clause WHERE est utilisée pour filtrer les lignes avant l'opération GROUP BY, tandis que la clause HAVING est utilisée pour filtrer les lignes après l'opération GROUP BY.
SELECT
departement,
SUM(salaire)
FROM
personnel
GROUP BY
departement
HAVING
SUM(salaire) > 100000;
Dans cet exemple, la clause HAVING est utilisée pour filtrer tous les départements dont la somme des salaires est inférieure à 100000. Ceci est fait après l'opération GROUP BY, donc elle n'affecte que les lignes représentant chaque département.
SELECT
*
FROM
personnel
WHERE
salaire > 50000;
Dans cet exemple, la clause WHERE est utilisée pour filtrer les employés dont le salaire est inférieur à 50000. Ceci est fait avant toute opération GROUP BY, donc il affecte toutes les lignes de la table des employés.
Question 06
Expliquez la différence entre les opérations TRUNCATE, DROP et DELETE en SQL.
TRUNCATE
L'opération TRUNCATE supprime toutes les lignes d'une table, mais n'affecte pas la structure de la table. Elle est plus rapide que DELETE car elle ne génère aucun journal d'annulation ou de refonte, et ne déclenche aucun déclencheur de suppression.
Voici un exemple d'utilisation de l'instruction TRUNCATE :
TRUNCATE TABLE personnel;
Cette instruction supprime toutes les lignes de la table des employés, mais la structure de la table (y compris les noms de colonnes et les types de données) reste inchangée.
DROP
L'opération DROP supprime une table de la base de données et supprime toutes les données de la table. Elle supprime également tous les index, déclencheurs et contraintes associés à la table.
Voici un exemple d'utilisation de l'instruction DROP :
DROP TABLE personnel;
Cette instruction supprime la table des employés de la base de données et supprime définitivement toutes les données de la table. La structure de la table est également supprimée.
DELETE
L'opération DELETE supprime une ou plusieurs lignes d'une table. Elle vous permet de spécifier une clause WHERE pour sélectionner les lignes à supprimer. Elle génère également des journaux d'annulation et de refonte, et déclenche les déclencheurs de suppression.
Voici un exemple d'utilisation de l'instruction DELETE :
DELETE FROM
personnel
WHERE
salaire < 50000;
Cette instruction supprime toutes les lignes de la table des employés dont le salaire est inférieur à 50000. La structure de la table reste inchangée, et les lignes supprimées peuvent être récupérées à l'aide des journaux d'annulation.
Question 07
Les jointures et les sous-requêtes, lequel est plus efficace ?
Lors de la combinaison de données provenant de plusieurs tables, l'utilisation de JOIN est généralement plus efficace que les sous-requêtes. C'est parce que JOIN permet à la base de données d'utiliser plus efficacement les index sur les tables jointes pour exécuter la requête.
Par exemple, considérez les deux requêtes suivantes qui retournent le même résultat :
SELECT
*
FROM
commandes c
WHERE
c.id_client IN (
SELECT
id_client
FROM
clients
WHERE
pays = 'France'
);
SELECT
c.*, cl.pays
FROM
commandes c
INNER JOIN
clients cl ON c.id_client = cl.id_client
WHERE
cl.pays = 'France';
La première requête utilise une sous-requête pour sélectionner les ID clients pertinents de la table des clients, puis utilise l'opérateur IN pour filtrer la table des commandes en fonction de ces ID. La deuxième requête utilise une jointure pour combiner les tables des commandes et des clients, puis utilise une clause WHERE pour filtrer les résultats.
Question 08
Comment utiliser les fonctions de fenêtrage en SQL ?
En SQL, une fonction de fenêtrage est une fonction qui opère sur un ensemble de lignes défini par une spécification de fenêtre. Les fonctions de fenêtrage sont utilisées pour effectuer des calculs entre les lignes et peuvent être utilisées dans les instructions SELECT, UPDATE et DELETE, ainsi que dans les clauses WHERE et HAVING des instructions SELECT.
Voici un exemple d'utilisation d'une fonction de fenêtrage dans une instruction SELECT :
SELECT
nom_employe,
salaire,
AVG(salaire) OVER (PARTITION BY id_departement) as salaire_moyen_par_departement
FROM
personnel;
Cette instruction retourne un ensemble de résultats avec trois colonnes : nom_employe, salaire et salaire_moyen_par_departement. La colonne salaire_moyen_par_departement utilise la fonction de fenêtrage AVG pour calculer le salaire moyen de chaque département. La clause PARTITION BY spécifie que la fenêtre est partitionnée par id_departement, ce qui signifie que le salaire moyen est calculé séparément pour chaque département.
Question 09
Expliquez la normalisation.
La normalisation est le processus d'organisation d'une base de données de manière à réduire la redondance et les dépendances. C'est une méthode systématique pour décomposer les tables afin d'éliminer la redondance des données et d'améliorer l'intégrité des données. Il existe plusieurs formes de normalisation qui peuvent être utilisées pour normaliser une base de données. Les formes de normalisation les plus courantes sont :
Première forme normale (1NF)
- Chaque cellule d'une table contient une valeur, plutôt qu'une liste de valeurs.
- Chaque colonne d'une table a un nom unique.
- La table ne contient aucun groupe de colonnes en double.
Deuxième forme normale (2NF)
- Conforme à la première forme normale.
- Aucune dépendance partielle (c'est-à-dire, qu'aucun attribut non clé ne dépend d'une partie d'une clé primaire composite).
Troisième forme normale (3NF)
- Conforme à la deuxième forme normale.
- Aucune dépendance transitive (c'est-à-dire, qu'aucun attribut non clé ne dépend d'un autre attribut non clé).
Forme normale de Boyce-Codd (BCNF)
- Conforme à la troisième forme normale.
- Chaque déterminant (attribut qui détermine la valeur d'un autre attribut) est une clé candidate (colonne ou ensemble de colonnes qui peut être utilisé comme clé primaire).
Question 10
Expliquez les verrous exclusifs et les verrous de mise à jour en SQL.
Un verrou exclusif est un type de verrou qui empêche d'autres transactions de lire ou d'écrire les lignes verrouillées. Ce type de verrou est généralemant utilisé lorsqu'une transaction doit modifier des données dans une table, en s'assurant qu'aucune autre transaction ne peut accéder simultanément à cette table.
Un verrou de mise à jour est un verrou qui permet à d'autres transactions de lire les lignes verrouillées, mais les empêche de mettre à jour ou d'écrire ces lignes. Ce type de verrou est généralement utilisé lorsqu'une transaction doit lire des données dans une table, mais s'assurant que d'auters transactions ne modifieront pas ces données avant la fin de la transaction actuelle.