SQL : select distinct

Aujourd’hui, je vous propose un aperçu de la clause “distinct” du langage SQL. Beaucoup de gens voient le distinct dans une requête SQL comme un moyen d’indiquer que l’on veut récupérer que les lignes contenant des valeurs distinctes sur certaines colonnes. Cette affirmation n’est ni totalement fausse, ni totalement vraie. Explication :

La clause “distinct” que l’on écrit juste après l’instruction “select” d’une requête SQL permet de filtrer les lignes en doublons

La définition s’arrête ici. Il n’est pas question de parler de colonnes ou d’ensemble de colonnes dans la description de l’instruction “distinct”. En effet, cette instruction s’applique sur l’intégralité des colonnes demandées à l’instruction select. Nous allons dérouler un petit exemple en requête. Tout d’abord il est nécessaire d’utiliser un jeu de donnée. N’en ayant pas sous la main, je vais en créer un avec une requête SQL et des unions :

Select departement
Select departement

La requête :

Maintenant, imaginons que je veuille récupérer l’intégralité de ma table. Je peux utiliser l’instruction “select * …”

select *
select *

Cette table contient le code pays, le numéro de département, le libelle du département ainsi que le libellé de la région du département. La géographie française nous a appris les cardinalités suivantes :

  • Pays 1:n Région
  • Région 1:n Département

Dans une table ayant la granularité du département, une sélection seulement du code Pays provoquera des doublons. Exemple :

Select Cd_Pays
Select Cd_Pays

Le résultat donne autant de fois le code du pays qu’il a été trouvé dans notre jeu de donnée. Cependant, mon intention est de récupérer tous les pays dans une table et je n’ai besoin que d’une seule fois chaque valeur. Le résultat que j’attends est juste : “FR”. C’est là qu’intervient la clause distinct. En effet, cette clause comme décrite plus haut va servir à supprimer toutes les lignes en doublons. le résultat est donc :

select distinct Cd_Pays
select distinct Cd_Pays

De la même manière, je peux vouloir connaitre l’intégralité des départements présents dans cette table :

select distinct Dep_Lib
select distinct Dep_Lib

La clause distinct fait parfaitement le travail demandé. Maintenant, imaginons que pour la construction d’une liste de valeur j’ai besoin du libelle de la région, mais aussi du code pays ?

select distinct Reg_lib,Cd_Pays
select distinct Reg_lib,Cd_Pays

Cette méthode peut être déclinée à l’infinie avec l’ajout du libelle de département, des villes, quartiers, etc. Dans un cas trivial comme celui d’une hiérarchie géographique connue tel que le découpage territorial, il ne nous viendrait pas à l’idée de sélectionner les colonnes du code pays et du libelle de la région, mais de ne pas accepter les doublons sur la colonne du code pays ? Quel serait le sens de cette requête ? Récupérer le nom de la première région pour chaque pays ? Et cette réflexion peut se décliner à l’infinie en rajoutant des découpages géographiques.

Imaginons maintenant un nouveau cas de figure avec une table contenant le nom, le prénom et le mail de nos utilisateurs. Lors d’une analyse de nos applications, nous avons besoin de faire la liste de tous nos utilisateurs. La requête est facile à faire, nous allons sélectionner les différentes colonnes dans notre table de données :

select nom, prenom,email
select nom, prenom,email

Le résultat n’est pas celui attendu, car nous avons plusieurs fois l’utilisateur “Jean Dupont” avec différentes adresses email. Celà est traité de la sorte dans notre application, l’utilisateur est bien présent 3 fois, il ne s’agit pas d’homonymes. L’envie est donc tenante de faire un distinct sur les colonnes nom et prénom afin de n’avoir qu’une seule fois chaque utilisateur. Seulement la question suivante se pose : “Comment faire un distinct seulement sur les colonnes “nom” et “prénom” de mon select ?” “select distinct (nom, prénom), email” ?

select (nom, prenom),email
select (nom, prenom),email

C’est bien tenté, mais visiblement ça ne marche pas. Dans ce cas de figure, nous sommes souvent tentés de chercher sur internet ou appeler l’expert en base de données pour savoir comment faire un distinct sur seulement certaines colonnes d’un select. D’ailleurs en général on vous demande comment faire un distinct sur certains champs dans un select, mais là je vais vous renvoyer sur un autre article “Colonne Vs Champ“.

En fait, cette demande qui arrive plus souvent qu’on ne le pense ne peut pas se résoudre simplement avec un distinct. Quelle ligne le sgbd est censé supprimer ? Il n’est pas capable de décider pour vous. Il faudra donc lui indiquer de sélectionner une adresse mail en particulier. Cette demande peut être traitée de manières différentes. Dans ce cas de figure, j’utiliserai personnellement une fonction d’agrégation ainsi que la clause “group by” nécessaire lorsque l’on utilise une fonction d’agrégation. Ici, je vais utiliser la fonction d’agrégation min() pour récupérer le premier email par ordre alphabétique :

select nom, prenom,min(email)
select nom, prenom,min(email)

Cette solution n’est bien sur pas la seul ni forcément la meilleur. Il est possible de proposer une règle de gestion pour sélectionner quel e-mail récupérer. Mais ce n’est pas le sujet de l’article.

Ce qu’il est important de retenir c’est que la clause distinct filtre les données sur le résultat final global d’un select.

Vocabulaire BDD : Colonne VS Champ

Colonne et Champ sont deux mots souvent confondus lorsque l’on parle base de données relationnelle. Nombreux sont ceux qui pensent qu’ils sont synonymes et pourtant …

1-      Colonne

Les bases de données relationnelles sont basées sur la théorie mathématique de l’algèbre relationnelle. Un SGBDR utilise donc une représentation physique des concepts de l’algèbre relationnelle. L’algèbre relationnelle définit des ensembles d’ « Attributs » nommés « Relations » comportant différents « Tuples ». Physiquement, il est possible de représenter les relations par des tables (ou tableaux) :

Schema d'une Relation
Schema d’une Relation

2-      Champ

Lorsque l’on veut décrire la relation ci-dessus, nous expliquerons qu’elle est constituée de 4 « Colonnes » et de n lignes. Un sgbdr ne fait qu’une représentation physique d’une relation et il est donc naturel de parler de la même manière de colonnes et de lignes. Lorsque l’on étend ce vocabulaire au langage SQL, nous sélectionnerons donc des colonnes et retournerons des lignes.

Un champ est une zone de saisie dans une application. Cela peut être une zone de saisie de formulaire ou tout autre composant permettant à l’utilisateur de renseigner une information destiner à être traitée. Ci-dessous, le champ de saisie d’une recherche dans Gmail :

Champ Saisie
Champ Saisie

3-      La confusion

La confusion vient du fait que beaucoup de champs de saisie sont enregistrés dans une base de données en tant que colonne d’une table. Le discours d’un utilisateur lors de la rédaction de spécifications sera donc de récupérer le « champ » de recherche. Cependant, la traduction par l’expert en base de données devrait être de sélectionner la « colonne » contenant la valeur du champ de saisie de recherche.

L’offre BigData d’Oracle

Oracle invite ses partenaires pour la présentation de son offre autour du BigData. J’étais donc présent le 13/03/2014 à Aix-en-Provence pour suivre cette présentation en deux axes.
Un peu de technique pour débuter avec à la clef une petite « démo » s’enchainant par une partie orientée sales.

Oracle insiste dès le début de la matinée sur le côté très récent de ces offres et sait pertinemment que ces partenaires sont là à titre de veille technologique et non comme un véritable besoin. Ils indiquent qu’en France Oracle à seulement deux « vrais projets BigData ».
Oracle répondra très rapidement à la question que tout le monde se pose dans l’assistance :
Comment se découpe l’offre Oracle ?
Voici leur réponse :

Oracle BigData
Oracle BigData

Nous parlons ici de trois machines (et pas les plus petites) qui composent la « Big Picture » d’Oracle BigData.
Oracle se targue d’être le « seul » Player à proposer une solution complète BigData depuis l’acquisition jusqu’à la restitution quitte à s’appuyer sur des briques beaucoup plus classiques telles qu’Exadata et Exalytics.
Les blocs Exadata et Exalytics correspondent un peu à la cerise sur le gâteau, c’est bien pour « Big Data Appliance » que nous sommes venus.
Que se cache donc derrière cette Appliance signée Oracle ?

  • Un hardware signé Oracle/Sun, rien de spécial, c’est de l’Oracle
  • Une distribution hadoop : Cloudera
  • Une base de données Oracle NoSQL
  • Les BigData connectors

Ce qui est bon de savoir c’est que Cloudera et Oracle NoSQL sont des logiciels Open Source qu’il est donc possible d’installer « gratuitement » sur une architecture X86 classique. Oracle apporte donc du support sur ces solutions ainsi que les connecteurs BigData qu’il est possible d’acquérir indépendamment.
Oracle argumente le choix de la distribution Cloudera par le fait qu’elle soit :

  • « la plus rependue »
  • « la plus structurée »

Le « BigData » correspond principalement à une idée de stockage de grosse volumétrie. Pour leur analyse, Oracle répond grâce à ses solutions traditionnelles en alimentant les données dans Oracle via ODI ou Oracle BigData Connector.
Cependant, si l’afflux massif de données non utiles dans l’entreprise peut être un frein, Oracle répond par Event Processing permettant de filtrer le flux de données au plus près de la source en étant embarque dans une JVM située directement dans un capteur de donnée par exemple.
En parallèle de toute cette architecture massive pour le bigdata, Oracle présente de manière très brève une solution nommée « Endeca » née d’un rachat d’une compagnie anglaise fin 2011.
Endeca est présentée comme une solution permettant de « fouiller » dans les données non structurées ne nécessitant pas de modélisation. Endeca donne de l’autonomie à l’utilisateur final ce qui permet de rendre les projets BigData plus « agiles ». Endeca répond à la problématique d’analyse d’un gros volume de donnée en un temps record grâce à la mémoire RAM.
Oracle propose aux techniciens de se faire la main grâce à une machine virtuelle embarquant l’intégralité de la BigData Appliance dans une machine virtuelle prête à l’emploi que l’on peut trouver ici.

Dans la deuxième partie de cette présentation, orientée « sales », Oracle en ayant conscience que la France est encore en observation dans le monde du BigData change radicalement de discours et met en avant la solution Endeca qui devient le produit phare du BigData Oracle. Oracle propose la solution Endeca comme starter d’un projet BigData.

Endeca à l’avantage de pouvoir présenté à l’utilisateur des données structurées en même temps que des données non structurée. C’est une solution totalement indépendante qui propose la découverte de la « Valeur » de la donnée.
Endeca est annoncé comme le « BigData Explorer » avec une forte agilité. Un projet est annoncé avec une durée d’une à deux semaines pour une première mise en application.

De l’autre cotée, la BigData Appliance est plutôt orientée très gros Player et n’a pas vraiment été évoqué.

Pour résumer, Oracle veux vendre du Endeca en misant sur un prix d’entrée « attractif » grâce un une solution indépendante et une possibilité de SaaS. En parallèle et dans l’attente d’un marchée plus mature, les développeurs peuvent se faire la main sur des solutions Open Source !

Tutoriel Stambia ??

Depuis quelque temps je travail avec Stambia. L’outil est peu connu à ce jour et mérite pourtant de l’être un peux plus. Cependant, ce qui est frappant lorsque l’on commence à développer avec Stambia c’est que google n’est plus ton ami. En effet, toutes mes recherches d’aide sur ce superbe outil restent infructueuses.

Ces assez frustrant de se dire que l’on va réinventer la roue, et surement pas dans le bon sens du premier coup …

En tous cas, je fais appel à l’assistance s’il y a des développeurs stambia qui naviguent par ici, ou avez vous trouvé des exemples de devs ? Ou gardez-vous votre connaissance ?

… Je vais finir par devoir le faire moi même … ??

 

Premiers pas avec Stambia

C’est donc aujourd’hui que je double clique pour la première fois sur l’icône stambia.exe. Je suis amené à l’utiliser dans un futur proche et il est donc temps de se familiariser avec ce nouvel outil. À première vue, ça ressemble beaucoup à Talend … la « faute » à Eclipse ? Le principe d’ELT à l’aire poussé à l’extrême. Je n’ai pas encore vraiment eu le temps de jouer avec, mais ça viendra … j’ai du Talend à finir !