Академический Документы
Профессиональный Документы
Культура Документы
T. Lecroq
LITIS EA 4108
Batiment Extension Biologie - 1er étage
Thierry.Lecroq@univ-rouen.fr
Cours rédigé par L. Mouchard
Année 2008–2009
Cours
I concepts génériques des bases de données ;
I bases du langage structuré de requêtes SQL ;
Travaux dirigés (apprentissage du langage SQL)
I descriptif approfondi des fonctions SQL ;
I exercices de conception de bases de données ;
I normalisation des relations et construction des tables ;
I construction des requêtes SQL.
Travaux pratiques (pratique du langage SQL)
I mise en pratique des TD sous MySQL ;
I requêtes et vérifications sous phpMyAdmin ;
I réalisation pratique d’une base de données (( grandeur nature )).
Parce que :
les données sont séparées (chaque entité est représentée par une table
indépendante des autres données) et donc réutilisables ;
les données sont spécifiées : les (( attributs )) d’une entité sont connus
et contraints ;
les données sont sécurisées : les transactions concurrentes sur les
données sont efficacement gérées ;
les mécanismes d’importation/exportation des données existent et
permettent d’alimenter efficacement les tables ;
les mécanismes génériques d’interrogation des données sont déjà
développés, le temps de développement d’une application est par
conséquent réduit ;
possibilités d’interfaçage www...
client
1. émission 2. réception
requête requête requête
internet 3. traitement
5. réception 4. émission
réponse réponse réponse
client : Le client peut interroger le serveur en utilisant :
I un langage de requêtes structuré (compatible avec la norme ANSI SQL)
I un langage de programmation classique doublé d’un connecteur
spécifique (DBC : DataBase Connectivity) : ODBC pour le langage C,
JDBC pour Java et équivalents pour les langages C++, Delphi, Perl,
Python, TCL, ...
Le client peut être installé sur tout type de système d’exploitation
(Windows, Mac OS, Linux, OS/2, ...), il interagit le plus souvent avec
le serveur au travers d’un mécanisme réseau.
conceptuel entités/relations
interne index/optimisation
physique fichiers/répertoires
Nous allons concevoir une petite base de données toute simple. Elle va
contenir les noms, prénoms et filières des étudiants inscrits pour cette
option. Elle consiste en une seule table, que nous nommerons etudiant,
qui contient quatre attributs typés :
le prénom : une chaı̂ne de caractères d’au plus 30 lettres ;
le nom : une chaı̂ne de caractères d’au plus 30 lettres ;
la qualité : au choix ’Melle’,’Mme ou ’M.’ ;
la filière : une chaı̂ne de caractères de 6 caractères ;
etudiant
nom VARCHAR (30)
prenom VARCHAR (30)
qualite ENUM (’Melle’,’Mme’,’M.’)
filiere VARCHAR (6)
Certains champs ici (champs Key et Extra) ne sont pas utilisées pour
l’instant, le reste est compréhensible.
Pour vérifier que les éléments ont bien été ajoutés à la table, il nous faut
affiche le contenu de cette table :
Syntaxe : select liste attributs from nom table ;
select * from etudiant ; (affichage de tous les attributs)
5 Association 1,n
Table filiere
Clé primaire
Peuplement
Nouvelle table etudiant
Clé étrangère
Requête conjointe
6 Association n, n
Table cours
Table etu cou
Peuplement
Requête conjointe
5 Association 1,n
Table filiere
Clé primaire
Peuplement
Nouvelle table etudiant
Clé étrangère
Requête conjointe
6 Association n, n
Table cours
Table etu cou
Peuplement
Requête conjointe
En fait, on s’aperçoit bien vite que le code (sur six caractères) de la filière
n’est pas explicite, et que l’on souhaiterait avoir, pour chaque étudiant
plus d’informations sur la filière dans laquelle il est inscrit. Nous allons
créer une entité spécifique, nommée filière regroupant les informations qui
lui sont associées, nous établirons ensuite une association entre ces deux
entités. L’entité filière sera représentée par une table filiere contenant :
le code : une chaı̂ne de caractères de 8 caractères (celui que l’on
trouve dans la table etudiant pour l’instant) ;
l’intitulé complet : une chaı̂ne de caractères (< 40 lettres) ;
le parcours : licence, master ou doctorat codé sur un caractère ;
l’année : un entier sur un chiffre ;
On peut noter la colonne Key et Extra où fil id est indiqué comme pri et
auto increment
insert into filiere(fil code, fil intitule, fil parcours, fil annee)
values(’SVA331’,’Biochimie et Biologie Moléculaire’,’l’,3),
(’SVA332’,’Biologie Cellulaire et Physiologie’,’l’,3),
(’SVA333’,’Sciences de Vie et de la Terre’,’l’,3),
(’SVA334’,’Écologie et Biologie des Organismes’,’l’,2),
(’SVA335’,’Écologie et Biologie des Organes’,’l’,3)) ;
Nous avons entré les attributs fil code, fil intitule, fil parcours et fil annee
mais pas l’attribut fil id, qui rappelons-le est auto increment et not
null. Cela veut dire que le système va attribuer une valeur si elle n’est
pas fournie, pour la première entrée, ce sera 1, puis cette valeur sera
auto-incrémentée pour chaque nouvelle entrée.
Essayons d’ajouter une ligne avec une clé primaire déjà attribuée :
insert into filiere values(3,’SVA331’,’Filière imaginaire’,’l’,1) ;
error 1062 : Duplicate entry ’3’ for key 1
L’entrée 3 ne peut être utilisée deux fois (déjà attribuée).
le mot clé foreign key indique que cet attribut est la clé primaire
d’une autre table ;
le mot clé references, suivi d’un nom de table (ici filiere), va
préciser à quelle table appartient la clé étrangère ;
le nom d’attribut entre parenthèses (ici fil id) indique le nom de la clé
primaire tel qu’il est connu dans la table l’hébergeant.
5 Association 1,n
Table filiere
Clé primaire
Peuplement
Nouvelle table etudiant
Clé étrangère
Requête conjointe
6 Association n, n
Table cours
Table etu cou
Peuplement
Requête conjointe
Nous allons à présent créer une table cours dans laquelle seront stockées
toutes les informations relatives aux cours. Elle contiendra au minimum les
attributs suivants :
Nous allons à présent créer une table etu cou dans laquelle seront stockées
les deux clés étrangères :
Nous allons ajouter par la suite des attributs : les numéros du groupe de
TD et de TP par exemple
etu id cou id
1 1
1 2
1 3
2 1
2 2
3 1
4 1
5 3
8 HTML
Paragraphes
Entêtes
Caractères
Listes
Tableaux
image
Hyperlien
8 HTML
Paragraphes
Entêtes
Caractères
Listes
Tableaux
image
Hyperlien
Navigateur web
Programme
HTML PHP, Python, Perl
Récupération de la
Page web de saisie Récupération Envoi de
requête SQL
des paramètres la requête SQL Exécution de la
Construction de la requête SQL
requête SQL
Base de
Réseau
Données
Récupération du
résultat de la Résultat de la
requête SQL Envoi du requête SQL
résultat de la
Construction de la requête SQL
Page web de résultat page web de résultat
serveur SGBD
serveur web
PHP n’est pas le seul langage permettant de faire le lien entre la page web
et le SGBD :
Python est une alternative extrémement intéressante, c’est un langage
facile à apprendre, puissant et extensible : il dispose d’un module
permettant l’interrogation d’un SGBD distant (il est étudié en
deuxième année de licence du parcours Biologie) ;
Perl est très utilisé, il dispose d’un ensemble de modules pour
l’interrogation d’un SGBD distant et la construction de pages HTML ;
ces deux langages possédent de nombreuses fonctionnalités pour le
traitement de données, des mécanismes souples de gestion de listes,
particulièrement utiles pour traiter les résultats d’une requête SQL ;
plus généralement, les langages qui s’appuient sur la CGI (Common
Gateway Interface)
Quelques langages à balises : SGML (Std Generalized Markup Language, depuis les
années 1960), XML (eXtensible Markup Language, 1998), TEXet LATEX 2ε , ...
Chaque langage dispose de ses propres balises, ainsi parfois que de
mécanismes permettant d’en définir de nouvelles.
8 HTML
Paragraphes
Entêtes
Caractères
Listes
Tableaux
image
Hyperlien
<html>
<head>
<title>Mon titre</title>
</head>
<body>
<center>Mon texte centré</center>
</body>
</html>
<title>Mon titre</title>
le titre qui apparaı̂tra sur la barre de titre ;
<meta name=author content="Thierry Lecroq">
le nom de l’auteur de la page ;
meta http-equiv="content-type" content="text/html;charset=iso-8859-15">
l’encodage utilisé (caractères accentués avec ¿ par exemple) ;
<link rel="stylesheet" href="ficstyle.css">
l’utilisation d’un fichier de style (fonctionnalité non présentée dans ce
cours).
C’est cette partie du fichier HTML qui va être affichée par votre
navigateur. Elle contient des balises pour :
les paragraphes ;
les entêtes (titres) ;
les listes ;
la construction de tableaux ;
la gestion des images ;
la création de liens vers d’autres documents ;
la mise en place de formulaires ;
...
un paragraphe est balisé par <p>, et est par défaut justifié à gauche ;
une rupture de paragraphe (passage à la ligne) est balisé par <br/> ;
pour modifier ce comportement, il faut ajouter un attribut à la balise
<p> comme ci-dessous :
<h1>Ent^
ete de niveau 1</h1>
<h2>Ent^
ete de niveau 2</h2>
<h2 align="center">Ent^
ete centrée de niveau 2</h2>
<h3>Ent^
ete de niveau 3</h3>
<h4>Ent^
ete de niveau 4</h4>
<h4>Ent^
ete de niveau 4 justifiée à droite</h4>
<h5>Ent^
ete de niveau 5</h5>
<h6>Ent^
ete de niveau 6</h6>
<ul>
<li>HTML</li>
<li>PHP</li>
<li>MySQL</li>
</ul>
<ol>
<li>HTML</li>
<li>PHP</li>
<li>MySQL</li>
</ol>
<dl>
<dt>HTML </dt>
<dd>langage...</dd>
<dt>PHP </dt>
<dd>langage...</dd>
<dt>MySQL</dt>
<dd>système...</dd>
</dl>
<dl>
<dd>HTML</dd>
<dd>langage...</dd>
<dd>PHP</dd>
<dd>langage...</dd>
<dd>MySQL</dd>
<dd>système...</dd>
</dl>
<table border=1>
<tr>
<td rowspan=2 valign="center">gauche</td>
<td>haut droite</td>
</tr>
<tr>
<td>bas droite</td>
</tr>
</table>
<br/>
<table border=1>
<tr>
<td background="chutes_niagara.jpg">
un petit texte pour la<br/>
cellule avec image<br/>
pas très lisible n’est-ce pas ?</td>
<td>rien d’autre</td>
</tr>
</table>
<br/>
<a href="Cours/Ba_Do/index.html">
Lien
</a>
vers les pages de cours.
<br/>
Un lien vers
<a href="mailto:Thierry.Lecroq@univ-rouen.fr">
mon mél
</a>
<br/>
Construction de la
Page web de résultat page web de résultat
serveur web
<html>
<head>
<title>deuxième exemple de
programme PHP</title>
</head>
<body>
<center>
<?php
$texte = "marie delabio";
print(strtoupper($texte));
?>
</center>
</body>
</html>
<html>
<head>
<title>Action pour l’entrée texte</title>
</head>
<body>
<?php
$nom = $_GET[’nom’] ;
print("Vous vous appelez : $nom");
?>
</body>
</html>
<html>
<head>
<title>Action pour l’entrée radio</title>
</head>
<body>
<?php
$filiere = $_GET[’filiere’] ;
print("Vous avez sélectionné
la filière suivante : $filiere");
?>
</body>
</html>
<html>
<head>
<title>Action pour l’entrée checkbox</title>
</head>
<body>
Liste des cours auxquels vous vous
êtes inscrit : <br/>
<table>
<?php
$cours = $_POST[’cours’];
$couleur="#ffffff";
for ($i=0;$i<count($cours);$i++)
{
if ( $couleur == "#ffffff" )
$couleur="#dddddd";
else
$couleur="#ffffff";
print("<tr bgcolor=\"$couleur\">");
print("<td>$cours[$i]</td></tr>\n");
}
?>
</table>
</body>
</html>
<html>
<head>
<title>Action pour le menu select</title>
</head>
<body>
<?php
$couleur = $_GET[’couleur’] ;
print("Votre couleur sélectionnée est : ");
print("$couleur\n");
?>
</body>
</html>
→ $resultat=mysql_list_dbs($connexion);
$resultat va recevoir la liste des bases de données, il y aura dans $resultat autant de lignes que de
bases de données gérées par le SGBD
→ $nbre_bases=mysql_num_rows($resultat);
$nbre_bases va recevoir le nombre de lignes dans $resultat, c’est-à-dire le nombre de bases de
données gérées par le SGBD
→ for($i=1;$i<=$nbre_bases;$i++) {
boucle de traitement : nous allons exécuter les commandes suivantes autant de fois qu’il y a de bases
de données
→ $ligne=mysql_fetch_array($resultat);
intérieur de boucle : récupération de la prochaine ligne de resultat
→ print("<li>$ligne[0]</li>\n"); }
intérieur de boucle : affichage dans <li> de la ligne récupérée de resultat
→ mysql_close($connexion);
fermeture de la connexion
# Construire la requ^
ete
$requete="SELECT etu_nom FROM etudiant ".
"ORDER BY etu_nom LIMIT 5 ;" ;
# Boucle principale
for($i=1;$i<=$nbre_lignes;$i++) {
# Récupérer la ligne puis l’afficher
$ligne=mysql_fetch_object($resultat);
print("$ligne->etu_nom<br/>\n"); }
# Fermeture de la connexion
my_close($connexion);
?>
→ mysql_select_db("base_du_cours");
sélection de la base de données
→ $resultat=mysql_query($requete);
$resultat va recevoir le résultat de la requête SQL envoyée au SGBD
→ $nbre_lignes=mysql_num_rows($resultat);
$nbre_lignes va recevoir le nombre de lignes dans $resultat (au max. 5)
→ for($i=1;$i<=$nbre_lignes;$i++) {
boucle de traitement
→ $ligne=mysql_fetch_array($resultat);
intérieur de la boucle : récupération de la prochaine ligne de resultat
→ print("$ligne->etu_nom<br/>\n"); }
intérieur de la boucle : affichage du champs etu_nom de ligne puis passage à la ligne
$resultat=mysql_query($requete);
$nbre_lignes=mysql_num_rows($resultat);
$couleur="#ffffff";
for($i=1;$i<=$nbre_lignes;$i++) {
if ( $couleur == "#ffffff" )
$couleur="#dddddd";
else
$couleur="#ffffff";
$ligne=mysql_fetch_object($resultat);
print("<tr bgcolor=\"$couleur\">");
print("<td> $ligne->etu_nom </td></tr>\n"); }
mysql_close($connexion);
?>
<html>
<head>
<title>
Interrogation de la base de données
</title>
</head>
<body>
<h1>Interrogation de la base de données</h1>
<form action="connexion5.php" method="get">
Entrer le code filière :
<input type="text" name="code_filiere"/>
<br/>
<input type="submit" value="Entrer"/>
</form>
</body>
</html>
<?php
$fil_code =$_GET[’code_filiere’];
# Etablir la connexion
$connexion=mysql_connect("localhost","","");
print("<center><table border=1>");
print("<tr><td>Nom</td><td>Prénom</td></tr>");
$couleur="#ffffff";
for($i=1;$i<=$nbre_lignes;$i++) {
if ( $couleur == "#ffffff" )
$couleur="#dddddd";
else
$couleur="#ffffff";
print("<tr bgcolor=\"$couleur\">");
printf("<td> %s </td>\n <td> %s </td>\n</tr>\n",
$ligne->etu_nom,$ligne->etu_prenom);