Notes sur MySql




LEFT JOIN et RIGHT JOIN
Introduction

Dans cet article, nous utiliserons les bases de test définies ci-dessous.

Première base de test


LEFT JOIN

Sélectionne les éléments de la table de gauche avec éventuellement pour chaque élément (de la table de gauche), les éléments correspondants de la table de droite, s'il y a correspondance. Nous désignerons la table de gauche par l'appellation "table de référence". Tous les enregistrements de la table de référence seront présents au moins une fois dans la sélection.


    SELECT      ...
    FROM        table_de_référence
    LEFT JOIN   autre_table ON ...


Exemple: On sélectionne tous les citoyens, avec leurs activités correspondantes.


Exemple: On sélectionne toutes les activités, avec les citoyens qui les assurent.


RIGHT JOIN

Sélectionne tous les éléments de la table de droite avec éventuellement pour chaque élément (de la table de droite), les éléments correspondants de la table de gauche, s'il y a correspondance Nous désignerons la table de droite par l'appellation "table de référence". Tous les enregistrements de la table de référence seront présents au moins une fois dans la sélection.


    SELECT      ...
    FROM        autre_table
    RIGHT JOIN  table_de_référence ON ...


Exemple: On sélectionne tous les citoyens, avec leurs activités correspondantes.


Exemple: On sélectionne toutes les activités, avec les citoyens qui les assurent.


Composition d'un LEFT JOIN et d'un RIGHT JOIN

On suppose que l'on a une base composée de trois tables "A", "B" et "C".


    SELECT      ...
    FROM        A
    LEFT JOIN   B ON A... = B...
    RIGHT JOIN  C ON A... = C...


On commence par exécuter la première jointure, dans l'ordre d'écriture des jointures. C'est la jointure de type "LEFT JOIN". On obtient une sélection intermédiaire.

Puis on exécute la seconde jointure (le RIGHT JOIN, en l'occurrence). On obtient la sélection finale.

Tous les enregistrements de la dernière table de référence (la table "C", en l'occurrence) seront présents au moins une fois dans la sélection.

Exemple:


    SELECT      citoyen.name as 'citoyen', voiture.name as 'voiture', activite.name as 'activite'
    FROM        citoyen
    LEFT JOIN   activite ON citoyen.fk_activite = activite.id
    RIGHT JOIN  voiture  ON citoyen.fk_voiture  = voiture.id;

On commence par effectuer le "LEFT JOIN". La table de référence est "citoyen". Cette jointure intermédiaire est :


    SELECT      citoyen.name as 'citoyen', activite.name as 'activite'
    FROM        citoyen
    LEFT JOIN   activite ON citoyen.fk_activite = activite.id;

Résultat:


Puis, on effectue le "RIGHT JOIN" entre le résultat de la jointure intermédiaire et la table "voiture". La table de référence est la table "voiture".

Résultat:


Utilisation d'un "LEFT JOIN" pour sélectionner tous les enregistrements d'une table qui n'ont pas de correspondance dans une autre table.

On sélectionne tous les enregistrements de la "table de référence" qui n'ont pas de correspondance dans une autre table.


    SELECT      ...
    FROM        table_de_reference
    LEFT JOIN   autre_table ON table_de_reference.key = autre_table.key
    WHERE       autre_table.key IS NULL

Exemple: On sélectionne tous les citoyens qui n'ont pas d'activité.


Et pour information, on affiche les voitures des citoyens qui n'ont pas d'activité.


Et pour information, on sélectionne les citoyens qui n'ont ni activité ni voiture.


Utilisation d'un "RIGHT JOIN" pour sélectionner tous les enregistrements d'une table qui n'ont pas de correspondance dans une autre table.

On sélectionne tous les enregistrements de la table de référence qui n'ont pas de correspondance dans une autre table.


    SELECT      ...
    FROM        autre_table
    RIGHT JOIN  table_de_reference ON table_de_reference.key = autre_table.key
    WHERE       autre_table.key IS NULL
UNION
Introduction

Dans cet article, nous utiliserons les bases de test définies ci-dessous.

Première base de test


Description générale

Par défaut, toutes les valeurs agrégées sont distinctes.

Dans de nombreux cas d'utilisation il faut utiliser des parenthèses!.

Exemple:



Utilisation avec des jointures de types LEFT JOIN et RIGHT JOIN.

Exemple: Sélectionner tous les citoyens sans activité et toutes les activités qui ne sont assurées par aucun citoyen.


Les procédures stockées
Gestion des erreurs

La discrimination, au niveau du code, entre les différentes erreurs susceptibles de se produire n’est pas toujours évidente. Il faut analyser des codes d’erreurs propres au SGBD...

Il peut être intéressant d’intégrer aux procédures stockées la « mécanique » permettant de discriminer certaines erreurs « particulièrement importantes », afin de faciliter le traitement ultérieur de ces erreurs (dans le code).

L’exemple qui suit illustre la technique utiliser.

La procédure stockée ci-dessous permet de mettre à jour une table qui contient des compagnies. Plusieurs erreurs peuvent de produire:


L’exemple ci-dessous est plus complet.


Test unitaires

Les quelques fonctions présentées ci-dessous permettent de rédiger des tests unitaires.


Trucs et astuces
Extraction de données via la ligne de commande

Il peut être utile de lancer une requête de sélection via la ligne de commande. Cela permet, par exemple, de diriger le résultat de la requête vers un script qui se chargera de l’exploitation des données.

Les options N et B permettent de supprimer le formatage du résultat en tableau.

Par exemple :

mysql -u root test -e 'select name from t_car_color limit 5';

Va retourner :


mysql -u root test -NBe 'select name from t_car_color limit 5';

Va retourner :


Une fois les données extraites, vous pouvez avoir besoin de les présenter sur une seule ligne. Pour cela vous pouvez utiliser Perl de la façon suivante :

mysql -u root test -NBe 'select name from t_car_color limit 5' | perl -e '@lines = (); while (<STDIN>) { chomp; push(@lines, $_); } print join(",", @lines);'

Va retourner :


Pour extraire le schéma d'une table :

mysql -u root test -NBe 'show create table t_car_color;' | perl -e '$t=<STDIN>; $t=~s/^[^\s]+\s+//; $t=~s/\\n/\n/mg; print $t;'


Insertion conditionnelle

Il arrive fréquemment que vous vouliez insérer une donnée uniquement si cette dernière n’a pas déjà été insérée.

Une solution simple pour parvenir à cet objectif est d’utiliser la construction « INSERT IGNORE ».

Par exemple :

La table définit un index unique sur le champ « name » (qui représentent le nom de la couleur). Vous disposez d’un grand nombre de couleurs dont certaines sont déjà déclarées dans la table. La construction « INSERT IGNORE » vous dispense de procéder à un tri préalablement au processus d’injection.


La commande mysql -u root test -e 'INSERT INTO t_car_color SET name="Air Force blue";' échoue car la couleur "Air Force blue" est déjà présente dans la table.

En revanche la commande mysql -u root test -e 'INSERT IGNORE INTO t_car_color SET name="Air Force blue";' fonctionne.