# SPARQL Protocol and RDF Query Language/Travail pratique/Initiation à MySQL
## Pourquoi installer MySQL ?

Dans ce TP, nous allons installer MySQL dans notre serveur Web. Ce logiciel permet de créer des bases de données SQL. Cela nous sera utile pour comparer nos exemples de programmes entre SPARQL et SQL.

## À savoir avant de commencer
### Que fait MySQL ?

C'est un logiciel qui stocke des données d'autres applications Web ou non.
Les applications ont comme contrainte d’utiliser le langage SQL pour lire ou pour enregistrer des données en passant par le protocole de la base de données utilisée.
Ces protocoles sont indolores (et même invisibles) pour les développeurs qui développent avec une base de données sous leur contrôle. Mais, dès lors qu’il y a partage de données entre services différents, les choses se compliquent et c’est là que SPARQL règle les problèmes. Ceci est une autre histoire, pour le moment nous installons MySQL pour illustrer nos exemples SPARQL et nous ne configurons pas PHPMyAdmin dans ce TP, car SQL n’est pas le sujet principal des TP.

### Que fait PHPmyAdmin ?

Il vous faut avoir fait le TP précédent pour avoir un serveur Web avec PHP.
MySQL n'a pas besoin d'un serveur web pour fonctionner mais nous allons utiliser le logiciel PHPmyAdmin pour l'administrer à distance. PHPmyAdmin est une interface de gestion de MySQL écrit en PHP qui a donc besoin du serveur que nous avons installé.

### Documentations
#### Cours sur SQL

Les cours sur SQL dans Wikiversité sont déjà bien avancés, lisez-les si vous en avez le temps. Les TP ne feront que survoler les concepts de base.

#### Le site officiel de PHP

Le site officiel de PHP est extrêmement bien fait. La documentation PHP/MySQL est accessible depuis l'URL : http://php.net
N'oubliez pas de consulter les commentaires utilisateurs, car de très nombreux commentaires donnent des conseils très utiles. La documentation complète de PHP est disponible en français à l’adresse : http://www.php.net/manual/fr/

## Installation de MySQL

Nous commençons par installer les paquets :
* mysql-server pour installer le serveur MySQL
* php5-mysql pour les outils de communication entre PHP5 et MySQL
* phpmyadmin pour l'outil d'administration à distance de MySQL
Suivre les instructions suivantes : 1. Taper ces commandes Sous Ubuntu
Sous Fedora ou CentOS
2. MySQL vous demandera le mot de passe de l’utilisateur root du serveur MySQL (à conserver).
3. PHPMyAdmin va vous demander :
* « Où installer le serveur HTTP ? » Choisir Apache.
* « Voulez-vous configurer PHPMyAdmin ? » Choisir Oui.
* « Indiquez le mot de passe root du serveur MySQL. » Indiquer le mot de passe que vous avez indiqué pour MySQL.

## Configuration du serveur

1. Configuration du mot de passe : Sous Ubuntu (à vérifier)
Sous Fedora ou CentOS
2. Activation du service : Sous Ubuntu(à retrouver)
Sous Fedora ou CentOS
4. Recharger la configuration sur service apache2 :
Sous Ubuntu
Sous Fedora ou CentOS
5. Tester l’accès au service PhpMyadmin :
PhpMyAdmin vous demande un login et un mot de passe :
* root
* votre mot de passe root mysql
En production, il vaut mieux activer, en cas de besoin, le service HTTP PHPMyAdmin et le désactiver ensuite.
Pour l'activer :
Pour le désactiver :
Pour plus d'info pour Fedora ou CentOS : http://doc.fedora-fr.org/wiki/Installation_et_configuration_de_MySQL#Installation_et_configuration_de_MySQL
Exercice avec Docker : Créer une image Docker avec les TP précédents avec MariaDb, PHPMyAdmin avec sur la page Web par défaut un lien permettant d'ouvrir PHPMyAdmin sans mot de passe.

## Ma première base de données

Pour nos futurs TP nous allons utiliser la base de données que nous allons fabriquer. Nous allons enregistrer des CVs dans notre base de données MySQL.

### La base de données

Pour commencer, lisez l’introduction de la leçon sur SQL de Wikiversité.
À faire avant de poursuivre : : créer la base de données moncv avec l'interface PHPMyAdmin. Nous considérons que, dans les prochaines étapes, vous aurez sous les yeux l'interface d'administration de votre base de données moncv.

### Les tables

Il nous faut 2 tables :
* une table pour enregistrer la liste des CVs
* une autre table pour enregistrer toutes les Experiences de tous les CVs
Nous n'utiliserons pour nos exemples que 4 types de données :
* INT : nombre entier
* VARCHAR : chaîne de caractères dont le nombre varie avec un maximum défini
* DATE : une date (qui prend cette forme YYYY-MM-DD)
* BOOLEAN : 0 (faux) ou 1 (vrai)
Nous utiliserons l'outil d'auto-incrémentation (AI) qui nous permettra d’auto-incrémenter les identifiants des objets dans la base de données.
Exercice : Créer avec PhpMyAdmin les deux tables suivantes.
Le "Storage Engine" des tables doit être InnoDB. Ce détail vous sera demandé dans le formulaire de création des tables.
Table 1 : CVs
| Nom du champ | Type | Auto-incrémenté | Taille/longueur |
| ID | INT | AI | |
| nom | VARCHAR | | 25 |
| prenom | VARCHAR | | 25 |
| adresse | VARCHAR | | 50 |
| code_postal | INT | | |
| ville | VARCHAR | | 25 |
| telephone | VARCHAR | | 25 |
Table 2 : Experiences
| Nom du champ | Type | Auto-incrémenté | Taille/longueur |
| ID | INT | AI | |
| ID_CV | INT | | |
| date_debut | DATE | | |
| date_fin | DATE | | |
| poste | VARCHAR | | 50 |
| societe | VARCHAR | | 25 |
| description | VARCHAR | | 200 |
| mots_cles | VARCHAR | | 100 |
| poste_actuel | BOOLEAN | | |
Voici, pour information, le code SQL que PhpMyAdmin vous a évité d'écrire vous-même :

### Contrainte d'intégrité

La seule façon certaine de distinguer deux CVs est la comparaison de leur ID (identification data), car il peut exister deux CVs de la même personne. Pour convoquer un enregistrement, ou un morceau d'enregistrement, on passera donc toujours par l'ID. Chaque enregistrement a généralement un ID que l’on nomme clé d'enregistrement.
La table Experiences, elle aussi, a une clé, mais elle utilise aussi la clé d'une autre table. On appelle cette autre clé « une clé étrangère ».
Une clé étrangère peut être contrôlée dans MySQL. Cela évite de créer des clés étrangères qui ne pointent sur aucun enregistrement et cela évite de supprimer des enregistrements dans d'autres tables car leurs clés sont encore utilisées.
Étape 1 : il faut faire du champ ID_CV un index, car un index optimise le traitement sur cette colonne et c’est indispensable pour en faire une clé étrangère.
* Cliquer sur le nom de la table "Experiences" dans la colonne de gauche. La structure de la table s'affiche.
* Cocher la ligne ID_CV
* Cliquer sur l’icône Index en bas du tableau de la structure (l'icône contient un éclair, passer le curseur de votre souris dessus pour afficher la signification des icônes).
Étape 2 : Indiquer qu'ID_CV contiendra une clé étrangère.
* Cliquer sur le nom de la table "Experiences" dans la colonne de gauche. La structure de la table s'affiche.
* Cliquer sur le lien Relation view
* Sur la ligne ID_CV dans la colonne "Foreign Key", sélectionner dans la liste moncv.CVs.ID
* Sauver.
C'était un tout petit aperçu pour commencer à contrôler l'intégrité d'une base de données.

## Enregistrer des données

Nous allons insérer 2 CVs à la main à travers les formulaires de PhpMyAdmin.
Exercice: Insertion de deux CVs
* À gauche, dans votre arborescence, sélectionnez la table CVs.
* Vous devez voir la structure de votre table qui s'affiche sous la forme d'un tableau. Cliquez sur 'Insert' (insérer) dans le menu du haut.
* Par défaut, PHPMyAdmin vous affiche un formulaire d'insertion avec deux entrées.
** Laissez toujours le champ ID vide. Il se remplit automatiquement.
** Et remplissez les autres champs.
* Sauvegardez et notez les ID des CVs (normalement : 1 et 2).
Voici, pour information, ce que PhpMyAdmin vous a évité d'écrire en SQL :
Exercice: Insertion des expériences associées à nos 2 CVs.
* Ouvrir le formulaire pour insérer des données dans la table Experiences
* Remplir tous les champs, sauf ID
* ID_CV doit correspondre à un ID d'un CV existant dans la table CVs (PHPMyAdmin vous aide en vous proposant uniquement des ID CVs qui existent).
* Attention : le champ poste_actuel ne peut prendre qu'un chiffre : 1 ou 0.
* Sauvegarder.
Recommencer l'opération une ou deux fois.
Voici, pour information, ce que PhpMyAdmin vous a évité d'écrire en SQL :
La base de données SQL est maintenant configurée pour faire les TP suivants.

## Exemples de requêtes

À faire avant les exercices :
* Créer la base de données moncv et insérer quelques CVs comme décrit dans le TP.
* Lire la partie du cours sur SQL dans Wikiversité : La requête la plus simple ?
Exercice 1 : Écrire la requête SQL qui récupère le numéro de téléphone du CV ayant l'ID = 2.
La requête sera la suivante : Sélectionne le champ telephone dans la table CVs qui correspond à l'ID 2 :
Exercice 2 : Écrire la requête SQL qui récupère toutes les adresses des personnes qui portent le prénom Michel.
Voici la requête qui récupère toutes les adresses des personnes qui portent le prénom Michel :
| Initiation à PHP | Initiation à PHPUnit |