Introduction au langage SQL
Introduction au langage SQL
Histoire
– langages pour les BD relationnelless incluant toutes
les possibilités de l'algèbre relationnelle : QUEL,
SEQUEL, SQL (79, sur Oracle)
– Normalisation en 87 par ANSI de SQL
– plus d'une centaine de produits supportant SQL
aujourd'hui
SQL n'est pas un langage de programmation
– 2 douzaines d'instructions environ
– peut trouver sa place dans un langage de
programmation
1
Caractéristiques
SQL assure l'indépendance des données
SQL est un langage déclaratif (par opposition à
procédural)
Mode interactif ou programmé
– interactif : instruction SQL tapée directement, instantanément
traitée
– à l'intérieur d'un pgm : appel de SQL dans un pgm en Python ou
C, ...
instruction SQL = requête
résultat d'une requête = table
2
Caractéristiques
3
SQL1 - 86
LANGAGE DE DEFINITIONS DE DONNEES
– CREATE TABLE
– CREATE VIEW
LANGAGE DE MANIPULATION DE DONNEES
– SELECT OPEN
– INSERT FETCH
– UPDATE CLOSE
– DELETE
LANGAGE DE CONTROLE DE DONNEES
– GRANT et REVOKE
– BEGIN et END TRANSACTION
– COMMIT et ROLLBACK
4
Le Language de Manipulation des
Données : la consultation de données
Instruction SELECT : 3 parties principales :
– clause (obligatoire) Select : précise les valeurs qui constituent
chaque ligne du résultat
– clause (obligatoire) from : indique les tables desquelles le
résultat tire ses valeurs
– clause where : donne la condition de sélection que doivent
satisfaire les lignes qui fournissent le résultat
SELECT schéma
FROM table
WHERE condition ;
5
Interrogation en SQL
SELECT <liste de colonnes>
FROM <liste de tables>
[WHERE <critère de jointure> AND <critère de sélection>]
[GROUP BY <attributs de partitionnement>]
[HAVING <citère de restriction>]
Exemple :
SELECT NomCoureur
FROM Coureurs
WHERE CodePays = ‘SUI’;
6
Interrogation d’une seule table
PILOTE(NUMPIL,NOMPIL,ADR,SAL)
AVION(NUMAV,NOMAV,CAPACITE,LOC)
VOL(NUMVOL,NUMPIL,NUMAV,VILLE_DEP,
VILLE_ARR,H_DEP,H_ARR)
OU
EMP(Num,Nom,Fonction,N_Sup,Embauche,
Salaire,N_Dep)
DEPT(N_Dept,Nom,Lieu)
7
PROJECTION
Extraction simple : afficher une table
entièrement
SELECT *
FROM Nom_table;
Exemple :
– Tous les pilotes?
– Expression algébrique : PILOTE
– SQL : SELECT *
FROM PILOTE;
8
PROJECTION
SELECT Nom_Col1, ..., Nom_ColN
FROM Nom_table;
Exemple :
Requête : Liste des noms de pilotes
Algèbre : πNOMPIL (PILOTE)
SQL : SELECT NOMPIL
FROM PILOTE
La clause DISTINCT permet d'éliminer les doublons.
9
SELECTION
SELECT Nom_Colonne
FROM Nom_Table
WHERE critère ;
Exemple :
– Requête : La liste des noms de pilotes niçois
– Algèbre : πNOMPIL (σ ADR = ‘NICE’(PILOTE))
– SQL : SELECT NOMPIL
FROM PILOTE
WHERE ADR =‘NICE’
10
Opérateurs de comparaison
=,>,<,>=,<=,<> (ou != ou ^=)
In et not in
– Requête : quels sont les noms d’avions de capacité supérieure
à 350 localisés à Paris ou Marseille ou Nice ?
– SQL : SELECT NOMAV
FROM AVION
WHERE CAP >= 350 AND (LOC = ‘PARIS’ OR
LOC = ‘MARSEILLE’ OR LOC = ‘NICE’)
OU
SELECT NOMAV
FROM AVION
WHERE CAP >= 350 AND
LOC IN (‘PARIS’,‘MARSEILLE’,’NICE’)
11
Opérateurs de comparaison
LIKE : appartenance à une chaîne de caractères
– ‘_’ remplace n'importe quel caractère
– ‘%’ remplace n'importe quelle chaîne de caractères
Exemple :
– Requête : Quels sont les noms de pilotes qui commencent par
‘DU’ ?
– SQL : SELECT NOMPIL
FROM PILOTE
WHERE NOMPIL like ‘DU%’
– Requête : Quels sont les noms de pilotes possédant un ‘A’ en
seconde position ?
– SQL : SELECT NOMPIL
FROM PILOTE
12 WHERE NOMPIL like ‘_A%’
Opérateurs de comparaison
13
Nom de colonne
14
Opérateurs de comparaison
IS NULL et IS NOT NULL
Exemple :
– Requête : les noms des pilotes dont l’adresse n’a pas
été renseignée
– SQL : SELECT NOMPIL
FROM PILOTE
WHERE ADR IS NULL
15
Tri des résultats
ORDER BY
SELECT attribut1, attribut2, ...
FROM Nom_table
ORDER BY attribut1 [ASC], attribut2 [DESC],
... ;
Exemple :
– Requête : Les pilotes bordelais classés par salaire
– SQL : SELECT *
FROM PILOTE
WHERE ADR = ‘BORDEAUX’
ORDER BY SAL
16
Fonctions
La relation résultat
– ne comportera qu'une ligne
– ou pourra simplement être considérée comme un nombre
Fonctions numériques :
– AVG : moyenne
– Exemple : Salaire moyen des pilotes:
– SQL : SELECT AVG(SAL)
FROM PILOTE;
– SUM : somme
– Exemple : le chiffre d’affaires généré par les vendeurs de Casa:
19
Regroupements
20
Résultat
ville Nbre_pilotes
BORDEAUX 1
CASA 1
LYON 1
MARSEILLE 1
NICE 3
PARIS 4
21
Selection des groupes
HAVING : conditions imposées aux groupes (de lignes)
à sélectionner
– pour éviter la confusion avec la clause WHERE (qui
ne s'applique qu'à des lignes seules)
Exemple :
– Requête : Donner les villes où on a au moins 2
pilotes?
– SQL : SELECT ADR ville, Count(*) nbre_pilotes
FROM PILOTE
GROUP BY ADR
HAVING Count(*) >=2;
22
Résultat
ville Nbre_pilotes
NICE 3
PARIS 4
23
Quantificateurs
ALL + opérateur de comparaison : teste si une
expression est vérifiée dans tous les cas de figure
– Requête : Tous les pilotes ont-ils un salaire supérieur à 10000 ?
– SQL : 10000 < ALL (SELECT SAL FROM PILOTE)
24
Quantificateurs
25
Comment interpréter une requête
complexe monotable ?
on considère la table spécifiée dans la clause FROM
on sélectionne les lignes sur la base de la clause
WHERE
on classe ces lignes en groupes comme spécifié dans la
clause GROUP BY
on ne retient que les groupes qui vérifient la clause
HAVING
de chacun de ces groupes, on extrait les valeurs
demandées dans la clause SELECT
les valeurs demandées sont ordonnées selon la clause
ORDER BY éventuelle.
26
Interrogations sur plusieurs tables :
SQL permet la liaison de plusieurs tables via 3
possibilités :
– Les opérations de jointure entre 2 tables en se
basant sur l'égalité entre l'un des attributs de chaque
table
– Le principe des requêtes imbriquées qui repose sur
le fait que le résultat d'une requête est une table
– L'utilisation d'opérations ensemblistes pour
combiner le résultat de plusieurs requêtes.
27
Jointures
SELECT ...
FROM nom_table1, nom_table2...
WHERE critère;
– pas de condition de sélection : résultat obtenu =
produit cartésien des tables présentes derrière le
FROM.
– Requête : quel est le nom de pilote qui assure le vol
numéro 20 ?
– SQL : SELECT NOMPIL Condition
FROM PILOTE P, VOL V de jointure
WHERE NUMVOL=20
AND [Link]=[Link]
28
Auto-jointure :
29
Autres jointures
Le critère d'égalité est le critère de jointure le
plus naturel. Mais on peut utiliser d'autres types
de comparaisons comme critères de jointures.
– Requête : Quels sont les employés gagnant plus
que SIMON ?
– SQL : SELECT [Link], [Link],
[Link]
FROM EMP, EMP empbis
WHERE [Link] = 'SIMON‘
AND [Link] > [Link] ;
30
Requêtes imbriquées
31
Requêtes imbriquées
Sous-interrogation ramenant une seule valeur
– Requête : Quels sont les pilotes (numéro et nom)
habitant dans la même ville que le pilote 1004?
SQL : SELECT NUMPIL,NOMPIL
FROM PILOTE
WHERE ADR = (SELECT ADR
FROM PILOTE
WHERE NUMPIL =
1004)
AND NUMPIL <> 1004
– Remarque : auto-jointure possible pour répondre à
cette question
32
Requêtes imbriquées
33
Requêtes imbriquées
34
Requêtes imbriquées
Requête : Quels sont les employés gagnant plus que
tous les employés du département 30 ?
SQL : SELECT Nom, Salaire
FROM Emp
WHERE salaire > ALL(SELECT Salaire
FROM Emp
WHERE N_Dep=30);
35
Requêtes imbriquées
36
Requêtes imbriquées
Sous-interrogation ramenant au moins une ligne
L'opérateur EXISTS permet de construire un prédicat
vrai si la sous-interrogation qui suit ramène au moins
une ligne.
– Requête : Quels sont les employés travaillant dans un
département qui a procédé à des embauches depuis le début
de l'année 2001 ?
– SQL : SELECT *
FROM Emp Empbis
WHERE EXISTS (SELECT *
FROM EMP
WHERE Embauche >= '01-jan-01'
37 AND N_Dept = Empbis.N_Dept);
Les opérateurs ensemblistes
permettent de "joindre" des tables verticalement c'est-à-
dire de combiner dans un résultat unique des lignes
provenant de deux interrogations. Les opérateurs
ensemblistes sont les suivants :
– l'union : UNION
– l'intersection : INTERSECT
– la différence relationnelle : EXCEPT
La syntaxe d'utilisation est la même pour ces trois
opérateurs :
SELECT ... {UNION | INTERSECT | EXCEPT} SELECT
...
38
Les opérateurs ensemblistes
Dans une requête utilisant des opérateurs ensemblistes :
– Tous les SELECT doivent avoir le même nombre de colonnes
sélectionnées, et leur types doivent être un à un identiques.
– Les doubles sont éliminés (DISTINCT implicite).
– Les noms de colonnes sont ceux du premier SELECT.
On peut combiner le résultat de plus de deux SELECT au
moyen des opérateurs UNION, INTERSECT, EXCEPT.
SELECT ... UNION SELECT ... EXCEPT SELECT ...
– Expresion évaluée de gauche à droite. Modification de l'ordre
d'évaluation par des parenthèses.
SELECT ...
UNION (SELECT ...
EXCEPT
39 SELECT ...)
Les opérateurs ensemblistes
40
Coment interpréter une requête
complexe multitable ?
on considère les tables spécifiées dans la clause FROM
on effectue la jointure de ces tables selon le critère de
jointure de la clause WHERE
on sélectionne les lignes de la jointure sur la base des
autres conditions de la clause WHERE
on classe ces lignes en groupes comme spécifié dans la
clause GROUP BY
on ne retient que les groupes qui vérifient la clause
HAVING
de chacun de ces groupes, on extrait les valeurs
demandées dans la clause SELECT
les valeurs demandées sont ordonnées selon la clause
ORDER BY éventuelle.
41
Coment interpréter une requête
complexe multitable ?
Exemple :
SELECT N°Client, COUNT(*), SUM(QtéCom)
FROM Commande C, LigneCom L
WHERE C.N°Com = L.N°Com
AND N°Pro = ‘PA 60’
GROUP BY N°Client
HAVING COUNT(*) >= 2
ORDER BY N°Client
42
Le Language de Manipulation des
Données : la modification de
données
Insertion de nouveaux n-uplets
INSERT INTO nom_table(nom_col1, nom_col2,...)
VALUES (val1, val2,...)
Exemple :
INSERT INTO Etudiant (n°Et, Nom, Prénom)
VALUES(96035, ‘Diego’, ‘Berger’)
43
La modification de données
Il est possible d'insérer dans une table des lignes
provenant d'une autre table. La syntaxe est la suivante :
INSERT INTO nom_table(nom_col1, nom_col2, ...)
SELECT ...
Exemple : Insérer dans la table Bonus les noms et
salaires des directeurs.
INSERT INTO bonus
SELECT nom, salaire
FROM emp
WHERE fonction = 'directeur';
44
La modification de données
Modification de lignes
– La commande UPDATE permet de modifier les valeurs d'une
ou plusieurs colonnes, dans une ou plusieurs lignes existantes
d'une table. La syntaxe est la suivante :
UPDATE nom_table
SET nom_col1 = {expression1 | ( SELECT ...) },
nom_col2 = {expression2 | ( SELECT ...) }
[WHERE critère];
Exemple : Augmenter de 10% les salaires [des
ingénieurs].
UPDATE emp
SET salaire = salaire * 1.1
[WHERE fonction = 'ingenieur' ];
45
La modification de données
Suppression de lignes
– La commande DELETE permet de supprimer des lignes d'une
table. La syntaxe est la suivante :
DELETE FROM nom_table
WHERE critère;
– Toutes les lignes pour lesquelles le critère est évalué à vrai sont
supprimées. En l'absence de clause WHERE, toutes les lignes
de la table sont supprimées.
– Exemple :
DELETE FROM emp
WHERE fonction = ‘retraité‘;
46
Le language de définition de
données
47
Types acceptés
Chaine de caractères : TEXT
- CHAR (TAILLE) : chaine de caractères de longueur fixe ; taille comprise
entre 1 et 2000 octets
- VARCHAR(taille_max) : chaine de caractères de longueur variable (taille
comprise entre 1 et 4000 octets )
- CLOB (Character Large Object): chaînes de caractères très longues (des
textes, voire des livres), le type VARCHAR ne suffit plus.
Type numérique : INTEGER, REAL
- Type numérique pour les entiers : INTEGER pour 4 octets
- Type numérique pour les décimaux à virgule flottante : REAL
- Type numérique pour nombres en virgule flottante double précision
(DOUBLE PRECISION)
- Type numérique pour les décimaux à virgule fixe : NUMERIC(nb_chiffres,
48 nb_décimales).
Types acceptés
Type date : DATE
- DATE : pour les dates au format AAAA-MM-JJ
- TIME : type heure au format HH:MM:SS
- DATETIME : type date et heure au format: AAAAMMJJHHMMSS
- YEAR: pour les années
49
Création d'une table
CREATE TABLE Departement
(NDep INTEGER NOT NULL PRIMARY KEY ,
NomDep TEXT,
Directeur TEXT,
Budget REAL);
CREATE TABLE Etudiant
(NEtud INTEGER NOT NULL PRIMARY KEY,
Nom VARCHAR(20),
Prénom TEXT,
DateNaissance DATE,
Rue TEXT,
CodePostal INTEGER,
Ville TEXT DEFAULT ‘PARIS’,
50 NDep INTEGER NOT NULL FOREIGN KEY);
Suppresion et modification d'une
table
DROP TABLE nom_table ;
– Exemple : DROP TABLE Etudiant ;
Modification d'une table
– Ajoût d'une ou plusieurs colonnes :
ALTER TABLE nom_table
ADD (nom_col1 TYPE1, nom_col2 TYPE2, ...);
– option : [BEFORE nom_col_before]
– Exemple : On aimerait connaître le téléphone des étudiants
ALTER TABLE Etudiant
ADD (Téléphone CHAR(10) BEFORE NDep);
51
Modification d'une table
Suppression d'une colonne :
ALTER TABLE nom_table
DROP nom_col;
– Attention aux problèmes d'intégrité !
Modification d’une table :
ALTER TABLE nom_table
MODIFY(nom_col1 TYPE1,nom_col2 TYPE2,...);
– Exemple : Un nom peut dépasser 20 caractères
ALTER TABLE Etudiant
MODIFY(Nom VARCHAR(25));
52
Modification d'une table
53
Les vues
Les vues permettent d'assurer l'objectif d'indépendance
logique. Grace à elles, chaque utilisateur pourra avoir
sa vision propre des données.
Créer une vue
– La commande CREATE VIEW permet de créer une vue en
spécifiant le SELECT constituant la définition de la vue :
CREATE VIEW nom_vue [(nom_col1,...)]
AS SELECT ...
WITH CHECK OPTION ;
54
Les vues
Exemple : Création d'une vue constituant une
restriction de la table emp aux employés du
departement 10.
CREATE VIEW emp10 AS
SELECT *
FROM emp
WHERE n_dept = 10 ;
Le CHECK OPTION permet de vérifier que la mise à
jour ou l'insertion faite à travers la vue ne produisent
que des lignes qui font partie de la sélection de la vue.
Supprimer une vue
DROP VIEW nom_vue;
55
Les index
Considérons le SELECT suivant :
SELECT *
FROM Etudiant
WHERE nom = 'MARTIN'
– moyen de recherche des lignes avec nom = 'MARTIN' :
balayer toute la table
– prohibitif dès que nb lignes > qq centaines
Solution offerte par tous les SGBD : création d'index
Les index sont des structures permettant de retrouver
une ligne dans une table à partir de la valeur d'une
colonne ou d'un ensemble de colonnes.
56
Choix des index
Indexer en priorité :
– les clés primaires
– les colonnes servant de critère de jointure
– les colonnes servant souvent de critère de recherche
Ne pas indexer :
– les colonnes contenant peu de valeurs distinctes
(index alors peu efficace)
– les colonnes fréquemment modifiées
57
Créer un index
Un index peut être créé par la commande suivante :
CREATE [UNIQUE] INDEX nom_index
ON nom_table (nom_col1 , nom_col2, ...)
Option UNIQUE : interdiction que deux lignes aient la
même valeur dans la colonne indexée.
Les requêtes SQL sont transparentes au fait qu'il existe
un index ou non.
Effacement d'un index :
DROP INDEX Nom_de_l’index
58
Les contraintes d'intégrité
Sur les colonnes :
– NOT NULL : force la saisie de la colonne
– DEFAULT : précise une valeur par défaut
– UNIQUE : vérifie que toutes les valeurs sont différentes
– CHECK : vérifie la condition précisée
– CONSTRAINT : permet de nommer une contrainte
Sur la table globalement :
– CONSTRAINT
– PRIMARY KEY : clé primaire
– FOREIGN KEY (liste_col1) REFERENCES table(liste_col2): clé
étrangère => intégrité référentielle
59
Les contraintes d'intégrité
Clé étrangère :
– Attribut ou groupe d’attribut dans une table T1 dont les valeurs
doivent exister comme valeurs de la clé candidate dans la table
T2.
– T1 : table qui référence : table secondaire du lien (contient la clé
étrangère)
– T2 : table référencée : table primaire du lien
Du point de vue de la table qui référence (T1) :
– FOREIGN KEY (T1) REFERENCES table(T2): clé étrangère =>
intégrité référentielle
Du point de vue de la table référencée (T2) :
– Modification de la clé primaire => effets sur les autres tables
utilisant cette clé comme clé étrangère ?
– REFERENCES complétée par ON UPDATE ou ON DELETE
60
Les contraintes d'intégrité
61
Gestion des transactions
Plusieurs utilisateurs peuvent accéder à la base de
données de façon concurrente, "en même temps".
– Exemple : un même système de réservations de billets d'avions
est utilisé en concurrence par des centaines d'employés
d'agences de voyage.
Ce concept pose des problèmes quant à la cohérence
et l'intégrité de la base de données.
Le SGBD devra donc gérer les utilisations concurrentes
sur les données avec le plus d'efficacité possible.
62
Gestion des transactions
Une transaction est un ensemble de requêtes
élémentaires sur les données d'une base.
– Exemple : vente de produit à un client = 2 parties
mise à jour de l'inventaire en soustrayant la quantité vendue du
produit, et
mise à jour de la table des encaissements à réaliser pour facturer
le client.
Fin de transaction :
– COMMIT : Validation.
– ROLLBACK : suite à un echec, le SGBD doit revenir à l'état
précédant le début de l’action. Ceci est fait automatiquement
par la commande ROLLBACK.
63
Administration d'une Base de
Données
GESTION DES DROITS
– protéger les données de la base contre les accès non autorisés
enregistrer et authentifier les utilisateurs
définir des autorisations de manipulation des objets de la base par
les utilisateurs (relation, vue, contrainte d'intégrité, index)
LES DIFFERENTS UTILISATEURS
– ADMINISTRATEUR BD
possède tous les droits
– UTILISATEURS PRIVILEGIES
peuvent créer des relations
– UTILISATEURS FINAUX
peuvent manipuler des relations
64
Les différents droits sur une relation
DROIT D'INTERROGATION
DROIT DE MISE A JOUR (insertion,
modification, suppression de tuples)
DROIT D'ADMINISTRATION (déclaration de
clés, définition d'index, modif. / suppression du
schéma, transmission des droits)
DROIT DE CREATION (création schéma
relation)
65
Droits sur une relation
66
Le mode Client-Serveur
Serveur : serveur de ressources communes
Client : logiciel qui accède au serveur
Machine A Machine B
Logiciel requête Logiciel
Utilisateur
Client Serveur
réponse
Besoin de permettre la connexion de n’importe quel type de
client avec n’importe quel type de serveur
Naissance de protocoles comme ODBC (Open DataBase
Connectivity) ou JDBC (Java DataBase Connectivity)
67
Le mode Client-Serveur
68
Le mode Client-Serveur
ODBC : accès aux bases de données dans le monde
de Microsoft
69