On ne pose pas de cookies de suivi nous-mêmes. Les vidéos de cours sont hébergées sur YouTube, qui dépose ses propres cookies dès qu'une vidéo se charge — elles restent disponibles en un clic si vous préférez ne pas les accepter maintenant.
Combiner ou comparer des ensembles de résultats (UNION / INTERSECT) · SQL — Sup2Tech
Combiner ou comparer des ensembles de résultats (UNION / INTERSECT)
0/5
Vidéo
Étape 1 sur 4, Vidéo
Apprendre SQL : UNION, UNION ALL, INTERSECT, EXCEPT — combiner des données multi-sources
Points clés de cette vidéo
UNION combine les résultats de deux requêtes SELECT en un seul ensemble, en supprimant les doublons
UNION ALL fait la même chose SANS supprimer les doublons (plus rapide, mais peut répéter des lignes)
INTERSECT ne garde que les lignes présentes dans les DEUX requêtes
Transcription de la vidéo
Allez, salut et bienvenue dans ce nouveau tutoriel. Dans la suite de notre apprentissage de SQL, nous verrons comment donc combiner des résultats, comment trouver des valeurs communes, comment trouver des valeurs présentes d'un côté et absente de l'autre. Et nous allons appliquer tout cela sur des cas métiers pour faire des analyses euh précises pour comprendre le contexte de ce que nous allons faire aujourd'hui. Donc on considère en fait une entreprise qui fait des ventes en magasin et en ligne. Donc pour des ventes en magasin, ils vont recevoir des clients. Ils vont prendre le temps donc de récupérer les informations sur ces clients et les stocker dans leur CRM. Euh CRM donc c'est le customer relationship management. C'est un système qui va leur permettre de gérer leur leurs clients et ils vont enregistrer également le ventes dans une table spécifique. Ici nous on appelle vente magasin. De même, ils offrent en fait une plateforme où des gens peuvent directement en fait acheter des produits en ligne. Donc ces ventes là seront enregistrées dans une table de ventes. les clients récupérés sur ces différentes sur ces différentes plateformes que ça soit des applications mobiles ou leurs sites web seront enregistrés également dans une autre table. Notre objectif à nous c'est d'avoir de pouvoir créer en fait des requêtes qui nous permettent de d'afficher l'ensemble des clients, que ça soit des clients euh enregistrés dans les CRM ou des clients enregistrés obtenus sur les plateformes web. pareil pour les ventes. Donc nous allons voir comment on peut faire tout cela, comment on pourra donc combiner ces données, comment on peut faire des analyses un peu plus poussées durant ce tutoriel. Pour les besoins de la vidéo, vous aurez donc à récupérer. Donc si vous avez commencé à suivre mes vidéos depuis le début, vous avez sûrement déjà exécuté ce script qui permet donc de créer la liste des employés et autres. Mais euh mais aujourd'hui vous aurez besoin en fait de ce script. Donc il faudra euh récupérer. Donc c'est pareil hein. Donc vous aurez le fichier, soit vous cliquez dedans, vous faites contrôle A, contrô C pour copier et ensuite vous irez dans votre espace de dans votre système de gestion de base de données ici pour coller directement ou si vous voulez, vous pouvez télécharger ici en cliquant et une fois que c'est téléchargé, vous ouvrez le fichier. D'accord ? Donc une fois vous avez votre script ici, assurez-vous que vous êtes bien sur la base de données où vous travaillez. Nous, on travaille ici avec une base de données qu'on a appelé OVIDER. Si vous avez euh donné un autre nom, pas de souci. Vous pouvez tout simplement en fait donner le nom. Euh vous assurer que vous avez sélectionné le nom puis euh voilà, vous vous sélectionnez et vous exécutez en fait le tout. D'accord ? Moi, je l'ai déjà fait. Ça va vous ajouter la table des clients CRM, clients web, vous aurez la table des ventes en magasin et aussi des vente en ligne. Voilà, ça c'est le nécessaire pour pouvoir suivre le tutoriel d'aujourd'hui. Vous n'avez pas les tables produit employés et départements, ce n'est pas c'est pas grave. Vous n'en avez pas besoin pour ce tutoriel. Mais pour les tutoriels précédents, vous en avez vous en certainement besoin de de les de les récupérer, d'accord ? Mais vous pouvez aussi aller les prendre depuis le GitHub, le lien en en description de la vidéo pour pouvoir les les créer et les ajouter aussi. Voilà. Donc ceci étant, donc je vais ouvrir en fait ici voilà un autre espace pour pouvoir travailler tranquillement. Donc on a dit qu'on va voir comment combiner des données. Déjà commençons par voir un peu ce que contient en fait notre notre nos tables. Donc je vais faire étoile. Donc select étoile from et je vais prendre la table. Alors allons-y déjà avec la table client. Donc je vais prendre la table client et c'est plutôt client. Alors on va commencer par CRM. J'exécute et comme vous pouvez le voir ici, on a 13 clients. Très bien. Donc je peux pas travailler avec toutes les colonnes pour le moment. Donc je vais me contenter dans un premier temps uniquement de la colonne mail. Très bien, j'exécute ça. Si je fais pareil, je vais copier ça. Je viens ici pour la seconde table des clients, la table client web et j'exécute j'ai au ici 11 clients. D'accord ? Donc vous pouvez voir. Alors je vais enlever ça. Je fais étoile pour que vous puissiez voir un peu. Donc on a aussi le nom complet pays et tout. D'accord. Voilà. Et allons étape par étape, je vais me focaliser d'abord sur cette colonne. Très bien. Donc si je veux combiner ces deux tables, d'accord, j'ai deux options. Donc j'ai la possibilité d'utiliser union ou d'utiliser union all. D'accord ? Donc je peux utiliser soit union ou bien union all. Alors, c'est quoi la différence entre ces deux ? Nous allons les découvrir ensemble. Donc la syntace, elle est très simple. Je vais enlever l'espace qui est là et je vais mettre entre mes deux requêtes union. Alors, la particularité de union ici, c'est que ça va en fait récupérer, donc ça va fusionner les deux, ça va combiner les deux et ensuite ça va faire quoi ? Ça va enlever les doublons. Ça veut dire quoi ? Si j'ai une adresse qui se trouve dans cette table et qui se trouve ici, cette adresse ne va apparaître qu'une fois. D'accord ? On a vu tout à l'heure qu'ici dans la table web, on a 11 lignes. Ici on a 13. Logiquement si je combine les deux, ça doit me faire 24. Mais avec l'union, s'il y a des doublons, on aura moins. Donc je vais exécuter les deux. Vous allez voir, on trouve ici 18. On ça veut dire qu'en fait qu'il y a des adresses mail, donc des gens qui sont passés par euh des plateformes web pour acheter, donc ils sont enregistrés comme des clients dans la base des de clients web, mais qui se retrouvent aussi dans la table de CRM parce que éventuellement ils sont aussi partis en magasin pour acheter. Ils ont aussi laissé donc leur leur noms ou les identifiants là-bas. D'accord ? Ça c'est le cas de union. Donc je vais copier ça et on va voir avec Union all. Union all ici va faire quoi ? Va récupérer l'ensemble en en prenant en compte les doublons. Donc les doublons seront conservés. Si j'exécute et bien on va se retrouver avec 24 lignes ici. Donc on a bien l'ensemble d'accord des euh des données à ce niveau-là. Quand est-ce qu'il faut utiliser union et quand est-ce qu'il faut utiliser union all ? Union si vous voulez vous assurer qu'il n'y a pas de doublon de duplication ce qui est par exemple le cas lorsque vous traitez des clients ici par exemple d'accord c'est le même client ce n'est pas la peine de le dupliquer de l'avoir deux ou trois fois dans votre système. Dans ce cas on va se contenter union. Par contre, si vous avez besoin et on va le voir tout à l'heure dans le cas métier, lorsqu'il s'agit des ventes par exemple, il peut ach il peut faire des ventes en ligne et puis faire des ventes en magasin, il faut que ces ventes là apparaissent. Dans ce cas, vous serez obligé d'utiliser union all. D'accord ? Donc si vous voulez supprimer les doublons, vous utilisez Union. Si vous voulez garder les doublons, dans votre combinaison, vous allez utiliser Union all. Très bien. Ça, ce sont les deux les deux premiers éléments que nous allons que nous avons prévu voir aujourd'hui. On peut maintenant se dire tiens, quels sont les clients qui se trouvent dans cette table et qui se trouve également ici, c'est en gros l'intercession de ces de ces deux là. Et donc dans ce cas pareil, je vais copier ça comme ça. Donc ici c'est intersect qu'on va voir. Je vais remplacer tout ça par intersect. Et quand je vais exécuter et bien on va retrouver six valeurs ici. Donc ces adresses mail là se trouve à la fois dans la table de client CRM et dans la table de client web. Vous pouvez le vérifier par une requête rapide. Donc je vais copier ça. Je vais faire donc select email from ça ou bien select si on le souhaite étoile from ça where email égal et je vais tester pour celui-ci. Très bien on le retrouve. Et si je remplace web par CRM, pareil, on va retrouver le même client. Ce qui confirme bien que c'est un client qui se trouve à la fois dans la table de client CRM et dans cette table. Ensuite, on peut se poser une autre question. Quels sont les clients qui sont dans votre CRM mais qui n'ont jamais été enregistrés en ligne. D'accord ? Quels sont les clients qui sont ici mais qui n'apparaissent pas à ce niveau-là. Donc c'est des clients qui ne font que des achats en magasin par exemple. Très bien. Pour ça pareil, je vais copier tout ça. On va plutôt utiliser accept. Très bien. Donc je vais remplacer ça par accept. Donc il s'agit ici donc de voir les clients qui se trouvent dans la table CRM mais qui ne se trouvent pas sur le web. Donc ce sont en gros les clients qui ne font que des achats euh en magasin. D'accord ? On peut aussi inverser pour mettre ici client web. Dans ce cas au début, ça sera les clients qui ne font que des achats en ligne qu'on va récupérer. On a fait la démonstration en nous limitant là en en nous focalisant donc sur les colonnes email pour faire une introduction. Mais sachez en fait que ces quatre éléments-là doivent respecter des règles précises. Ces règles sont les suivantes. Alors, je vais les mettre ici en commentaire. La première en fait c'est que il faut que vos deux requêtes, vos trois requêtes ou je sais pas combien vous allez en fait mettre parce que les unions ici vous pouvez enchaîner à plusieurs niveaux, il faut qu'ils aient en fait le même nombre de colonnes. Très bien. Donc ça on va on va on va vérifier on va regarder cette règle rapidement. Et donc je vais remonter ici. Je copie ça. Je viens là. Non, pas celui-là. OK, on va le prendre avec union. D'accord. Je peux faire la démonstration avec union ou ou union all, peu importe. Supposons ici que je complète là et j'ajoute une autre colonne, c'est non complet. Donc en haut, j'ai deux colonnes et en bas, j'ai quoi ? J'ai une seule colonne qui est sélectionnée. Si j'exécute, j'aurai une erreur. Donc si j'ai deux colonnes dans la première requête, il faut obligatoirement qu'en bas, j'ai aussi deux colonnes. Que se passerait-il si j'enversais ? D'accord ? Si j'inverse et que j'ai une colonne en haut et deux colonnes en bas, j'aurai toujours une R1. D'accord ? Et c'est bien indiqué ici union, intercept ou union all. Ce sont en fait des opérations qui doivent se faire sur la base du même nombre de colonnes. Ça c'est la toute première règle. La deuxième règle, il faut que ça soit en fait des types compatibles. D'accord ? Donc si j'ai je mets là très bien aussi non com et que j'exécute ça fonctionne. D'accord ? Lorsqu'on parle de type compatible ici ça c'est de type ici aussi de type test. Là j'ai un type test et ici aussi type test. Comment je sais ? Il faut lors c'est la création de la table que c'est définie mais vous pouvez les vérifier ici. Donc si je clique là au niveau de la colonne, je vois que ici c'est de type N varchat qui qui veut dire en fait chaîne de caractère. Donc c'est du c'est du test. Pareil pour la colonne non complet qui est aussi N verchand. Si vous décidez, donc je vais respecter le même nombre, mais là si vous prenez euh une colonne en haut qui est de type entier et en bas vous avez une colonne qui est de type chaîne de caractère, ça ne va pas fonctionner. Bon, c'est la règle que on est en train de de voir ici. D'accord ? L'autre chose, c'est que les colonnes doivent avoir les mêmes les colonnes doivent avoir le même ordre. Très bien. Là, je suppose je mets non complet. Non complet. Et ici, je vais mettre nom complet au début. Donc non complet. Donc vous voyez que j'ai inversé l'ordre. Si j'exécute, j'ai un résultat. Mais remarquez que à des moments donné, on retrouve les noms dans la colonne qui s'appelle email. D'accord ? C'est à cause de la deuxième règle que nous allons voir. Le truc c'est que là en fait le système considère les premières colonnes spécifiées et derrière on considère que dans le même ordre, on aura les éléments associés. Donc la première requête ici récupère l'email et le nom complet. Donc pour le système, les autres requêtes aussi doivent être dans ce ordre-là email et non complet. Donc faites très très attention, d'accord à ça. Surtout lorsque vous êtes en train de euh voilà de de créer des grosses requêtes qui contiennent peut-être plusieurs colonnes. Assurez-vous de respecter le même ordre sinon vous allez en fait fausser vos résultats. Votre requête va bien fonctionner mais vous aurez des erreurs qui seront difficiles à détecter. Voilà. Donc la dernière règle, le dernier principe ici dont je je ça rejoint ce qu'on vient de dire, c'est que lorsque vous définissez des noms ou des alliances et bien viennent avec la première requête. Donc si je mets ici par exemple, je mets un allias ici en disant on va l'appeler non client, d'accord ? Et que j'exécute, vous verrez. Alors là, je vais remettre dans l'ordre ce qui va se passer. Vous verrez que la colonne de résultat final s'appelle non client et tout est respecté dedans. D'accord ? Donc c'est dire que ici je n'ai pas forcément besoin de rajouter l'allas mais moi je vous recommande pour écrire donc des des requêtes propres n'est-ce pas de voilà de respecter quand même hein d'utiliser des des allias à divers niveaux pour vous permettre de comprendre vous-même et pour les autres ce qui se passe derrière. Voilà les quatre principes que vous devez garder en teinte lorsque vous êtes en train de travailler avec union, union all intersect ou accept. Donc on peut s'arrêter ici pour la vidéo, mais comme j'aime bien appliquer avec vous ce qu'on est en train de faire, je vais poser quelques cas métiers qu'on peut en fait retrouver et qui pourraient donc être utiles. Vous avez vu qu'on a créé deux tables, donc euh table des magasins et tables des ventes. Je vais ouvrir ici notre fenêtre pour les requêtes ici. Donc on peut chercher à voir ce que contient ces différentes tables. Donc j'ai une une colonne de commande ID, date de la commande email, le produit ID, la quantité, le prix unitaire ainsi que le canal. D'accord ? Pareil ici pour la table des ventes. Alors ici je peux faire ça. On aura des informations sur la date de la vente, l'email du client, le produit dit, la quantité et le prix unitaire ainsi que le magasin où la vente a eu a eu lieu. Alors, je vais revenir en arrière. vous me le permettez pour vous ajouter euh une remarque ici. D'accord ? Lorsque là on a récupérer par exemple là nos nos la liste des clients, on pouvait aller encore plus loin. Alors je sais pas si je l'ai mis quelque part. Non. OK. On pouvait par exemple si on le souhaite, allez on peut compléter ici avec alors je vais passer à la ligne mettre par exemple non complet et je peux ajouter en fait ici je peux mettre par exemple là que c'est CRM AZ, je vais mettre par exemple euh source Ouais, je peux mettre source et pareil ici. Alors, notre source ici par exemple, ce sera web. Donc si je le laisse comme ça et que j'exécute, alors quelle est l'erreur ? Oui, ici j'ai manqué de mettre la virgule. J'exécute à nouveau. Donc là, vous voyez que en ajoutant le les voilà une colonne de différenciation ici de source et bien même lorsqu'il y avait des doublons, d'accord, les doublons là n'existent plus puisqu'on a une colonne désormais qui va les différencier. D'accord ? Tout à l'heure, on a exécuté comme ça. Donc si j'exécute comme ça, j'ai 18. D'accord ? Donc ce sont 18 clients distincts. Mais si j'ajoute manuellement donc une colonne supplémentaire, c'est CRM pour définir la source pour me permettre de pouvoir différencier la source de mes de mes clients. Donc dans ce cas, je n'ai plus de valeur distincte, j'aurai les 24 comme dans les cas de union all ici. D'accord ? Donc quand vous êtes en train de d'utiliser le union ou le union all, j'ai parlé de doublon mais sachez que la notion de doublon c'est dans le résultat. final. Donc si vous ajoutez des colonnes intermédiaires, des colonnes personnalisées, des calculs, et bien ces calculs peuvent en fait introduire ou bien supprimer la notion de de doublant tout simplement. Donc voilà, important de de le savoir. Donc pareil ici, quand on arrive là et qu'on veut combiner par exemple, ça c'est un cas classique métier qu'on peut retrouver, vous avez des tables de vente et autres et donc vous devez les ramener. Je commence par exemple par ça. Vous voyez ici on a date commande alors que ici on a date vente. Donc il faut normaliser et donner un nom. Est-ce que on va l'appeler date vente ou bien on va appeler date command. Donc nous on va partir du principe. Donc ici on a alors étoile. Donc là, je vais mettre date commande as date vent. Et ici je mettrai date vente et entre les deux, on va mettre une all parce que toutes les commandes en fait dans les deux cas, on veut les récupérer. J'exécute, j'ai donc une première ligne et je vais compléter avec les autres colonnes de façon à constituer à la fin un résultat qui reflecte la liste des ventes. Je vous mets le résultat final de la requête. Donc là, je vais récupérer la date de la vente, le client, le produit, ainsi de suite. J'ajoute ici une colonne supplémentaire magasin pour indiquer le canal par lequel la vente a eu lieu et je vais faire un union all avec les ventes en ligne. Si j'exécute et bien j'obtiens ça. Donc j'aurai à la fois les ventes en magasin et les ventes en ligne. À partir de de ceci, je pourrais donc faire d'autres calculs supplémentaires. euh créer mes indicateurs avec des outils d'analyse comme PowerBi ou ou autres. Alors, on va voir un dernier cas euh pour pour finir la vidéo. Et bien, c'est par exemple, on se demande est-ce qu'il existe des produits qui n'ont jamais été vendus ? Est-ce qu'il existe des produits qui n'ont jamais été vendus ? Comment est-ce qu'on pourrait écrire ce cette requête pour obtenir ce résultat ? Dir produits qui n'ont jamais été vendus, nous devons déjà commencer par aller chercher la liste des tous les produits qui ont été vendus. D'accord ? Donc ça ça revient à aller récupérer donc la colonne select produit id donc les ventes en I. Je vais faire un union la liste des ventes ou en magasin. Donc si j'exécute ça, j'obtiens de façon distincte l'ensemble des produits qui ont eu un une vente, d'accord ? Qui ont été vendus quelque part. Et ensuite ce que je vais faire c'est d'aller récupérer select produit id from notre table produit. Je l'ai pas encore utilisé. Et ce que je vais utiliser c'est tout simplement accept comme on l'a vu tout à l'heure et je vais mettre entre parenthèses ce qui se trouve là. Donc là si j'exécute donc là il y a pas de de résultat mais voilà si il y avait donc un produit qui n'a jamais connu de vente et bien qu'est-ce qui va se passer ? tout simplement ce produit là va apparaître. Vous pouvez aussi chercher par exemple à savoir à connaître les produits qui sont vendus en lit et aussi en magasin. En gros, ce sont les produits qui marchent bien dont la vente marche bien aussi bien en ligne que en au niveau des magasins. D'accord ? Donc ça c'est aussi un autre cas pour comprendre pour voir en fait quels sont les produits que nos clients ils aiment bien. Il l'achète aussi bien en ligne qu'en magasin là par exemple. Donc à la place je vais copier ça. Je vais utiliser quoi ? Comme ce qu'on a vu tout à l'heure, on va passer par inter intersect tout simplement entre les deux. J'exécute et donc ce sont les produits 1 3 6 7 qui se vont aussi bien en ligne qu'en magasin. Les autres soit c'est vendu uniquement en ligne soit c'est vendu uniquement en magasin. dernier point avant de nous quitter. Donc si je reviens ici et que je vais et que je copie ça vo bien je viens là c'est comment on pourra trier le résultat lorsqu'on utilise union union all ou ainsi de suite. Pour le faire il suffit donc d'ajouter à la fin un order buy. Donc là je vais mettre order buy. Je vais mettre là email et je vais mettre par exemple alors si je le laisse comme ça, mes résultats seront triés par ordre croissant. C'est l'ordre par défaut si ce n'est pas précisé. Et si je veux, je peux donc le préciser l'ordre des des croissants et donc l'ARC sera ordonné par ordre des croissant. Donc je le mets au niveau de la dernière requête ici et mon résultat final sera donc trié. C'est la fin de ce tutoriel. J'espère que vous avez aimé. Si c'est le cas, n'hésitez pas à liker, à vous abonner, à activer la cloche de notification pour ne rien manquer. En attendant le prochain tutoriel, je vous dis à très bientôt.