15th Mar 2024 22 minutes de lecture 9 exemples pratiques de SQL LEFT JOIN Tihomir Babic left join sql Table des matières Les bases de la jointure gauche en SQL Syntaxe de la jointure à gauche en SQL Exemples de JOINTS DE GAUCHE Exemple 1 : Jointure gauche de base Exemple 2 : Un exemple concret de JOINTE À GAUCHE Exemple 3 : Un autre exemple concret de JOINTE À GAUCHE Exemple 4 : LEFT JOIN avec 3 tables Exemple 5 : Jointure à gauche "forcée" avec trois tables Exemple 6 : Jonction à gauche avec WHERE Exemple 7 : WHERE vs. ON dans LEFT JOIN Exemple 8 : LEFT JOIN avec Alias Exemple 9 : JOINT A GAUCHE avec GROUP BY Autres exemples et ressources SQL LEFT JOIN LEFT JOIN La jointure à gauche est l'une des formes les plus courantes de SQL. JOINs. Assurez-vous d'en connaître tous les tenants et aboutissants en parcourant nos neuf exemples réels. LEFT JOIN exemples concrets. LEFT JOIN - La jointure à gauche - INNER JOIN - est l'un des outils SQL essentiels dont vous avez besoin pour travailler avec des données provenant de deux tables ou plus. Mais comment et quand l'utiliser ? Ces neuf exemples LEFT JOIN vous montreront la voie à suivre. C'est la première fois que vous entendez parler de JOINs ? Si c'est le cas, nous avons tout prévu avec notre cours complet sur Les jointures en SQL . Vous découvrirez tous les types de SQL JOIN, les différentes façons de joindre deux tables ou plus, et quand utiliser chaque type de JOIN. Vous apprendrez même à joindre une table de façon autonome et à utiliser des jointures non équidistantes. À la fin du cours, vous aurez résolu 99 défis interactifs. Les bases de la jointure gauche en SQL LEFT JOIN est l'un des nombreux types de SQL JOINs. L'objectif de JOINs est d'obtenir les données de deux tables ou plus. LEFT JOIN atteint cet objectif en renvoyant toutes les données de la première table (gauche) et seulement les lignes correspondantes de la deuxième table (droite). Les valeurs non correspondantes de la table de droite seront affichées à l'adresse NULL. En quoi cela diffère-t-il des autres JOIN? Voici un bref aperçu, mais pour une meilleure compréhension, jetez un coup d'œil à ces exemples de JOIN SQL. (INNER) JOIN - Renvoie uniquement les lignes correspondantes des tables jointes. Voici un article pour en savoir plus sur les INNER JOIN. RIGHT (OUTER) JOIN - Renvoie toutes les données de la table de droite et seulement les lignes correspondantes de la table de gauche. Les valeurs des lignes non correspondantes seront NULL. FULL (OUTER) JOIN - Renvoie toutes les lignes des deux tables jointes. S'il y a des lignes non correspondantes entre les tables, elles sont affichées en tant que NULL. Pour en savoir plus, consultez notre article consacré au FULL JOIN. CROSS JOIN - Renvoie toutes les combinaisons de toutes les lignes des tables jointes, c'est-à-dire un produit cartésien. Vous trouverez plus d'informations à ce sujet dans l'article CROSS JOIN. Les mots entre parenthèses dans les noms de JOIN ci-dessus ne sont pas obligatoires ; SQL accepte les versions complètes et abrégées. Cela signifie que LEFT JOIN est identique à LEFT OUTER JOIN. Donc, oui, LEFT JOIN est un type de jointure externe, tout comme RIGHT JOIN et FULL JOIN. En tant qu'utilisateurs de SQL, nous écrivons généralement LEFT JOIN. La raison ? C'est plus court et nous sommes paresseux. Pour en savoir plus, consultez l'article expliquant le fonctionnement de la jointure à gauche. Syntaxe de la jointure à gauche en SQL La syntaxe de LEFT JOIN est la suivante. SELECT … FROM table1 LEFT JOIN table2 ON table1.column = table2.column; Les deux points clés sont le mot-clé LEFT JOIN et la clause de jonction ON. La première table jointe est référencée dans la clause FROM, puis la clause LEFT JOIN est ajoutée, suivie de la deuxième table que vous souhaitez joindre. Les tables sont jointes sur la base des valeurs de colonnes correspondantes ; vous référencez ces colonnes dans la clause ON et placez un signe égal entre elles. Vous joindrez ainsi les tables pour lesquelles la colonne d'une table est égale à la colonne de la deuxième table. Il s'agit du type le plus courant de LEFT JOIN. On l'appelle equi-join à cause du signe égal. D'autres opérateurs de comparaison peuvent être utilisés ; il s'agit des jointures non égales, qui sortent du cadre de cet article. Tout ceci est également expliqué dans l'Aide-mémoire SQL JOIN. Gardez-la à portée de main pendant les exemples suivants ; elle vous aidera à mieux les comprendre. Exemples de JOINTS DE GAUCHE Permettez-moi maintenant de vous présenter plusieurs exemples concrets d'utilisation de LEFT JOIN. Je commencerai par un exemple basique et simple pour vous montrer comment LEFT JOIN fonctionne sur des données réelles. Exemple 1 : Jointure gauche de base Je vais travailler avec deux tables. La première est companyqui contient une liste de sociétés d'électronique. Utilisez ce script pour créer la table. idcompany_name 1Lenovo 2Apple 3Samsung 4Huawei 5Fairphone La deuxième table est la table product est la table Le script de création de la table se trouve ici. idproduct_namecompany_id 1Fairphone 45 2Galaxy S24 Ultra3 3Galaxy Z Flip53 4iPhone 15 Pro2 5Fairbuds XL5 6MacBook Pro 16' M3 Pro2 7iPad Air 10.9' M12 8Galaxy Tab S9 FE+3 LEFT JOIN ces deux tables et voyons ce qui se passe : SELECT company_name, product_name FROM company LEFT JOIN product ON company.id = product.company_id ORDER BY company_name; Je sélectionne le nom de la société et du produit. Ces colonnes proviennent de deux tables. Je dois donc joindre les tables pour obtenir ces colonnes dans le résultat. La table de gauche est companyet j'y fais référence dans FROM. J'ajoute ensuite LEFT JOIN et la deuxième table, qui est product. Dans la clause ON, je spécifie les colonnes sur lesquelles les tables seront jointes. Dans ce cas, il s'agit de la colonne id de la première table et de la colonne company_id de la deuxième table. J'ai utilisé ORDER BY pour rendre la sortie plus lisible. (Vous n'avez pas besoin de ORDER BY pour que la jointure fonctionne). En parlant de résultat, le voici. company_nameproduct_name AppleiPhone 15 Pro AppleiPad Air 10.9' M1 AppleMacBook Pro 16' M3 Pro FairphoneFairphone 4 FairphoneFairbuds XL HuaweiNULL LenovoNULL SamsungGalaxy Z Flip5 SamsungGalaxy S24 Ultra SamsungGalaxy Tab S9 FE+ La sortie montre une liste de toutes les entreprises, ce qui est conforme à l'adresse LEFT JOIN qui montre toutes les données de la table de gauche. Lorsqu'une entreprise a plusieurs produits, tous ces produits sont listés et le nom de l'entreprise est dupliqué. Lorsqu'il n'y a pas de produits de l'entreprise (Huawei et Lenovo), la valeur de la colonne product_name est NULL. Exemple 2 : Un exemple concret de JOINTE À GAUCHE Explorons un scénario courant. Dans cet exemple, vous souhaitez dresser la liste de tous les départements et de leurs employés, mais aussi afficher les départements sans employés, s'il y en a. Pour ce faire, vous avez besoin de LEFT JOIN. Voici le tableau department et son script. Il s'agit d'une liste de départements. iddepartment_name 1Sales 2Accounting 3IT 4HR 5Operations La deuxième table est employee, qui est une liste d'employés. Voici son script. idfirst_namelast_namedepartment_id 1BobEstevez3 2FrancescaGotze2 3FrankGordon2 4MilicentJohnson3 5HansHandkeNULL 6KatieKeaton1 7LucaDi FrancescoNULL 8ZoeJong1 9PatrickRose2 10BillieThompsonNULL Les valeurs NULL signifient que cet employé n'a pas encore été affecté à un département. Pour afficher les départements et leurs employés - ainsi que les départements sans employés - voici le code : SELECT department.id AS department_id, department_name, employee.id AS employee_id, first_name, last_name FROM department LEFT JOIN employee ON department.id = employee.department_id ORDER BY department_id, employee_id; Je sélectionne l'ID dans le tableau department et je le renomme department_id. La deuxième colonne sélectionnée dans le même tableau est department_name. Les données sélectionnées dans le tableau employee sont id (renommé employee_id) et les noms des employés. Tout ce renommage des colonnes a pour seul but de rendre le résultat plus facile à lire. Maintenant, je peux faire référence au tableau department dans FROM et LEFT JOIN avec le tableau employee. Les tables sont jointes lorsque les identifiants des départements sont identiques. Enfin, je trie le résultat par département, puis par numéro d'identification de l'employé pour le rendre plus lisible. Voici le résultat : department_iddepartment_nameemployee_idfirst_namelast_name 1Sales6KatieKeaton 1Sales8ZoeJong 2Accounting2FrancescaGotze 2Accounting3FrankGordon 2Accounting9PatrickRose 3IT1BobEstevez 3IT4MilicentJohnson 4HRNULLNULLNULL 5OperationsNULLNULLNULL Le résultat montre tous les départements et leurs employés. Il montre également deux départements qui n'ont pas d'employés : RH et Opérations. Il se peut que la base de données n'ait pas encore été mise à jour et que les nouveaux employés ne soient pas affectés au département. Exemple 3 : Un autre exemple concret de JOINTE À GAUCHE Un autre exemple typique de LEFT JOIN est celui où vous voulez trouver tous les clients et leurs commandes, mais où vous voulez aussi inclure les clients qui n'ont pas encore passé de commande. Pour cet exemple, j'utiliserai l'ensemble de données suivant. La première table est customerqui est une simple liste de clients. Voici le script. idfirst_namelast_name 1FlorentinusGlöckner 2EmanAdcock 3ErikNyman 4LeebaKubo 5LiasVámos 6LavanyaNikolaev 7RishiPetit 8ChristieFodor 9AndrisLončar 10JulianaHarlan La deuxième table de l'ensemble de données est orders. Vous pouvez la créer vous-même à l'aide de ce script. Voici comment j'écris le code pour obtenir le résultat souhaité : SELECT customer.first_name, customer.last_name, orders.id AS order_id, orders.order_date FROM customer LEFT JOIN orders ON customer.id = orders.customer_id; Je sélectionne les noms des clients dans le tableau customer. Logiquement, les informations sur les commandes proviennent de la table orders. Le tableau de gauche est customeret je veux toutes ses lignes. Je la LEFT JOIN avec la table orders sur l'ID du client. Le résultat ressemble à ceci : first_namelast_nameorder_idorder_date LiasVámos12024-01-01 EmanAdcock22024-01-08 ChristieFodor32024-01-08 AndrisLončar42024-01-12 LiasVámos52024-01-18 LavanyaNikolaev62024-01-22 JulianaHarlanNULLNULL LeebaKuboNULLNULL FlorentinusGlöcknerNULLNULL ErikNymanNULLNULL RishiPetitNULLNULL Vous pouvez voir que tous les clients et leurs commandes sont affichés. Lorsque le client n'a pas de commande, il y a NULLs. Pour plus de pratique, consultez cet article qui présente quatre autres exemples de LEFT JOIN. Exemple 4 : LEFT JOIN avec 3 tables Voici un exemple LEFT JOIN dans lequel je vous montrerai comment joindre trois tables. Jetons d'abord un coup d'œil à l'ensemble de données. La première table est writeravec le script ici. Il s'agit simplement d'une liste de rédacteurs. idfirst_namelast_name 1BernardineEvaristo 2AlbertCamus 3GeorgeOrwell 4ÉmileZola 5MilanKundera 6CharlesDickens 7BohumilHrabal 8WitoldGombrowicz La deuxième table est translator. Il s'agit d'une liste de traducteurs de livres. Le script de création de la table est ici. idfirst_namelast_name 1JenniferCroft 2PeterConstantine 3EwaldOsers La dernière table est celle des livres, qui donne des informations sur les livres en question. Voici le script. idbook_titlepublication_yearwriter_idtranslator_id 1The Plague200823 2Cosmos201581 3Manifesto: On Never Giving Up20211NULL 4Girl, Woman, Other20191NULL 5The Stranger202223 6Germinal201243 7198420203NULL Si la valeur de la colonne translator_id est NULL, ce livre n'est pas une traduction. Dans cet exemple, je veux afficher tous les écrivains, qu'ils aient un livre ou non. Je souhaite également afficher les informations relatives au traducteur du livre. Voici à quoi devrait ressembler le code : SELECT writer.first_name AS writer_first_name, writer.last_name AS writer_last_name, book_title, translator.first_name AS translator_first_name, translator.last_name AS translator_last_name FROM writer LEFT JOIN book ON writer.id = book.writer_id LEFT JOIN translator ON book.translator_id = translator.id; Je sélectionne les noms des écrivains, les titres de leurs livres et les noms des traducteurs. Pour obtenir toutes ces données, je dois joindre les trois tables. La jointure de trois tables (ou plus) se fait sous la forme d'une chaîne. Après avoir joint les deux premières tables, vous ajoutez une autre jointure, faites référence à la troisième table et indiquez la condition de jointure dans la deuxième clause ON. Tout d'abord, je référence la table writeret LEFT JOIN avec la table book sur l'auteur ID. Ensuite, j'ajoute la deuxième clause LEFT JOIN. Je l'utilise pour joindre la deuxième table (book) avec la table translator sur l'ID du traducteur. Pourquoi ces LEFT JOINsont-ils le résultat de la relation entre les tables ? Le premier LEFT JOIN est là parce qu'il peut y avoir des écrivains sans livre. Toutefois, cela est également vrai pour la relation entre les tables book et translatorun livre peut être ou ne pas être une traduction, et il peut donc y avoir ou non un traducteur correspondant. Vous devez donc utiliser LEFT JOIN entre les deux, car vous voulez montrer les livres, qu'il s'agisse ou non de traductions. Voici le résultat du code : writer_first_namewriter_last_namebook_titletranslator_first_nametranslator_last_name AlbertCamusThe PlagueEwaldOsers WitoldGombrowiczCosmosJenniferCroft BernardineEvaristoManifesto: On Never Giving UpNULLNULL BernardineEvaristoGirl, Woman, OtherNULLNULL AlbertCamusThe StrangerEwaldOsers ÉmileZolaGerminalEwaldOsers GeorgeOrwell1984NULLNULL MilanKunderaNULLNULLNULL CharlesDickensNULLNULLNULL BohumilHrabalNULLNULLNULL Comme vous pouvez le voir, les livres de Bernardine Evaristo sont affichés bien qu'ils ne soient pas des traductions. C'est parce que j'ai utilisé LEFT JOIN comme deuxième jointure. De même, Milan Kundera, Charles Dickens et Bohumil Hrabal sont affichés bien qu'ils n'aient pas de livres et donc pas de traducteurs. Exemple 5 : Jointure à gauche "forcée" avec trois tables En général, le choix de LEFT JOIN découle de la nature des relations entre les tables. Cependant, il arrive que nous soyons "obligés" d'utiliser LEFT JOIN. Vous verrez bientôt ce que je veux dire. Le premier tableau de l'ensemble de données est une liste de directeurs nommés director. Voici le script. idfirst_namelast_name 1StanleyKubrick 2CélineSciamma 3WoodyAllen 4LynneRamsay 5KrzysztofKieślowski Le tableau suivant est le tableau streaming_platformqui est une liste des plateformes de streaming disponibles. Vous pouvez créer la table à l'aide de ce script. idplatform_name 1Netflix 2HBO 3Hulu 4Mubi 5Apple TV Le troisième tableau est streaming_catalogue. Elle contient des informations sur les films et entretient des relations avec les deux premières tables via director_id et streaming_platform_id. Voici le script de création de la table. idmovie_titlerelease_yeardirector_idstreaming_platform_idstarted_showingended_showing 1Three Colours: Blue1993542023-02-282023-09-30 2Three Colours: White1994542023-02-282023-09-30 3Three Colours: Red1994542023-02-282023-09-30 4Manhattan Murder Mystery1993312023-08-15NULL 5Portrait of a Lady on Fire2019212023-01-012023-09-28 6Three Colours: Blue1993522024-01-15NULL 7Three Colours: White1994522024-01-15NULL 8Three Colours: Red1994522024-01-15NULL 9Tomboy2011212020-04-012021-04-01 10Vicky Cristina Barcelona2008312023-10-01NULL Les valeurs NULL dans la colonne ended_showing signifient que le film est toujours diffusé sur la plateforme. Je souhaite afficher tous les réalisateurs, leurs films et les plateformes de streaming qui diffusent (ou ont diffusé) leurs films. Je souhaite également afficher les réalisateurs dont aucun film n'est diffusé en continu. La relation entre les tables est que chaque film doit avoir un réalisateur, mais pas l'inverse. De même, chaque film du catalogue doit avoir une plate-forme de diffusion en continu, mais toutes les plates-formes de diffusion en continu ne doivent pas figurer dans le catalogue. Je commence à écrire le code en sélectionnant les noms des réalisateurs, les titres des films, les noms des plateformes et les dates de début et de fin des projections. D'après les exemples précédents, vous savez qu'il est prévu de joindre la table director avec la table streaming_catalogue sur la colonne ID du réalisateur. C'est ce que je fais pour m'assurer d'afficher également les réalisateurs qui n'ont pas de films dans le catalogue. Maintenant, j'ajoute le second LEFT JOIN pour joindre la table streaming_catalogue avec la table streaming_platform sur l'ID de la plateforme. SELECT first_name AS director_first_name, last_name AS director_last_name, movie_title, platform_name, started_showing, ended_showing FROM director LEFT JOIN streaming_catalogue ON director.id = streaming_catalogue.director_id LEFT JOIN streaming_platform ON streaming_catalogue.streaming_platform_id = streaming_platform.id; La requête renvoie le résultat suivant : director_first_namedirector_last_namemovie_titleplatform_namestarted_showingended_showing KrzysztofKieślowskiThree Colours: BlueMubi2023-02-282023-09-30 KrzysztofKieślowskiThree Colours: WhiteMubi2023-02-282023-09-30 KrzysztofKieślowskiThree Colours: RedMubi2023-02-282023-09-30 WoodyAllenManhattan Murder MysteryNetflix2023-08-15NULL CélineSciammaPortrait of a Lady on FireNetflix2023-01-012023-09-28 KrzysztofKieślowskiThree Colours: BlueHBO2024-01-15NULL KrzysztofKieślowskiThree Colours: WhiteHBO2024-01-15NULL KrzysztofKieślowskiThree Colours: RedHBO2024-01-15NULL CélineSciammaTomboyNetflix2020-04-012021-04-01 WoodyAllenVicky Cristina BarcelonaNetflix2023-10-01NULL LynneRamsayNULLNULLNULLNULL StanleyKubrickNULLNULLNULLNULL Le résultat montre tous les réalisateurs, leurs films et les plateformes où ils sont ou ont été diffusés. Les films contenant toutes les données , à l'exception d' un NULL dans les colonnes ended_showing, peuvent toujours être vus sur une plateforme particulière. Bien qu'il n'y ait aucun film dans le catalogue, Lynne Ramsay et Stanley Kubrick sont également répertoriés. Cela se reconnaît à la présence de leurs noms, mais à l'absence d'autres données. J'ai pu les obtenir parce que j'ai utilisé deux LEFT JOINs. Le premier LEFT JOIN n'est pas contestable ; j'ai dû l'utiliser au cas où il y aurait des réalisateurs sans films. Il s'avère que c'est le cas. Mais qu'en est-il du second LEFT JOIN? J'ai été en quelque sorte forcé de l'utiliser pour retenir tous ces réalisateurs sans films et obtenir le résultat souhaité. Pourquoi "forcé" ? Eh bien, utilisons INNER JOIN au lieu du second LEFT JOIN, et vous verrez. SELECT first_name AS director_first_name, last_name AS director_last_name, movie_title, platform_name, started_showing, ended_showing FROM director LEFT JOIN streaming_catalogue ON director.id = streaming_catalogue.director_id JOIN streaming_platform ON streaming_catalogue.streaming_platform_id = streaming_platform.id; Il manque maintenant Lynne Ramsay et Stanley Kubrick dans le résultat ! director_first_namedirector_last_namemovie_titleplatform_namestarted_showingended_showing KrzysztofKieślowskiThree Colours: BlueMubi2023-02-282023-09-30 KrzysztofKieślowskiThree Colours: WhiteMubi2023-02-282023-09-30 KrzysztofKieślowskiThree Colours: RedMubi2023-02-282023-09-30 WoodyAllenManhattan Murder MysteryNetflix2023-08-15NULL CélineSciammaPortrait of a Lady on FireNetflix2023-01-012023-09-28 KrzysztofKieślowskiThree Colours: BlueHBO2024-01-15NULL KrzysztofKieślowskiThree Colours: WhiteHBO2024-01-15NULL KrzysztofKieślowskiThree Colours: RedHBO2024-01-15NULL CélineSciammaTomboyNetflix2020-04-012021-04-01 WoodyAllenVicky Cristina BarcelonaNetflix2023-10-01NULL Comment cela se fait-il ? Parce que INNER JOIN ne renvoie que les lignes correspondantes des tables jointes. J'ai donc pu obtenir les noms des réalisateurs sans les films avec le premier LEFT JOIN. Bravo ! Mais j'ai ensuite utilisé INNER JOIN et j'ai tout gâché ! INNER JOIN annule le premier LEFT JOIN, car il n'affiche que les lignes correspondantes entre streaming_catalogue et streaming_platform. Puisque Lynne Ramsay et Stanley Kubrick n'ont pas de films dans la table streaming_catalogueleurs films inexistants ne peuvent pas être mis en correspondance dans le tableau streaming_platform et ils n'apparaissent pas dans le résultat final. Voici un article qui fournit d'autres conseils et exemples sur la JONCTION À GAUCHE de plusieurs tables. Exemple 6 : Jonction à gauche avec WHERE Poursuivons les exemples de SQL LEFT JOIN en utilisant les mêmes données que dans l'exemple précédent. Cet exemple vous montrera comment LEFT JOIN peut être utilisé avec la clause WHERE. C'est exactement ce que fait le code ci-dessous pour trouver les réalisateurs, leurs films et les dates de début et de fin des projections. Cependant, il n'affiche pas tous les films, mais seulement ceux dont la projection s'est terminée avant le 1er octobre 2023. SELECT first_name, last_name, movie_title, started_showing, ended_showing FROM director LEFT JOIN streaming_catalogue ON director.id = streaming_catalogue.director_id WHERE ended_showing < '2023_10_01'; Après avoir sélectionné les colonnes nécessaires, j'ai LEFT JOIN le tableau director avec la table streaming_ catalogue. Les tables sont jointes sur l'ID du réalisateur. J'utilise la clause WHERE pour ne sortir que les films dont la diffusion s'est terminée avant le 1er octobre 2023. Dans WHERE, je compare la colonne ended_showing à la date limite requise en utilisant l'opérateur de comparaison "less than" (<). Voici le résultat. Aucun film n'est sorti après le 1er octobre 2023. first_namelast_namemovie_titlestarted_showingended_showing KrzysztofKieślowskiThree Colours: Blue2023-02-282023-09-30 KrzysztofKieślowskiThree Colours: White2023-02-282023-09-30 KrzysztofKieślowskiThree Colours: Red2023-02-282023-09-30 CélineSciammaPortrait of a Lady on Fire2023-01-012023-09-28 CélineSciammaTomboy2020-04-012021-04-01 Exemple 7 : WHERE vs. ON dans LEFT JOIN Je vais maintenant vous montrer comment l'effet de LEFT JOIN peut être annulé si WHERE est utilisé sur la bonne table. Et, bien sûr, je vous montrerai comment y remédier. J'utilise à nouveau le même ensemble de données que dans l'exemple précédent. Supposons que je veuille l'interroger et récupérer tous les réalisateurs, qu'ils aient ou non un film dans la base de données. Pour les réalisateurs qui ont un film, je veux afficher uniquement les films sortis en 1993. Je pourrais essayer d'y parvenir en écrivant cette requête : SELECT DISTINCT first_name, last_name, movie_title, release_year FROM director LEFT JOIN streaming_catalogue ON director.id = streaming_catalogue.director_id WHERE release_year = 1993; Tout d'abord, je sélectionne les colonnes nécessaires. J'utilise SELECT DISTINCT pour éviter la duplication des lignes, car certains films apparaissent plus d'une fois dans la table streaming_catalogue. Maintenant, je LEFT JOIN le tableau director avec streaming_catalogue sur l'ID du réalisateur. L'étape finale consisterait à utiliser la clause WHERE et à ne récupérer que les films sortis en 1993. Voyons le résultat : first_namelast_namemovie_titlerelease_year KrzysztofKieślowskiThree Colours: Blue1993 WoodyAllenManhattan Murder Mystery1993 Non, ce n'est pas correct ! Je n'ai obtenu que deux réalisateurs au lieu de cinq. Rappelez-vous que je voulais une liste de tous les réalisateurs. Pourquoi cela s'est-il produit, bien que j'aie utilisé LEFT JOIN? La raison en est que lorsque le filtre de WHERE est appliqué aux données du tableau de droite, il annule l'effet de LEFT JOIN. N'oubliez pas que si le réalisateur n'a aucun film dans le tableau, les valeurs de la colonne release_year seront NULL. C'est le résultat de LEFT JOIN. Et le filtre de WHERE exclura également NULLde la sortie. Alors, comment pouvez-vous lister tous les directeurs et utiliser le filtre sur l'année de publication en même temps ? La réponse est que vous devez déplacer la condition de filtrage de WHERE à ON, comme suit. SELECT DISTINCT first_name, last_name, movie_title, release_year FROM director LEFT JOIN streaming_catalogue ON director.id = streaming_catalogue.director_id AND release_year = 1993; La condition relative à l'année de publication devient alors la deuxième condition de jointure dans la clause ON. La deuxième (troisième, quatrième...) condition est ajoutée à l'aide du mot-clé AND. Regardez, la sortie est maintenant correcte : first_namelast_namemovie_titlerelease_year StanleyKubrickNULLNULL LynneRamsayNULLNULL CélineSciammaNULLNULL KrzysztofKieślowskiThree Colours: Blue1993 WoodyAllenManhattan Murder Mystery1993 Vous pouvez en apprendre davantage dans cet article consacré à la différence entre WHERE et ON dans Les jointures en SQL. Exemple 8 : LEFT JOIN avec Alias Dans tous les exemples précédents, l'utilisation d'alias avec les tables dans LEFT JOIN n'était pas nécessaire. Cela aurait pu vous aider à raccourcir les noms des tables et à écrire le code un peu plus rapidement. Utile, certes, mais pas obligatoire. Cependant, les alias deviennent obligatoires lorsque vous LEFT JOINING la table avec elle-même - c'est-à-dire lorsque vous auto-jointoyez la table. Voyons comment cela fonctionne dans un exemple où je souhaite récupérer les noms de tous les employés et les noms de leurs responsables. Je veux que cette liste contienne les employés qui n'ont pas de supérieur hiérarchique. J'en ferai la démonstration dans le tableau intitulé employees_managers. Voici le script: idfirst_namelast_namemanager_id 1LindKaiser2 2IanMcKune8 3DeckTrustrieNULL 4RupertaNind1 5GarrotCharsleyNULL 6AtheneFedoronko8 7PriscillaCrocombeNULL 8StafaniSidebottom8 9MarveTrustie1 10AntonyMarple2 Voici la liste des employés. La colonne manager_id contient l'ID de l'employé qui est le manager de l'employé en question. Certains employés n'ont pas de responsable, la valeur est donc NULL. Pour réaliser la tâche demandée, je dois écrire cette requête : SELECT e.first_name AS employee_first_name, e.last_name AS employee_last_name, m.first_name AS manager_first_name, m.last_name AS manager_last_name FROM employees_managers e LEFT JOIN employees_managers m ON e.manager_id = m.id; Je fais référence à la table dans la clause FROM et je lui donne l'alias e. Cette table servira de données sur les employés. Ensuite, je référence la même table dans la clause LEFT JOIN et lui donne l'alias m. Elle sera utilisée pour les données des managers. De cette manière, j'ai pu joindre la table à elle-même. C'est la même chose que de joindre deux tables différentes. Lors d'une jointure automatique, une table agit comme deux tables. Il suffit de leur donner des alias pour que SQL sache à quelle table vous faites référence. La table est auto-jointe lorsque l'ID du manager de la table "employé" est égal à l'ID de l'employé de la table "manager". De cette façon, j'obtiendrai tous les employés et leurs responsables. Maintenant que les tables sont en place, il ne me reste plus qu'à sélectionner les colonnes nécessaires. Là encore, pour faire la distinction, j'utilise des alias de table différents pour obtenir les noms des employés et des responsables. Voici le résultat : employee_first_nameemployee_last_namemanager_first_namemanager_last_name LindKaiserIanMcKune IanMcKuneStafaniSidebottom DeckTrustrieNULLNULL RupertaNindLindKaiser GarrotCharsleyNULLNULL AtheneFedoronkoStafaniSidebottom PriscillaCrocombeNULLNULL StafaniSidebottomStafaniSidebottom MarveTrustieLindKaiser AntonyMarpleIanMcKune Comme vous pouvez le constater, il s'agit d'une liste complète des employés et de leurs responsables. Deck Trustrie, Garrot Charsley et Priscilla Crocombe n'ont pas de responsable. Ils se trouvent au sommet de la structure hiérarchique de l'entreprise. Exemple 9 : JOINT A GAUCHE avec GROUP BY Revenons maintenant à l'exemple 2, dans lequel nous avons travaillé avec une liste de départements et d'employés. Un exemple simple de LEFT JOIN avec GROUP BY serait de lister tous les départements et de compter le nombre d'employés dans chacun d'eux : SELECT department_name, COUNT(employee.id) AS number_of_employees FROM department LEFT JOIN employee ON department.id = employee.department_id GROUP BY department_name; Je sélectionne le département et j'utilise la fonction d'agrégation COUNT() sur la colonne de l'ID de l'employé pour trouver le nombre d'employés. Les données proviennent de deux tables. Je dois LEFT JOIN la table department avec la table employee car je veux aussi des départements qui n'ont pas d'employés. Les tables sont jointes sur l'ID du département. Comme j'ai utilisé une fonction d'agrégation, je dois également regrouper les données. Pour ce faire, j'utilise la clause GROUP BY. Le regroupement des résultats par nom de département permet d'afficher le nombre d'employés pour chaque département. Jetez un coup d'œil. Sympathique, n'est-ce pas ? department_namenumber_of_employees Accounting3 Operations0 Sales2 IT2 HR0 Essayons maintenant un autre exemple et utilisons COUNT(*) au lieu d'appliquer COUNT() à une colonne particulière. Cette fois, j'utilise les données sur les entreprises et leurs produits de l'exemple 1. Dans cet exemple, je souhaite récupérer toutes les entreprises et afficher le nombre de produits qu'elles possèdent. Voyons ce qui se passe si j'utilise COUNT(*): SELECT company_name, COUNT(*) AS number_of_products FROM company LEFT JOIN product ON company.id = product.company_id GROUP BY company_name; Les tables company et product sont LEFT JOINsur la base de l'identifiant de l'entreprise. J'utilise COUNT(*) et GROUP BY pour trouver le nombre de produits par société. Voici le résultat : company_namenumber_of_products Huawei1 Lenovo1 Samsung3 Apple3 Fairphone2 Cependant, je peux vous dire que ce résultat n'est pas correct : Huawei et Lenovo auraient dû avoir zéro produit. Pourquoi cette erreur s'est-elle produite ? Le coupable est COUNT(*)! L'astérisque dans la fonction COUNT() signifie qu'elle compte toutes les lignes, y compris NULLs. Est-ce plus clair maintenant ? Oui, c'est exact : lorsque les entreprises sans produits sont LEFT JOIN, elles ont des produits NULS. Cependant, il s'agit toujours d'une valeur et COUNT(*) considérera chaque valeur NULL comme un produit. En d'autres termes, même les entreprises sans produits seront considérées comme ayant un produit. Pour résoudre ce problème, utilisez COUNT(expression). Dans ce cas, cela signifie COUNT(product.id). L'utilisation de COUNT() avec un nom de colonne ignore NULLs : SELECT company_name, COUNT(product.id) AS number_of_products FROM company LEFT JOIN product ON company.id = product.company_id GROUP BY company_name; Le résultat est maintenant conforme aux attentes : company_namenumber_of_products Huawei0 Lenovo0 Samsung3 Apple3 Fairphone2 Vous pouvez aller plus loin en lisant cet article sur les différentes variations de la fonction agrégée COUNT(). Autres exemples et ressources SQL LEFT JOIN Les exemples ci-dessus montrent que LEFT JOIN est largement utilisé dans les travaux pratiques sur les données. Il peut être utilisé pour une simple recherche de données lorsque vous avez besoin de toutes les données d'une table et uniquement des données correspondantes d'une autre table. Cependant, il peut également être utilisé pour joindre plusieurs tables, avec WHERE, dans les jointures automatiques et avec les fonctions d'agrégation et GROUP BY. Les jointures SQL sont essentielles pour travailler avec plusieurs tables, ce qui est une tâche quotidienne, même pour les analystes de données débutants. Connaître les jointures est une nécessité absolue si vous voulez vous considérer comme maîtrisant le langage SQL et progresser dans votre travail. Cela implique également de connaître LEFT JOIN, car c'est l'un des deux types de jointures les plus utilisés. En raison de ses caractéristiques très spécifiques, de nombreuses tâches ne peuvent être effectuées qu'en exploitant LEFT JOIN. Si vous avez besoin d'un guide approfondi sur ces sujets, nous vous invitons à consulter notre coursLes jointures en SQL . De plus, vous devez pratiquer tous ces concepts pour qu'ils soient vraiment assimilés. Cela signifie que vous devez pratiquer LEFT JOIN ainsi que d'autres types de JOIN afin de pouvoir les différencier. Vous pouvez essayer ces 12 questions pratiques sur les JO IN ou certaines des suggestions sur la façon de pratiquer Les jointures en SQL. Si vous devez bientôt passer un entretien d'embauche en SQL, essayez de répondre à ces 10 questions d'entretien sur les JOIN SQL. Bon apprentissage ! Tags: left join sql