Vous êtes sur la page 1sur 117

SQL

SQ L

CO PY R IG HT
- SQL par David HURTREL est mis à disposition selon les termes
de la Licence Creative Commons Attribution - Pas d'Utilisation
Commerciale - Pas de Modi cation 4.0 International (CC BY-
NC-ND 4.0).

- Attribution — Vous devez créditer l'Œuvre, intégrer un lien vers


la licence et indiquer si des modi cations ont été effectuées à
l'Oeuvre. Vous devez indiquer ces informations par tous les
moyens raisonnables, sans toutefois suggérer que l'Offrant vous
soutient ou soutient la façon dont vous avez utilisé son Oeuvre.

- Pas d’Utilisation Commerciale — Vous n'êtes pas autorisé à


faire un usage commercial de cette Oeuvre, tout ou partie du
matériel la composant.

- Pas de modi cations — Dans le cas où vous effectuez un


remix, que vous transformez, ou créez à partir du matériel
composant l'Oeuvre originale, vous n'êtes pas autorisé à
distribuer ou mettre à disposition l'Oeuvre modi ée.

fi

fi
fi
fi

SQ L

1. BDD - SGBD - SGBDR

2. concevoir une BDD : Merise, MCD


(creately), MLD (MySQLWorkBench), MPD
(SQL)
SO MMA IRE 3. SQL

4. manipuler une base de données

5. performance et intégrité

SQ L

BDD
SGBD
SGBDR

B DD - SGB D - SGB DR

H ISTO IR E
- 1956 : invention des disques durs (utilisation des ordinateurs pour stocker des données)

- 1964 : apparition du terme "database" (collection d’informations)


années

- 1960 : apparition des premières bases de données hiérarchiques

- 1968 : création de Pick (système de gestion de bases de données)

- 1970 : apparition du terme "algèbre relationnelle" (origine des bases de données relationnelles)

- 1975 : invention du modèle entité-relation


années

- 1990 : apparition des bases de données objet-relationnel




B DD - SGB D - SGB DR

BDD
- BDD = Base De Données

- ensemble de données :

‣ stockées sur un support informatique

‣ structurées

‣ organisées
- permet de facilement consulter leur contenu il faut aussi :

‣ un système permettant de gérer la BDD

‣ un langage pour transmettre des instructions


B DD - SGB D - SGB DR

CL ASS IFICATION
- les BDD sont classées selon leur structuration :

‣ hiérarchique (arborescence, un seul parent)

‣ réseau (graphes, associations)

‣ relationnelle (tables, le plus utilisé)

‣ objet

‣ NoSQL (not only SQL : clé-valeur, document (JSON, XML), colonnes)


B DD - SGB D - SGB DR

SGBD
- SGBD = Sytème de Gestion de Bases de Données

- logiciel (ou ensemble de logiciels) permettant de manipuler les données d’une BDD

- manipuler = sélectionner, af cher, modi er, ajouter, supprimer

- ex.: MySQL
fi
fi

B DD - SGB D - SGB DR

SGBDR
- SGBDR = SGBD = Sytème de Gestion de Bases de Données Relationnelles

- les données sont contenues dans des relations, représentées sous forme de tables

- une BDD peut comporter plusieurs tables, chaque table dé nissant un certain nombre de
colonnes (caractéristiques de l’objet, attributs de l’en-tête)

- une relation est composée de deux parties :

‣ en-tête = composée de plusieurs attributs

‣ le corps = ensemble des lignes


- c’est le cas de MySQL

fi

B DD - SGB D - SGB DR

PROTO C O L E CLIEN T - SERV EUR


- beaucoup de SGBD sont basés sur le modèle client-serveur

- la BDD se trouve sur un serveur

- il faut un logiciel client pour interagir avec la BDD


B DD - SGB D - SGB DR

AU TRES S G BD R
- Oracle Database : coût élevé, gère bien les grands
volumes de données, plus performant, langage
procédural puissant (PL/SQL)

- PostgreSQL : open source, moins utilisé, moins


connu, longtemps disponible que sur UNIX, langage
procédural PL/pgSQL

- MS Access : payant, édité par Microsoft, que sous


Windows, pas adapté pour les grands volumes de
données, moins de fonctionnalités, interface
graphique intuitive

- SQLite : n’utilise pas le schéma client-serveur, stocke


dans de simples chiers, pas d’installation de serveur,
performant pour les petits volumes de données,
dif cile à sécuriser
fi
fi

B DD - SGB D - SGB DR

SQL
- SQL = Structured Query Language

- permet d’interagir avec des BDD relationnelles

- langage pour BDD le plus répandu et celui utilisé par MySQL

- créé dans les années 1970

- devenu standard en 1986


B DD - SGB D - SGB DR

OPÉ R ATIO NS
- considérons A et B deux relations

- sélection (restriction) : obtenir des lignes de A répondant à certains critères

- projection : obtenir une partie des attributs des lignes de A

- union : obtenir tout ce qui se trouve dans A ou B

- intersection : obtenir tout ce qui se trouve dans A et B

- différence : obtenir ce qui se trouve dans A mais pas dans B

- jointure : obtenir les lignes provenant de la liaison de A et B à l’aide d’une information


commune

SQ L

MYSQL
M YS QL

PRÉSE NTATION
- SGBDR

- un des SGBD les plus utilisés

- 1995 : première version

- 2018 : version 8.0

- moteur utilisé : InnoDB

- performance élevée en lecture


M YS QL

I N STA L LATION
M-W-L-X
- télécharger un serveur web local :

‣ Mac : MAMP A

‣ Windows : WAMP

‣ Linux : LAMP M

‣ tous : XAMPP
- MySQL est compris dans les serveurs web P
locaux
MAMP
- l’installation avec une plateforme AMP permet WAMP
aussi de prendre de l’avance lors du module PHP LAMP
XAMPP



M YS QL

T EST E R L' INSTALLATION D U SE RV E UR W E B LOC A L


- Windows :

‣ démarrer WAMP

‣ se rendre à l’adresse "http://localhost/phpmyadmin/"

‣ identi ant : root

‣ mot de passe : (aucun)


- Mac :

‣ démarrer MAMP

‣ se rendre à l’adresse "http://localhost:8888/phpMyAdmin/"

‣ identi ant : root

‣ mot de passe : root


fi
fi

M YS QL

UTILISATION EN LIGNE DE COMMANDE - TERMINAL


- toutes les instructions sont tapées à la main

- Mac : Applications => Utilitaires => Terminal

- Windows : Démarrer => Tous les programmes => Accessoires

- plus adapté pour les choses subtiles et compliquées

- dans du PHP, on doit écrire en dur les requêtes

M YS QL

U TIL I SATIO N E N L I G N E D E C O M M AN D E -
PRÉ PA RAT I O N

- Windows:

‣ ajouter le chemin de MySQL aux variables LOC ALISATIO N DE M YSQL


d'environnement
WAMP
C:\wamp64\bin\mysql\mysql5.7.14
‣ démarrer WAMP
MAMP
‣ démarrer le serveur /Applications/MAMP/Library/bin/mysql

XAMPP
- Mac : C:\xampp\mysql\bin

‣ ajouter le chemin de MySQL au chier de


con guration du terminal (.zshrc)

‣ démarrer MAMP

‣ démarrer le serveur


fi

fi

M YS QL

UT I LI SATIO N E N LI GNE D E COM M AND E - C O N N E X IO N / DÉC O N N E X IO N

- connexion :

mysql -u root -p
(le mot de passe pour l’utilisateur "root" sera demandé)

- déconnexion :

quit (ou exit)


M YS QL

I N TE R FACE G RAPH IQUE


- MySQLWorkbench

- phpMyAdmin (pour le web avec PHP)

- MySQL Front

M YS QL

SYN TAXE
SYNTAX E UTILIT É EXEMPLE
; n d’instruction

-- commentaire -- ceci est un commentaire

' chaîne de caractères 'je suis David HURTREL'

'je m\'appelle David HURTREL'


\ échapper un caractère
'je m'appelle David HURTREL'

\n retour à la ligne

\t tabulation

\\ antislash

% pourcent

_ souligné
fi

M YS QL

CO NVE NTIO NS
- pas d’espaces ou d'accents dans les noms de bases, tables ou colonnes

- pas de mots réservés (date, text, type…)

- les commandes et mots-clés sont écrites en majuscules

- les noms de bases, tables et colonnes en minuscules

M YS QL

CA LCU L
- pas de guillemets

- SQL est sensible à la priorité des opérations


EXEMPLE
SELECT (1+2)*3, 1+2*3;

donnera 9 et 7

M YS QL

U TILISATE U R
- root a tous les droits

- SQL est sensible à la priorité des opérations


EXEMPLE
- CREATE USER 'etudiant' (crée l’utilisateur etudiant)
CREATE USER 'etudiant'@'localhost' IDENTIFIED BY
- @'localhost' (dé nit à partir de où l’utilisateur peut se connecter) 'mot_de_passe';

- IDENTIFIED BY 'mot_de_passe' (dé nit le mot de passe de GRANT ALL PRIVILEGES ON maBase.* TO
l’utilisateur) 'etudiant'@'localhost';

- GRANT ALL PRIVILEGES (attribue tous les droits) mysql -u étudiant -p

- ON cours.* (BDD sur laquelle ces droits sont acquis pour toutes
les tables *)

- TO 'etudiant'@'localhost' (dé nit l’utilisateur et l’hôte auquel on


accorde les droits)

- on se connecte avec mysql -u etudiant -p


fi

fi
fi

SQ L

TYPES DE
DONNÉES
TY P ES D E DO N N É ES

POU RQU O I
- comprendre les usages et particularités pour mieux choisir et éviter :

‣ gaspillage de mémoire

‣ problèmes de performance

‣ comportement contraire à celui attendu

‣ impossibilité d’utiliser des fonctionnalités propres à un type de données


TY P ES D E DO N N É ES

TYP ES NU M ÉRIQUES - N OMB R E S E NT I E R S


- mot-clé INT

- déclinaisons : TINYINT, SMALLINT, MEDIUMINT, BIGINT

TYPE OCTETS MINIMUM MAXIM UM


TINYINT 1 -128 127

SMALLINT 2 -32768 32767

MEDIUMINT 3 -8388608 8388607

INT 4 -2147483648 2147483647

BIGINT 8 -9223372036854775808 9223372036854775807


TY P ES D E DO N N É ES

TYP ES NU M ÉRIQUES - ATTRI B UTS


- UNSIGNED : ne précise pas si une valeur est positive ou négative

- ZEROFILL : nombre de chiffres minimum à l’af chage

INT(4) ZEROFILL

STO CK É AFFI CHÉ


1 0001

12 0012

123 0123

1234 1234

12345 12345
fi

TY P ES D E DO N N É ES

TYP ES NU M ÉRIQUES - N OMB R E S DÉC I MAUX


- deux paramètres :

‣ précision : nombre de chiffres signi catifs

‣ échelle : nombre de chiffres après la virgule

TYPE OCTETS PARAMÈTRES VA LEURS


DECIMAL
1 précision, échelle exacte (chaîne de caractère)
NUMERIC

FLOAT 2 précision, échelle approchée (nombre)

REAL 4 approchée (nombre)

DOUBLE 8 approchée (nombre)



fi

TY P ES D E DO N N É ES

TY P E S A L PH A N UMÉR IQU ES - C H A Î N E S D E TY P E T E X T E

TY PE TAILLE MAX EXEMPLE MAXIM UM


CHAR 255 CHAR(x) complète avec des espaces jusqu’à avoir x caractères

VARCHAR 255 VARCHAR(x) stocke jusqu’à x caractères + la taille du texte

TEXT 28 octets

TINYTEXT 216 octets

MEDIUMTEXT 224 octets

LONGTEXT 232 octets


TY P ES D E DO N N É ES

TY PE S AL PHANUMÉRIQUES - CHAÎN E S D E TYPE BIN AIR E

- suite de caractères

- pas d’af chage par encodage ou interclassent, c’est une suite d’octets

- une chaîne binaire traite directement l'octet et pas le caractère que l’octet représente
(sensible à la casse)

- tous les caractères sont utilisables

- parfait pour les données brutes (ex.: images)


fi

TY P ES D E DO N N É ES

TY PE S AL PHANUMÉRIQUES - CHAÎN E S D E TYPE BIN AIR E

TY PE TAILLE MAX EXEMPLE MAXIM UM


BINARY 255 CHAR(x) complète avec des espaces jusqu’à avoir x caractères

VARBINARY 255 VARCHAR(x) stocke jusqu’à x caractères + la taille du texte

BLOB 28 octets

TINYBLOB 216 octets

MEDIUMBLOB 224 octets

LONGBLOB 232 octets


TY P ES D E DO N N É ES

TYP ES A L PH A N UM É R IQ UE S - E N U M (MYS QL)

- colonne pour laquelle on dé nit un certain nombre


de valeurs autorisées, de type chaîne de caractères

- si valeur non autorisée : ' ' sera stocké dans le champ EXEMPLE
- si on a donné l’autorisation de ne pas contenir de ENUM('HTML', 'CSS', 'JS')
valeur : NULL sera stocké
la colonne pourra contenir les chaînes HTML, CSS et JS

- deux possibilités pour remplir un champ ENUM : la colonne ne pourra pas contenir les chaînes SQL, PHP

‣ remplir directement avec la valeur : ENUM(NULL),


ENUM(''), ENUM('HTML'), ENUM('CSS'),
ENUM('JavaScript')

‣ l’index de la valeur : ENUM(NULL), ENUM(0),


ENUM(1), ENUM(2), ENUM(3)

fi

TY P ES D E DO N N É ES

TY PE S AL PHANUMÉRIQ UES - SET (MYSQL)

- semblable à ENUM

- différence : on peut y stocker 0, 1 ou plusieurs


valeurs EXEMPLE

- la séparation des valeurs se fait avec une SET('HTML', 'CSS', 'JS')

virgule, sans espace, la totalité entourée de la colonne pourra contenir : '' (chaîne vide), 'HTML',
'HTML,CSS', 'HTML,CSS,JS' — …
guillemets

- on ne peut pas stocker deux fois la même


valeur

TY P ES D E DO N N É ES

TYP ES TE M PORELS - DATE


- sert à stocker une date

- ordre des données : année, mois, jour

- exemples :

‣ AAAA-MM-JJ

‣ AAAA/MM/JJ

‣ AAAAMMJJ

‣ AA-MM-JJ
- MySQL supporte les DATE de 1001-01-01 à 9999-12-31

TY P ES D E DO N N É ES

TYP ES TE M PORELS - TIME


- sert à stocker une heure

- ordre des données : heures, minutes, secondes

- exemples :

‣ HH:MM:SS

‣ HHH:MM:SS

‣ MM:SS

‣ HH-MM-SS
- MySQL supporte les TIME de -838:59:59 à 838:59:59

TY P ES D E DO N N É ES

TYP ES TE M PORELS - DATET IM E


- sert à stocker une date et une heure

- ordre des données : année, mois, jours, heures, minutes, secondes

- exemples :

‣ AAAA-MM-JJ HH:MM:SS (format MySQL)

‣ AAAAMMJJHHMMSS (format nombre)


- MySQL supporte les DATETIME de 1001-01-01 00:00:00 à 9999-12-31 23:59:59

TY P ES D E DO N N É ES

TYP ES TE M PORELS - YEA R


- sert à stocker une année

- ne prend qu'un octet

- sous forme de chaîne de caractère ou d’entier

- MySQL supporte les YEAR de 1901 à 2155


TY P ES D E DO N N É ES

TYP ES TE M PORELS - TIMESTAMP


- le TIMESTAMP d’une date est le nombre de secondes écoulées depuis le 1er janvier 1970 à
minuit UTC et la date en question

- utilise 4 octets

- limite : 19 janvier 2038 à 3 h 14 min 7 s

- dans MySQL, TIMESTAMP ne sert qu’à stocker un DATETIME au format numérique


TY P ES D E DO N N É ES

TYP ES TE M PORELS - VALEUR S PA R DÉ FAUT

TY PE VALEUR PA R DÉFAUT
DATE 0000-00-00

TIME 00:00:00

DATETIME 0000-00-00 00:00:00

YEAR 0000

TIMESTAMP 00000000000000
SQ L

CONCEVOIR
UNE BDD
CO NCE VO IR UN E B DD

CO NC E PTIO N D'UN E BD D
- on utilise la méthodologie Merise et les diagrammes entités-relations

- on dessine les modèles

- on ne mélange pas les étapes


CO NCE VO IR UN E B DD

M É TH ODO LO GIE MERISE


- avant de créer une BDD, il faut la concevoir

- méthodologie Merise (et diagrammes entités-relations) :

‣ analyse du "problème" => domaine

‣ description du problème => modèle conceptuel (MCD)

‣ traduction du modèle conceptuel => modèle logique (MLD)

‣ implémentation du modèle logique => modèle physique (MPD)


CO NCE VO IR UN E B DD

DOMA I NE
- analyse du domaine : étude du problème et consignation sans un document

- note de clari cation, besoins, choix, contraintes

- analyse de d’usages existants :

‣ documents existants (formulaire papier, che description produit, tableur, BDD existante…)

‣ discussion avec les utilisateurs cibles (clients, administrateurs…)

‣ consultation d’experts métier (employés, cadres, experts externes…)

‣ système informatique (ERP, CRM, cloud…)


fi

fi

CO NCE VO IR UN E B DD

M CD
- MCD = Modèle Conceptuel de Données

- représentation schématique permettant de


décrire un système d’informations

- outils en ligne :

‣ Creately : creately.com

‣ Draw.io (diagrams.net) : draw.io

‣ …

CO NCE VO IR UN E B DD

VO CAB U LAIRE
- entité : regroupement d’informations
(ex.: utilisateur et article)

- attribut : caractéristique décrivant les entités


(ex.: id_utilisateur, nom, prenom…)

- relation (association) : liaison logique entre entités


(ex.: rédiger)

- identi ants : attribut permettant d’identi er une


entité de manière unique
(ex.: id_utilisateur et id_article)

- cardinalité : nombre de correspondances


minimum et maximum entre deux entités
(ex.: 1,1 et 0,n)
fi


fi



CO NCE VO IR UN E B DD

MLD
- MLD = Modèle Logique de Données

- se déduit du MCD

CO NCE VO IR UN E B DD

M L D - É TA P E S
- pour passer du MCD au MLD :

1. une entité devient une table (possibilité de fusionner les entités homogènes)

2. un identi ant devient une clé primaire

3. les attributs sont typés (INT, VARCHAR, DATE, TEXT…)

4. les relations sont identi ées et traduites :

‣ relation binaire (0, 1) : création d’une clé étrangère dans l’une des tables

‣ relation binaire (1, 1) : fusion des deux tables ou création d’une clé étrangère dans l’une des tables

‣ relation binaire (1, n) : création d’une clé étrangère dans la table côté 1

‣ relation binaire (n, m) : création d’une table reprenant deux clés étrangères correspondant aux clés
primaires de chaque table
fi
fi

CO NCE VO IR UN E B DD

M L D - E XE M PLES
- il est possible d’utiliser MysqlWorkBench ou un outil de visualisation pour réaliser un MLD

- MysqlWorkBench permet aussi de se connecter aux BDD pour les manipuler

- il est possible concevoir sa BDD sans MCD une fois le MLD compris

CO NCE VO IR UN E B DD

M YSQL WO R K B EN CH
- MysqlWorkBench permet aussi de se connecter aux BDD pour les manipuler

- il est possible concevoir sa BDD sans MCD une fois le MLD compris

- MySQL Workbench :

‣ outil de visualisation pour réaliser un MLD

‣ lien de téléchargement : https://dev.mysql.com/downloads/workbench/


CO NCE VO IR UN E B DD
CREATE TABLE IF NOT EXISTS `mydb`.`article` (
`id` INT NOT NULL AUTO_INCREMENT,
`titre` VARCHAR(255) NOT NULL,
`contenu` LONGTEXT NOT NULL,
M PD `img` VARCHAR(255) NOT NULL,
`date_redaction` DATETIME NOT NULL,
`id_utilisateur` INT NOT NULL,
PRIMARY KEY (`id`),
- MPD = Modèle Physique de Données UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
INDEX `fk_article_utilisateur1_idx`
(`utilisateur_id` ASC) VISIBLE,
- traduction du MLD en SQL CONSTRAINT `fk_article_utilisateur1`
FOREIGN KEY (`utilisateur_id`)
REFERENCES `mydb`.`utilisateur` (`id`)
- MysqlWorkBench permet d’exporter ON DELETE NO ACTION
ON UPDATE NO ACTION
directement un MLD en SQL )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `mydb`.`utilisateur` (


`id` INT NOT NULL AUTO_INCREMENT,
`nom` VARCHAR(255) NOT NULL,
`prenom` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`mot_de_passe` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE,
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;





























CO NCE VO IR UN E B DD

SCHÉMA - DATA
- schéma = structure

- data = données

- MySQL permet de manipuler le schéma et les datas

- le MPD peut toujours être modi é avec ALTER

id nom prenom
1 Hurtrel David

2 Dupont Jean

fi

SQ L

MYSQL
WORKBENCH
SQ L

M A NIPU LER U N E
BAS E DE DONNÉES
M A NIPU LE R UN BASE D E D ON N É E S

CO MM ENTA IRE S
- -- commentaire jusqu’à la n de la ligne

- # commentaire jusqu’à la n de la ligne EXEMPLE DE BUG POTENTIEL

- /* SELECT * -- sélectionner tout


FROM `commandes`; -- dans la table commandes
commentaire
si système supprimant les retours à la ligne :
sur
plusieurs SELECT * -- sélectionner tout FROM `commandes`; --
dans la table commandes
lignes
*/

- les commentaires sur une ligne peuvent


causer des bugs






fi
fi

M A NIPU LE R UN BASE D E D ON N É E S

CR E ATE DATABASE
- commande permettant la création d’une base
de données

- CREATE DATABASE ma_base EXEMPLE


- IF NOT EXISTS permet de véri er si la base de CREATE DATABASE IF NOT EXISTS blog;

données existe déjà crée la base blog si celle-ci n’existe pas déjà

- des options peuvent être utilisées mais elles


dépendant du SGBD utilisé (jeu de caractères,
propriétaire, limite de connexion, …)

fi
M A NIPU LE R UN BASE D E D ON N É E S

DROP DATA BAS E


- commande permettant de supprimer une
base de données

- DROP DATABASE ma_base EXEMPLE


- IF EXISTS permet de véri er si la base de DROP DATABASE IF EXISTS blog;

données existe supprime la base blog si celle-ci existe


fi

M A NIPU LE R UN BASE D E D ON N É E S

CR E ATE TA BLE
- commande permettant la création d’une table
dans une base de données EXEMPLE
- CREATE TABLE table ( CREATE TABLE `utilisateur` (
'id' INT NOT NULL,
colonne1 type_de_donnees, 'nom' VARCHAR(45),
colonne2 type_de_donnees, 'prenom' VARCHAR(45),
'email' VARCHAR(100),
colonne3 type_de_donnees, 'mot_de_passe' VARCHAR(255),
);
colonne4 type_de_donnees
) crée la table utilisateurs

- NOT NULL : la valeur ne pourra pas être nulle












M A NIPU LE R UN BASE D E D ON N É E S

PRIM A RY K E Y
- permet d’identi er chaque enregistrement dans une table

- chaque enregistrement pour ce champ doit être unique EXEMPLE


et ne doit pas être nul
CREATE TABLE `utilisateur` (
'id' INT,
- la clé primaire est un index : chaque table ne peut 'nom' VARCHAR(45),
contenir qu’une seule clé primaire 'prenom' VARCHAR(45),
'email' VARCHAR(100),
'mot_de_passe' VARCHAR(255),
- CREATE TABLE table ( PRIMARY KEY ('id')
'id' INT PRIMARY KEY NOT NULL AUTO_INCREMENT, );
[…]
crée la table utilisateurs
);

- CREATE TABLE table (


'id' INT NOT NULL AUTO_INCREMENT,
[…],
PRIMARY KEY (`id`)
);




fi











M A NIPU LE R UN BASE D E D ON N É E S

AU TO_ INC R E MENT


- permet de spéci er si une colonne numérique
avec une clé primaire doit être incréments EXEMPLE
automatiquement à chaque enregistrement
CREATE TABLE `utilisateur` (
'id' INT,
- CREATE TABLE table ( 'nom' VARCHAR(45) AUTO_INCREMENT=100,
'prenom' VARCHAR(45),
'id' INT NOT NULL AUTO_INCREMENT, 'email' VARCHAR(100),
'mot_de_passe' VARCHAR(255),
[…], PRIMARY KEY ('id')
PRIMARY KEY ('id') );

); crée la table utilisateurs

- une valeur initiale peut être précisée



fi









M A NIPU LE R UN BASE D E D ON N É E S

ALTER TA B L E EXEMPLE
Ajouter une colonne role à la table
- permet de modi er une table existante utilisateur :

- ALTER TABLE table ALTER TABLE `utilisateur`


ADD 'role' VARCHAR(20);

- ADD : ajoute une colonne Modifier le type de la colonne role :


DROP COLUMN : supprime une colonne
ALTER TABLE `utilisateur`
- MySQL : MODIFY 'role' VARCHAR(10);

‣ MODIFY colonne type_de_donnees Modifie le nom de la colonne role :

ALTER TABLE `utilisateur`


‣ CHANGE colonne_ancien colonne_nouveau CHANGE 'role' 'roles';
type_de_données
Supprimer la colonne roles :
- PostgreSQL :
ALTER TABLE `utilisateur`
‣ ALTER COLUMN colonne TYPE type_de_données DROP COLUMN 'roles';

‣ RENAME COLUMN colonne_ancien TO colonne_nouveau


fi





M A NIPU LE R UN BASE D E D ON N É E S

DROP TA BL E
- permet de supprimer une table

- DROP TABLE table;


EXEMPLE
DROP TABLE `utilisateur`;

supprime la table utilisateur


M A NIPU LE R UN BASE D E D ON N É E S

T RU NCATE TAB LE
- permet de supprimer le contenu d’une table
sans supprimer la table elle-même

- TRUNCATE TABLE table; EXEMPLE


TRUNCATE TABLE `utilisateur`;

supprime le contenu de la table


utilisateur mais conserve la table

M A NIPU LE R UN BASE D E D ON N É E S

M E RGE
- permet d’insérer ou mettre à jour des données dans une table (upsert)

- MERGE INTO table1


USING table_reference
ON (conditions)
WHEN MATCHED THEN
UPDATE SET table1.colonne1 = valeur, table1.colonne2 = valeur2
DELETE WHERE condition2
WHEN NOT MATCHED THEN
INSERT (colonnes1, colonne3)
VALUES (valeur1, valeur3)

- MERGE INTO : sélectionne la table à modi er


USING et ON : liste les données sources et la conditionne correspondance
WHEN MATCHED : condition de mise à jour lorsque la condition est véri ée
WHEN NOT MATCHED : condition d’insertion lorsque la condition n’est pas validée

- les différents SGBD n’implémentent pas cette fonctionnalité de la même façon (standard, UPSERT, non standard)







fi


fi


M A NIPU LE R UN BASE D E D ON N É E S

SE L ECT
- permet de lire les données

- SELECT colonne EXEMPLE


FROM table;
Donne la liste des noms des utilisateur :

SELECT `nom` FROM `utilisateur`;

Donne toutes les informations sur les utilisateurs :

SELECT * FROM `utilisateur`;


M A NIPU LE R UN BASE D E D ON N É E S

DISTIN CT
- permet d’éviter les redondances (lignes en
double)

- SELECT DISTINCT colonne EXEMPLE


FROM table; SELECT DISTINCT `nom`
FROM `utilisateur`;

donne la liste des noms des utilisateurs


en évitant les doublons




M A NIPU LE R UN BASE D E D ON N É E S

WH E R E
- permet d’extraire des lignes selon une
condition
EXEMPLE
- SELECT colonnes
FROM table SELECT DISTINCT `nom`
FROM `utilisateur`
WHERE condition; WHERE `prenom` = 'David';

donne la liste des noms des utilisateurs


ayant pour prénom David






M A NIPU LE R UN BASE D E D ON N É E S

AN D & O R
EXEMPLE
- opérateurs logiques permettant de combiner
des conditions SELECT `email`
FROM `utilisateur`
WHERE `prenom` = 'David'
- AND : et AND `nom` = 'HURTREL';

OR : ou donne la liste des emails des utilisateurs


ayant pour prénom David et nom Hurtrel

- SELECT colonne SELECT `email`


FROM table FROM `utilisateur`
WHERE `prenom` = 'David'
WHERE condition1 AND condition2; OR `nom` = 'HURTREL';

donne la liste des emails des utilisateurs


- SELECT colonne FROM table ayant pour prénom David ou nom Hurtrel
WHERE condition1 OR condition2;












M A NIPU LE R UN BASE D E D ON N É E S

IN
- opérateur logique permettant de véri er si EXEMPLE
une colonne est égale à une des valeurs
SELECT `email`
indiquées FROM `utilisateur`
WHERE `prenom` = 'David'
OR `prenom` = 'Jean'
- évite d’utiliser OR plusieurs fois OR `prenom` = 'Pierre';

- SELECT colonne SELECT `email`


FROM `utilisateur`
FROM table WHERE `prenom`
IN ('David', 'Jean', 'Pierre');
WHERE colonne
donnent la liste des emails des utilisateurs
IN (valeur1, valeur2, valeur3, …); ayant pour prénom David, Jean ou Pierre











fi
M A NIPU LE R UN BASE D E D ON N É E S

BET WE EN
- opérateur permettant de sélectionner un
intervalle de données
EXEMPLE
- SELECT *
SELECT *
FROM table FROM `article`
WHERE colonne WHERE `date_redaction`
BETWEEN '2020-01-01 00:00:00'
BETWEEN 'valeur1' AND 'valeur2'; AND '2020-12-31 23:59:59';

donne la liste des articles parus en 2020









M A NIPU LE R UN BASE D E D ON N É E S

L IK E
- opérateur permettant d’effectuer une recherche sur un
modèle particulier

- SELECT * EXEMPLE
FROM table
WHERE colonne SELECT *
LIKE modele; FROM `utilisateur`
WHERE `email`
LIKE '%gmail.com';
- %a : termine par a
donne la liste des utilisateurs ayant
- b% : commence par b un email se terminant par gmail.com

- %c% : utilise c

- de%fg : commence par de et termine par fg

- h_i : _ peut être remplacé par un seul caractère (ex.: hai, hbi,
…)

- % et _ sont appelés des wildcards




M A NIPU LE R UN BASE D E D ON N É E S

I S N U L L & IS NOT N ULL


- opérateur permettant de ltrer les résultats
contenant la valeur NULL
EXEMPLE
- SELECT *
FROM table SELECT *
FROM `utilisateur`
WHERE colonne IS NULL; WHERE `email` IS NULL;

donne la liste des utilisateurs


- SELECT * n’ayant pas renseigné de nom
FROM table
WHERE colonne IS NOT NULL;






fi
M A NIPU LE R UN BASE D E D ON N É E S

GROU P BY
- commande utilisée pour grouper plusieurs
résultats et utiliser une fonction de totaux sur
un groupe de résultats EXEMPLE
- SELECT colonne1, fonction(colonne2) SELECT `client`, SUM(`tarif`)
FROM `achat`
FROM table GROUP BY `client`;
GROUP BY colonne1; donne le montant total des
achats de chaque client




M A NIPU LE R UN BASE D E D ON N É E S

H AV IN G
- conditions permettant de ltrer en utilisant
des fonctions
EXEMPLE
- SELECT colonne1, SUM(colonne2)
SELECT `client`, SUM(`tarif`)
FROM table FROM `achat`
GROUP BY colonne1 GROUP BY `client`
HAVING SUM(`tarif`) > 50;
HAVING fonction(colonne2) operateur valeur;
donne la liste des clients ayant acheté pour
au moins 50 € toute commandes confondues





fi

M A NIPU LE R UN BASE D E D ON N É E S

ORDE R BY
- commande permettant de trier les lignes
dans le résultat d’une requête
EXEMPLE
- SELECT colonne1, colonne2
FROM table SELECT *
FROM `utilisateur`
ORDER BY colonne1; ORDER BY `nom` DESC;

donne la liste des utilisateurs triés par


- ASC : ordre croissant (par défaut) ordre alphabétique décroissant (Z à A)

- DESC : décroissant



M A NIPU LE R UN BASE D E D ON N É E S

AS
- alias permettant de renommer
temporairement une colonne ou une table
dans une requête EXEMPLE
- SELECT colonne1 AS c1, colonne2 SELECT *p_nom_fr AS nom, p_prix_euro AS prix
FROM `produit`
FROM table; ORDER BY `nom` DESC;

donne les noms en français et prix en euro des


produits triés par ordre alphabétique décroissant




M A NIPU LE R UN BASE D E D ON N É E S

L IM IT & O FFS ET
- LIMIT : clause permettant de spéci er la limite EXEMPLE
maximum de résultats d’une requête
SELECT *
FROM `article`
- OFFSET : décalage LIMIT 20;

- SELECT * donne une liste de 20 articles

FROM table SELECT *


FROM `article`
LIMIT nombre; LIMIT 10 LIMIT 5;

- SELECT * donne une liste de 10 articles en


omettant les 5 premiers (6 à 15)
FROM table
LIMIT nombre1 OFFSET nombre2;









fi

M A NIPU LE R UN BASE D E D ON N É E S

CASE
- permet l’utilisation de conditions si / sinon
EXEMPLE
- CASE a SELECT `id`, `titre`, `commentaires`
WHEN 1 THEN 'un' CASE
WHEN `commentaires` = NULL THEN 'Sans
WHEN 2 THEN 'deux' commentaire'
WHEN 3 THEN 'trois' WHEN `commentaires` > 10 THEN 'Trop de
commentaires'
ELSE 'autre' ELSE 'Article commenté'
END
END; FROM `article`;

- CASE affiche un message selon la condition

WHEN a=b THEN 'A égal à B'


WHEN a>b THEN 'A supérieur à B'
ELSE 'A inférieur à B'
END;
















M A NIPU LE R UN BASE D E D ON N É E S

U NION
- permet de mettre bout à bout les résultats de
plusieurs requêtes (permet de concaténer des
résultats)

- il est nécessaire que chacune des requêtes


retourne le même nombre de colonnes avec
le même type de données et dans le même
ordre EXEMPLE
SELECT `client` FROM `magasin1`
- SELECT * FROM table1 UNION
SELECT `client` FROM `magasin2`;
UNION
SELECT * FROM table2; donne une liste des clients des 2
magasins en ignorant les doublons

- UNION ALL : inclut les doublons




M A NIPU LE R UN BASE D E D ON N É E S

I N TE R SEC T
- permet d’obtenir l’intersection des résultats
de deux requêtes (enregistrements communs)

- il est nécessaire que chacune des requêtes


retourne le même nombre de colonnes avec
le même type de données et dans le même
ordre
EXEMPLE
- SELECT * FROM table1 SELECT `client` FROM `magasin1`
INTERSECT INTERSECT
SELECT `client` FROM `magasin2`;
SELECT * FROM table2;
donne la liste des clients qui
se rendant dans les 2 magasins






M A NIPU LE R UN BASE D E D ON N É E S

E XCEPT & M I NUS


- EXCEPT (PostgreSQL) et MINUS (MySQL,
Oracle) permettent de de récupérer les
enregistrements de la première instruction
sans inclure le résultats de la seconde
requête

- il est nécessaire que chacune des requêtes


retourne le même nombre de colonnes avec EXEMPLE
le même type de données et dans le même SELECT `client` FROM `magasin1`
ordre MINUS
SELECT `client` FROM `magasin2`;

- SELECT * FROM table1 donne la liste des clients qui


se rendant dans les 2 magasins
MINUS
SELECT * FROM table2;




M A NIPU LE R UN BASE D E D ON N É E S

I MP ORT
- SOURCE /chemin/du/dossier/désiré/nom_ chier.sql
ou
mysql -u nom_utilisateur -p -h localhost base_de_données < nom_ chier.sql

fi

fi
M A NIPU LE R UN BASE D E D ON N É E S

E XP ORT
- cd chemin/vers/le/dossier/désiré

- mysqldump -u nom-utilisateur -p base_de_données > nom_ chier.sql

fi
SQ L

CRUD
CR UD

DÉ FIN IT IO N
- opérations de base pour la manipulation de données

- Create : créer (INSERT)

- Read : lire (SELECT)

- Update : modi er (UPDATE)

- Delete : supprimer (DELETE)


fi

CR UD

I N SERT EXEMPLE
INSERT INTO `utilisateur`
- permet d’insérer des données dans une table VALUES ('Hurtrel', 'David',
'david.hurtrel@gmail.com');

- ON DUPLICATE KEY UPDATE permet de mettre INSERT INTO `utilisateur`


VALUES
à jour des données si un enregistrement ('Hurtrel', 'David', 'david.hurtrel@gmail.com'),
existe déjà ('DUPONT', 'Jean', 'jean.dupont@domaine.com');

insèrent les noms, prénoms et emails


- INSERT INTO table VALUES ('valeur1', 'valeur2', dans la table utilisateurs

…); INSERT INTO `vote` (`nom`, `compte`, `dernier`)


VALUES ('David', 1, NOW())
ON DUPLICATE KEY UPDATE `compte` = `compte`+1,
- INSERT INTO table (a, b, c) `dernier` = NOW()
VALUES (1, 2, 3)
vérifie si David a déjà eu des votes :
ON DUPLICATE KEY UPDATE a=a+1; si non : création de la ligne
si oui : incrémentation










CR UD

SE L ECT
- permet de lire les données

- SELECT colonne EXEMPLE


FROM table;
Donne la liste des noms des utilisateur :

SELECT `nom` FROM `utilisateur`;

Donne toutes les informations sur les utilisateurs :

SELECT * FROM `utilisateur`;


CR UD

U PDAT E
- permet de modi er des données déjà
existantes

- UPDATE table EXEMPLE


SET colonne1 = nouvelle_valeur UPDATE `utilisateur`
WHERE condition; SET `email` = 'jean.dupont@mail.com'
WHERE `nom` = 'Dupont':

change l’email de la ligne où le nom est Dupont




fi



CR UD

DE L E T E
- permet de supprimer des données dans une
table

- DELETE FROM table EXEMPLE


WHERE condition;
DELETE FROM `utilisateur`
WHERE `nom` = 'Dupont':
- DELETE sans condition supprimera toutes les
supprime l’utilisateur(s) qui a le nom Dupont
données de la table



SQ L

FONCTIONS
FONC TI O N S

FO NC TI ONS D'AGRÉGATIO N
- MIN(nom_colonne) FROM table

- MAX(nom_colonne) FROM table

- AVG(nom_colonne) FROM table

- SUM(nom_colonne) FROM table

- COUNT(nom_colonne) FROM table

- …

FONC TI O N S

FO NC TI ONS DE CH AÎN E DE C A R AC T È R E
- CONCAT(colonne1, '-', colonne2) => colonne1-colonne2

- REPLACE('Hello world !', 'Hello', 'Bonjour'); => Bonjour world !

- LENGTH('Exemple') => 7

- LOWER('BONJOUR tout le monde'); => bonjour tout le monde

- UPPER('Exemple') => EXEMPLE

- LEFT(chaine, 2); => ch

- RIGHT(chaine, 3); => ine

- …

FONC TI O N S

FO NC TI ON D E DATE
- DATE_FORMAT(date, format)

- TIMESTAMP("YYYY-MM-DD", "HH:MM");

- NOW();

- SEC_TO_TIME(1); => 00:00:01

- TIME_TO_SEC(00:00:01) => 1

- …

FONC TI O N S

AU TRES FO NC TIONS
- RAND();

- ROUND(nom_colonne) FROM 'table'

- MD5('mot_de_passe');

- SHA1('mot_de_passe');

- …

SQ L

SOUS-
REQUÊTES
SO U S- REQU ÊT ES

SOUS- R EQ U ÊT E
- aussi appelée requête imbriquée ou requête en cascade

- exécution d’une requête dans une autre

- souvent avec une clause WHERE, HAVING ou IN

SO U S- REQU ÊT ES

SOUS- R EQ U ÊT E RETOURN A NT UN S E UL R É S ULTAT


- SELECT *
FROM table
WHERE colonne = (
SELECT valeur
FROM table2
LIMIT 1
);






SO U S- REQU ÊT ES

SOUS- R EQ U ÊT E RETOURN A NT UNE C OLONNE


- SELECT *
FROM table
WHERE nom_colonne IN (
SELECT colonne
FROM table2
WHERE cle_etrangere = 36
);






SO U S- REQU ÊT ES

E XISTS
- clause conditionnelle pour véri er la présence (ou non) de lignes

- SELECT colonne1
FROM table1
WHERE EXISTS (
    SELECT colonne2
    FROM table2
    WHERE colonne3 = 10
);






fi

SO U S- REQU ÊT ES

E XISTS
- permet de comparer une valeur dans l’ensemble des valeurs de la sous-requête

- opérateurs conditionnels : =, <, >, <>, !=, <=, >=, !>, !<

- SELECT *
FROM table1
WHERE condition > ALL (
  SELECT *
  FROM table2
  WHERE condition2
);






SO U S- REQU ÊT ES

AN Y - S O M E
- permet de comparer une valeur avec le résultat d’une sous-requête

- "= ANY" est équivalent à "IN"

- SELECT *
FROM table1
WHERE condition > ANY (
SELECT *
FROM table2
WHERE condition2
);






SQ L

JOINTURES
J O INT URE S

J OIN T UR E S
- permet de récupérer des données de plusieurs tables en une seule requête

- plus performant que les sous-requêtes

- les jointures sont à privilégier face aux requêtes imbriquées

J O INT URE S

CLI ENT CO MMA NDE


I N NE R J O IN
I D N OM P R E NOM I D I D _ CL I E N T N UM _ C MD E M ONTA NT

1 Hurtrel David 1 1 C00123 19,99


- permet de lier plusieurs tables entre elles 2 Dupont Jean 2 1 C00352 2,99

- aussi appelée EQUIJOIN 3 Troijour Adam 3 2 C01387 2,39

- retourne les enregistrements lorsqu’il y a au SELECT `id`, `nom`, `prenom`, `num_cmde`, `montant`
FROM `clients`
moins une ligne dans chaque colonne qui INNER JOIN `commandes`
ON `clients`.`id` = `commandes`.`id_client`;
correspond à la condition

- SELECT * RÉSULTAT
FROM table1
INNER JOIN table2 I D N OM P R E NOM N UM _ C MD E M ONTA NT

ON table1.id = table2.fk_id 1 Hurtrel David C00123 19,99

(ou WHERE table1.id = table2.fk_id); 1 Hurtrel David C00352 2,99

2 Dupont Jean C01387 2,39









J O INT URE S

HOMM E FEMME
CROSS JO IN I D _ H P R E NOM N OM I D _ F I D _ CL I E N T M ONTA NT

1 Alain Verse 1 Daisy Rable

- permet de retourner le produit cartésien de 2 Serge Oin 2 Lucie Dité

deux tables 3 Adam Troijour

- souvent associé à une clause WHERE pour SELECT * FROM `homme` CROSS JOIN `femme`;

limiter les résultats

- SELECT * RÉSULTAT
FROM table1 I D _ H P R E NOM N OM I D _ F P R E NOM N OM
CROSS JOIN table2; 1 Alain David 1 Daisy Rable

1 Alain David 2 Lucie Dité

2 Serge Oin 1 Daisy Rable

2 Serge Oin 2 Lucie Dité

3 Adam Troijour 1 Daisy Rable

3 Adam Troijour 2 Lucie Dité



J O INT URE S

CLI ENT CO MMA NDE


L E FT JO IN I D N OM P R E NOM I D I D _ CL I E N T N UM _ C MD E M ONTA NT

1 Hurtrel David 1 1 C00123 19,99

- permet de lister tout les résultats de la table 2 Dupont Jean 2 1 C00352 2,99

de gauche même sans correspondance dans 3 Troijour Adam 3 2 C01387 2,39

la deuxième table
SELECT *
- aussi appelée LEFT OUTER JOIN FROM `clients`
LEFT JOIN `commandes`
ON `clients`.`id` = `commandes`.`id_client`;
- SELECT *
FROM table1
LEFT JOIN table2 ON table1.id = table2.fk_id; RÉSULTAT
I D N OM P R E NOM N UM _ C MD E M ONTA NT

1 Hurtrel David C00123 19,99

1 Hurtrel David C00352 2,99

2 Dupont Jean C01387 2,39

3 Troijour Adam NULL NULL







J O INT URE S

CLI ENT CO MMA NDE


RIGHT JO IN
I D N OM P R E NOM I D I D _ CL I E N T N UM _ C MD E M ONTA NT

1 Hurtrel David 1 1 C00123 19,99


- permet de lister tout les résultats de la table 2 Dupont Jean 2 1 C00352 2,99
de droite même sans correspondance dans la
3 Troijour Adam 3 4 C01387 2,39
table de gauche

- aussi appelée RIGHT OUTER JOIN SELECT *


FROM `clients`
RIGHT JOIN `commandes`
- SELECT * ON `clients`.`id` = `commandes`.`id_client`;

FROM table1
RIGHT JOIN table2 ON table1.id = table2.fk_id; RÉSULTAT
ID N OM P R E NOM N UM _ C MD E M ONTA N
T
1 Hurtrel David C00123 19,99

1 Hurtrel David C00352 2,99

NULL NULL NULL C01387 2,39






J O INT URE S

CLI ENT CO MMA NDE

FU L L JO IN I D N OM P R E NOM I D I D _ CL I E N T N UM _ C MD E M ONTA NT

1 Hurtrel David 1 1 C00123 19,99

2 Dupont Jean 2 1 C00352 2,99


- permet de combiner les résultats de deux 3 Troijour Adam 3 4 C01387 2,39
tables, de les associer entre eux grâce à une
condition SELECT *
FROM `clients`
- la valeur NULL est utilisée si la condition n’est FULL JOIN `commandes`
ON `clients`.`id` = `commandes`.`id_client`;
pas respectée

- SELECT * RÉSULTAT
FROM table1
ID N OM P R E NOM N UM _ C MD E M ONTA NT
FULL JOIN table2 ON table1.id = table2.fk_id;
1 Hurtrel David C00123 19,99

1 Hurtrel David C00352 2,99

2 Dupont Jean NULL NULL

3 Troijour Adam NULL NULL

NULL NULL NULL C01387 2,39







J O INT URE S

SE L F J OIN
- jointure d’une table avec elle-même
J O INT URE S

N ATU R A L JO IN FRUI T ORIGI NE


ID N OM I D _ OR IG I N E I D _ OR IG I N E PAYS

- permet d’effectuer une jointure naturelle entre 1 pomme 1 1 France

deux tables 2 poire NULL 2 Belgique

3 kiwi 2 3 Allemagne

- il est nécessaire d’avoir des colonnes de


même nom et type dans les deux tables SELECT *
FROM `clients`
NATURAL JOIN `origine`;
- SELECT *
FROM table1
NATURAL JOIN table2; RÉSULTAT
I D _ OR IG I N E I D N OM PAYS

1 1 pomme France

NULL 2 poire Belgique

3 3 kiwi Allemagne



SQ L

PERFORMANCE
ET INTÉGRITÉ
SQ L

PHPMYADMIN
SQ L

DIVERS
SQ L

POUR ALL ER
PLUS LOI N
P O UR ALL ER P LUS LO IN

SOURC E S
M

- MySQL Workbench : site of ciel

- OpenClassrooms : administrez vos bases


de données avec MySQL

- SQL.sh : cours et tutoriels sur le langage


SQL

fi

Vous aimerez peut-être aussi