Vous êtes sur la page 1sur 19

Administration des

Bases de Données
Nicolas REALE
Environnement MySql : console
Environnement MySql : phpMyAdmin
MOTEUR DE BASE DE DONNÉES
Moteur de base de données : MyISAM ou InnoDB

MyISAM moteur par défaut de MySQL

MyISAM ne gère pas les contraintes d'intégrité référentielle. Il pourrait donc arriver qu'une table contienne une clé
étrangère dont la valeur n'existe pas comme clé primaire dans la table référencée.

MyISAM ne gère pas les transactions. Il n'est donc pas possible d'effectuer un bloc de requêtes SQL en lot tout en en
assurant que si l'une d'entre elles faisait défaut, les requêtes seraient défaites pour que la base de données revienne dans
son état original.

MyISAM ouvre un risque d’avoir des données corrompues. L'intégrité des données sera ici aussi compromise.

On préfèrera toujours le moteur InnoDB


CHARSET / JEUX DE CARACTÈRES
Votre ordinateur ne connaît pas les lettres, il ne connaît qu’une suite de bits (0/1). Les CHARSET permettent de créer un
tableau de correspondance entre combinaisons de bits et lettres.

ASCII : Chaque caractère a un code ASCII. Le code ASCII est défini sur 7 bits ce qui lui permet de contenir 128 caractères,
plus un huitième bit de contrôle, soit 8 bits, un octet. Ne permet d’encoder que les caractères de base.
https://fr.wikibooks.org/wiki/Les_ASCII_de_0_à_127/La_table_ASCII

UNICODE : Un ensemble standardisé de caractère défini par une norme qui spécifie un ensemble de couples (caractère,
point de code). "Bonjour" s’écrit en unicode "U+0042 U+006F U+006E U+006A U+006F U+0075 U+0072".
UTF-8 : Un des choix possibles pour encoder des messages écrits avec des caractères Unicode. Il s'agit d'un algorithme
qui permet de coder des caractères de l'Unicode en binaire. "Bonjour" s’écrit en UTF-8 "01000001 01101111 01101110
01101010 01101111 01110101 01110010".

On préfèrera toujours l’encodage UTF-8


COLLATION
Une collation est un attribut d’un littéral et permet de spécifier :

1) l’ordre de classement des lettres conforme au dictionnaire spécifique à une langue ;


2) si l’on tient compte de la casse (distinction entre majuscules et minuscules) ou non ;
3) si l’on tient compte des éléments diacritique d’une lettre (distinction entre les lettres avec et sans accents) ou non ;
4) si l’on tient compte des ligatures (des symboles constituées de plusieurs lettres imbriquées) ou non ;
5) si l’on tient compte des différences entre les formes des écritures des symboles comme c’est le cas du japonais
syllabique (katakana カタカナ et hiragana ひらがな) ;
6) si l’on tient compte de la largeur d’encodage (certains caractères étant codés sur 1 octets, d’autres sur 2, d’autres sur 3
ou plus encore en fonction des jeux de caractères) auxquels les collations sont associées ;
7) de ne pas tenir compte de la sémantique des caractères et d’effectuer des comparaisons sur les codes binaires des
symboles.

On préfèrera (toujours) la collation utf8-general-ci


Cahier des Charges client
Notre client nous demande de créer un site e-commerce sur-mesure, multi-langues Français et Anglais.

Les produits vendus sur le site sont des vêtements qui peuvent être de différentes tailles et différentes couleurs pour un
même modèle. Ils seront répertoriés dans différentes catégories : s’inspirer des rubriques du site SHEIN Femmes /
Hommes / Enfants. Des packs produits pourront aussi être vendus, comme des ensembles mais les articles pourront être
toujours vendus séparément.

Les prix des produits peuvent varier en fonction de leurs caractéristiques. Il faut prévoir des textes de présentation
(description générale, avantage, composition), plusieurs photos dont une principale à afficher en priorité. Les autres
seront affichées sous forme de vignettes que l’on pourra sélectionner et agrandir.

Les clients (utilisateurs) pourront passer des commandes. Des frais de port s’ajouteront au montant de la commande
selon un grille de poids correspondant au poids total de la commande, quelque soit la destination de livraison. Les clients
pourront se connecter à leur compte pour vérifier si les commandes ont été traitées et expédiées.

Les clients pourront laisser des commentaires sur les produits commandés (uniquement ceux-là), que les autres clients
pourront aimé à leur tour.
MCD : Modèle
1,n 1,1
categories produits
id int(10)
id int(10)
categorie_id int(10)
titre_fr varchar(250)
reference varchar(50)
titre_en varchar(250)
titre_fr varchar(250)
titre_en varchar(250)
description_fr text
description_en text
prix decimal(10,2)
1,n 1,n
utilisateurs
id int(10)
1,1 prenom varchar(250)
1,1 nom varchar(250)
commentaires adresse varchar(250)
codepostal varchar(50)
id int(10) ville varchar(250)
date date telephone varchar(100)
commentaire text email varchar(250)
CREATE DATABASE c:/wamp/www/iut-info/iut-info-001/base.model.sql

CREATE {DATABASE | SCHEMA} [IF NOT DROP {DATABASE | SCHEMA} [IF EXISTS]
EXISTS] db_name db_name
[create_option] ...

create_option: [DEFAULT ] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {'Y' | 'N'}
}

https://dev.mysql.com/doc/refman/8.0/en/sql-data-definition-statements.html

DROP DATABASE IF EXISTS `iut-info-001`;

CREATE DATABASE IF NOT EXISTS `iut-info-001` CHARACTER SET = 'utf8' COLLATE =


'utf8_general_ci';
CREATE TABLE c:/wamp/www/iut-info/iut-info-001/base.model.sql

CREATE [TEMPORARY ] TABLE [IF NOT EXISTS] tbl_name DROP [TEMPORARY ] TABLE [IF EXISTS]
(create_definition,...) tbl_name [, tbl_name] ...
[table_options] [RESTRICT | CASCADE ]

create_definition: {
col_name column_definition
| {INDEX | KEY} [index_name] [index_type] (key_part,...)
[index_option] ...
| {FULLTEXT | SPATIAL } [INDEX | KEY] [index_name]
(key_part,...)
[index_option] ...
| [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (key_part,...)
[index_option] ...
| [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
[index_name] [index_type] (key_part,...)
[index_option] ...
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name,...)
reference_definition
| check_constraint_definition
}
https://dev.mysql.com/doc/refman/8.0/en/sql-data-definition-statements.html
CREATE TABLE

DROP TABLE IF EXISTS `categories` ;


CREATE TABLE IF NOT EXISTS `categories` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`titre_fr` varchar(250) DEFAULT NULL,
`titre_en` varchar(250) DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE = 'InnoDB' DEFAULT CHARACTER SET = 'utf8';
INDEX / KEY
ALTER TABLE tbl_name ALTER TABLE `produits` ADD
[alter_option [, alter_option] ...]
CONSTRAINT `uk-produits-reference`
alter_option: { UNIQUE KEY (`reference` );
table_options
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| ADD [COLUMN] (col_name column_definition,...) ALTER TABLE `produits` ADD
| ADD {INDEX | KEY} [index_name]
[index_type] (key_part,...) [index_option] ... CONSTRAINT
| ADD {FULLTEXT | SPATIAL } [INDEX | KEY] [index_name] `fk-produits-categorie_id`
(key_part,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] PRIMARY KEY FOREIGN KEY (`categorie_id` )
[index_type] (key_part,...) REFERENCES `categories` (`id`) ON
[index_option] ...
| ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY] DELETE SET NULL ON UPDATE SET
[index_name] [index_type] (key_part,...) NULL;
[index_option] ...
| ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name,...)
reference_definition
| ADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT]
ENFORCED ]
https://dev.mysql.com/doc/refman/8.0/en/sql-data-definition-statements.html
B-TREE / HASH INDEX
Caractéristiques des index B-Tree

Un index B-tree peut être utilisé pour des comparaisons de colonnes dans des expressions qui utilisent les opérateurs =,
>, >=, <, <= ou BETWEEN. L'index peut également être utilisé pour les comparaisons LIKE si l'argument de LIKE est une
chaîne constante qui ne commence pas par un caractère générique.

Caractéristiques des index de hachage

Ils sont utilisés uniquement pour les comparaisons d'égalité qui utilisent les opérateurs = ou <=> (mais sont très rapides).
Ils ne sont pas utilisés pour les opérateurs de comparaison tels que < qui trouvent une plage de valeurs.

https://dev.mysql.com/doc/refman/8.0/en/index-btree-hash.html
B-TREE
JOINTURES
LEFT JOIN FULL OUTER JOIN LEFT JOIN (if NULL)

INNER JOIN RIGHT JOIN RIGHT JOIN (if NULL)


REQUÊTES SQL
1/ Jeu de données IUT-INFO-002 : Récupérer la liste de tous produits
Tips : *

2/ Jeu de données IUT-INFO-002 : Compter le nombre de produits dans la base de données


Tips : COUNT

3/ Jeu de données IUT-INFO-002 : Refaire les question 1 et 2 pour les tables catégories, utilisateurs et commentaires.

4/ Récupérer les prénoms, noms et emails des utilisateurs, classés par nom ascendant, puis par nom descendant.
Tips : Pas *, ORDER BY. Faire 2 requêtes, une pour classement ascendant, une pour classement descendant.

5/ Récupérer les commentaires créés entre le 1er juillet 2021 inclus et le 31 décembre 2021, classés pas date.
Tips : 2 méthodes, Signes “>” “>=” “<” “<=” et condition BETWEEN. Testez les différences.

6/ Récupérer tous produits qui ont des commentaires, avec leur commentaire.
Tips : JOIN, INNER JOIN, RIGHT JOIN. Testez les différences.
REQUÊTES SQL
7/ Récupérer tous produits qu’ils aient ou non des commentaires, avec leur commentaire (ou vide).
Tips : LEFT JOIN. Quelle différence par rapport à la précédente requête.

8/ Récupérer tous produits qui n’ont pas des commentaires, commentaire vide.
Tips : IS NULL

9/ Récupérer l’ID, le prénom, le nom et l’email de l’utilisateur Andrew Smith ainsi que les références des produits pour
lesquels il a posté un commentaire.
Tips : Pas *, WHERE

10/ Récupérer pour chaque produit le nombre total de commentaires.


Tips : 2 méthodes. Sous-requêtes ou JOIN + GROUP BY. Expliquez votre choix grâce à EXPLAIN.

11/ Récupérer la moyenne des prix des produits ayant au moins 3 commentaires
Tips : AVG + HAVING
REQUÊTES SQL
12/ Jeu IUT-INFO-001 : Supprimer l’utilisateur ID 5

13/ Jeu IUT-INFO-002 : Supprimer l’utilisateur ID 5

Qu’est-ce que vous constatez comme différence entre le moteur MyISAM et InnoDB ?

14/ Ajouter la langue Italien au jeu de données IUT-INFO-002 pour la table produits et ajouter l’italien sur quelques
enregistrements au choix
Tips : ALTER TABLE avec ADD COLUMN + UPDATE

15/ Créer une base de données IUT-INFO-003


Tips : ne pas oublier le Charset et la Collation

16/ Dans IUT-INFO-003, créer les tables categories, produits, commentaires et utilisateurs en transformant les tables
categories et produits en multi-langue. Pensez à créer la table langues et appliquer les contraintes d'intégrités.
Tips : Recréer un fichier base.model.sql dans le dossier c:\wampserver\www\iut-info-003
Moteur InnoDB avec clés primaires, contraintes de clés étrangères et index. Ne pas oublier la table langues et tables de
traductions pour les tables categories et produits.
REQUÊTES SQL
17/ Importer les données dans IUT-INFO-003 à partir de IUT-INFO-002, en créant les données manquantes.
Tips : Insérer en premier les 3 langues français, anglais et italien.
Utilisez l’instruction “INSERT … SELECT” pour alimenter vos nouvelles tables de IUT-INFO-003 à partir de IUT-INFO-002.
Pensez à faire 2 requêtes pour les tables produits et categories, l’une pour la table principale, l’autre pour sa traduction.

18/ Jeu IUT-INFO-003 : Récupérer les produits en français, avec le nom de la catégorie dans la langue qui convient.
Tips : LEFT JOIN

19/ Jeu IUT-INFO-003 : Refaire la requête pour l’anglais, puis l’italien

20/ Jeu IUT-INFO-003 : Idem pour l’italien, mais ne prendre que les produits qui ont été traduits
Tips : IS NOT NULL

21/ Jeu IUT-INFO-003 : Supprimer toutes les traductions des produits italien non traduits
Tips : DELETE WHERE IS NULL, vérifiez avant de faire un DELETE avec un SELECT pour vous assurez de votre requête.

22/ Refaire la question 18, 19 et 20. Que pensez-vous de la question 20 maintenant ?

Vous aimerez peut-être aussi