Retour à la liste des articles Articles
12 minutes de lecture

Questions d'entretien SQL avancé (et réponses)

Vous souhaitez occuper un emploi qui utilise SQL ? Vous ne savez pas à quoi vous attendre pendant l'entretien d'embauche ou comment évaluer vos connaissances ? Cet article vous donnera une bonne idée de votre situation.

Si vous vous sentez coincé dans votre emploi, vous n'êtes pas le seul. La division moderne du travail pousse les gens à effectuer des tâches très spécifiques, en attendant d'eux qu'ils ne regardent pas ce qu'il y a de l'autre côté. Les travailleurs doivent uniquement se concentrer sur leurs responsabilités (souvent répétitives et ennuyeuses) et ne doivent pas se poser de questions au-delà. On a souvent l'impression de travailler sur une chaîne de montage. Oui, une chaîne de montage - même dans un beau bureau avec de grandes fenêtres, du café gratuit et des fruits frais. Mais quand même, une chaîne de montage. Ou peut-être voulez-vous simplement faire votre travail plus rapidement, sans perdre de temps à traiter les données de manière inefficace.

Changer votre travail ou améliorer vos performances peut augmenter considérablement le sentiment de faire quelque chose d'utile. Cet article énumère quelques questions SQL avancées que vous pourriez rencontrer lors d'un entretien. Et nous vous donnerons également les réponses ! Ainsi, vous pourrez évaluer vos connaissances actuelles et peut-être apprendre quelque chose de nouveau.

C'est à vous de décider si vous voulez appliquer ces connaissances à votre nouvel emploi ou à votre emploi actuel ! Commençons notre "entretien d'embauche" !

(Vous cherchez des questions SQL pour débutants ? Cet article est celui qu'il vous faut).

10 SQL avancé Questions et réponses pour l'entretien d'embauche

Question 1 : Qu'est-ce qu'un index ? Quels sont les deux principaux types d'index ?

Un index est une structure dans une base de données qui peut aider à récupérer des données plus rapidement. Lorsque vous recherchez les données d'une table à l'aide d'une requête SQL, celle-ci recherche la table entière et renvoie le résultat. Une table non indexée est appelée un tas. Les données stockées dans ces tables ne sont généralement pas organisées de manière particulière. Elles sont stockées dans l'ordre où elles ont été saisies. Par conséquent, la recherche de données peut être très lente et frustrante.

Lorsque vous interrogez une table indexée, la base de données se rend d'abord dans l'index et récupère directement les enregistrements correspondants. Les deux principaux types d'index sont :

  • Clustered
  • Non groupé

Un index clusterisé définit l'ordre exact des données stockées dans la table. Il ne peut y avoir qu'un seul index clusterisé par table, puisque la table ne peut être ordonnée que d'une seule manière.

Un index non clusterisé pointe simplement vers les données, l'ordre des données dans l'index n'étant pas le même que l'ordre physique des données réelles. Les données sont stockées à un endroit, tandis que l'index est stocké à un autre endroit.

Question 2 : Quel est le code pour créer un index ?

Passons maintenant à un exemple pratique ! Supposons que nous ayons le tableau employeequi contient les colonnes suivantes :

  • name - Le prénom de l'employé.
  • surname - Le nom de famille de l'employé.
  • nin - Le numéro d'identification national de l'employé (par exemple, le numéro de sécurité sociale).

Votre tâche consiste à créer un index clusterisé sur la colonne nin et un index non clusterisé sur la colonne surname. Comment procédez-vous ?

Pour créer l'index clusterisé, le code sera le suivant :

CREATE CLUSTERED INDEX CL_nin
ON employee(nin);

Ceci va créer un index clusterisé avec le nom CL_nin, sur la table employee et la colonne nin.

Pour créer l'index non clusterisé, le code sera :

CREATE NONCLUSTERED INDEX NCL_surname
ON employee(surname);

Exécutez ce code et vous créerez un index non clusterisé nommé NCL_surname sur la colonne nom de famille dans la table employee.

Important : Si vous ne spécifiez pas un type (clustered ou non-clustered), vous créerez un index non-clustered par défaut.

Question 3 : Comment ajouter un classement aux lignes en utilisant RANK() ?

Le suivi des chiffres de vente est essentiel pour toute entreprise. Prenons l'exemple d'un concessionnaire automobile. Il peut y avoir de nombreux vendeurs qui vendent des voitures chaque jour. Imaginez que la direction de la concession souhaite comparer ses vendeurs. Elle veut savoir qui est performant et qui traîne les pieds. Vous disposez d'un tableau salespeople avec les informations suivantes :

  • first_name - Le prénom de l'employé.
  • last_name - Le nom de famille de l'employé.
  • cars_sold - Le nombre de voitures vendues par cet employé.

Comment ajouter un rang à ce tableau, présenté ci-dessous ?

first_namelast_namecars_sold
ClarabelleHanmer77
ChristianoOverstall51
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn57
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

Le code pour ce problème est le suivant :

SELECT	RANK() OVER(ORDER BY cars_sold DESC) AS rank_sales,
		first_name,
		last_name,
		cars_sold
FROM salespeople;

Ce code utilise la fonction de fenêtre RANK(). Comme aucune fenêtre n'est définie, la fonction utilisera l'ensemble du tableau. Elle classera les données en fonction de la colonne cars_sold et le rang sera ajouté à la nouvelle colonne rank_sales. Exécutez le code et vous obtiendrez un beau tableau - qui vous permettra de gagner un point lors de votre entretien !

rank_salesfirst_namelast_namecars_sold
1GlendonKnowlys116
2JolyTschierasche114
3CarlottaDytham106
4ArtemusWoolward100
5EmileeNanetti84
6ClarabelleHanmer77
7RubieDing72
8RainaBedinn57
9ChristianoOverstall51
10WilhelmKopec38

J'ai écrit un article plus détaillé sur les fonctions de fenêtre et leur utilisation (avec des exemples) si vous souhaitez approfondir le sujet. Il y a aussi le livre de recettes pratique LearnSQL.fr duquel j'ai volé ce code. Vous pouvez aussi le faire ! La section du livre de recettes est essentiellement une liste de problèmes courants résolus à l'aide de SQL. Vous pouvez trouver une solution très rapidement, lire l'explication et obtenir un extrait de code que vous pouvez utiliser pour résoudre vos tâches.

Question 4 : Quelle est la différence entre RANK() et DENSE_RANK() ?

La principale différence est que RANK() donnera le même rang à toutes les lignes ayant les mêmes valeurs (dans les critères de classement). Il sautera également des rangs si plusieurs lignes ont le même rang ; le nombre de rangs sautés dépendra du nombre de lignes partageant la même valeur. Cela crée des rangs non consécutifs.

Avec DENSE_RANK(), les lignes ayant les mêmes valeurs seront également classées de la même façon. Toutefois, cette fonction ne sautera aucun rang, ce qui donnera lieu à des rangs consécutifs.

Voici un exemple pour vous aider à comprendre la différence. Modifions le tableau de l'exemple précédent. Le tableau ressemble à ceci :

first_namelast_namecars_sold
ClarabelleHanmer72
ChristianoOverstall84
WilhelmKopec38
RubieDing72
ArtemusWoolward100
EmileeNanetti84
RainaBedinn72
GlendonKnowlys116
CarlottaDytham106
JolyTschierasche114

Si vous exécutez le code de l'exemple précédent, RANK(), vous obtiendrez ce résultat :

rank_salesfirst_namelast_namecars_sold
1GlendonKnowlys116
2JolyTschierasche114
3CarlottaDytham106
4ArtemusWoolward100
5EmileeNanetti84
5ChristianoOverstall84
7ClarabelleHanmer72
7RubieDing72
7RainaBedinn72
10WilhelmKopec38

Vous remarquerez que le rang 5 est alloué deux fois, puis le classement saute le 6 et passe directement au 7. Le rang 7 est attribué trois fois, après quoi le classement passe directement à 10.

Si vous voulez voir comment DENSE_RANK() classe les rangs, exécutez le code suivant :

SELECT	RANK() OVER(ORDER BY cars_sold DESC) AS rank_sales,
		DENSE_RANK () OVER (ORDER BY cars_sold DESC) AS dense_rank_sales,
		first_name,
		last_name,
		cars_sold
FROM salespeople;

Il vous donnera un résultat qui ressemble à ceci :

rank_salesdense_rank_salesfirst_namelast_namecars_sold
11GlendonKnowlys116
22JolyTschierasche114
33CarlottaDytham106
44ArtemusWoolward100
55EmileeNanetti84
55ChristianoOverstall84
76ClarabelleHanmer72
76RubieDing72
76RainaBedinn72
107WilhelmKopec38

La connaissance des fonctions de fenêtre est essentielle pour tout emploi nécessitant des connaissances SQL avancées. Pour pratiquer davantage le SQL et voir comment les fonctions de fenêtre peuvent vous aider, n'hésitez pas à essayer le cours Window Functions de LearnSQL.fr.

Question 5 : Qu'est-ce qu'une auto-incrémentation ?

Tout type de travail sur une base de données nécessitera cette connaissance. L'auto-incrément est une fonction SQL qui crée automatiquement et séquentiellement un numéro unique chaque fois qu'un nouvel enregistrement est ajouté à la table.

Le mot-clé qui vous donnera cette fonction est AUTO_INCREMENT.

Voici l'exemple. Le code ci-dessous va créer le tableau names avec les valeurs définies par INSERT INTO:

create table names (
	id INT NOT NULL AUTO_INCREMENT,
	first_name VARCHAR(50),
	last_name VARCHAR(50)
);
INSERT INTO names(first_name, last_name) VALUES ('Kristen', 'Yukhnev');
INSERT INTO names(first_name, last_name) VALUES ('Angelica', 'Hulson');

La table ressemblera à ceci :

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson

Pour voir comment la fonction d'auto-incrémentation fonctionne, ajoutez un nouvel enregistrement à la table ci-dessus :

INSERT INTO names (first_name, last_name)
VALUES ('Rosalia', 'O''Towey');

Ceci ajoutera un nouvel enregistrement à une table. Sélectionnez toutes les données pour voir comment le tableau a changé :

SELECT *
FROM names;

Le tableau ressemble maintenant à ceci :

idfirst_namelast_name
1KristenYukhnev
2AngelicaHulson
3RosaliaO'Towey

Lorsque nous avons ajouté un nouvel enregistrement à la table, AUTO_INCREMENT a automatiquement ajouté un nouveau numéro séquentiel. Comme 1 et 2 existaient précédemment dans la table, avec AUTO_INCREMENT la base de données sait que la prochaine valeur sera 3.

Question 6 : Qu'est-ce qu'une sous-requête ?

Une sous-requête (également appelée requête interne ou requête imbriquée) est une requête placée dans une autre requête. Elle renvoie des données qui seront utilisées par la requête principale. Vous la trouverez généralement dans la clause WHERE.

Question 7 : Que retournera le code suivant ?

Le code ci-dessous est un exemple de sous-requête :

SELECT	first_name,
		last_name,
		cars_sold
FROM cars
WHERE cars_sold >	(SELECT AVG (cars_sold)
					FROM cars);

L'exécution du code renverra les colonnes first_name, last_name, et cars_sold du tableau. carsmais seulement si cars_sold est supérieur au nombre moyen de voitures vendues.

Question 8 : Y a-t-il une différence entre une valeur NULL et zéro ?

Oui ! Une valeur NULL est l'absence de la donnée/information. Elle a un caractère quantitatif dans la mesure où elle représente l'absence de la quantité. En termes simples, NULL en SQL signifie que la valeur est inconnue ou manquante ; nous ne savons pas quelle est cette valeur. D'autre part, zéro signifie qu'il existe une valeur égale à, eh bien, zéro. Par conséquent, zéro a un caractère qualitatif.

Question 8 : Comment filtrer les données à l'aide de JOIN ?

La signification fondamentale de JOIN est qu'il renvoie les données d'une table lorsque ces données sont égales à celles d'une seconde table. Si vous le combinez avec la clause WHERE, JOIN peut être utilisé pour filtrer les données.

Voici un exemple d'une autre concession automobile. La première table s'appelle carsElle est constituée des données suivantes :

  • model_id - Le numéro d'identification du modèle de voiture.
  • model_name - Le nom de ce modèle.
  • brand_id - L'ID de la marque de la voiture.
  • brand_name - Le nom de la marque de la voiture.
  • year_id - L'année où le modèle a été produit. (Utilise les données de la table production_year.)

La deuxième table est production_yearqui contient les colonnes suivantes :

  • year_id - Un numéro d'identification pour chaque année.
  • year - L'année réelle de production.

Que feriez-vous si on vous demandait de trouver tous les modèles qui ont été produits avant 2016 ? Voici le code :

SELECT	model_name,
		brand_name
FROM	cars JOIN production_year ON cars.year_id = production_year.year_id
WHERE	year_id < 2016;

Laissez-moi vous expliquer le code. Il sélectionne les colonnes model_name et brand_name dans le tableau. cars. Cette table est jointe à la table production_year en utilisant la colonne year_id, qui est une connexion entre la table cars et la table production_year et la table . En raison de la clause WHERE, ce code renvoie uniquement les voitures produites avant 2016, c'est-à-dire WHERE year_id < 2016.

Si vous souhaitez en savoir plus sur les JOIN ou si vous voulez mettre en pratique ce que vous avez appris, la piste de pratique SQL LearnSQL.fr peut vous y aider.

Question 10 : Comment extraire les quatre derniers caractères d'une chaîne de caractères ?

Pour ce faire, vous avez besoin de la fonction RIGHT().

Par exemple, il y a la table products qui contient les données suivantes :

  • product - Le nom du produit.
  • manufacturer - L'entreprise qui fabrique le produit.

Le tableau ressemble à ceci :

productmanufacturer
X278 Hammer 2018Sledge Hammer
M+S Tyres Z348 2020Goodtyre
Paint red pearly 9R458PT12 2019PaintItBlack

Vous devez trouver l'année de fabrication de chaque produit. Mais celui qui a créé la base de données a fait un mauvais travail. Il n'y a pas de colonne avec l'année de production ! Cette donnée n'est pas disponible, si ce n'est les quatre derniers caractères du nom du produit. Pour extraire l'année de ce champ, voici le code à utiliser :

SELECT	product,
		manufacturer,
		RIGHT(product,4) AS year_produced
FROM products;

Et voici le résultat ! Simple, non ?

productmanufactureryear_produced
X278 Hammer 2018Sledge Hammer2018
M+S Tyres Z348 2020Goodtyre2020
Paint red pearly 9R458PT12 2019PaintItBlack2019

Laissez-moi vous expliquer ce que nous venons de faire. Le code, bien sûr, sélectionne les colonnes product et manufacturer. Puis, à l'aide de la fonction RIGHT(), nous avons demandé à la requête de prendre les chaînes de la colonne product et de renvoyer les quatre derniers caractères en partant de la droite. Nous placerons ces résultats affichés dans la nouvelle colonne year_produced.

Question 11 : Qu'est-ce qu'une vue ? Comment en créer une ?

Une vue est une table virtuelle ou une instruction SQL stockée qui utilise les données d'une ou plusieurs tables existantes. La vue est appelée "table virtuelle" parce que les données sont utilisées comme une table, mais elles sont récupérées chaque fois que la vue est exécutée. (Le résultat d'une vue n'est pas stocké comme une table).

Disons qu'il y a une table appelée salary qui contient les colonnes suivantes :

  • first_name - Le prénom de l'employé.
  • last_name - Le nom de famille de l'employé.
  • salary - Le salaire de l'employé.
first_namelast_namesalary
MikeHammer2780
JohnJohnson1600
KateWilliams3000

Les informations sur le salaire des employés ne sont pas disponibles pour tout le monde dans l'entreprise. Cependant, dans cette entreprise, tout le monde doit pouvoir accéder à la liste des employés. Comment leur permettre de le faire tout en respectant les règles de confidentialité ?

Vous ne leur donneriez pas accès à l'ensemble de la table, mais vous pourriez créer une vue pour eux. Ainsi, ils pourront toujours accéder aux dernières données sans voir quoi que ce soit de confidentiel. Voici comment procéder :

CREATE VIEW		employee_list AS
SELECT		first_name,
			last_name
FROM salary;

L'exécution de ce code créera une vue nommée employee_list, qui récupérera les informations de first_name et last_name dans la table. salary. C'est simple, n'est-ce pas ? Vous la créez en utilisant la commande CREATE VIEW, puis vous écrivez une requête normale.

OK, mais cela a juste créé une vue. La créer n'a pas récupéré de données. Alors comment faire fonctionner la vue ? Vous faites simplement comme si c'était une table normale. Le code ci-dessous va exécuter la vue :

SELECT *
FROM employee_list;

Et le tableau résultant est ici ! Magnifique ! Aucun salaire n'est affiché, donc vous n'avez rien gâché !

first_namelast_name
MikeHammer
JohnJohnson
KateWilliams

Pensez-vous être prêt pour un emploi à l'adresse SQL avancé?

La longueur de l'article ne nous permet pas de couvrir tous les sujets SQL avancés que vous pourriez rencontrer lors d'un entretien d'embauche. Cependant, j'ai essayé de vous donner un bon aperçu de ce à quoi vous pouvez vous attendre lorsque vous postulez à un emploi qui utilise SQL. Il ne s'agit que d'un point de départ pour vos recherches et pour voir où vos connaissances doivent être améliorées. Si vous souhaitez en savoir plus, il existe un cours interactif de SQL avancé que vous pouvez utiliser pendant que vous vous préparez à l'entretien.

N'hésitez pas à commenter dans la section des commentaires ! Partagez vos réflexions et vos expériences d'entretien !