DUT SRC – IUT de Marne-la-Vallée
02/03/2015
M2203 – Bases de données
Cours 3
Le langage SQL
Philippe Gambette
Sources
• Cours de Tony Grandame à l'IUT de Marne-la-Vallée en 2010-2011
• Cours de Mathieu Mangeot, IUT de Savoie
http://jibiki.univ-savoie.fr/~mangeot/Cours/BasesDeDonnees.pdf
• Cours de Fabrice Meuzeret, IUT de Troyes
http://195.83.128.55/~fmeuzeret/vrac/
• Livre de Laurent Audibert : Bases de données - de la modélisation au SQL
Version partielle sur :
http://laurent-audibert.developpez.com/Cours-BD/html/index.php
Plan du cours 3 – Le langage SQL
• Résumé des épisodes précédents
• Introduction au langage SQL
• Langage de définition des données
• Intermède sur PHP
• Langage de manipulation des données
• SQL avancé : les jointures
• SQL avancé : les groupements
• SQL avancé : les transactions
Plan
• Résumé des épisodes précédents
• Introduction au langage SQL
• Langage de définition des données
• Intermède sur PHP
• Langage de manipulation des données
• SQL avancé : les jointures
• SQL avancé : les groupements
• SQL avancé : les transactions
Modèle physique des données
Modèle entité-association
(modèle conceptuel des données)
Modèle logique des données
Modèle physique des données
Transformation vers le modèle logique des données
Modèle entité association Modèle logique des données
Transformation automatique : exemple de WinDesign Database
http://www.win-design.com/fr/Documentation/MANUEL%20DATABASE.pdf
Transformation vers le modèle logique des données
Modèle entité association Modèle logique des données
Transformation automatique : exemple de WinDesign Database
http://www.win-design.com/en/Documentation/WD_DataBase.pdf
Plan
• Résumé des épisodes précédents
• Introduction au langage SQL
• Langage de définition des données
• Intermède sur PHP
• Langage de manipulation des données
• SQL avancé : les jointures
• SQL avancé : les groupements
• SQL avancé : les transactions
Introduction au langage SQL
SQL
• Structured Query Language
• Langage standardisé pour effectuer des opérations sur des bases de données.
• LDD : langage de définition de données, pour gérer les structures de la base
• LMD : langage de manipulation de données, pour interagir avec les données.
Attention, certaines syntaxes ou fonctions sont propres au système de base de
données utilisé.
http://dev.mysql.com/doc/refman/5.0/fr/
Introduction au langage SQL
SQL
• Structured Query Language (“query” = “requête”)
• Langage standardisé pour effectuer des opérations sur des bases de données.
• LDD : langage de définition de données, pour gérer les structures de la base
• LMD : langage de manipulation de données, pour interagir avec les données.
Attention, certaines syntaxes ou fonctions sont propres au système de base de
données utilisé.
requête : instruction demandant une action sur la base de données.
Alternative au langage SQL : clic-clic-poët-poët avec PhpMyAdmin
http://dev.mysql.com/doc/refman/5.0/fr/
Plan
• Résumé des épisodes précédents
• Introduction au langage SQL
• Langage de définition des données
• Intermède sur PHP
• Langage de manipulation des données
• SQL avancé : les jointures
• SQL avancé : les groupements
• SQL avancé : les transactions
Langage de définition des données
Bases
Une base regroupe toutes les données nécessaires pour un besoin fonctionnel
précis : une application ↔ une base de données.
Possible de créer autant de bases de données que nécessaires, interaction
entre les bases de données possible, mais alourdit la syntaxe SQL.
Création d'une base de données
CREATE DATABASE [IF NOT EXISTS] db_name
[create_specification]
Les spécifications permettent notamment de définir l'encodage de caractères
de la base :
CREATE DATABASE db_name DEFAULT CHARACTER SET latin1
COLLATE latin1_swedish_ci;
Langage de définition des données
Bases
Une base regroupe toutes les données nécessaires pour un besoin fonctionnel
précis : une application ↔ une base de données.
Possible de créer autant de bases de données que nécessaires, interaction
entre les bases de données possible, mais alourdit la syntaxe SQL.
Suppression d'une base de données
DROP DATABASE [IF EXISTS] db_name
Langage de définition des données
Bases
Une base regroupe toutes les données nécessaires pour un besoin fonctionnel
précis : une application ↔ une base de données.
Possible de créer autant de bases de données que nécessaires, interaction
entre les bases de données possible, mais alourdit la syntaxe SQL.
Modification d'une base de données
ALTER DATABASE db_name alter_specification [,
alter_specification] ...
Langage de définition des données
Tables
Rappel : Une table correspond à une entité.
Une base de données contient une ou plusieurs tables.
Création d'une table :
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)] [table_options]
• 1. create_definition représente la liste des champs avec leur type et
leurs éventuelles options.
• 2. table_option permet de préciser notamment le système d'encodage
des caractères, et le moteur de la table (ENGINE).
Introduction au langage SQL
SQL
• Structured Query Language (“query” = “requête”)
• Langage standardisé pour effectuer des opérations sur des bases de données.
• LDD : langage de définition de données, pour gérer les structures de la base
• LMD : langage de manipulation de données, pour interagir avec les données.
Attention, certaines syntaxes ou fonctions sont propres au système de base de
données utilisé.
requête : instruction demandant une action sur la base de données.
Alternative au langage SQL : clic-clic-poët-poët avec PhpMyAdmin
http://dev.mysql.com/doc/refman/5.0/fr/
Création d'une table avec PhpMyAdmin
http://dev.mysql.com/doc/refman/5.0/fr/
Création d'une table avec PhpMyAdmin
http://dev.mysql.com/doc/refman/5.0/fr/
Création d'une table avec PhpMyAdmin
http://dev.mysql.com/doc/refman/5.0/fr/
Langage de définition des données
Tables
Rappel : Une table correspond à une entité.
Une base de données contient une ou plusieurs tables.
Création d'une table :
• 1. La liste des champs doit être précisée :
col_name type [NOT NULL | NULL] [DEFAULT
default_value] [AUTO_INCREMENT] [[PRIMARY] KEY]
[reference_definition]
Seuls le nom et le type sont obligatoires.
Par défaut un champ est défini en NULL.
Les champs sont séparés par des virgules.
Langage de définition des données
Tables
Rappel : Une table correspond à une entité.
Une base de données contient une ou plusieurs tables.
Création d'une table :
• 1. L'option AUTO_INCREMENT permet de confier la gestion du champ par le
moteur de base de données.
A chaque insertion dans la table, la valeur du champ sera automatiquement
incrémentée.
Cette option n'est possible que sur des champs de type entier.
Le type SERIAL est un raccourci pour définir un champ UNSIGNED BIGINT
AUTO_INCREMENT UNIQUE.
Langage de définition des données
Tables
Rappel : Une table correspond à une entité.
Une base de données contient une ou plusieurs tables.
Création d'une table :
• 2. Les options facultatives de la tables permettent de préciser (en outre) :
• le moteur de la table :
- MyIsam (par défaut)
- InnoDb (gère les transactions)
- Memory (chargée en mémoire)
• Le système d'encodage de caractères, par défaut latin1_swedish_ci
correspondant à ISO-8859.
Langage de définition des données
Tables
Rappel : Une table correspond à une entité.
Une base de données contient une ou plusieurs tables.
Exemples de création d'une table
CREATE TABLE IF NOT EXISTS Coord (Id int(11) NOT NULL
auto_increment, Name varchar(255) collate
latin1_general_ci NOT NULL, Type varchar(255) collate
latin1_general_ci NOT NULL, Coord varchar(255)
collate latin1_general_ci NOT NULL, Url varchar(255)
collate latin1_general_ci NOT NULL, PRIMARY KEY
(Id)) ENGINE=MyISAM DEFAULT CHARSET=latin1
COLLATE=latin1_general_ci AUTO_INCREMENT=201 ;
Langage de définition des données
Index
Un index permet au moteur d'accéder rapidement à la donnée recherchée.
Si vous recherchez un champ ayant une valeur donnée et qu'il n'y a pas d'index
sur ce champ, le moteur devra parcourir toute la table.
Index à utiliser avec parcimonie : pénalisent les temps d'insertion et de
suppression des données dans la table.
Une clé primaire est par définition un index unique sur un champ non nul.
Un index peut être nul.
CREATE TABLE IF NOT EXISTS Personne(Id int NOT NULL
primary key auto_increment, Nom varchar(100) not
null, Prenom varchar(100), Annee_naiss year default
"1950") ENGINE=InnoDB
Langage de définition des données
Index
Un index permet au moteur d'accéder rapidement à la donnée recherchée.
Si vous recherchez un champ ayant une valeur donnée et qu'il n'y a pas d'index
sur ce champ, le moteur devra parcourir toute la table.
Index à utiliser avec parcimonie : pénalisent les temps d'insertion et de
suppression des données dans la table.
Une clé primaire est par définition un index unique sur un champ non nul.
Un index peut être nul.
CREATE TABLE IF NOT EXISTS Personne(Id int NOT NULL
primary key auto_increment, Nom varchar(100) not
null, Prenom varchar(100), Annee_naiss year default
"1950") ENGINE=InnoDB
CREATE TABLE IF NOT EXISTS Personne(Nom varchar(100)
not null, Prenom varchar(100), Annee_naiss year
default "1950", primary key (Nom, Prenom), index
personne_anne (Annee_naiss)) ENGINE=InnoDB
Langage de définition des données
Modification d'une table
CREATE TABLE tbl_name
ADD [COLUMN] column_definition [FIRST | AFTER
col_name ]
| ADD INDEX [index_name] [index_type]
(index_col_name,...)
| ADD PRIMARY KEY [index_type] (index_col_name,...)
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP
DEFAULT}
| ALTER TABLE tbl_name
| ADD FOREIGN KEY [index_name] (index_col_name,...)
| CHANGE [COLUMN] old_col_name column_definition
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DROP FOREIGN KEY fk_symbol
Langage de définition des données
Modification d'une table
Renommage d'une table :
RENAME TABLE nom_de_table TO nouveau_nom_de_table
Suppression d'une table :
DROP TABLE tbl_name
Attention, cette action est irréversible, toutes les données contenues dans la
table sont évidemment supprimées.
Plan
• Résumé des épisodes précédents
• Introduction au langage SQL
• Langage de définition des données
• Intermède sur PHP
• Langage de manipulation des données
• SQL avancé : les jointures
• SQL avancé : les groupements
• SQL avancé : les transactions
Plan
• Résumé des épisodes précédents
• Introduction au langage SQL
• Langage de définition des données
• Intermède sur PHP
• Langage de manipulation des données
• SQL avancé : les jointures
• SQL avancé : les groupements
• SQL avancé : les transactions
Langage de manipulation des données
Les commandes principales sont :
- INSERT pour ajouter les données
- SELECT pour consulter les données
- UPDATE pour modifier les données
- DELETE pour supprimer les données
Insertion d'occurrences dans une table avec PhpMyAdmin
http://dev.mysql.com/doc/refman/5.0/fr/
Insertion d'occurrences dans une table avec PhpMyAdmin
http://dev.mysql.com/doc/refman/5.0/fr/
Insertion d'occurrences dans une table avec PhpMyAdmin
http://dev.mysql.com/doc/refman/5.0/fr/
Langage de manipulation des données - INSERT
Insérer des données dans une table : liste des champs
INSERT [INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...)
liste des valeurs des champs
Le nombre de col_name doit correspondre au nombre d'expr.
Le fait de préciser les champs est optionnel :
- s’il est indiqué, il faut indiquer les valeurs dans le même ordre que les champs
- s’il n’est pas indiqué, il faut donner les valeurs de chaque champs dans l’ordre
des champs stockés dans la table
Pour les champs ayant l'option AUTO_INCREMENT, il est possible :
- soit de ne pas préciser le champ dans la liste,
- soit de passer la valeur NULL.
Le système se chargera d'attribuer automatiquement une valeur.
Langage de manipulation des données - SELECT
Lire des données dans une ou plusieurs tables :
SELECT [DISTINCT] select_expression,...
FROM table_references
[WHERE where_definition]
[ORDER BY {unsigned_integer | nom_de_colonne}
[ASC | DESC] ,...]
[LIMIT [offset,] lignes]
select_expression indique la colonne à lire, une constante, ou une
valeur calculée. Par exemple, écrire concat(champ1,champ2) AS new
signifie qu’on va récupérer un nouveau champ virtuel new qui contient la
valeur du champ champ1 suivie de la valeur du champ champ2.
Si deux champs ont le même nom champ1 dans plusieurs tables table1 et
table2, on les désigne par table1.champ1 et table2.champ1.
Le DISTINCT permet de ne lire que des valeurs distinctes.
Le FROM permet de lister les tables à utiliser dans la recherche des données.
Le ORDER BY permet de trier le résultat de la requête (ASC : croissant,
DESC : décroissant).
Langage de manipulation des données - SELECT
Le WHERE permet de préciser les critères de recherche et d'associer les tables
entre elles.
Tous les opérateurs =, <=>, <, >,!=, >=, <=, <>, BETWEEN,
IN, NOT IN, IS NULL, IS NOT NULL, ... sont supportés.
On peut faire des critères de sélection « avec joker » sur les chaînes de
caractères grâce au mot-clé LIKE.
Le critère :
champ1 LIKE '%a%'
signifie que le champ champ1 est une chaîne de caractères qui contient :
n’importe quoi suivi d’un « a » suivi de n’importe quoi
Langage de manipulation des données - SELECT
Exemples
On désire lire les noms rangés par ordre alphabétique de toutes les personnes
qui se prénomment Lisa.
Personne
ID int
Nom varchar(30)
Prenom varchar(30)
Adress# int
Langage de manipulation des données - SELECT
Exemples
On désire lire les noms rangés par ordre alphabétique de toutes les personnes
qui se prénomment Lisa.
Personne
SELECT Nom FROM Personne
WHERE Prenom = 'Lisa' ORDER BY 1 ID int
Nom varchar(30)
Prenom varchar(30)
On désire lire tous les noms et prénoms associés dans Adress# int
un champ séparés par un espace.
Langage de manipulation des données - SELECT
Exemples
On désire lire les noms rangés par ordre alphabétique de toutes les personnes
qui se prénomment Lisa.
Personne
SELECT Nom FROM Personne
WHERE Prenom = 'Lisa' ORDER BY 1 ID int
Nom varchar(30)
Prenom varchar(30)
On désire lire tous les noms et prénoms associés dans Adress# int
un champ séparés par un espace.
SELECT concat(Nom, ' ', Prenom) as Gens
FROM Personne ORDER BY 1
On désire lire les ID de toutes les personnes ayant une adresse renseignée.
Langage de manipulation des données - SELECT
Exemples
On désire lire les noms rangés par ordre alphabétique de toutes les personnes
qui se prénomment Lisa.
Personne
SELECT Nom FROM Personne
WHERE Prenom = 'Lisa' ORDER BY 1 ID int
Nom varchar(30)
Prenom varchar(30)
On désire lire tous les noms et prénoms associés dans Adress# int
un champ séparés par un espace.
SELECT concat(Nom, ' ', Prenom) as Gens
FROM Personne ORDER BY 1
On désire lire les ID de toutes les personnes ayant une adresse renseignée.
SELECT ID FROM Personne
WHERE Adress IS NOT NULL
Langage de manipulation des données - SELECT
Lire des données en combinant les informations de plusieurs tables :
Pour chercher des données contenues dans une table ainsi que dans une autre
table liées par le biais d'une clé étrangère, il est indispensable de préciser
l'égalité entre les 2 champs.
Si on ne précise pas que la clé étrangère de la table table1 correspond à la
clé primaire de la table table2, ce sont toutes les possibilités d’associations
de lignes de table1 avec toutes les lignes de la table table2 qui seront
listées par la requête ! Il faut donc préciser que la clé étrangère de la table
table1 correspond à la clé primaire de la table table2.
Par exemple, pour sélectionner les clés primaires des objets de la table
table2 liés aux objets de la table table1 dont l’attribut nom est "toto", on
écrit :
SELECT table2.cleprimaire
FROM table1,table2
WHERE table1.cleetrangere=table2.cleprimaire
AND table1.nom='toto'
Langage de manipulation des données - SELECT
Exemple
Personne Adresse
ID int ID int
Nom varchar(30) Voie varchar(200)
Prenom varchar(30) CP int
Adress# int Ville varchar(50)
Sélectionner le nom et l'adresse des personnes dont le nom commence par
Simps :
Langage de manipulation des données - SELECT
Exemple
Personne Adresse
ID int ID int
Nom varchar(30) Voie varchar(200)
Prenom varchar(30) CP int
Adress# int Ville varchar(50)
Sélectionner le nom et l'adresse des personnes dont le nom commence par
Simps :
SELECT Personne.Nom, Adresse.Voie
FROM Personne, Adresse
WHERE Personne.Adress = Adresse.ID
AND Personne.Nom LIKE 'Simps%'
Langage de manipulation des données - UPDATE
Modifier des données dans une table :
UPDATE tbl_name
SET col_name1=expr1 [,col_name2=expr2 …]
[WHERE where_definition] [LIMIT row_count]
Le SET permet d'attribuer une nouvelle valeur au champ.
Il est possible de mettre à jour plusieurs champs en même temps.
Le WHERE permet de préciser quelles données on désire mettre à jour.
Son fonctionnement sera détaillé avec la commande SELECT.
Sans clause WHERE, toutes les données de la table sont mises à jour.
La LIMIT permet de limiter le nombre de lignes à modifier.
Langage de manipulation des données
Lien entre requêtes dans un INSERT
Il est possible d'insérer dans une table des données issues d'une autre requête.
INSERT [INTO] tbl_name [(col_name,...)]
SELECT ...
Lien entre tables dans un UPDATE
Il est possible de mettre à jour des données en fonction de données d'autres
tables :
UPDATE tbl_name [, tbl_name ...]
SET col_name1=expr1 [,col_name2=expr2 ...]
[WHERE where_definition]
C'est toujours la table dont le nom est accolé au mot UPDATE qui est mise à
jour.
Langage de manipulation des données - DELETE
Supprimer des données dans une table :
DELETE FROM table_name
[WHERE where_definition] [LIMIT row_count]
Le WHERE permet de préciser quelles données on désire supprimer.
Sans clause WHERE, toutes les données de la table sont supprimées. On
préfère alors utiliser la commande spéciale TRUNCATE TABLE.
Langage de manipulation des données - DELETE
Supprimer des données dans une table :
DELETE FROM table_name
[WHERE where_definition] [LIMIT row_count]
Le WHERE permet de préciser quelles données on désire supprimer.
Sans clause WHERE, toutes les données de la table sont supprimées. On
préfère alors utiliser la commande spéciale TRUNCATE TABLE.
Plan
• Résumé des épisodes précédents
• Langage de manipulation des données
• SQL avancé : les jointures
• SQL avancé : les groupements
• SQL avancé : les transactions
• SQL avancé : l'intégrité référentielle
Jointures
Utilisation des jointures
→ Sélectionner les données se trouvant dans plusieurs tables.
→ Préciser les données sur lesquelles travailler lors d'un :
• SELECT (lecture)
• UPDATE (mise à jour)
• DELETE (suppression)
Jointures
Utilisation des jointures
→ Sélectionner les données se trouvant dans plusieurs tables.
→ Préciser les données sur lesquelles travailler lors d'un :
• SELECT (lecture)
• UPDATE (mise à jour)
• DELETE (suppression)
Principe
Une jointure a lieu entre deux tables. Elle exprime une correspondance entre
deux clés par un critère d'égalité.
Si les données à traiter se trouvent dans trois tables, la correspondance entre
les trois tables s'exprime par deux égalités.
Jointures
Exemple
Personne Adresse
ID int ID int
Nom varchar(30) Voie varchar(200)
Prenom varchar(30) CP int
Adress# int Ville varchar(50)
Pour lire l'adresse correspondant à la personne, il faut écrire :
Jointures
Exemple
Personne Adresse
ID int ID int
Nom varchar(30) Voie varchar(200)
Prenom varchar(30) CP int
Adress# int Ville varchar(50)
Pour lire l'adresse correspondant à la personne, il faut écrire :
SELECT * FROM Personne, Adresse
WHERE Personne.Adress = Adresse.ID
Jointures
Exemple
Personne Adresse
ID int ID int
Nom varchar(30) Voie varchar(200)
Prenom varchar(30) CP int
Adress# int Ville varchar(50)
Pour lire l'adresse correspondant à la personne, il faut écrire :
SELECT * FROM Personne, Adresse
WHERE Personne.Adress = Adresse.ID
Attention : dans la clause WHERE se mélangent les associations entre les
tables et les conditions de sélection des données. Ne pas les confondre !
SELECT * FROM Personne, Adresse
WHERE Personne.Adress = Adresse.ID
AND Personne.Nom = 'Durand'
Jointures
Exemple
Personne Adresse
ID int ID int
Nom varchar(30) Voie varchar(200)
Prenom varchar(30) CP int
Adress# int Ville varchar(50)
Pour lire l'adresse correspondant à la personne, il faut écrire :
SELECT * FROM Personne, Adresse
WHERE Personne.Adress = Adresse.ID
Attention : dans la clause WHERE se mélangent les associations entre les
tables et les conditions de sélection des données. Ne pas les confondre !
SELECT * FROM Personne, Adresse jointure pour associer les
WHERE Personne.Adress = Adresse.ID deux tables
AND Personne.Nom = 'Durand' critère de sélection
Remarque : ordre sans importance