5 questions SQL fréquemment posées par les scientifiques des données pour les entretiens d'embauche

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, FROMet 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:





  1. Explorer des mécanismes qui vont au-delà des connaissances SQL de base.
  2. 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 IFNULLetOFFSET


Voici les principaux mécanismes qui seront utilisés dans cette solution au problÚme:

  • IFNULL(expression, alt): cette fonction renvoie son argument expressions'il n'est pas Ă©gal null. Sinon, l'argument est renvoyĂ© alt. Nous utiliserons cette fonction pour retourner nullsi la table ne contient pas la valeur souhaitĂ©e.
  • OFFSET: Cet opĂ©rateur est utilisĂ© avec une expression ORDER BYpour supprimer les premiĂšres nlignes. 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 Persontoutes 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: COUNTdans 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 WHEREavec 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 Weathertoutes 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 Employeestocke 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 Departmentcontient 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 INvous permet de définir des WHEREconditions 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 DepartmentIDet Salarys'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 seatqui stocke les noms des Ă©lĂšves et des informations sur leur place dans la classe. La valeur idde 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 THENpeut ĂȘtre considĂ©rĂ©e comme un opĂ©rateur ifdans la programmation.

Dans notre cas, le premier opérateur est WHENutilisé 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 WHENest 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?

Source: https://habr.com/ru/post/undefined/


All Articles