Bien que la compilation de requĂȘtes SQL ne soit pas la chose la plus intĂ©ressante pour les Data Scientists, une bonne comprĂ©hension de SQL est extrĂȘmement importante pour quiconque souhaite rĂ©ussir dans toute activitĂ© liĂ©e au traitement des donnĂ©es. Le point ici est que SQL n'est pas seulement SELECT
, FROM
et WHERE
. Plus un spĂ©cialiste connaĂźt de constructions SQL, plus il lui sera facile de crĂ©er des requĂȘtes pour obtenir des bases de donnĂ©es tout ce dont il peut avoir besoin. L'auteur de l'article, dont nous publions la traduction aujourd'hui, dit qu'il vise Ă rĂ©soudre deux problĂšmes:
- Explorer des mécanismes qui vont au-delà des connaissances SQL de base.
- Prise en compte de plusieurs tĂąches pratiques pour travailler avec SQL.
Cet article couvre 5 questions SQL de Leetcode. Ils représentent des tùches pratiques souvent rencontrées lors des entretiens.Question n ° 1: deuxiÚme place en termes de salaire
Ăcrivez une requĂȘte SQL pour obtenir du tableau contenant les informations sur le salaire des employĂ©s ( Employee
) une entrĂ©e contenant le deuxiĂšme salaire le plus Ă©levĂ©.Par exemple, une telle requĂȘte exĂ©cutĂ©e pour le tableau ci-dessous devrait retourner 200
. Si la table n'a pas une valeur inférieure au salaire le plus élevé, la demande doit retourner null
.+
| Id | Salary |
+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+
â DĂ©cision A: utiliser IFNULL
etOFFSET
Voici les principaux mécanismes qui seront utilisés dans cette solution au problÚme:IFNULL(expression, alt)
: cette fonction renvoie son argument expression
s'il n'est pas égal null
. Sinon, l'argument est renvoyé alt
. Nous utiliserons cette fonction pour retourner null
si la table ne contient pas la valeur souhaitée.OFFSET
: Cet opérateur est utilisé avec une expression ORDER BY
pour supprimer les premiĂšres n
lignes. Cela nous est utile parce que nous nous intéressons à la deuxiÚme ligne du résultat (c'est-à -dire le deuxiÚme plus gros salaire, dont les données figurent dans le tableau).
Voici une demande toute faite:SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
), null) as SecondHighestSalary
FROM Employee
LIMIT 1
â Solution B: utiliser MAX
La requĂȘte ci-dessous utilise la fonction MAX
. Ici, la valeur de salaire la plus élevée est sélectionnée, non égale au salaire maximum reçu dans l'ensemble du tableau. En conséquence, nous obtenons ce dont nous avons besoin - le deuxiÚme plus gros salaire.SELECT MAX(salary) AS SecondHighestSalary
FROM Employee
WHERE salary != (SELECT MAX(salary) FROM Employee)
Question # 2: adresses e-mail en double
Ăcrivez une requĂȘte SQL qui dĂ©tecte Person
toutes les adresses e-mail en double dans le tableau .+
| Id | Email |
+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+
â DĂ©cision A: COUNT
dans la sous-requĂȘte
Tout d'abord, nous crĂ©ons une sous-requĂȘte dans laquelle la frĂ©quence d'occurrence de chaque adresse dans le tableau est dĂ©terminĂ©e. Le rĂ©sultat renvoyĂ© par la sous-requĂȘte est ensuite filtrĂ© Ă l'aide de l'instruction WHERE count > 1
. La requĂȘte renvoie plusieurs informations sur les adresses trouvĂ©es dans la table source.SELECT Email
FROM (
SELECT Email, count(Email) AS count
FROM Person
GROUP BY Email
) as email_count
WHERE count > 1
â Solution B: expression HAVING
HAVING
: Il s'agit d'une expression qui vous permet d'utiliser une instruction WHERE
avec une expression GROUP BY
.
SELECT Email
FROM Person
GROUP BY Email
HAVING count(Email) > 1
Question n ° 3: hausse de la température
Ăcrivez une requĂȘte SQL qui trouve dans le tableau Weather
toutes les dates (identificateurs de date) oĂč la tempĂ©rature serait supĂ©rieure Ă la tempĂ©rature aux dates qui la prĂ©cĂšdent. C'est-Ă -dire que nous nous intĂ©ressons aux dates auxquelles la tempĂ©rature «d'aujourd'hui» est plus Ă©levĂ©e que celle «d'hier».+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+
âSolution: DATEDIFF
DATEDIFF
: Cette fonction calcule la différence entre deux dates. Il est utilisé pour fournir une comparaison précise des températures «d'aujourd'hui» et «d'hier».
Si nous formulons la requĂȘte suivante en langage ordinaire, il s'avĂšre qu'elle exprime l'idĂ©e suivante: nous devons choisir des identifiants tels que la tempĂ©rature correspondant aux dates qu'ils reprĂ©sentent est supĂ©rieure Ă la tempĂ©rature des dates «d'hier» par rapport Ă eux.SELECT DISTINCT a.Id
FROM Weather a, Weather b
WHERE a.Temperature > b.Temperature
AND DATEDIFF(a.Recorddate, b.Recorddate) = 1
Question numéro 4: le salaire le plus élevé de l'unité
Le tableau Employee
stocke des informations sur les employés de l'entreprise. Chaque enregistrement de ce tableau contient des informations sur l'identifiant ( Id
) de l'employé, son nom ( Name
), son salaire ( Salary
) et la division de l'entreprise oĂč il travaille ( Department
).+
| Id | Name | Salary | DepartmentId |
+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
+
Le tableau Department
contient des informations sur les services de l'entreprise.+
| Id | Name |
+
| 1 | IT |
| 2 | Sales |
+
Ăcrivez une requĂȘte SQL qui trouve dans chacun des dĂ©partements des employĂ©s avec le salaire maximum. Par exemple, pour les tableaux ci-dessus, une requĂȘte similaire doit renvoyer les rĂ©sultats reprĂ©sentĂ©s par le tableau suivant (l'ordre des lignes dans le tableau n'a pas d'importance):+
| Department | Employee | Salary |
+
| IT | Max | 90000 |
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
+
âSolution: Ă©quipe IN
La commande IN
vous permet de définir des WHERE
conditions dans l'instruction qui correspondent Ă l'utilisation de plusieurs commandes OR
. Par exemple, les deux constructions suivantes sont identiques:WHERE country = âCanadaâ OR country = âUSAâ
WHERE country IN (âCanadaâ, âUSAâ).
Ici, nous voulons obtenir un tableau contenant le nom du département ( Department
), le nom de l'employé ( Employee
) et son salaire ( Salary
). Pour ce faire, nous créons une table qui contient des informations sur l'identifiant d'unité ( DepartmentID
) et le salaire maximum pour cette unité. Ensuite, nous combinons les deux sur une table de conditions selon laquelle l'entrée dans la table résultante ne tombe que si DepartmentID
et Salary
s'est déjà formée dans la table.SELECT
Department.name AS 'Department',
Employee.name AS 'Employee',
Salary
FROM Employee
INNER JOIN Department ON Employee.DepartmentId = Department.Id
WHERE (DepartmentId , Salary)
IN
( SELECT
DepartmentId, MAX(Salary)
FROM
Employee
GROUP BY DepartmentId
)
Question n ° 5: transplanter des étudiants
Mary est enseignante au secondaire. Elle a une table seat
qui stocke les noms des élÚves et des informations sur leur place dans la classe. La valeur id
de ce tableau est en constante augmentation. Mary veut échanger des étudiants voisins.Voici un tableau du placement initial des étudiants:+
| id | student |
+
| 1 | Abbot |
| 2 | Doris |
| 3 | Emerson |
| 4 | Green |
| 5 | Jeames |
+
Voici ce qui devrait arriver aprÚs la transplantation d'étudiants voisins:+
| id | student |
+
| 1 | Doris |
| 2 | Abbot |
| 3 | Green |
| 4 | Emerson |
| 5 | Jeames |
+
Ăcrivez une demande qui permettra Ă l'enseignant de rĂ©soudre le problĂšme ci-dessus.Veuillez noter que si le nombre d'Ă©tudiants est impair, vous n'avez pas besoin de transfĂ©rer le dernier Ă©tudiant n'importe oĂč.âSolution: Ă l'aide d'un opĂ©rateur WHEN
Une construction SQL CASE WHEN THEN
peut ĂȘtre considĂ©rĂ©e comme un opĂ©rateur if
dans la programmation.Dans notre cas, le premier opérateur est WHEN
utilisé pour vérifier si l'identifiant impair est affecté à la derniÚre ligne du tableau. Si c'est le cas, la ligne n'est pas sujette à changement. Le deuxiÚme opérateur WHEN
est responsable d'ajouter 1 Ă chaque identifiant impair (par exemple, 1, 3, 5 tours en 2, 4, 6) et de soustraire 1 de chaque identifiant pair (2, 4, 6 devient 1, 3, 5).SELECT
CASE
WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THEN id
WHEN id%2 = 1 THEN id + 1
ELSE id - 1
END AS id, student
FROM seat
ORDER BY id
Sommaire
Nous avons examinĂ© plusieurs tĂąches SQL, discutant en cours de route quelques outils avancĂ©s pouvant ĂȘtre utilisĂ©s pour compiler des requĂȘtes SQL. Nous espĂ©rons que ce que vous avez appris aujourd'hui vous sera utile lors des entretiens avec SQL et se rĂ©vĂ©lera utile dans le travail quotidien.PS Sur notre marchĂ©, il y a une image Docker avec SQL Server Express, qui est installĂ©e en un clic. Vous pouvez vĂ©rifier le fonctionnement des conteneurs sur VPS. Tous les nouveaux clients bĂ©nĂ©ficient de 3 jours gratuits pour les tests.Chers lecteurs! Que pouvez-vous conseiller Ă ceux qui veulent maĂźtriser l'art de crĂ©er des requĂȘtes SQL?