Exercices
Questions à choix multiple

Leçon N° 15 : Mysql 2ième partie : liaisons entre tables

Introduction
L'instruction SELECT avec une seule table
Jointure simple : SELECT avec deux tables
Jointure gauche
Modification d'une table existante
Un moteur de recherche
Notes de page

Introduction _ Rappels

Exemple
Une liste de livre avec leur Auteur
TitresAuteursNB_Pages
Les dix petits negres Agata Christie 254
Champolion l'Egyptien Christian Jacq 389
La femme sage Christian Jacq 439
La cinquième montagne Paulo Coelho 297
Le démon et Mademoise Paulo Coelho 332
L'ile mystèrieuse Jules Verne 642
Les Confessions Jean-Jacques Rousseau589
Lettres Madame de Sévigné 432
Le mystère de la chambre jaune 432

Dans une base de données relationnelle, ces informations devront figurer dans deux tables différentes, une table pour les titres, une table pour les auteurs :
Table des titres
TitresCLE_
auteur
Nb_
pages
Les dix petits negres 1 254
Champolion l'Egyptien 2 389
La femme sage 2 439
La cinquième montagne 3 297
Le démon et Mademoise 3 332
L'ile mystèrieuse 4 642
Les Confessions 5 589
Lettres 6 432
Le mystère de la chambre jaune 412
Table des auteurs
CLE_
auteur
Auteurs
1 Agata Christie
2 Christian Jacq
3 Paulo Coelho
4 Jules Verne
5 Jean-Jacques Rousseau
6 Madame de Sévigné
Création des tables titre et auteur
Nom du fichier : exercises_15/lesson_15_a_create_two_tables.php

L'instruction SELECT

Syntaxe conprenenant seulement les termes les plus courants, pour une description plus détaillée, se referrer à la documentation officielle. Les termes décrits ci-après, s'ils sont entre crochets, sont facultatifs, mais s'ils sont utilisés, ils doivent l'être dans l'ordre indiqué ci-après
SELECT [DISTINCT | DISTINCTROW | ALL]
Les options DISTINCT , DISTINCTROW et ALL indiquent si les enregistrements avec doublons doivent être retournés. Par défaut (ALL), tous les enregistrements sont retournés. DISTINCT et DISTINCTROW (synonymes) et indiquent résultat devra être sans doublons.
SELECT_expression,...
La liste des champs devant être retournés, * si tous les champs, an cas de plusieurs tables, ON pourra ecrire nom_de_table.nom_de_champ. On peut aussi effectuer des opérations sur les champs à l'aide des opérateurs courrants ou des mots-clés SIUM, COUNT,... Le mot-clé AS permet de donnér un nom au champ calculé ou de redonner un nom à un champ
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
Par défaut, sortie à l'écran, mais ON peut aussi spécifier un fichier sur le serveur uniquement.
[FROM table_references
Liste des tables à partir desquelles devront être extraites les données
[WHERE where_definition]
Critére pour l'extraction des données :voir exemple ci-après
[GROUP BY {unsigned_integer | nom_de_colonne | formula} [ASC | DESC], ...]
Pour effectuer des groupements en sortie
[HAVING where_definition]
Critère sur les groupements
[ORDER BY {unsigned_integer | nom_de_colonne | formula} [ASC | DESC] ,...]
Ordre des colonnes de sortie
[LIMIT [offset,] rows]
Si l'on ne veut seulement un échantillon en sortie
Exemples
<?
$result = mysql_query("SELECT * FROM auteurs ORDER BY titre"); //Renvoie toutes les données de la table auteurs claasés par titre
$result = mysql_query("SELECT auteur FROM auteurs WHERE auteur LIKE 'A%'"); //Renvoie les noms d'auteur commençant par A
$result = mysql_query("SELECT COUNT(auteur) FROM auteurs"); //Compte le nombre d'auteurs différents
?>
Lecture d'une table avec SELECT
Nom du fichier : exercises_15/lesson_15_b_select_one_table.php

L'instruction SELECT avec deux tables : jointure simple


Lecture de deux tables avec SELECT
Nom du fichier : exercises_15/lesson_15_c_select_two_tables_1.php
Lecture de deux tables avec SELECT (**)
Nom du fichier : exercises_15/lesson_15_f.php

Jointure gauche : Obtenir tous les enregistrelments de l'une des tables

Lecture de deux tables avec SELECT et jointure gauche
Nom du fichier : exercises_15/lesson_15_d_select_two_tables_2.php

Modification d'une table existante

ALTER [IGNORE] TABLE nom_de_table alter_spec [, alter_spec ...]
alter_specification:
ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
ou ADD [COLUMN] (create_definition, create_definition,...)
ou ADD INDEX [nom_d_index] (index_nom_de_colonne,...)
ou ADD PRIMARY KEY (index_nom_de_colonne,...)
ou ADD UNIQUE [nom_d_index] (index_nom_de_colonne,...)
ou ADD FULLTEXT [nom_d_index] (index_nom_de_colonne,...)
ou ADD [CONSTRAINT symbol] FOREIGN KEY nom_d_index (index_nom_de_colonne,...)
[reference_definition]
ou ALTER [COLUMN] nom_de_colonne {SET DEFAULT literal | DROP DEFAULT}
ou CHANGE [COLUMN] old_nom_de_colonne create_definition
ou MODIFY [COLUMN] create_definition
ou DROP [COLUMN] nom_de_colonne
ou DROP PRIMARY KEY
ou DROP INDEX nom_d_index
ou RENAME [TO] new_nom_de_table
ou ORDER BY col
ou options_de_table.
ALTER TABLE permet de changer la structure d'une table pré-existante.
Par exemple, vous pouvez ajouter ou effacer des colonnes, créer ou détruire des index, modifier le type d'une colonne ou renommer la table elle-même. Vous pouvez aussi changer les commentaires et le type de la table.
Exemples :
<?
$result = MYSQL_QUERY("ALTER TABLE titres ADD COLUMN titre_format CHAR(12)"); Rajouter une comonne
$result = MYSQL_QUERY("ALTER TABLE titres RENAME TO new_nom_de_table"); Renommer le table
$result = MYSQL_QUERY("ALTER TABLE titres CHANGE COLUMN nb_pages nombre_de_pages int"); Modifier une colonne
$result = MYSQL_QUERY("ALTER TABLE titres ADD INDEX nom_d_index (nombre_de_pages)"); Rajouter un index
$result = MYSQL_QUERY("ALTER TABLE titres ADD FULLTEXT nom_index (titre)"); Rajouter une comonne
?>
Modifier une table avec ALTER TABLE : rajouter un champ
Nom du fichier : exercises_15/lesson_15_e_alter_table.php
Modifier une table avec ALTER TABLE : supprimer un champ
Nom du fichier : exercises_15/lesson_15_e_alter_table.php

Recherche simultanée dans plusieurs champs d'une table

Les versions récentes de mysql (4 et plus) implémentent de nouvelles instructions très pratiques pour réaliser un moteur de recherche permettant la recherche de texte simultanément dans plusieurs champs d'une table.
Principe :
  1. Création de la table :
    On utilise le mot-clé "FULLTEXT" suivi de tous les champs sur lesquels la recherche va s'appliquer :
    <?
    CREATE TABLE maTable (
    champ1_id int(10) NOT NULL auto_increment,
    champ2 varchar(15) NOT NULL,
    champ3 text,
    champ4 char(15) NOT NULL,
    .................
    PRIMARY KEY (champ1_id),
    FULLTEXT (champ2, champ3, champ4,... ));
  2. Utilisation :
    On utilise les mots clés "MATCH (liste des champs)" et "AGAINST(critère de recherche)" de la façon suivante :
    <?
    select * from maTable
    WHERE MATCH (champ2, champ3, champ4,... ) AGAINST ('$recherche_texte') ) ;
Attention : par défaut, le mot recherche doit avoir plus de trois lettres ! (variable mysql : ft_min_word_len )
Si l'on veut changer cette valeur, sous windows, il faut modifier le my.ini (par défaut dans le répertoire windows) de la façon suivante (pour la passer à trois par exemple, rajouter une ligne dans le paragraphe [mysqld]):
[mysqld]
ft_min_word_len = 3
Note 1 : il faut à ce moment-là bien sur reconstruire les index !
Note 2 : de nombreuses autres options sont paramétrables : longueur max, opérateurs permis...voir la documentation officielle

Création d'une table avec champ fulltext
Nom du fichier : exercises_15/lesson_15_g0_create_table_departements.php

Attention, pour l'exercice suivant, créer d'abord la table avec l'index adéquat ; Créer d'abord la table
Rechercher un texte dans les champs d'une table
Nom du fichier : exercises_15/lesson_15_g1_fulltext.php

Tous droits réservés. 2005-2008