4th Jul 2022 12 minutes de lecture Questions d'entretien SQL avancé (et réponses) Tihomir Babic sql apprendre sql emplois et carrières Table des matières 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 ? Question 2 : Quel est le code pour créer un index ? Question 3 : Comment ajouter un classement aux lignes en utilisant RANK() ? Question 4 : Quelle est la différence entre RANK() et DENSE_RANK() ? Question 5 : Qu'est-ce qu'une auto-incrémentation ? Question 6 : Qu'est-ce qu'une sous-requête ? Question 7 : Que retournera le code suivant ? Question 8 : Y a-t-il une différence entre une valeur NULL et zéro ? Question 8 : Comment filtrer les données à l'aide de JOIN ? Question 10 : Comment extraire les quatre derniers caractères d'une chaîne de caractères ? Question 11 : Qu'est-ce qu'une vue ? Comment en créer une ? Pensez-vous être prêt pour un emploi à l'adresse SQL avancé? 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 ! Tags: sql apprendre sql emplois et carrières