Ceci est une ancienne révision du document !
Table des matières
Version : 2022.01
Dernière mise-à-jour : 2022/11/10 07:02
SER802 - SQL, Champs, Moteurs et Jointures
SQL
Chaînes de caractères
Les chaînes de caractères doivent être entourées de ' ou de “.
Exemples
'Linux est incroyable'
“Windows est …….”
“Je lui dit : ”“Je t'aime””“
Nombres
Il existe 3 types de nombres :
Nombres Entiers
Une séquence de chiffres sans espaces
Exemple
999256
0
Nombres Décimaux
Utilisent le point comme séparateur.
Exemple
120.54
5566.8956e+12
Nombres Négatifs
Sont précédés par le signe -.
Exemple
-458
-147.36
Valeurs NULL
Une chaîne sans données.
Important - NULL n'est pas la même chose qu'une chaîne vide ou un 0 dans le cas d'un nombre.
Noms de Fichiers
Les noms de bases, tables et colonnes :
- peuvent contenir jusqu'à 64 caractères
- peuvent commencer par un chiffre
- ne peuvent pas contenir que de chiffres
- ne peuvent pas contenir un /, une \ ou un point
Les alias :
- peuvent contenir jusqu'à 255 caractères
- peuvent contenir un /, une \ ou un point
Variables Utilisateurs
Les variables n'ont pas besoin d'être initialisées. Elles sont automatiquement crées avec la valeur NULL.
Commentaires
Les commentaires d'une ligne sont précédés par le caractère # ou - -.
Les commentaires sous plusieurs lignes sont entourés comme suit :
/* Ceci est un commentaire sur plusieurs lignes */
Commandes
SELECT
Obtenir un ensemble de données à partir d'une ou de plusieurs tables.
Syntaxe
SELECT [table.][colonne]|expression [AS nom][,[table.[colonne] FROM nom-table [, nom_table ...] [WHERE condition [AND|OR condition ...] [GROUP BY [table.][colonne],[table].[colonne] ...] [ORDER BY [table.][colonne][Description],[table].[colonne] ...]
Exemples
SELECT nom, prenom FROM familles ORDER BY nom
SELECT nom, prenom FROM familles GROUP BY ville
UPDATE
Mettre à jour des données dans une table.
Syntaxe
UPDATE [LOW_PRIORITY][IGNORE] nom_table SET colonne = expression WHERE expression ORDER BY expression LIMIT valeur
Directive | Description |
---|---|
LOW_PRIORITY | L'opération se fera quand la table n'est pas utilisée par un client |
IGNORE | La mise à jour continue malgré des problèmes éventuels rencontrés. Les enregistrements posant problème ne seront PAS mis à jour |
Exemples
UPDATE familles SET Adresse2='*******', nb_enfants=2;
UPDATE familles SET nb_enfants=8 ORDER BY Nom LIMIT 3;
DELETE FROM
Supprimer des enregistrements d'une table.
Syntaxe
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM nom_table [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]
Exemple
DELETE FROM familles WHERE Nom = Durant;
DROP TABLE
Syntaxe
DROP DATABASE [IF EXISTS] db_name
Supprimer une table d'une base de données.
Exemple
DROP TABLE Test;
INSERT
Syntaxe
INSERT [LOW_PRIORITY] | [DELAYED] [IGNORE] [INTO] nom_table [(nom_colonne ...)] VALUES ((expression | DEFAULT) ...) , (...)
ou
INSERT [LOW_PRIORITY] | [DELAYED] [IGNORE] [INTO] nom_table [(nom_colonne ...)] SELECT ...
Directive | Description |
---|---|
LOW_PRIORITY | L'opération se fera quand la table n'est pas utilisée par un client |
DELAYED | Permet à un client d'utiliser la table sans attendre la fin de l'opération |
IGNORE | La mise à jour continue malgré des problèmes éventuels rencontrés. Les enregistrements posant problème ne seront PAS mis à jour |
INSERT VALUES
Insérer des valeurs dans une table.
Exemple
INSERT INTO familles (Nom, Prenom) VALUES ('Smith', 'John');
INSERT SELECT
Insérer des valeurs en provenance d'une autre table dans la table cible.
Exemple
INSERT INTO familles (Prenom) SELECT enfants.prenom FROM enfants;
ALTER
Ajouter, supprimer ou modifier une colonne, index ou nom de table.
ALTER ADD
Commande | Description |
---|---|
ADD [COLUMN] | Ajouter un champ |
ADD INDEX | Ajouter un index |
ADD PRIMARY KEY | Ajouter une clef primaire |
ADD UNIQUE | Ajouter un index unique |
ADD FULLTEXT | Ajouter une recherche texte entier |
Exemples
ALTER TABLE familles ADD Sports VARCHAR(50) NOT NULL;
ALTER TABLE familles ADD INDEX (Sports);
ALTER CHANGE
Permet de modifier le nom ou le type d'une colonne.
Exemple
ALTER TABLE familles CHANGE PrenomPere Prenom_Pere VARCHAR(45) NOT NULL;
ALTER DROP
Commande | Description |
---|---|
DROP [COLUMN] | Supprimer un champ |
DROP INDEX | Supprimer un index |
DROP PRIMARY KEY | Supprimer une clef primaire |
Exemple
ALTER TABLE familles DROP Sports;
ALTER KEYS
Permet de désactiver la clef primaire momentanément.
Exemples
ALTER TABLE familles DISABLE KEYS;
ALTER TABLE familles ENABLE KEYS;
ALTER RENAME
Permet de renommer une table.
Exemple
ALTER TABLE enfants RENAME familles_enfants;
ALTER ORDER BY
Permet de reclasser physiquement une table.
Exemple
ALTER TABLE familles ORDER BY Prenom_Pere;
MATCH
Permet la recherche d'un mot, d'une phrase ou d'une expression sur un texte entier
Exemple
SELECT * FROM familles WHERE MATCH (Commentaire) AGAINST ('fleuve');
Opérateurs
Mathémathiques
Nom | Description |
---|---|
+ | Addition |
- | Soustraction |
* | Multiplication |
/ | Division |
() | Le calcul entre parenthèses est effectué en priorité |
Logiques
Nom | Description |
---|---|
! | NON |
|| | OU |
&& | ET |
XOR | XOR exclusif |
Comparaison
Nom | Description |
---|---|
= | Egal |
!= ou <> | Non égal |
< | Inférieur |
< = | Inférieur ou égal |
> | Supérieur |
> = | Supérieur ou égal |
< = > | Egal gérant la nullité |
IS NULL | Nullité |
IS NOT NULL | Non nullité |
Fonctions
Mathémathiques
Nom | Description |
---|---|
ABS(nbr) | Valeur absolue de nbr |
SIGN(nbr) | -1 0 ou 1 en fonctionne du signe de nbr |
MOD(nbr1, nbr2) | Indique le reste de la division de nbr1 par nbr2 |
FLOOR(nbr) | Indique le plus grande nombre entier inférieur à nbr |
CEILING(nbr) | Indique la plus petite valeur entière supérieure à nbr |
ROUND(nbr) | Indique l'arrondi entier le plus proche de nbr |
ROUND(nbr,D) | Indique l'arrondi à D décimales plus plus proche de nbr |
EXP(nbr) | Indique l'exponentielle de nbr |
POW(nbr,nbr2) | indique nbr à la puissance nbr2 |
SQRT(nbr) | Indique la racine carrée de nbr |
PI() | Indique la valeur de PI |
COS(nbr) | Indique le cosinus de nbr |
ACOS(nbr) | Indique l'arc cosinus de nbr |
SIN(nbr) | Indique le sinus de nbr |
ASIN(nbr) | Indique l'arc sinus de nbr |
TAN(nbr) | Indique le tangent de nbr |
ATAN(nbr) | Indique l'arc tangent de nbr |
COT(nbr) | Indique la cotangente de nbr |
RAND() | Indique une valeur en virgule flottante entre 0 et 1.0 |
RAND(nbr) | Indique une valeur en virgule flottante entre 0 et 1.0. La valeur de nbr indique la limite haute |
LEAST(nbr1, nbr2 …) | Indique le plus petit des nombres nbr1 à nbrX |
GREATEST(nbr1, nbr2 …) | Indique le plus grand des nombres nbr1 à nbrX |
DEGREES(nbr) | Convertit nbr de gradiants vers degrés |
RADIANS(nbr) | Convertit nbr de degrés vers gradiants |
TRUNCATE(nbr,D) | Indique nbr tronqué à D décimales |
Chaînes
Nom | Description |
---|---|
LIKE | Effectue une comparaison en fonction d'un motif |
NOT LIKE | L'inverse de LIKE |
_ | Remplace un caractère dans le motif d'une chaîne |
% | Remplace un ou plusieurs caractère(s) dans le motif d'une chaîne |
\ | Caractère d'échappement |
BINARY | Rend la comparaison avec un motif sensible à la casse |
STRCMP(chaîne1, chaîne2) | Compare deux chaînes. Retourne -1 si chaîne 1 < chaîne 2. Retourne 0 si chaîne 1 = chaîne 2. Retourne 1 si chaîne 1 > chaîne 2. |
MATCH | Utilisé pour des recherches de texte intégral |
UPPER('chaîne') | Transforme les minuscules en majuscules |
LOWER('chaîne') | Transforme les majuscules en majuscules |
Dates
Nom | Description |
---|---|
NOW() | Retourne la date au format 'AAAA-MM-JJ HH:MM:SS' |
DATE_FORMAT(date,format) | Retourne la date selon le format spécifié |
DAYOFWEEK(date) | Retourne un chiffre qui représente le jour de la semaine ( 1 pour dimanche, 7 pour samedi ) |
WEEKDAY(date) | Retourne un chiffre qui représente le jour de la semaine ( 7 pour dimanche, 0 pour lundi ) |
DAYOFMONTH(date) | Retourne un chiffre de 1 à 31 |
DAYOFYEAR(date) | Retourne un chiffre de 1 à 366 |
MONTH(date) | Retourne un chiffre de 1 à 12 |
DAYNAME(date) | Retourne le nom du jour ( lundi, mardi … ) |
MONTHNAME(date) | Retourne le nom du mois |
QUARTER(date) | Retourne un chiffre de 1 à 4 ( 1 = premier trimestre de l'année ) |
WEEK(date [,depart] | Retourne une valeur de 1 à 52. La valeur de depart peut être 0 ou 1. Dans le cas de 0, le dimanche est considéré comme le premier jour de la semaine. Dans le cas de 1, c'est le lundi. |
YEAR(date) | Retourne un chiffre de 1000 à 9999 |
HOUR(date) | Retourne l'heure |
MINUTE(date) | Retourne les minutes |
SECOND(date) | Retourne les secondes |
TO_DAYS(date) | Retourne le nombre de jours écoulés depuis le début de l'an 0 |
FROM_DAYS(date) | Retourne la date à partir d'un nombre de jours écoulés depuis le début de l'an 0 |
CURDATE() | Retourne la date courante au format AAAA-MM-JJ |
CURRENT_DATE() | Retourne la date courante au format AAAA-MM-JJ |
CURTIME() | Retourne la date courante au format HH:MM:SS |
CURRENT_TIME() | Retourne la date courante au format HH:MM:SS |
UNIX_TIMESTAMP([date]) | Retourne le nombre de secondes depuis la date 1970-01-01 00:00:00 |
FROM_UNIXTIME(unix_timestamp[,format]) | Retourne la date en fonction d'un nombre de secondes depuis la date 1970-01-01 00:00:00 |
Motifs
Nom | Description | Exemple |
---|---|---|
%M | Le mois | janvier |
%W | Le jour de la semaine | lundi |
%D | La date du mois | 1st |
%Y | L'année | 2009 |
%y | L'année | 09 |
%a | L'abréviation du jour | lun |
%d | Le jour du mois | 01 |
%m | Le numéro du mois | 01 |
%b | L'abréviation du mois | lun |
%j | Le jour de l'année | 031 |
%H | L'heure | 00 |
%h | L'heure | 12 |
%i | Les minutes | 05 |
%r | L'heure au format américain | 11:01:00 PM |
%T | L'heure au format 24 heures | 23:01:00 |
%S | Les secondes | 06 |
%p | AM ou PM | PM |
%w | Le numéro du jour de la semaine | 0 (=dimanche) |
%U | Le numéro de la semaine avec le début de la semaine étant un dimanche | 03 |
%u | Le numéro de la semaine avec le début de la semaine étant un lundi | 02 |
Par exemple :
MariaDB [(none)]> select DATE_FORMAT(now(), '%W %d %M %Y'); +-----------------------------------+ | DATE_FORMAT(now(), '%W %d %M %Y') | +-----------------------------------+ | Monday 07 November 2022 | +-----------------------------------+ 1 row in set (0.000 sec) MariaDB [(none)]>
Contrôle
Nom | Description |
---|---|
IF(exp1, exp2, exp3) | Si exp1 est vrai, exp2 est retournée sinon exp3 est retournée |
IFNULL(exp1,exp2) | Si exp1 est NULL, exp2 est retournée sinon exp1 est retournée |
NULLIF(exp1,exp2) | Si exp1 = exp2, NULL est retournée sinon exp1 est retournée |
CASE value WHEN comp1 THEN res1 [WHEN comp2 THEN res2][ELSE elseres] END | La fonction compare value à comp1 ( comp2 … ). Si une égalité est trouvée, res1 ( res2 … ) est retournée. Si aucune égalité n'est trouvée, elseres est retournée |
Agrégation
Nom | Description |
---|---|
AVG(colonne) | Moyenne de la colonne |
COUNT(items) | Le nombre de valeurs non nulles de la colonne |
MIN(colonne) | Valeur minimum de la colonne |
MAX(colonne) | Valeur maximum de la colonne |
STD(colonne) | Écart type des valeurs de la colonne |
SUM(colonne) | Somme des valeurs de la colonne |
BIT_OR(colonne) | Ou logique effectué sur les valeurs de la colonne |
BIT_AND(colonne) | ET logique effectué sur les valeurs de la colonne |
Autres
Nom | Description |
---|---|
CAST(expression) CONVERT(expression) | Convertit l'expression vers le type demandé - BINARY, DATE, DATETIME, SIGNED, TIME, UNSIGNED |
LAST_INSERT_ID() | Retourne la valeur d'une colonne AUTO_INCREMENT lors du dernier insertion |
VERSION() | La version du serveur MariaDB |
CONNECTION_ID() | L'identifiant du thread de la connexion courante |
DATABASE() | La base de données courante |
USER() | L'utilisateur courant |
PASSWORD(chaîne) | Encrypte un mot de passe |
ENCRYPT(chaîne, [,force]) | Encrypte un mot de passe avec la fonction crypt d'Unix |
ENCODE(chaîne,mdp) | Encode la chaîne avec le mot de passe mdp |
DECODE(chaîne,mdp) | Décode la chaîne avec le mot de passe mdp |
MD5(chaîne) | Retourne une chaîne encodée à la norme MD5 |
SHA1() | Retourne une chaîne encodée à la norme SHA1 |
Types de Champs
Nombres entiers
Type | Intervalle | Taille en octets | Description |
---|---|---|---|
TINYINT[(M)] | -127 à 128 | 1 | Entiers très courts |
TINYINT[(M)] UNSIGNED | 0 à 255 | 1 | Entiers très courts |
SMALLINT[(M)] | -32 768 à 32 767 | 2 | Entiers courts |
SMALLINT[(M)] UNSIGNED | 0 à 65 535 | 2 | Entiers courts |
MEDIUMINT[(M)] | - 8 388 608 à 8 388 607 | 3 | Entiers de taille moyenne |
MEDIUMINT[(M)] UNSIGNED | 0 16 777 215 | 3 | Entiers de taille moyenne |
INT[(M)] | -231 à 231 - 1 | 4 | Entiers |
INT[(M)] UNSIGNED | 0 à 232 - 1 | 4 | Entiers |
INTEGER[(M)] | - | - | Synonyme de INT |
BIGINT[(M)] | -263 à 263 - 1 | 8 | Entiers larges |
BIGINT[(M)] UNSIGNED | 0 à 264 - 1 | 8 | Entiers larges |
Nombres à virgule flottante
Type | Intervalle | Taille en octets | Description |
---|---|---|---|
FLOAT(precision) | Varie selon precision | Varie | < =24 pour un nombre en simple précision ou >24 et < =53 pour un nombre ne double précision |
FLOAT[(M,D)] | + ou - 1.175494351E-38 à + ou - 3.402823466E+38 | 4 | Simple précision |
DOUBLE[(M,D)] | + ou - 1.7976931348623157E+308 à + ou - 2.2250738585072014E-308 | 8 | Double précision |
DOUBLEPRECISION[(M,D)] | - | - | Synonyme de DOUBLE[(M,D)] |
REAL[(M,D)] | - | - | Synonyme de DOUBLE[(M,D)] |
DECIMAL[(M[,D])] | Varie | M +2 | Nombre à virgule flottante |
NUMERIC | - | - | Synonyme de DECIMAL |
Dates et Heures
Type | Intervalle |
---|---|
DATE | 1000-01-01 à 9999-12-31 |
TIME | -838:59:59 à 838:59:59 |
DATETIME | 1000-01-01 00:00:00 à 9999-12-31 23:59:59 |
TIMESTAMP[(M)] | Voir tableau ci-dessous |
YEAR[(2)] | 70 à 69 (1970 à 2069) |
YEAR[(4)] | 1901 à 2155 |
Types de données TIMESTAMP
Type | Affichage |
---|---|
TIMESTAMP | YYYYMMDDHHMMSS |
TIMESTAMP(14) | YYYYMMDDHHMMSS |
TIMESTAMP(12) | YYMMDDHHMMSS |
TIMESTAMP(10) | YYMMDDHHMM |
TIMESTAMP(8) | YYYYMMDD |
TIMESTAMP(6) | YYMMDD |
TIMESTAMP(4) | YYMM |
TIMESTAMP(2) | YY |
Chaînes
Type | Longeur | Description |
---|---|---|
CHAR(M) | 1 à 255 | Chaîne de longueur fixe où M varie entre 1 et 255 |
VARCHAR(M) | 1 à 255 | Chaîne de longueur variable où M varie entre 1 et 255 |
TEXT et BLOB
- TEXT,
- TEXT respecte la casse des données,
- BLOB (Binary Large OBject),
- BLOB permet de stocker toute information binaire telle une image ou un son.
Type | Longueur Maximale en caractères | Description |
---|---|---|
TINYBLOB | 255 | Objet binaire court |
TINYTEXT | 255 | Texte court |
BLOB | 65 535 | Objet binaire de taille normale |
TEXT | 65 535 | Texte de taille normale |
MEDIUM BLOB | 16 777 215 | Objet binaire de taille moyenne |
MEDIUM TEXT | 16 777 215 | Texte de taille moyenne |
LONG BLOB | 4 294 967 295 | Objet binaire de grande taille |
LONG TEXT | 4 294 967 295 | Texte de grande taille |
ENUM et SET
- ENUM,
- permet de prendre une valeur ou NULL parmi une liste de valeurs prédéfinies à la création de la colonne,
- SET
- permet de prendre un maximum de 64 valeurs ou NULL parmi une liste de valeurs prédéfinies à la création de la colonne,
Type | Maximum des valeurs dans l'ensemble | Description |
---|---|---|
ENUM('valeur1','valeur2',…) | 65 535 | Les valeurs de ce type ne peuvent contenir qu'une seule des valeurs de la liste ou NULL |
SET('valeur1','valeur2',…) | 64 | Les valeurs de ce type ne peuvent contenir un ensemble des valeurs de la liste ou NULL |
Types de Moteurs de Stockage
Le type de moteur est spécifié lors de la création de la table. Le moteur d'une table existant peut être modifié avec la commande ALTER TABLE. Les différents types principaux sont résumés ci-après :
Type de Moteur | Description |
---|---|
InnoDB | Le format par défaut. Supportent les transactions sécurisées avec COMMIT et ROLLBACK. Permet de verrouiller des enregistrements un-à-un au lieu de la table entière. |
MyISAM | Données stockées dans un fichier .MYD. Index stockés dans un fichier .MYI. Structure da la table stockée dans un fichier .frm |
MEMORY | Anciennement connues sous le nom HEAP. Les données sont stockées en mémoire tandis que la structure de la table est stockée sur disque dans un fichier .frm. Ne supportent pas les champs TEXT, BLOB. Ne supportent pas l'attribut AUTO_INCREMENT. Utilisé pour augmenter la vitesse de traitement d'une requête. |
ARCHIVE | Ne supportent que des requêtes de lecture et d'insertion. Utilisé pour stocker des données des journaux d'application. Structure stockée dans un fichier .frm. Données stockées dans un fichier .ARZ. Métadonnées sont stockées dans un fichier .ARM |
CSV | Données sont stockées dans un fichier texte au format CSV. Utilisé pour échanger des données avec d'autres applications. Structure stockée dans un fichier .frm. Données stockées dans un fichier .CSV. |
FEDERATED | Ne stocke pas de données. Extrait des données de tables en provenance de bases sur des serveurs distants. |
Bien que possible techniquement, il n'est pas préférable d'utiliser des types de moteurs différents dans la même base de données car ceci complique la tâche d'optimisation, augmente le nombre de buffers et de caches et complexifie le travail de l'administrateur.
Le choix d'un moteur de stockage se fait en fonction de l'adéquation entre les besoins et les caractéristiques suivants :
Moteur | Verrous | Transactionnel de type ACID | MVCC | Clef Etrangère | Données sur Disque | Sauvegarde à Chaud | COMMIT | ROLLBACK | Crash Recovery |
---|---|---|---|---|---|---|---|---|---|
InnoDB | Enregistrement | Oui | Oui | Oui | Oui | Oui | Oui | Oui | Oui |
MyISAM | Table | Non | Non | Non | Oui | Non | Non | Non | Non |
Memory | Table | Non | Non | Non | Non | Non | Non | Non | Non |
Archive | Enregistrement | Non | Non | Non | Oui | Non | Non | Non | Non |
CSV | Table | Non | Non | Non | Oui | Non | Non | Non | Non |
Federated | Table | Non | Non | Non | Oui | Non | Non | Non | Non |
NDB Cluster | Enregistrement | Oui | Non | Oui | Oui | Oui | Oui | Oui | Oui |
Caractéristiques des Moteurs
InnoDB
Le moteur InnoDB est le moteur par défaut de MariaDB. Les principaux caractéristiques du moteur InnoDB sont :
- Il est transactionnel de type ACID (Atomicité, Cohérence, Isolation, Durabilité),
- Il implémente le MVCC (Multi Version Concurrency Control) qui permet d'avoir des lectures qui ne bloquent pas des écritures et inversement,
- Il implémente un verrou au niveau enregistrement,
- Il implémente un mécanisme de restauration automatique en utilisant des journaux de transactions ib_logfile* ou * est 0, 1, 2 etc,
- La structure de la table est stockée dans un fichier .frm,
- Il supporte l'utilisation de clefs étrangères,
- Il peut être sauvegardé à chaud,
- Il est recommandé pour des applications avec beaucoup d'écritures.
Mécanisme Interne
Les transactions en cours sont stockées en mémoire dans le buffer des journaux de transactions (log_buffer). La taille du buffer est fixée par la valeur de l'option innodb_log_buffer_size. Chaque seconde les informations dans le buffer sont écrites sur disque dans l'un des deux journaux des transactions ib_logfile0 ou ib_logfile1. Le nombre de journaux des transactions est fixé par la valeur de l'option innodb_log_files_in_group. La taille des logs ib_logfile*, aussi appelés le Redo log, est fixée par l'option innodb_log_file_size mais ne peut pas dépasser 512 Go. Le buffer est aussi écrit sur disque lors de chaque commit (validation) sauf si ce mécanisme a été modifié par la valeur de l'option innodb_flush_log_at_trx_commit.
Une partie des données ainsi que les index sont stockés en mémoire dans le buffer pool. La taille du buffer est fixée par la valeur de l'option innodb_buffer_pool_size. Il faut éviter que la taille de cette mémoire tampon dépasse les 80 % de la RAM du serveur. Chaque seconde, les informations dans le buffer sont écrites sur disque dans le tablespace. L'emplacement du tablespace est fixé par la valeur de l'option innodb_data_file_path.
Transactions
Le moteur Innodb est transactionnel. Ceci implique que le moteur collectionne des requêtes jusqu'à la commande COMMIT. A ce moment le moteur applique les modifications à toutes les tables concernées en même temps. Soit toutes les modifications réussissent, soit il y a un ROLLBACK. Par défaut, MariaDB utilise un autocommit avec le moteur Innodb. Ceci implique qu'à la fin de chaque requête SQL, le serveur voit un commit virtuel.
Il est possible de modifier ce comportement automatique en utilisant la commande BEGIN. Par exemple :
mysql> BEGIN; mysql> INSERT INTO table (colonne) VALUES (value); mysql> COMMIT;
Si la dernière commande est remplacée par la commande ROLLBACK la modification apportée par la requête INSERT INTO sera effacée :
mysql> BEGIN; mysql> INSERT INTO table (colonne) VALUES (value); mysql> ROLLBACK;
Tablespace
Depuis la version 5.6.6 de MySQL, il existe l'option innodb_file_per_table. Si cette option est 0, Innodb se comporte comme les versions précédentes, à savoir les données et les index de toutes les tables sont centralisées dans la Tablespace, c'est-à-dire, dans le fichier ibdata par défaut. Avec une valeur de 1, les données et index de chaque table sont stockées dans un fichier individuel ayant une extension .ibd se trouvant dans le répertoire du schéma à côté du fichier de définition de la structure, le .frm.
Cette modification permet le stockage des fichiers .ibd sur un autre espace de stockage physique. De cette façon, il est possible d'utiliser des espaces de stockage très rapides.
Malgré l'utilisation des fichiers .ibd, il est toujours necéssaire d'avoir le fichier ibdata car ce dernier stocke le dictionnaire des données qui est une copie de tous les fichiers .frm ainsi que les Redo logs. Les Redo logs journalisent toute requête de modification des objets.
Important - Malgré l'utilisation des fichiers .ibd, il n'est pas possible de manipuler les fichiers dans un gestionnaire de fichiers. Ne les déplacez pas, ne les copiez pas sous peine de perdre des données.
Important - La quantité de mémoire libre dans un fichier *.ibd ou dans la Tablespace est indiquée par la sortie de la commande SHOW TABLE STATUS. Cette valeur est en pages et chaque page vaut 16 Ko. Bien que vous puissiez libérer de l'espace mémoire utilisée dans la Tablespace en passant la valeur de l'option innodb_file_per_table de 0 à 1 et en saisissant la commande ALTER TABLE table ENGINE=InnoDB pour chaque table, la taille du fichier ibdata ne diminuera pas. La seule façon de réduire la taille de ce fichier est d'exporter la base de données avec mysqldump puis de recréer la base de données à partir du dump.
Multiversion Concurrency Control
Chaque table Innodb contient deux colonnes cachées :
- le numéro de transaction - txn#,
- un pointeur vers la version précédente de la ligne qui se trouve dans le Undo log. Ce pointeur s'appelle le Pointeur ROLLBACK.
Quand une ligne est modifiée, l'ancienne version de la ligne y compris son numéro de transaction est copiée dans le Undo log. La nouvelle version de la ligne y compris son numéro de transaction est copiée dans la Tablespace ou dans le fichier .ibd. Le pointeur de la nouvelle ligne identifie l'ancienne ligne dans le Undo log. Ce processus s'appelle le MVCC (Multiversion Concurrency Control).
Transaction Isolation Levels
Créez la base de données nombres :
MariaDB [none]> CREATE DATABASE `Nombres` ; Query OK, 1 row affected (0.00 sec) MariaDB [none]> USE Nombres; Database changed MariaDB [Nombres]> CREATE TABLE english (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Number VARCHAR(10)); Query OK, 0 rows affected (0.02 sec) MariaDB [Nombres]> INSERT INTO english (Number) VALUES ('One'); Query OK, 1 row affected (0.01 sec) MariaDB [Nombres]> INSERT INTO english (Number) VALUES ('Two'); Query OK, 1 row affected (0.01 sec) MariaDB [Nombres]> INSERT INTO english (Number) VALUES ('Three'); Query OK, 1 row affected (0.01 sec) MariaDB [Nombres]> SELECT * FROM english; +----+--------+ | id | Number | +----+--------+ | 1 | One | | 2 | Two | | 3 | Three | +----+--------+ 3 rows in set (0.000 sec) MariaDB [Nombres]>
Read Uncomitted
Mettez à jour l'enregistrement 1 sans faire de COMMIT ou de ROLLBACK :
MariaDB [Nombres]> BEGIN; Query OK, 0 rows affected (0.000 sec) MariaDB [Nombres]> UPDATE english SET Number = "Un" WHERE id = 1; Query OK, 1 row affected (0.000 sec) Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [Nombres]> SELECT * FROM english; +----+--------+ | id | Number | +----+--------+ | 1 | Un | | 2 | Two | | 3 | Three | +----+--------+ 3 rows in set (0.000 sec) MariaDB [Nombres]>
Ouvrez une autre terminal, connectez-vous à mysql et visualisez la modification :
[root@centos8 ~]# mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 17 Server version: 10.3.28-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | Nombres | | information_schema | | mysql | | performance_schema | +--------------------+ 4 rows in set (0.000 sec) MariaDB [(none)]> use Nombres; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [Nombres]> SELECT * FROM english; +----+--------+ | id | Number | +----+--------+ | 1 | One | | 2 | Two | | 3 | Three | +----+--------+ 3 rows in set (0.000 sec) MariaDB [Nombres]>
Important - Notez que le deuxième client voit l'ancienne valeur de l'enregistrement 1. Ceci est parce que la base de données a suivi le Pointeur ROLLBACK vers le Undo log pour afficher la valeur de la colonne. Notez que MVCC ne bloque pas la lecture malgré le fait qu'il y a une transaction en cours !
Pour voir la valeur dans la Tablespace, il faut modifier la valeur de l'option TRANSACTION ISOLATION LEVEL :
MariaDB [Nombres]> SET TRANSACTION ISOLATION LEVEL read uncommitted; Query OK, 0 rows affected (0.000 sec) MariaDB [Nombres]> SELECT * FROM english; +----+--------+ | id | Number | +----+--------+ | 1 | Un | | 2 | Two | | 3 | Three | +----+--------+ 3 rows in set (0.000 sec) MariaDB [Nombres]>
Important - Dans ce mode, le client voit une donnée fictive car il n'y a pas encore eu de COMMIT !
Read Comitted
Dans ce mode de fonctionnement InnoDB suit les Pointeurs ROLLBACK jusqu'à il trouve la dernière version ayant subi un COMMIT :
MariaDB [Nombres]> SET TRANSACTION ISOLATION LEVEL read committed; Query OK, 0 rows affected (0.000 sec) MariaDB [Nombres]> SELECT * FROM english; +----+--------+ | id | Number | +----+--------+ | 1 | One | | 2 | Two | | 3 | Three | +----+--------+ 3 rows in set (0.000 sec) MariaDB [Nombres]>
Retournez au premier terminal :
MariaDB [Nombres]> COMMIT; Query OK, 0 rows affected (0.000 sec) MariaDB [Nombres]>
Retournez au deuxième terminal :
MariaDB [Nombres]> SELECT * FROM english; +----+--------+ | id | Number | +----+--------+ | 1 | Un | | 2 | Two | | 3 | Three | +----+--------+ 3 rows in set (0.000 sec) MariaDB [Nombres]>
MyISAM
L'architecture du moteur MyISAM est plus simple que le moteur InnoDB. Les principaux caractéristiques du moteur MyISAM sont :
- Il n'est pas transactionnel,
- Il implémente un verrou au niveau table,
- Il n'y a pas de recouvrement automatique des données lors d'un crash,
- La structure de la table est stockée dans un fichier .frm,
- Les données sont stockées dans un fichier .MYD tandis que les index sont stockés dans un fichier .MYI,
- Il ne supporte pas de clefs étrangères,
- Il ne peut pas être sauvegardé à chaud,
- Il peut être compressé,
- Il supporte les index plain text (fulltext),
- Il est recommandé pour des applications avec beaucoup de lectures.
Il existe trois types de moteurs MyISAM : FIXED , DYNAMIC et COMPRESSED :
MyISAM FIXED
Une table est FIXED si elle ne contient aucun champ de type VARCHAR, VARBINARY, TEXT ou BLOB ou si la valeur de l'option row_format est FIXED ( row_format=FIXED ). Tous les enregistrements sont de la même taille. De ce fait, les tables sont plus rapides et plus robustes que les tables dynamiques mais elles prennent plus d'espace disque. Les données de la table ne peuvent pas être fragmentées. Une table devient FIXED quand la valeur de l'option row_format est FIXED ( row_format=FIXED ) :
MariaDB [Nombres]> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [mysql]> SHOW TABLE STATUS LIKE 'db' \G; *************************** 1. row *************************** Name: db Engine: MyISAM Version: 10 Row_format: Fixed Rows: 0 Avg_row_length: 0 Data_length: 0 Max_data_length: 178173660257845247 Index_length: 4096 Data_free: 0 Auto_increment: NULL Create_time: 2022-11-07 06:00:13 Update_time: 2022-11-07 06:00:13 Check_time: NULL Collation: utf8_bin Checksum: NULL Create_options: Comment: Database privileges Max_index_length: 1125899906841600 Temporary: N 1 row in set (0.000 sec) ERROR: No query specified MariaDB [mysql]>
MyISAM DYNAMIC
Une table est DYNAMIC si elle contient au moins un champ de type VARCHAR, VARBINARY, TEXT ou BLOB ou la valeur de l'option row_format est DYNAMIC ( row_format=DYNAMIC ). Les données de la table peuvent être fragmentées. Dans ce cas, l'utilisation de la commande OPTIMIZE TABLE ou myisamchk est nécessaire :
MariaDB [mysql]> SHOW TABLE STATUS LIKE 'proc' \G; *************************** 1. row *************************** Name: proc Engine: MyISAM Version: 10 Row_format: Dynamic Rows: 2 Avg_row_length: 566 Data_length: 1132 Max_data_length: 281474976710655 Index_length: 4096 Data_free: 0 Auto_increment: NULL Create_time: 2022-11-07 06:00:48 Update_time: 2022-11-07 06:02:06 Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: Stored Procedures Max_index_length: 288230376151710720 Temporary: N 1 row in set (0.000 sec) ERROR: No query specified
MyISAM COMPRESSED
Après avoir arrêté le serveur, la compression est obtenue en utilisant la commande myisampack suivi de la commande myisamchk -rq. Le décompression est obtenue en utilisant la commande myisamchk –unpack. La compression peut atteindre les 70% maximum. Une fois compressée les requêtes UPDATE, DELETE et INSERT ne peuvent pas être utilisées :
[root@centos8 ~]# systemctl stop mariadb [root@centos8 ~]# myisampack /var/lib/mysql/mysql/help_keyword.MYI Compressing /var/lib/mysql/mysql/help_keyword.MYD: (464 records) - Calculating statistics - Compressing file 95.2% Remember to run myisamchk -rq on compressed tables [root@centos8 ~]# myisamchk -rq /var/lib/mysql/mysql/help_keyword.MYI - check record delete-chain - recovering (with sort) MyISAM-table '/var/lib/mysql/mysql/help_keyword.MYI' Data records: 464 - Fixing index 1 - Fixing index 2 [root@centos8 ~]# myisamchk --unpack /var/lib/mysql/mysql/help_keyword.MYI - recovering (with sort) MyISAM-table '/var/lib/mysql/mysql/help_keyword.MYI' Data records: 464 - Fixing index 1 - Fixing index 2
Particularités
- Le moteur MyISAM est particulièrement portable car il suffit de copier les fichiers *.frm, *.MYD et *.MYI pour obtenir une sauvegarde physique,
- Le nombre d'enregistrements est stocké dans la table,
- Les index non-uniques peuvent être désactivés momentanément,
- Il est possible d'avoir des INSERT et SELECT simultanés en utilisant l'option concurrent_insert.
Memory
Les principaux caractéristiques du moteur Memory sont :
- Il n'est pas transactionnel,
- Il implémente un verrou au niveau table,
- Il n'y a pas de recouvrement automatique des données lors d'un crash,
- La structure de la table est stockée dans un fichier .frm,
- Les données sont stockées dans la mémoire,
- Il ne supporte pas de clefs étrangères,
- Il ne peut pas être sauvegardé à chaud,
- Il est recommandé pour des applications ayant besoin de la vitesse.
Particularités
- La consommation de la mémoire est fixée par les options MAX_ROWS et max_heap_table_size,
- Le moteur peut implémenter soit l'algorithme HASH pour les index pour augmenter la performance pour les recherches d'égalité soit l'algorithme BTREE pour les index pour augmenter la performance pour les recherches d'inégalité,
- Au démarrage du serveur les tables sont évidement vides. Il est possible de les pré-remplir grâce à des instructions SQL contenues dans un fichier référencé par l'option init-file.
En Pratique
Créez une table au format MEMORY en utilisant les données de la tables famille issue de la base carnetadresses :
mysql> CREATE TABLE tempfamilles TYPE=MEMORY SELECT * FROM familles ;
Visualisez les enregistrements de la table tempfamilles :
mysql> SELECT * FROM tempfamilles;
Supprimez la table tempfamilles :
mysql > DROP TABLE tempfamilles;
Archive
Les principaux caractéristiques du moteur Archive sont :
- Il n'est pas transactionnel,
- Il implémente un verrou au niveau enregistrement,
- Il n'y a pas de recouvrement automatique des données lors d'un crash,
- Les données sont stockées en les compressant,
- Il ne supporte pas de clefs étrangères,
- Il ne peut pas être sauvegardé à chaud,
- Il ne supporte pas d'Index,
- Il est recommandé pour réduire l'espace disque utilisé par les tables.
Particularités
- Le moteur ne permet que des requêtes INSERT et SELECT.
CSV
Les principaux caractéristiques du moteur CSV sont :
- Il n'est pas transactionnel,
- Il implémente un verrou au niveau table,
- Il n'y a pas de recouvrement automatique des données lors d'un crash,
- La structure de la table est stockée dans un fichier .frm,
- Les données sont séparées par des ; et stockées dans un fichier .CSV tandis que les informations concernant l'état de la table ainsi que le nombre d'enregistrements sont stockées dans un fichier .CSM,
- Il ne supporte pas de clefs étrangères,
- Il ne peut pas être sauvegardé à chaud,
- Il ne supporte pas d'Index,
- Il est recommandé pour des tables ayant besoin d'être manipulées par des logiciels tiers.
FEDERATED
Les principaux caractéristiques du moteur FEDERATED sont :
- Il n'est pas transactionnel,
- Il n'y a pas de recouvrement automatique des données lors d'un crash,
- Il ne supporte pas de clefs étrangères,
- Il ne peut pas être sauvegardé à chaud,
- Il ne supporte pas d'Index,
- Il supporte des requêtes SELECT, INSERT, UPDATE, DELETE, TRUNCATE et DROP TABLE,
- Il n'utilise pas le cache de requêtes,
- Il est utilisé pour accéder à des données localisées sur un serveur MariaDB distant.
NDB Cluster
Le moteur NDB Cluster est le moteur de MariaDB Cluster. Les principaux caractéristiques du moteur NDB Cluster sont :
- Il est transactionnel de type ACID (Atomicité, Cohérence, Isolation, Durabilité),
- Il implémente le MVCC (Multi Version Concurrency Control) qui permet d'avoir des lectures qui ne bloquent pas des écritures et inversement,
- Il implémente un verrou au niveau enregistrement,
- Il implémente la réplication synchrone,
- Il implémente le basculement automatique sur un autre nœud en cas de panne et la synchronisation automatique du nœud à son démarrage,
- Il peut être sauvegardé à chaud,
- Il permet le dimensionnement des requêtes de lecture et d'écriture,
- Il utilise l'architecture Shared Nothing où les nœuds ne partagent pas un disque de données,
- Il implémente l’absence du SPOF (Single Point Of Failure).
Autres Moteurs Non Standards
XtraDB
XtraDB est le moteur de la société Percona. Il est basé sur InnoDB et a pour but d'être plus performant. Les principaux caractéristiques du moteur XtraDB sont :
- Il est transactionnel de type ACID (Atomicité, Cohérence, Isolation, Durabilité),
- Il implémente le MVCC (Multi Version Concurrency Control) qui permet d'avoir des lectures qui ne bloquent pas des écritures et inversement,
- Il implémente un verrou au niveau enregistrement,
- Il implémente un mécanisme de restauration automatique,
- Il supporte l'utilisation de clefs étrangères,
- Il peut être sauvegarder à chaud,
- Le moteur peut implémenter soit l'algorithme HASH pour les index pour augmenter la performance pour les recherches d'égalité soit l'algorithme B+TREE pour les index pour augmenter la performance pour les recherches d'inégalité.
Aria
Aria est le moteur de Michael Widenius. Il a été créé pour être un alternatif au moteur MyISAM. Les principaux caractéristiques du moteur Aria sont :
- En version 2.0, il est transactionnel de type ACID (Atomicité, Cohérence, Isolation, Durabilité),
- Il implémente un verrou au niveau enregistrement,
- Il implémente un mécanisme de restauration automatique.
Jointures
Les jointures permettent de créer un lien entre deux tables. Le champ utilisé pour la jointure dans la première table est souvent la clef primaire. Le champs utilisé dans la deuxième table est appelé le clef étrangère. La clef primaire et la clef étrangère doivent être du même type.
Dans le cas où on utilise un champs autre que la clef primaire pour assurer la jointure, cet autre champs doit être indexé.
FULL JOIN
Ce type de jointure permet de renvoyer uniquement les enregistrements des deux tables 1 et 2 ayant une correspondance :
mysql> SELECT table1.champ1, table2.champ1 FROM table1, table2 WHERE table1.clefprimaire = table2.clefetrangere;
ou
mysql> SELECT table1.champ1, table2.champ1 FROM table1 JOIN table2 WHERE table1.clefprimaire = table2.clefetrangere;
LEFT JOIN
Ce type de jointure permet de renvoyer les enregistrements de la première table qui ont une correspondance dans la deuxième table. La syntaxe est la suivante :
mysql> SELECT table1.champ1, table2.champ1 FROM table1 LEFT JOIN table2 ON table1.clefprimaire = table2.clefetrangere;
Le résultat de cette requête est l'affichage de tous les enregistrements de la table 1 avec ou sans les enregistrements correspondants de la table 2. Dans le cas où la table 2 ne contient pas d'enregistrement correspondant un un enregistrement de la table 1, la valeur retournée est NULL. Cette information nous permet de rechercher uniquement les enregistrements dans la table1 n'ayant pas d'enregistrements dans la table 2 :
mysql> SELECT table1.champ1, table2.champ1 FROM table1 LEFT JOIN table2 ON table1.clefprimaire = table2.clefetrangere WHERE table2.clefetrangere IS NULL;
RIGHT JOIN
Ce type de jointure est l'inverse d'un LEFT JOIN.
LAB #2 - Le Langage SQL
Créez maintenant la base de données CarnetAdresses :
mysql> CREATE DATABASE `CarnetAdresses` ; Query OK, 1 row affected (0.00 sec) mysql>
Créez ensuite deux tables familles et enfants dans la base CarnetAdresses :
MariaDB [(none)]> use CarnetAdresses; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [CarnetAdresses]>
MariaDB [CarnetAdresses]> CREATE TABLE familles (CodeFamille BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, Nom VARCHAR(40), PrenomPere VARCHAR(40) , PrenomMere VARCHAR(40) , Adresse1 VARCHAR(40) , Adresse2 VARCHAR(40), CodePostal VARCHAR(5), Ville VARCHAR(40), ProfPere VARCHAR(40), ProfMere VARCHAR(40)); Query OK, 0 rows affected (0.03 sec) MariaDB [CarnetAdresses]>
Pour plus de facilité, copiez simplement la requête et collez-la dans votre terminal :
- familles
CREATE TABLE familles (CodeFamille BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, Nom VARCHAR(40), PrenomPere VARCHAR(40) , PrenomMere VARCHAR(40) , Adresse1 VARCHAR(40) , Adresse2 VARCHAR(40), CodePostal VARCHAR(5), Ville VARCHAR(40), ProfPere VARCHAR(40), ProfMere VARCHAR(40));
MariaDB [CarnetAdresses]> CREATE TABLE Enfants ( CodeFamille BIGINT NOT NULL, Prenom VARCHAR(40) NOT NULL, Sexe VARCHAR(1) NOT NULL, DateNaissance DATE NOT NULL, PRIMARY KEY (CodeFamille)); Query OK, 0 rows affected (0.02 sec) MariaDB [CarnetAdresses]>
Pour plus de facilité, copiez simplement la requête et collez-la dans votre terminal :
- enfants
CREATE TABLE Enfants ( CodeFamille BIGINT NOT NULL, Prenom VARCHAR(40) NOT NULL, Sexe VARCHAR(1) NOT NULL, DateNaissance DATE NOT NULL, PRIMARY KEY (CodeFamille));
Utilisez ensuite la commande SHOW pour visualiser le résultat de chaque instruction, par exemple :
MariaDB [CarnetAdresses]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | CarnetAdresses | | Nombres | | mysql | | performance_schema | | test | +--------------------+ 6 rows in set (0.00 sec) MariaDB [CarnetAdresses]>
MariaDB [CarnetAdresses]> SHOW TABLES FROM CarnetAdresses; +--------------------------+ | Tables_in_CarnetAdresses | +--------------------------+ | Enfants | | familles | +--------------------------+ 2 rows in set (0.00 sec) MariaDB [CarnetAdresses]>
MariaDB [CarnetAdresses]> SHOW COLUMNS FROM familles FROM CarnetAdresses; +-------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+----------------+ | CodeFamille | bigint(20) | NO | PRI | NULL | auto_increment | | Nom | varchar(40) | YES | | NULL | | | PrenomPere | varchar(40) | YES | | NULL | | | PrenomMere | varchar(40) | YES | | NULL | | | Adresse1 | varchar(40) | YES | | NULL | | | Adresse2 | varchar(40) | YES | | NULL | | | CodePostal | varchar(5) | YES | | NULL | | | Ville | varchar(40) | YES | | NULL | | | ProfPere | varchar(40) | YES | | NULL | | | ProfMere | varchar(40) | YES | | NULL | | +-------------+-------------+------+-----+---------+----------------+ 10 rows in set (0.00 sec) MariaDB [CarnetAdresses]>
MariaDB [CarnetAdresses]> SHOW INDEX FROM familles; +----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | familles | 0 | PRIMARY | 1 | CodeFamille | A | 0 | NULL | NULL | | BTREE | | | +----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 1 row in set (0.00 sec) MariaDB [CarnetAdresses]>
MariaDB [CarnetAdresses]> SHOW TABLE STATUS FROM CarnetAdresses; +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+ | Enfants | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 0 | 9437184 | NULL | 2017-10-30 15:17:13 | NULL | NULL | latin1_swedish_ci | NULL | | | | familles | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 0 | 9437184 | 1 | 2017-10-30 15:15:49 | NULL | NULL | latin1_swedish_ci | NULL | | | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+ 2 rows in set (0.00 sec) MariaDB [CarnetAdresses]>
Créez les enregistrements dans la table familles :
- data
INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Durant', 'Jacques', 'Jane', '23 rue Dutor','','92200', 'Neuilly', 'Plombier',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Tortua', 'Benoît', 'Carole', '7 rue Verget','', '75005', 'Paris', 'Cadre', 'Cadre'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Portier', 'Pierre', 'Elisabeth', '5 rue Toulet','', '92200', 'Neuilly', 'Dentiste',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Renault', 'Damien', 'Anne', '2 rue Ragon','', '75007', 'Paris', 'Comptable', 'Enseignante'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Darduet', 'Jean','','','','','','',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Rodier', 'Gérard', 'Aurélie', '6 rue Agien','', '77000', 'Fontainebleau', 'Professeur',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Tarte', 'Alla', 'Crème', '1 allée Durond','', '92200', 'Neuilly', 'Cuisinier', 'Cuisinière'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Cohen', 'David', 'Sarah', '7 Av d\'Eylau','', '75016', 'Paris', 'PDG', 'Assistante Direction'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Dupont2', 'Bruno', 'Odile', '12 rue Sébastien','', '75008', 'PARIS', 'Electricien', 'Comptable'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Durand2', 'Jacques', 'Jane', '23 rue Dutor','', '92200', 'Neuilly', 'Plombier',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Darmon2', 'Bruno', 'Béatrice', '2 rue Nicolo','', '13008', 'Marseille', 'Cadre', 'Peintre'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Darduet2', 'Jean', '','' ,'' ,'' ,'','',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Tarte2', 'Alla', 'Crème', '1 allée Durond','', '92200', 'Neuilly', 'Cuisinier', 'Cuisinière'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Cohen2', 'David', 'Sarah', '7 Av d\'Eylau','', '75016', 'Paris', 'PDG', 'Assistante Direction');
MariaDB [CarnetAdresses]> INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Durant', 'Jacques', 'Jane', '23 rue Dutor','','92200', 'Neuilly', 'Plombier',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Tortua', 'Benoît', 'Carole', '7 rue Verget','', '75005', 'Paris', 'Cadre', 'Cadre'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Portier', 'Pierre', 'Elisabeth', '5 rue Toulet','', '92200', 'Neuilly', 'Dentiste',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Renault', 'Damien', 'Anne', '2 rue Ragon','', '75007', 'Paris', 'Comptable', 'Enseignante'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Darduet', 'Jean','','','','','','',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Rodier', 'Gérard', 'Aurélie', '6 rue Agien','', '77000', 'Fontainebleau', 'Professeur',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Tarte', 'Alla', 'Crème', '1 allée Durond','', '92200', 'Neuilly', 'Cuisinier', 'Cuisinière'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Cohen', 'David', 'Sarah', '7 Av d\'Eylau','', '75016', 'Paris', 'PDG', 'Assistante Direction'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Dupont2', 'Bruno', 'Odile', '12 rue Sébastien','', '75008', 'PARIS', 'Electricien', 'Comptable'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Durand2', 'Jacques', 'Jane', '23 rue Dutor','', '92200', 'Neuilly', 'Plombier',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Darmon2', 'Bruno', 'Béatrice', '2 rue Nicolo','', '13008', 'Marseille', 'Cadre', 'Peintre'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Darduet2', 'Jean', '','' ,'' ,'' ,'','',''); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Tarte2', 'Alla', 'Crème', '1 allée Durond','', '92200', 'Neuilly', 'Cuisinier', 'Cuisinière'); INSERT INTO familles (Nom , PrenomPere , PrenomMere , Adresse1 , Adresse2 , CodePostal , Ville , ProfPere , ProfMere) VALUES ('Cohen2', 'David', 'Sarah', '7 Av d\'Eylau','', '75016', 'Paris', 'PDG', 'Assistante Direction'); Query OK, 1 row affected (0.01 sec) Query OK, 1 row affected (0.00 sec) Query OK, 1 row affected (0.01 sec) Query OK, 1 row affected (0.01 sec) Query OK, 1 row affected (0.00 sec) Query OK, 1 row affected (0.00 sec) Query OK, 1 row affected (0.01 sec) Query OK, 1 row affected (0.00 sec) Query OK, 1 row affected (0.01 sec) Query OK, 1 row affected (0.00 sec) Query OK, 1 row affected (0.01 sec) Query OK, 1 row affected (0.00 sec) Query OK, 1 row affected (0.01 sec) Query OK, 1 row affected (0.00 sec) MariaDB [CarnetAdresses]>
Saisissez maintenant chacune des commandes suivantes et expliquez le résultat obtenu. Les instructions sont numérotées pour faciliter vos prises de notes.
1 | ALTER TABLE Enfants ADD INDEX (Prenom); |
2 | ALTER TABLE Enfants DROP INDEX Prenom; |
3 | ALTER TABLE Enfants ADD TelPort VARCHAR(50) NOT NULL; |
4 | ALTER TABLE Enfants CHANGE TelPort TelPort VARCHAR( 22 ) NOT NULL; |
5 | ALTER TABLE Enfants ADD Test VARCHAR( 40 ) NOT NULL; |
6 | ALTER TABLE Enfants DROP Test; |
7 | SELECT * FROM familles; |
8 | SELECT * FROM familles LIMIT 8,12; |
Important - LIMIT - Avec un argument, la valeur spécifie le nombre de lignes à retourner depuis le début du jeu de résultat. Si deux arguments sont donnés, le premier indique le décalage du premier enregistrement à retourner, le second donne le nombre maximum d'enregistrement à retourner. Le décalage du premier enregistrement est 0 (pas 1).
9 | UPDATE familles SET Adresse1 = '120 rue de Vaugirard', CodePostal = '75015', Ville = 'PARIS' WHERE Nom = 'DARDUET' AND PrenomPere = 'Jean' LIMIT 1; |
10 | DELETE FROM familles WHERE Nom = 'DURANT' AND PrenomPere = 'Jacques'; |
11 | DELETE FROM familles WHERE Ville = 'Neuilly'; |
12 | SELECT * FROM familles LIMIT 8,12; |
13 | SELECT nom, PrenomPere FROM familles; |
14 | SELECT Nom AS 'Nom de famille', PrenomPere AS 'Prenom du Père' FROM familles; |
15 | INSERT INTO Enfants (Prenom, Sexe, CodeFamille) VALUES ('Georges', 'M', '14'); |
16 | SELECT familles.nom, familles.PrenomPere FROM familles, Enfants; |
Important - Créez la colonne familles.nb_enfants.
17 | UPDATE familles SET nb_enfants = '2' WHERE CodeFamille = '2'; |
18 | UPDATE familles SET nb_enfants = '1' WHERE CodeFamille = '4'; |
19 | UPDATE familles SET nb_enfants = '3' WHERE CodeFamille = '5'; |
20 | UPDATE familles SET nb_enfants = '2' WHERE CodeFamille = '6'; |
21 | UPDATE familles SET nb_enfants = '4' WHERE CodeFamille = '8'; |
22 | UPDATE familles SET nb_enfants = '5' WHERE CodeFamille = '9'; |
23 | UPDATE familles SET nb_enfants = '3' WHERE CodeFamille = '11'; |
24 | UPDATE familles SET nb_enfants = '1' WHERE CodeFamille = '12'; |
25 | UPDATE familles SET nb_enfants = '5' WHERE CodeFamille = '14'; |
26 | SELECT SUM(nb_enfants) FROM familles; |
27 | SELECT MIN(nb_enfants) AS 'Nb enfants minimum', MAX(nb_enfants) AS 'Nb enfants maximum', AVG(nb_enfants) AS 'Nb enfants moyen' FROM familles; |
28 | SELECT nom FROM familles WHERE ville = 'Paris'; |
29 | SELECT nom FROM familles WHERE ville = 'Paris' OR ville = 'Neuilly'; |
30 | ALTER TABLE Enfants DROP PRIMARY KEY; |
31 | INSERT INTO Enfants (Prenom, Sexe, CodeFamille) VALUES ('Alex', 'F', '12'); |
32 | INSERT INTO Enfants (Prenom, Sexe, CodeFamille) VALUES ('Mila', 'F', '2'); |
33 | INSERT INTO Enfants (Prenom, Sexe, CodeFamille) VALUES ('Amandine', 'F', '5'); |
34 | SELECT familles.Nom , Enfants.Prenom FROM familles, Enfants WHERE ( Enfants.CodeFamille = familles.CodeFamille ); |
35 | SELECT familles.nom, familles.PrenomPere FROM familles, Enfants; |
36 | SELECT ville, min(nb_enfants) as 'Nb enfants minimum', max(nb_enfants) as ' Nb enfants maximum', avg(nb_enfants) as 'Nb enfants moyen' from familles GROUP BY Ville; |
37 | SELECT * FROM familles ORDER BY nom; |
38 | SELECT * FROM familles GROUP BY ville, Nom; |
39 | UPDATE familles SET Adresse2 = '-'; |
40 | UPDATE familles SET Adresse2 = '___',nb_enfants=2; |
41 | UPDATE familles SET nb_enfants=4 WHERE Ville = 'Paris'; |
42 | UPDATE familles SET nb_enfants=7 LIMIT 4; |
43 | UPDATE familles SET nb_enfants=8 ORDER BY Nom LIMIT 3; |
44 | DELETE FROM familles WHERE Nom = 'Dupont'; |
45 | CREATE TABLE loisirs( Nom VARCHAR( 30 ) NOT NULL ); |
46 | DROP TABLE loisirs; |
47 | INSERT INTO familles (Nom, PrenomPere) VALUES ('Alouet','Jean'),('Rahtmi','Patrick'); |
48 | INSERT INTO familles (PrenomPere) SELECT Enfants.prenom FROM Enfants; |
49 | ALTER TABLE familles ADD Sports VARCHAR(50) NOT NULL; |
50 | ALTER TABLE familles ADD INDEX (Sports); |
51 | ALTER TABLE familles ADD INDEX (PrenomPere), ADD EmailPere VARCHAR( 50 ) NOT NULL; |
52 | ALTER TABLE familles CHANGE PrenomPere Prenom_Pere VARCHAR( 45 ) NOT NULL; |
53 | ALTER TABLE familles DROP Sports; |
54 | ALTER TABLE familles DROP INDEX PrenomPere; |
55 | ALTER TABLE familles DISABLE KEYS; |
56 | ALTER TABLE Enfants RENAME familles_enfants; |
57 | ALTER TABLE familles ORDER BY Prenom_Pere; |
58 | ALTER TABLE familles ADD Commentaire LONGTEXT NOT NULL ; |
59 | ALTER TABLE familles ADD FULLTEXT (Commentaire); |
60 | UPDATE familles SET Commentaire = 'La vie est un long fleuve tranquille' WHERE CodeFamille = '11'; |
61 | UPDATE familles SET Commentaire = 'Paris, capitale de la France est traversée par un fleuve' WHERE CodeFamille ='4'; |
62 | UPDATE familles SET Commentaire = 'Le ruisseau se jette dans la rivière qui se jette dans le FLEUVE' WHERE CodeFamille = '6'; |
63 | SELECT * FROM familles WHERE MATCH (Commentaire) AGAINST ('fleuve'); |
64 | SELECT Nom, Commentaire FROM familles WHERE MATCH (Commentaire) AGAINST ('-capitale+fleuve'IN BOOLEAN MODE); |
Copyright © 2021 Hugh Norris.