Choix de mon éditeur de code

Visual Studio Code

La première question à se poser dans un premier temps est: pourquoi changer d’éditeur de code ?

Effectivement, j’ai précédemment parlé d’utiliser des outils connus pour mon projet perso. Pourquoi ne pas suivre cette règle pour tous les outils utilisés en y incluant mon éditeur de code ?

La réponse est simple : je ne suis pas 100% satisfait avec mes précédentes expériences.

Voici la liste des prétendants

NotePad++ et Context

Je met ces deux dans le même panier car ils sont pour moi de très bon éditeur de texte que j’ai longuement utilisé par le passé mais que j’ai assez rapidement remplacé par Sublime Text. Je n’ai pas vraiment de commentaire négatif à faire mais peux être que les autres outils sont plus répandu et que j’ai naturellement été influencé. A tord ou a raison, …

Sublime text

Magnifique éditeur, j’étais à deux doigts d’acquérir la licence après une petite période de teste plutôt concluante. L’éditeur est rapide, multi-plateforme, « beau », propose de nombreux plugins et est régulièrement mis à jour. Il dispose d’une bonne visibilité dans la communauté des développeurs ou il est régulièrement mis en concurrence avec Atom. Ce qu’il manque à mon sens est une intégration « parfaite est simple » avec la ligne de commande ainsi qu’une bonne intégration de GIT.

Atom

Il a beau être resté longtemps installé sur mes différentes machines, je ne l’ai que très peu utilisé. Son éviction peut donc paraître sévère, mais il possède pour moi la pire des tares à aujourd’hui : la lenteur à l’ouverture ! Pourtant utilisé installé sur des disques SSD, avec des machines plutôt puissantes, rien n’y fait. La désinstallation de certains modules n’a pas aidé. Mes recherches sur Google ont été fatales à Atom, mettant en exergue mon ressenti. Certes la promesse est belle, mais la lenteur d’ouverture du soft est pour moi rédhibitoire !

Visual Studio Code

Arrivant en fin de test, c’est celui que j’ai retenu pour mon projet perso. Il regroupe pour moins tous les points forts des deux précédents et se targue d’une merveilleuse intégration de GIT et de la ligne de commande. Pour l’instant, il fait réellement mon bonheur pour écrire mon code PHP/Symfony.

Le choix de mon éditeur de code est donc fait : Visual Studio Code

Symfony 3, retour au PHP

Logo Symfony

Et le JavaScript dans tout ça ?

Effectivement, je retourne rapidement ma veste. Je passe en une semaine de JavaScript à PHP. (Sans compter qu’il y a un mois j’étais à fond dans le Ruby !

Révélation !

Au cours de mes nombreuses lectures, je suis tombé sur nombres d’articles vantant le mérite d’un projet personnel pour l’apprentissage d’une nouvelle techno. Je pense, et c’est ce que j’ai souvent fait, que c’est effectivement le meilleur moyen d’apprendre que de se mettre en situation concrète.

Et si je faisais ce projet dont je parle depuis maintenant 2 ans ?

Pas bête ! sachant que mon objectif global plus que d’apprendre une techno en particulier et de revoir mes compétences globales (et de les mètres à jour) sur le scope complet d’une application « moderne ».

Partir sur des bases connues pour un résultat sûr !

D’autres lectures (je ne lisais visiblement pas assez avant) ont réussi à me faire comprendre que si l’on veut réellement délivrer un projet perso, il était plus sur de partir sur des technologies connues plutôt que sur de la découverte absolut. L’idée globale étant qu’il vaut mieux délivrer une partie pas folichonne et non complète que rien du tout !

Virage à 180°

C’est donc comme ça que j’ai mis de côté certaines de mes expériences notamment avec Ruby pour revenir à mes fondamentaux : le PHP !

Symfony

Le choix du framework a été tout comme le choix du langage vite réglé par mes précédents travaux. L’envie de découvrir Laravel a été forte, mais par sagesse, je suis retourné à mon premier amour : Symfony. La bonne nouvelle c’est que je vais quand même avoir le droit à certaines nouveautés (je l’espère) puisque que Symfony est maintenant en version 3 et PHP en version 7 !

Il ne reste plus qu’à repartir de 0 pour ne pas commettre les erreurs du passé !

JavaScript world – mon « Hello World »

JavaScript

alert(‘Hello, JavaScript’)

Eh oui, il existe encore des gens qui en 2017 ne se sont pas mis au JavaScript. Pour moi, il n’y a aucune réticence technologique, mais simplement aucune opportunité professionnelle ou personnelle ne m’y a conduit.

2017 l’année du JavaScript ?

Mais, évidemment, les années passent et les temps changent. La fin d’année 2016 aura été le théâtre de quelques changements professionnels et certaines opportunités se sont ouvertes. Et avec elles a fait surface le « merveilleux » monde du JavaScript. Je me lance donc en ce début d’année dans ce monde obscur et tortueux avec pour objectif d’y faire mes premiers pas en partant d’à peux près 0. –> Tout le monde est passé par là à un moment ou à un autre alors pourquoi pas moi ?

Par où commencer ?

React ? Angular ? Node ? Babel ? ES6/7 ? Redux ? DOM ? … que des noms déjà entendus, mais tout n’est pas complètement claire encore. L’objectif est donc d’y voir un peut plus claire et d’avancer petit à petit dans cet environnement riche ou il est assez facile de se perdre.

Dans mes premières lectures techniques de l’année figure l’article de Sacha Greif « A Study Plan To Cure JavaScript Fatigue »

JavaScript Study plan
JavaScript Study plan

Tout n’est pas encore limpide, mais je vais m’orienter vers les bases de React.js pour dans un premier temps, voir à quoi cela ressemble et les possibilités du JavaScript.

Il est temps de mettre les mains dans le cambouis !

DataCenter personnel : du rêve à la livraison

Serveurs en salle d'attente

Un peu d’histoire

Comme tout (ou du moins une grande majorité) passionné d’informatique, bidouilleur et touche à tout, j’ai toujours voulu avoir à la maison un « serveur », au sens rack, comme on en voie dans les entreprises et datacenter. En grandissant et au fils des études, j’ai eu de nombreux ordinateurs, toujours monté par mes soins, sur lesquelles étaient installé de quoi faire de la virtualisation et ainsi créer des serveurs virtuel.

Cependant, tout ceci est « virtuel » et mon PC n’a visuellement rien d’un serveur. J’avais certes exactement la même expérience de travail mais c’est un peu comme jouer sur un émulateur ou une NES. Evidemment, je n’ai aucun émulateur sur mes machines et préfère souffler un bon coup dans mes cartouches !

Google Appliance
Google Appliance

Je me rappelle être tombé par hasard au fils de mes lectures de geek sur une page parlant des Google search appliances dans leur jolie livrée jaune avec le logo de la marque. J’étais sous le charme ! attiré par le châssis plus que par ce qu’il y avait dedans mais je me suis donc mis à chercher comment me procurer la bête. La désillusion fût rapide puisque ce genre de choses n’était pas vraiment prévu pour être mis chez un étudiant avide d’expériences.

Les années passants, l’idée d’avoir un petit data center personnel à fait un vas et vient incessant dans mes envies. Passant ensuite dans le monde professionnel, je travaillé au quotidiens sur ce genre de machines, sans jamais en voir mais avec leur flexibilité. Moyennant l’appel au service infra, la disponibilité des ressources, la volonté de la hiérarchie il m’a été quasiment impossible de faire mes expériences personnelles et ainsi m’auto former sur de nombreux aspect technique car mes employeurs n’étais pas de cet avis. (Vive les SSII, mais ce n’est pas le sujet du jour)

Le rêve reprend forme

Dans mon cercles d’amis d’enfance, j’ai eu une conversation avec l’un d’eux qui travaille chez un broker :

  • « C’est marrant on vient de récupérer un serveur tout jaune avec écrit Google dessus »
  • « HO !! le serveur DELL fait par Google […] » (je sors toute ma science sur cette machine)
  • « Oué mais c’est con ça vaut rien on va le jeter »

Livraison réceptionné

C’est comme ça qu’après quelques semaines de négociation, j’ai finalement pu mettre la main sur les bestioles !

 

Après déballage, je branche et … décollage, un avion à réaction est dans le bureau …

Ok, je vais vite trouver un moyen pour les mettre dans la buanderie ! –> DataCenter ok mais WAF complient c’est mieux !

 

Ruby : Préparation de l’environnement de développement

Logo Ruby

Choix des outils

Rentrons maintenant dans le vif du sujet. Après avoir passé ma machine principale sous ubuntu spécialement pour faire du dev en Ruby On Rails, il faut maintenant la préparer. Faisons tout d’abord le point de ce qui est nécessaire.

  • Un éditeur de code ou environnement de développement intégré
  • Un gestionnaire de version
  • L’interpréteur et les librairies propres au langage

N’étant pas un expert, j’ai plus ou moins fouiné sur le net pour trouver quels étaient les outils les plus utilisé par les développeurs Ruby actuels.   Ceci m’a amené à construire mon environnement de la sorte :

  • Sublime text 3 pour mon éditeur
  • Git pour la gestion de version
  • Rbenv comme gestionnaire de version RUBY

Tout ceci n’a rien de vraiment farfelu et c’est bien là l’intérêt afin de trouver rapidement de l’aide au besoin.

L’installation

Pour rappel, je suis passé sous linux pour m’éviter tous les problèmes de configuration et d’installation de l’environnement de développement pour Ruby. Voyons donc comment tout cela se passe sous ubuntu.

  • Sublime Text 3

Pourquoi sublime texte ? Parce que je suis tombé dessus par hasard en cherchant une alternative à Notepad++ qui soit multi plateforme. J’ai essayé, j’ai adopté. Tout simplement.

Pour l’installation, rien de plus simple. Rendez-vous sur le site officiel : http://www.sublimetext.com/, télécharger la version 64bits linux puis avec le gestionnaire de paquet Ubuntu, il n’y a plus qu’à faire « Installer »

  • Installer Git

La magie de linux opère déjà. La simplification de l’installation est poussée à l’extrême grâce au gestionnaire de paquet Apt. Seulement deux actions sont à faire. Tout d’abord mettre à jour le catalogue d’apt et ensuite installer le paquet désiré. Pour ce faire, très simplement :

sudo apt-get update

sudo apt-get install git

Et voilà ! C’est encore plus rapide et simple que sous Windows. Avant de pouvoir utiliser Git, il reste deux petites configuration a effectué mais rien de bien méchant. Il faut simplement dire à Git qui vous êtes en renseignant votre nom et votre email qui seront vos identifiants Git. Tout aussi simplement, deux petites lignes de commandes suffisent :

git config --global user.name "Your Name"

git config --global user.email "youremail@domain.com"

Et voilà rien de plus, nous somme prête à faire du versionning avec Git.

  • Installer Rbenv

Il ne reste maintenant « que » le plus gros morceau. L’installation du Ruby lui-même. En effet, sans Ruby sur la machine, il est plutôt compliquer de développer avec. Pour sons installation, de par ses différentes versions et la nécessité de vouloir développer et gérer différents environnement avec différentes version, les développeurs Ruby font souvent le choix d’un gestionnaire de version Ruby.

Je ne pense pas avoir besoin de ça tout de suite ne travaillant pas sur 50 projets à la fois mais autant prendre de bonnes habitudes le plus vite possibles.

Dans un premier temps, on va installer certaines dépendances de Ruby qui seront régulièrement utilisée par les gem Ruby. Autant s’en occuper tout de suite.

sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev

Passons maintenant à l’installation de rbenv. L’idée est d’utiliser notre nouvel outil « Git » pour récupérer la dernière version sur le dépôt de l’auteur. Cette fois, les commandes peuvent paraitre un peu barbare mais rien de bien compliquer en définitive :

git clone git://github.com/sstephenson/rbenv.git .rbenv

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc

echo 'eval "$(rbenv init -)"' >> ~/.bashrc

exec $SHELL

Une dernière petite manipulation afin d’installer ruby-build qui sert à « compiler » les différents gem de Ruby. Et nous seront fin prêt !

git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc

exec $SHELL

Nous allons maintenant pouvoir installer la dernière version de Ruby et la définir comme la version « global » de notre environnement :

rbenv install 2.2.3

rbenv global 2.2.3

Les problèmes commencent

ruby –v

Petit problème, la dernière commande qui aurait-du me donner la version de Ruby installé (soit 2.2.3) ne me renvoi un message pas sympa du tout :

roxanne7@roxyfix:~$ ruby -v

Le programme « ruby » n’est pas encore installé. Vous pouvez l’installer en tapant :

sudo apt-get install ruby

Si tout ne marche pas comme prévu, c’est que j’ai dû merder à un moment !

Welcome to linux me dis-je enfin !

Bon, en cherchant dans mon arborescence là ou « devrait » être installé Ruby, je verrais bien si celui-ci est installé …

InstallRubyCheck

Tout m’a l’air d’être bien installé. Petite vérification pour savoir si ruby marche :

rubyV_Ok

Le verdict tombe, mon shell ne connait pas le chemin de l’exécutable Ruby via rbenv. Dans la documentation de rbenv, c’est l’ajout de la ligne suivant qui permet de rediriger le path vers la bonne version de Ruby :

'eval "$(rbenv init -)"

 

Il faut donc maintenant chercher dans les différents fichiers qui chargent les paramètres du shell pour voir si cette ligne a bien été rajoutée et si ces fichiers ne se marchent pas dessus …

Le fichier ~/.bashrc contient bien les lignes gérant le PATH. Mais la surprise provient du fichier .bash_profile qui contient aussi quelques lignes pour mon PATH et rbenv … louche !

bash_profile

Certaines recherche vont m’apprendre que la présence de ce fichier empêche le chargement d’autres fichiers de profile. La solution serait donc de supprimer ce fichier.

Holà holà … Mais il vient d’où ce fichier ?

Probablement d’une mauvaise manip de ma part. En relisant la différente doc que j’ai lu pour arriver à mes fins ainsi que l’heure de création du fichier, la sentence est tombée : je suis fautif du syndrome du copier-coller sans réfléchir !

Solution simple :

remove_bash_profile

Résultat :

rbenv_marche

Ca y est, Ruby est donc installé et fonctionnel !

Les petits plus à faire par la suite :

echo "gem: --no-ri --no-rdoc" > ~/.gemrc

gem install bundler


install_bundler

SSH vers une machine Ubuntu

Tunnel ssh

Linux c’est bien, à distance c’est mieux !

Bon, RoxyFix est maintenant passé sous linux. Ce n’est bien sûr qu’une première étape de la migration de mon petit labo à domicile.

Une des choses qui me tiens à cœur c’est de pouvoir accéder à ma machine d’un peu partout et quand je le veux. Point de bureau, interface graphique ou autre, mais un simple petit terminal avec accès ssh fera l’affaire.

Installation du serveur ssh

Grace à linux (et surtout aux gestionnaires de paquets), nul besoin de passer des heures de configurations pour parvenir à mes fins. Tout ce passe en 2 lignes de commandes.

La première servira à la mise à jour des paquets :

sudo apt-get update

Puis une seconde pour l’installation à proprement parler du serveur ssh. (Le client étant installé par défaut)

sudo apt-get install openssh-server

Plus d’informations sont disponibles directement sur la doc d’ubuntu.

Maintenant, pour se connecter, n’importe quel terminal fera l’affaire. Que ce soit depuis un linux, MacOs ou même un Windows.

Le résultat :

ssh vers RoxyFix
ssh vers RoxyFix

Clique gauche inactif sur Ubuntu

Ubuntu

L’installation d’ubuntu s’est plutôt bien passée, « presque » tout marche. En effet, j’ai un désagréable problème de clique gauche de la souris.

Une fois arrivée sur le joli bureau Unity, j’ai évidemment commencé à vouloir jouer avec … en cliquant partout pour tout ouvrir et tout voir. Ma première impression a été :

Ca rame à mort, je clique et 3 minutes après il se passe toujours rien …

A force de manipulation j’ai pu constater qu’en fait le clique gauche de la sourie ne fait rien … le droit fonctionne, le pointeur et la molette aussi mais le gauche rien n’y fait …

Via le clavier, je me suis rendu dans les paramètres système (qui ressemble étrangement à celui d’OsX) pour configurer la souris.

Surprise … la souris marche impec !

Merde c’est quoi ce bordel ?

Google étant mon ami même via linux, mes différentes recherches me font sentir moins seul. Visiblement il y a un vrai problème avec ça et sur de nombreuses versions. J’ai trouvé des traces remontant à la version  9.0.

Alors, pour être honnête, je n’ai pas encore trouvé de solution pérenne. Pour l’instant, ce qui marche c’est de passer en mode console et de revenir en graphique …

Ctrl + Alt +F5 // Ctrl + Alt +F7

Je ne sais pas si ça veut dire bien venu dans le monde linux ou tu vas en chier pour tout faire marcher correctement mais pour l’instant ça reste supportable…

Pour info, Ce symptôme arrive après une installation toute fraiche, dès le premier démarrage avec un téléchargement des mises à jour pendant l’installation. Pourtant, lors de l’utilisation avec le Live CD, tout fonctionne bien.

Si quelqu’un à une solution, je suis preneur !

RoxyFix passe sous ubuntu 15.04

Ubuntu

Roulement de tambour … Tadam !

RoxyFix a franchi le pas de l’open source. Après avoir tournée sous du Windows 7, Windows 8, Serveur 2008, Serveur 2012, Serveur 2012R2, l’ordi « fixe » de la maison est passé sous ubuntu ! (j’avoue il y a toujours un dual boot sur serveur 2012R2 pour des tests).

RoxyFix tourne maintenant sous ubuntu 15.04 64bits.

Pourquoi une telle révolution ?

La dernière en date qui a tout déclenché ce sont mes expériences de développement RUBY. L’installation de tous les outils pour avoir un environnement RUBY + Rails est un peu une prise de tête. Rien d’insurmontable puisque j’y suis finalement arrivé mais en faisant la comparaison du temps passé à tout mettre en place par rapport à RoxyMac (vous le connaissez pas encore mais vu son nom vous vous douterez qu’il tourne sous OsX), j’ai craqué !

Pourquoi ubuntu ?

Très simple. Cette installation n’est pas ma première expérience sur une distrib Unix. Coté pro j’ai déjà joué avec quantité de Linux ou de BSD. Coté perso, j’ai déjà eu du dual boot avec du Mandriva, Fedora, Debian.

Malgré tout ça, je n’ai jamais fini par adopté pleinement un Unix sur ma machine principale. Alors par « peur » ou simplicité, j’ai choisi la distrib la plus « grand publique » en espérant que ça se passe le mieux possible !

Ubuntu install OK
Ubuntu install OK

… A suivre

SQL : SELECT DISTINCT

Base de donnée

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 :

select 'FR' as Cd_Pays, '01' as Dep_Num ,'Ain' as Dep_Lib, 'Rhône-Alpes' as Reg_lib
union
select 'FR', '02','Aisne','Picardie'
union
select 'FR', '03','Allier','Auvergne'
union
select 'FR', '04','Alpes-de-Haute-Provence','Provence-Alpes-Côte d Azur'
union
select 'FR', '05','Hautes-Alpes','Provence-Alpes-Côte d Azur'
union
select 'FR', '06','Alpes-Maritimes','Provence-Alpes-Côte d Azur'
union
select 'FR', '07','Ardèche','Rhône-Alpes'
union
select 'FR', '08','Ardennes','Champagne-Ardenne';

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)
select nom, prenom,min(email)
from (
select 'Jean' as prenom, 'Dupont' as nom ,'jean.dupont@mail.com' as email
union
select 'Jean', 'Dupond','jean.dupond@mail.com'
union
select 'Alfred', 'Robert','alfred.R@mail.com'
union
select 'Jean', 'Dupont','jdupont@mail.com'
union
select 'Jean', 'Dupont','j-dupont@mail.com'
) as Sample
group by nom, prenom

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

Base de donnée

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 de Saisie
Champ de 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.