Créée le, 19/06/2015

 Mise à jour le, 19/05/2019

Visiteurs N°  




Accueil
Nouveau Blog Nouveautés Moteur de Recherche Votre Caddie Pour Vos Achats Votre Espace Membre Vos Signets et Vos Jeux Préférés Page de Bienvenue Statique Site en Français Site en Anglais
Sommaires
Électronique Fondamentale Technologie Fondamentale Testez vos Connaissances Électronique Théorique Digitale Électronique Pratique Digitale Lexique Électronique Numérique Data book TTL Data book CMOS Dépannage TVC Mathématique
Micro-ordinateurs
Théorique des Micro-ordinateurs Testez vos Connaissances Pratique des Micro-ordinateurs Glossaires sur les Ordinateurs
Physique
La lumière Champ d'action Rayonnement Électromagnétique
Technologies
Classification des Résistances Identification des Résistances Classification des Condensateurs Identification des Condensateurs
Formulaires Mathématiques
Géométrie Physique 1. - Électronique 1. 2. - Électronique 1. 3. - Électrotechnique 1. 4. - Électromagnétisme
Accès à tous nos Produits
E. T. F. - Tome I - 257 Pages E. T. F. - Tome II - 451 Pages E. T. F. - Tome III - 611 Pages E. T. D. - Tome I - 610 Pages N. B. M. - Tome I - 201 Pages E. T. M. - Tome I - 554 Pages Business à Domicile Ouvrages 34 pages gratuits Nos E-books Logiciel Géométrie Logiciel Composants Électroniques
Aperçu de tous nos Produits
E. T. F. - Tome I - 257 Pages E. T. F. - Tome II - 451 Pages E. T. F. - Tome III - 611 Pages E. T. D. - Tome I - 610 Pages E. T. M. - Tome I - 554 Pages Logiciel Géométrie Logiciel Composants Électroniques
Nos Leçons aux Formats PDF
Électronique Fondamentale Technologie Fondamentale Électronique Théorique Digitale Électronique Pratique Digitale Théorique des Micro-ordinateurs Mathématiques
Informatique
Dépannage Win98 et WinXP et autres Dépannage PC Glossaire HTML et Programmes PHP et Programmes JavaScript (en cours de travaux) Création de plusieurs Sites
Forums
Forum Électronique et Infos Forum Électronique et Poésie
Divers et autres
Formulaire des pages perso News XML Statistiques CountUs Éditeur JavaScript Nos Partenaires et nos Liens Utiles Gestionnaire de Partenariat Nos Partenaires MyCircle Sondages 1er Livre d'Or 2ème livre d'Or

Signets :
  Leçons suivantes        Leçons précédentes     Bas de page
  Cliquez ici pour la leçon suivante ou dans le sommaire prévu à cet effet


Travailler avec votre base de données MySQL (2ème partie) :



Lire des données dans la base de données :


L'instruction principale de SQL est SELECT. Elle est utilisée pour lire des données dans une base de données, en sélectionnant les lignes qui correspondent à certains critères, dans un tableau. L'instruction SELECT accepte beaucoup d'options, et peut être utilisée de plusieurs manières très différentes.

Voici la forme principale d'une instruction SELECT :

    SELECT items FROM tables

    [ WHERE condition ]

    [ GROUP BY group_type ]

    [ HAVING where_definition ]

    [ ORDER BY order_type ]

    [ LIMIT limit_criteria ] ;

Nous reviendrons un peu plus loin sur toutes les clauses de cette instruction. Nous allons tout d'abord commencer par examiner une requête sans aucune clause optionnelle, c'est-à-dire une simple requête qui sélectionne des éléments dans un tableau particulier. Typiquement, ces éléments sont des colonnes du tableau, mais il peut également s'agir des résultats de n'importe quelle expression MySQL. Nous reviendrons sur celles qui sont le plus utiles un peu plus loin de cette section. Cette requête renvoie le contenu des colonnes nom et ville du tableau les_clients :

    SELECT nom, ville FROM les_clients ;

Cette requête fournit le résultat suivant, en supposant que vous avez saisi les données du Listing 1, ainsi que les trois exemples qui sont montrés dans le premier chapitre, en cliquant ici et qui s'intitule "Jean_Pierre_INSERT.sql" sans oublier nos exemples.


Requete_SELECT_nom_ville_FROM_les_clients.png

Comme vous pouvez le constater, nous obtenons un tableau qui contient les éléments sélectionnés (nom et ville), à partir du tableau que nous avons spécifié, les_clients. Ces données sont issues de toutes les lignes du tableau les_clients.

Vous pouvez spécifier autant de colonnes que vous le souhaitez, en les mentionnant après le mot clé SELECT. Vous pouvez aussi spécifier d'autres éléments, comme le joker (*), qui symbolise toutes les colonnes du tableau spécifié. Par exemple, pour afficher toutes les colonnes et toutes les lignes du tableau les_articles_commandés, nous pouvons utiliser l'instruction suivante :

    SELECT * FROM les_articles_commandes ;

Cette commande renvoie la sortie suivante :


Requete_Tableau_des_Articles_Commandes.png

Récupérer des données avec des critères spécifiques :

Pour accéder à un sous-ensemble de lignes d'un tableau, nous devons spécifier plusieurs critères de sélection, à l'aide de la clause WHERE. Par exemple :

    SELECT * FROM les_commandes WHERE client_id = 5 ;

Sélectionne toutes les colonnes du tableau les_commandes et toutes les lignes dont le client_id vaut 5. Voici la sortie obtenue :


Requete_Sous_Ensemble_de_Lignes_Tableau.png

La clause WHERE spécifie les critères utilisés pour sélectionner les lignes. Dans notre exemple, nous avons sélectionné les lignes dont le client_id vaut 5. Le signe égale permet de tester l'égalité (vous remarquerez la différence avec le langage PHP). Les erreurs sont fréquentes lorsque vous les utilisez conjointement.

En plus du test d'égalité, MySQL supporte plusieurs opérateurs et expressions régulières, dont les plus courants sont présentés dans le Tableau 1. Notez bien qu'il ne s'agit pas d'une liste complète. En cas de besoin, reportez-vous au manuel du Net de MySQL.

Les trois dernières lignes de ce tableau font référence à LIKE, NOT LIKE et à REGEXP, qui effectuent des comparaisons de motifs.


Tableau 1. - Les opérateurs de comparaison utiles dans les clauses WHERE :
Opérateur Nom (si possible) Exemple Description
= égalité client_id = 5 Teste si deux valeurs sont égales.
> supérieur montant  >  60.00 Teste si une valeur est supérieure à une autre.
< inférieur montant  <  60.00 Teste si une valeur est inférieure à une autre.
>= supérieur ou égal montant  >=  60.00 Teste si une valeur est supérieure ou égale à une autre.
<= inférieur ou égal montant  <=  60.00 Teste si une valeur est inférieure ou égale à une autre.
! = ou <> différent de quantité ! = 0 Teste si deux valeurs sont différentes.
IS NOT NULL adresse IS NOT NULL Teste si un champ contient une valeur.
IS NULL adresse IS NULL Teste si un champ ne contient aucune valeur.
BETWEEN montant BETWEEN 0 AND 60.00 Teste si une valeur se trouve dans un intervalle spécifié.
IN Ville IN  ("Jean",  "Daniel") Teste si une valeur se trouve dans un ensemble spécifié.
NOT IN Ville NOT IN ("Jean", "Daniel") Teste si une valeur ne se trouve pas dans un ensemble spécifié.
LIKE comparaison de motif nom LIKE ("Pierre %") Teste si une valeur correspond à un motif spécifié.
NOT LIKE comparaison de motif nom NOT LIKE ("Pierre %") Teste si une valeur ne correspond pas à un motif spécifié.
REGEXP expression régulière nom REGEXP Teste si une valeur correspond à une expression régulière.

LIKE se sert de la comparaison de motif de SQL. Les motifs peuvent contenir du texte classique, plus les caractères  %  et   _ . %   remplace n'importe quelle chaîne de caractères, et  _  remplace n'importe quel caractère. Dans MySQL, ces motifs ne respectent pas la casse. Par exemple, 'Pierre %' correspond à n'importe quelle valeur commençant par 'Pierre'.

Le mot clé REGEXP est utilisé pour les comparaisons avec des expressions régulières. MySQL se sert des expressions régulières POSIX. Vous pouvez aussi vous servir de RLIKE à la place de REGEXP, qui en est un synonyme. Les expressions régulières sont également utilisées dans PHP (voir 4ème leçon, 1ère et 2ème partie).

Il est possible de tester plusieurs critères de cette manière, et de les associer avec AND et OR. Par exemple :

    SELECT * FROM les_commandes WHERE client_id = 4 OR client_id = 3 ;

Ce qui vous donne ceci :


Requete SELECT les commandes WHERE client_id = 4 OR client_id = 3 ;.png

Récupérer des données dans plusieurs tableaux :

Il arrive souvent que pour répondre à une question posée à la base de données, il faille récupérer des données dans plusieurs tableaux. Par exemple, si vous souhaitez connaître les clients qui ont passé des commandes au cours de ce mois-ci, vous devez examiner le tableau les_clients et le tableau les_commandes. Si vous souhaitez également savoir précisément ce qu'ils ont commandé, vous devez également examiner le tableau les_articles_commandés.

Ces éléments se trouvent dans différents tableaux puisqu'ils correspondent à des objets réels différents. C'est l'un des principes de conception que nous avons vus dans les leçons précédentes, cliquez ici si vous voulez revoir certaines leçons.

Pour rassembler ces informations avec SQL, vous devez effectuer une opération appelée "fusion". Cela revient simplement à réunir plusieurs tableaux, en fonction des relations qui existent entre leurs données. Par exemple, si nous souhaitons afficher les commandes effectuées par Michael-Pierre ROBERT, nous devons commencer par chercher le client_id de Michael-Pierre ROBERT dans le tableau les_clients, puis chercher les commandes correspondant à ce client_id dans le tableau les_commandes.

Bien que les opérations de fusion soient conceptuellement assez simples, il s'agit en fait d'une des parties les plus subtiles et les plus complexes de SQL. MySQL implémente plusieurs types de fusions différentes, destinées chacune à une utilisation particulière.

Fusion simple de deux tableaux :

Commençons par étudier le code SQL pour la requête dont nous venons de parler, à propos de Michael-Pierre ROBERT.

    SELECT les_commandes . commande_id, les_commandes . montant, les_commandes . date

    FROM les_clients, les_commandes

    WHERE les_clients . nom = 'Michael-Pierre ROBERT'

    AND les_clients . client_id = les_commandes . client_id ;

Le résultat de cette requête est le suivant :


requete SELECT les commandes commande_id.png

Nous pouvons remarquer plusieurs choses intéressantes.

Tout d'abord, comme il faut réunir les informations des deux tableaux pour répondre à cette requête, nous avons listé ces deux tableaux.

Nous avons également spécifié un type de fusion, même si nous ne le savons pas. La virgule entre les noms des tableaux est équivalente à INNER JOIN ou à CROSS JOIN. Il s'agit d'un type de fusion que l'on appelle parfois une "fusion complète", ou encore le "produit cartésien" des deux tableaux. Cela signifie littéralement : "A partir des tableaux spécifiés, faire un seul grand tableau, qui doit contenir une ligne pour chaque combinaison possible des lignes des tableaux spécifiés, que cela ait un sens ou non." En d'autres termes, nous obtenons un tableau contenant toutes les lignes du tableau les_clients associées à toutes les lignes du tableau les_commandes, quelles que soient les commandes effectuées par les clients.

Cette opération n'a pas beaucoup de sens dans la plupart des cas. En effet, on souhaite le plus souvent retenir uniquement les lignes qui ont un sens, c'est-à-dire, les commandes effectuées par un client associées à ce même client.

Pour obtenir ce résultat, il suffit d'ajouter une "condition de fusion" dans la clause WHERE, qui est une instruction conditionnelle spéciale. Dans notre cas, notre condition de fusion est la suivante :

    les_clients . client_id = les_commandes . client_id

En d'autres termes, comme ceci :

    SELECT les_commandes . commande_id, les_commandes . montant, les_commandes . date

    FROM les_clients, les_commandes

    WHERE les_clients . client_id = les_commandes . client_id

    AND les_clients . client_id = les_commandes . client_id ;

Ce qui donne un peu plus d'informations comme ci-après :


Requete_Condition_de_Fusion.png

Elle demande à MySQL de ne placer dans le tableau final que les lignes dont le client_id du tableau les_clients correspond au client_id du tableau les_commandes.

En ajoutant cette condition de fusion à notre requête, nous sommes passés à un autre type de fusion, appelée "fusion d'équivalence".

Vous avez également remarqué la notation avec le point, permettant de spécifier sans ambiguïté le tableau dont les colonnes proviennent, c'est-à-dire que les_clients . client_id fait référence à la colonne client_id du tableau les_clients, et les_commandes . client_id fait référence à la colonne client_id du tableau les_commandes.

Cette notation est nécessaire si le nom d'une colonne est ambigu, c'est-à-dire s'il apparaît dans plusieurs tableaux.

De plus, elle peut également être utilisée pour lever les ambiguïtés sur les noms des colonnes de plusieurs bases de données. Dans cet exemple, nous nous sommes servi de la notation tableau.colonne, mais il est aussi possible d'y ajouter la base de données (base_de_donnees.tableau.colonne), par exemple, pour tester une condition comme celle-ci :

    books.les_commandes.client_id = autre_db.les_commandes.client_id ;

Enfin, vous pouvez vous servir de cette notation pour toutes les références de colonnes dans une requête. C'est généralement une bonne idée, surtout lorsque vos requêtes deviennent un peu plus complexes. Ce n'est pas imposé par MySQL, mais cela facilite beaucoup la lisibilité et la maintenance de vos requêtes. Vous remarquerez que nous avons respecté cette convention dans le reste de la requête précédente, par exemple dans la condition :

    les_clients.nom = 'Michael-Pierre ROBERT' ;

La colonne nom se trouve uniquement dans le tableau les_clients, donc, on pourrait penser que cette notation est superflue, mais elle clarifie la syntaxe.

Fusion de plus de deux tableaux :

Cette opération n'est pas plus complexe que la fusion de deux tableaux. D'une manière générale, les tableaux doivent être fusionnés avec des conditions de fusion. Vous pouvez considérer que cela revient à respecter les relations qui existent entre les données des tableaux.

Par exemple, si nous souhaitons connaître les clients qui ont commandé des livres sur Electrotechnique pour les Professeurs (éventuellement pour pouvoir leur envoyer des informations sur un nouveau livre sur Electrotechnique pour les Professeurs), nous devons suivre ces relations dans plusieurs tableaux.

Nous devons commencer par repérer les clients qui ont passé au moins une commande contenant sur les_articles_commandés correspondant à un livre sur Electrotechnique pour les Professeurs. Pour passer du tableau les_clients au tableau les_commandes, nous pouvons nous servir du client_id, comme nous l'avons déjà fait. Pour passer du tableau les_commandes au tableau les_articles_commandés, nous pouvons utiliser commande_id. Pour obtenir dans le tableau les_articles_commandés un livre spécifique du tableau Books, nous pouvons nous servir du numéro ISBN. Après avoir établi toutes ces relations, nous pouvons chercher les livres dont le titre contient "Electrotechnique pour les Professeurs", et renvoyer les noms des clients qui ont acheté l'un de ces livres.

Voyons maintenant le code de cette requête :

    SELECT les_clients . nom

    FROM les_clients, les_commandes, les_articles_commandes, les_livres

    WHERE les_clients . client_id = les_commandes . client_id

    AND les_commandes . commande_id = les_articles_commandes . commande_id

    AND les_articles_commandes . isbn = les_livres . isbn

    AND les_livres . titre like "%Electrotechnique pour les Professeurs%" ;

Cette requête renvoie le résultat suivant :


Requete_pour_Trouver_le_Nom_du_Livre.png

Vous remarquerez que nous avons suivi les données dans quatre tableaux différents, et pour faire cela avec une fusion d'équivalence, nous avons besoin de trois conditions de fusion différentes. Comme il faut généralement une condition de fusion pour chaque paire de tableau que vous souhaitez fusionner, il y a au total une fusion de moins que le nombre de tableaux à fusionner. Cette règle est assez utile pour déboguer les requêtes qui ne fonctionnent pas. Vérifiez vos conditions de fusion et assurez-vous que vous respectez bien les enchaînements nécessaires.

Trouver les lignes qui ne correspondent pas :

Le principal autre type de fusion que l'on utilise dans MySQL est la fusion de suppression.

Dans les exemples précédents, seules les lignes vérifiant les conditions dans tous les tableaux étaient retenues. Il arrive cependant que l'on ait besoin des lignes qui ne correspondent pas à ces conditions, par exemple, pour rechercher les clients qui n'ont passé aucune commande, ou les livres qui n'ont jamais été achetés.

La méthode la plus simple pour répondre à ce type de question dans MySQL consiste à utiliser une fusion de suppression. Une fusion de suppression renvoie les lignes satisfaisant une condition de fusion spécifiée, entre deux tableaux. S'il n'y a aucune ligne correspondante dans le tableau, une ligne est ajoutée dans le tableau des résultats, contenant la valeur NULL dans la colonne appropriée.

Prenons un exemple :

    SELECT les_clients . client_id, les_clients . nom, les_commandes . commande_id

    FROM les_clients left join les_commandes

    ON les_clients . client_id = les_commandes . client_id ;

Cette requête SQL se sert d'une fusion de suppression pour fusionner les tableaux les_clients et les_commandes. Vous remarquerez que la fusion de suppression suit une syntaxe légèrement différente de celle de la condition de fusion : dans notre cas, la condition du fusion se trouve dans une clause ON spéciale de l'instruction SQL.

Voici le résultat de cette requête :


Les Clients n ont passe aucune Commande.png

Cette sortie montre qu'il existe aucune commande_id pour les clients Jean-Patrick BEESSE, Michaelle-Patricia CORGNO, Jennifer-Josiane LEDUC et Julie DUPONDRA, parce que les commande_id de ces clients valent NULL.

Si nous souhaitons trouver les clients qui n'ont passé aucune commande, il suffit de chercher ces valeurs NULL dans le champ de la clé primaire du tableau correspondant (dans ce cas commande_id), puisque ce champ ne devrait pas être NULL :

    SELECT les_clients . client_id, les_clients . nom

    FROM les_clients LEFT JOIN les_commandes

    USING (client_id)

    WHERE les_commandes . commande_id IS NULL ;

Et voici le résultat obtenu :


Les Clients n ont passe aucune Commande_2.png

Vous remarquerez également que nous nous sommes servi d'une syntaxe différente pour la condition de fusion dans cet exemple. Les fusions de suppression supportent soit la syntaxe ON que nous avons utilisée dans le premier exemple, soit la syntaxe USING du second exemple. La syntaxe USING ne spécifie pas le tableau d'où provient l'attribut de fusion, cest pourquoi les colonnes des deux tableaux doivent posséder le même nom si vous voulez utiliser USING.

Utiliser d'autres noms pour les tableaux - les alias :

Il est souvent pratique, voire essentiel, de pouvoir faire référence aux tableaux avec d'autres noms, que l'on appelle des "alias". Vous pouvez les créer au début d'une requête, et les utiliser dans tout le reste de cette requête. Ils permettent souvent de simplifier la saisie des noms des tableaux. Considérons la grosse requête que nous venons de voir, récrite avec des alias :

    SELECT c . nom

    FROM les_clients as c, les_commandes as o, les_articles_commandes as oi, les_livres as b

    WHERE c . client_id = o . client_id

    AND o . commande_id = oi . commande_id

    AND oi . isbn = b . isbn

    AND b . titre LIKE '%Electrotechnique pour les Professeurs%'

Et voici le résultat obtenu :


Alias.png

Lorsque nous déclarons les tableaux que nous allons utiliser, nous ajoutons une clause AS pour déclarer l'alias d'un tableau. Il est également possible de définir des alias pour des colonnes, mais nous y reviendrons lorsque nous verrons les fonctions d'agrégation.

Il faut passer par les alias pour fusionner un tableau avec lui-même. Cela a l'air plus difficile et plus étrange que cela ne l'est en réalité. Cette approche peut être utile, si, par exemple, nous voulons trouver dans un tableau les lignes qui possèdent des valeurs en commun. Ainsi, pour trouver les clients qui habitent dans la même ville (éventuellement pour diffuser des publicités par exemple), nous pouvons affecter deux alias au même tableau (les_clients) :

    SELECT c1 . nom, c2 . nom, c1 . ville

    FROM les_clients AS c1, les_clients AS c2

    WHERE c1 . ville = c2 . ville

    AND c1 . nom != c2 . nom ;

Dans cette requête, nous faisons comme si le tableau les_clients était en fait deux tableaux différents, c1 et c2, et nous effectuons une fusion sur la colonne ville. Vous remarquerez que nous avons également besoin de la deuxième condition, c1 . nom != c2 . nom, pour éviter que chaque client ne soit détecté.

Résumé des fusions :

Les différents types de fusions sont résumés dans le Tableau 2. Il en existe quelques autres, mais ce tableau rassemble les fonctions que vous utiliserez le plus souvent.


Tableau 2. - Les types de fusions dans MySQL :
Nom Description
Produit cartésien Toutes les combinaisons de toutes les lignes des tableaux à fusionner. Ce type de fusion est choisi en spécifiant une virgule entre les noms des tableaux, et en ne spécifiant aucune clause WHERE.
Fusion complète Comme ci-dessus.
Fusion croisée Comme ci-dessus. Peut également être utilisé en spécifiant les mots clés CROSS JOIN entre les noms des tableaux à fusionner.
Fusion interne Sémantiquement équivalent à la virgule. Peut également être spécifié à l'aide des mots-clés INNER JOIN. Sans condition WHERE, équivalent à une fusion complète. Généralement, vous spécifierez donc une condition WHERE pour en faire une fusion interne.
Fusion d'équivalence Utilise une expression conditionnelle avec un = pour associer les lignes des différents tableaux de la fusion. Dans SQL, c'est une fusion avec une clause WHERE.
Fusion de suppression Tente d'associer des lignes provenant des tableaux spécifiés, et remplit les lignes ne correspondant pas avec les valeurs NULL. Utilisé dans SQL avec des mots clés LEFT JOIN. Permet de trouver des valeurs manquantes. Vous pouvez utiliser de la même manière RIGHT JOIN.

Nous terminons ainsi ce deuxième chapitre (2ème partie de cette leçon) et nous verrons dans le prochain, l'usage pour Récupérer les Données dans un Ordre Particulier, Groupement et Agrégation des données, choisir les lignes à renvoyer, Mise à jour des enregistrements de la base de données et enfin, les Modifications des Tableaux après leur Création et Suppression des enregistrements dans la Base de Données.










Nombre de pages vues, à partir de cette date : le 23 MAI 2019

compteur de visite

    




Envoyez un courrier électronique à Administrateur Web Société pour toute question ou remarque concernant ce site Web. 

Version du site : 10. 5. 14 - Site optimisation 1280 x 1024 pixels - Faculté de Nanterre - Dernière modification : 19 MAI 2019.   

Ce site Web a été Créé le, 14 Mars 1999 et ayant Rénové, en MAI 2019.