II.4. SQL (Structured Query Language)

Transcription

II.4. SQL (Structured Query Language)
II.4. SQL (Structured Query Language)
• Langage de définition des données (LDD).
• Langage de manipulation des données (LMD).
Le plus ancien standard : 1989
SQL-2 ou SQL-92 date de 1992
SQL3 : intégration de concepts orienté-objet (mais pas de normes
pour l’instant)
1
LDD – Types SQL
• Description des tables et de leur contenu
• Description des contraintes
• Types numériques
• Types chaines de caractères
• Types dates
2
Type
Description
INTEGER
Type des entiers relatifs
SMALLINT
Idem
BIGINT
Idem
FLOAT
Flottants simple précision
DOUBLE PRECISION
Flottants double précision
REAL
Synonyme de FLOAT
NUMERIC(M,D)
Numérique avec précision fixe
DECIMAL(M,D)
Idem
CHAR(M)
Chaı̂nes de longueur fixe
VARCHAR(M)
Chaı̂nes de longueur variable
BIT VARYING
Chaı̂nes d’octets
DATE
Date (jour/mois/an)
TIME
Horaire (heure/minutes/secondes)
DATETIME
Date et heure
YEAR
Année
3
Taille
Création des tables
CREATE TABLE Internaute (email VARCHAR(50) NOT NULL,
nom VARCHAR(20) NOT NULL,
prenom VARCHAR(20),
motDePasse VARCHAR(60) NOT NULL
anneeNaiss DECIMAL(4));
ou encore
CREATE TABLE Cinema (nom VARCHAR(50) NOT NULL,
adresse VARCHAR(50) DEFAULT ’Inconnue’);
4
Les contraintes – Que peut-on demander ?
• Un attribut doit toujours avoir une valeur (NOT NULL)
• Un attribut (ou un ensemble d’attributs) constitue la clé de la
relation.
• Un attribut est lié à la clé primaire d’une autre table (intégrité
référentielle)
• La valeur d’un attribut doit être unique au sein de la relation
• Enfin toute règle s’appliquant à la valeur d’un attribut (min et
max par exemple).
5
PRIMARY KEY
Tout attribut d’une clé primaire doit être déclarer NOT NULL
CREATE TABLE Internaute (email VARCHAR(50) NOT NULL,
nom VARCHAR(20) NOT NULL,
prenom VARCHAR(20),
motDePasse VARCHAR(60) NOT NULL
anneeNaiss DECIMAL(4)
PRIMARY KEY(email));
ou
CREATE TABLE Notation(idFilm INTEGER NOT NULL,
email VARCHAR(50) NOT NULL,
note INTEGER DEFAULT 0,
PRIMARY KEY(titre, email));
6
Clés secondaires – UNIQUE
Comment dire : deux cinémas ne peuvent avoir la même adresse ?
Deux artistes ne peuvent avoir les mêmes nom et prénom ?
CREATE TABLE Cinema (nom VARCHAR(50) NOT NULL,
adresse VARCHAR(50) UNIQUE
PRIMARY KEY (nom));
CREATE TABLE Artiste(id INTEGER NOT NULL,
nom VARCHAR(30) NOT NULL,
prenom VARCHAR(30) NOT NULL,
anneeNaiss INTEGER,
PRIMARY KEY(id),
UNIQUE(nom, prenom));
Attention : UNIQUE ne s’applique pas aux valeurs NULL.
7
Les clés étrangères – FOREIGN KEY
CREATE TABLE Film(idFilm INTEGER NOT NULL,
titre VARCHAR(50) NOT NULL,
annee INTEGER NOT NULL,
idMES INTEGER,
codePays INTEGER,
PRIMARY KEY (idFilm),
FOREIGN KEY (idMES) REFERENCES Artiste,
FOREIGN KEY (codePays) REFERENCES Pays);
Remarque : idMES n’est pas déclaré NOT NULL, donc on s’autorise à
ne pas connaı̂tre le nom du metteur en scène.
8
Violation des contraintes d’intégrité référentielles
• Insertion dans Film avec une valeur inconnue pour iDMES
• destruction d’un artiste
• modification de id dans Artiste ou de idMES dans Film
Mise-à-jour rejetée par défaut, mais on peut répercuter les
mises-à-jour (modification ou destruction) de manière à respecter
les contraintes :
• ON UPDATE : SET NULL ou SET CASCADE
• ON DELETE : SET NULL ou SET CASCADE
9
Répercussion des contraintes référentielles
Destruction d’un MES implique mise à NULL des films référencés.
CREATE TABLE Film(idFilm INTEGER NOT NULL,
titre VARCHAR(50) NOT NULL,
annee INTEGER NOT NULL,
idMES INTEGER,
codePays INTEGER,
PRIMARY KEY (idFilm),
FOREIGN KEY (idMES) REFERENCES Artiste,
ON DELETE SET NULL,
FOREIGN KEY (codePays) REFERENCES Pays);
10
CREATE TABLE Salle (nomCinema VARCHAR(30) NOT NULL,
no INTEGER NOT NULL,
capacite INTEGER,
PRIMARY KEY (nomCinema, no),
FOREIGN KEY (nomCinema) REFERENCES Cinema
ON DELETE CASCADE
ON UPDATE CASCADE
);
11
Énumération des valeurs possibles – CHECK
CREATE TABLE Film(idFilm INTEGER NOT NULL,
titre VARCHAR(50) NOT NULL,
annee INTEGER
CHECK(annee BETWEEN 1890 AND 2000) NOT NULL,
genre VARCHAR(10)
CHECK (genre IN (’Histoire’, ’Western’, ’Drame’)),
idMES INTEGER,
codePays INTEGER,
PRIMARY KEY (idFilm),
FOREIGN KEY (idMES) REFERENCES Artiste,
ON DELETE SET NULL,
FOREIGN KEY (codePays) REFERENCES Pays);
12
Modification du schéma – ALTER TABLE
ALTER TABLE NomTable ACTION Description
ADD, MODIFY, DROP, RENAME
ALTER TABLE Internaute ADD region VARCHAR(10)
ALTER TABLE Internaute MODIFY region VARCHAR(30) NOT
NULL
ALTER TABLE Internaute DROP region
13
II.4.1. Requêtes simples - Sélections simples
SELECT nomStation
FROM Station
WHERE region=’Antilles’
• SELECT indique la liste des attributs consituant le résultat;
• FROM indique la (ou les) tables dans lesquelles on trouve les
attributs utiles à la requête.
• WHERE indique les conditions que doivent satisfaire les n-uplets
de la base pour faire partie des résultats.
Composition de la projection et de la sélection
14
Opérations sur les attributs et renommage
SELECT libelle, prix/6.56, ’Cours de l’euro = ’, 6.56
FROM Activite
WHERE nomStation=’Santalba’
SELECT libelle, prix/6.56 AS prixEnEuros, ’Coursde l’euro = ’, 6.
FROM Activite
WHERE nomStation=’Santalba’
15
Doublons
SELECT libelle
FROM Activite
libelle
Voile
renvoie la table :
Plongee
Ski
Piscine
Kayac
SELECT DISTINCT libelle
FROM Activite
16
Tri du résultat – ORDER BY
SELECT *
FROM Station
ORDER BY tarif, nomStation
Tri par ordre ascendant d’abord en fonction du tarif, puis en
fonction du nom (ordre lexicographique)
SELECT *
FROM Station
ORDER BY tarif, nomStation DESC
17
La sélection la plus simple
SELECT *
FROM Station
WHERE Region=’Antilles’
Pour voir le contenu d’une table, il suffit d’omettre WHERE
18
La clause WHERE
On y spécifie une condition booléenne (utilisation standard de AND,
OR et NOT)
Les opérateurs de comparaison sont <, >, <=, >=, ! =
SELECT nomStation, libelle
FROM Activite
WHERE nomStation=’Santalba’ AND (prix > 50) AND (prix <120)
SELECT nomStation, libelle
FROM Activite
WHERE nomStation=’Santalba’ AND (prix BETWEEN 50 AND 120)
19
Conditions sur les chaı̂nes de caractères
% pour n’importe quelle chaı̂ne de caractères, pour n’importe quel
caractère.
SELECT nomStation
FROM Station
WHERE nomStation LIKE ’%a’
SELECT nomStation
FROM Station
WHERE nomStation LIKE ’V____’
20
Les Dates
SELECT idClient
FROM Sejour
WHERE debut BETWEEN DATE ’1998-07-01’ AND DATE ’1998-07-31’
Attention les 0 sont nécessaires
Fonctions supplémentaires pour calculer des écarts de dates,
ajouter des mois, des jours des semaines (voir la doc).
21
Les valeurs nulles
• NULL n’est pas une valeur mais une absence de valeur !
• Toute opération appliquée à NULL renvoie NULL
• Toute comparaison avec NULL donne un résultat qui n’est ni
vrai (1) ni faux (0) mais une valeur UNKNOWN (1/2).
Les connecteurs logiques donnent alors :
• x AND y = min(x, y)
• x OR y = max(x, y)
• NOT x = 1-x
22
Autre piège : NULL est un mot-clé pas une constante donc pas
d’opérateurs de comparaison usuels
SELECT *
FROM Sejour
WHERE nbPlaces IS NOT NULL
23
Requêtes sur plusieurs tables – Jointures
Noms des clients avec le nom des stations où ils ont séjourné :
SELECT nom, station
FROM Client, Sejour
WHERE id=idClient
Nom d’une station, son tarif, ses activités et leurs prix :
SELECT nomStation, tarif, libelle, prix
FROM Station, Activite
WHERE Station.nomStation=Activite.nomStation
SELECT nomStation, tarif, libelle, prix
FROM Station, Activite
WHERE Station.nomStation=Activite.nomStation
24
Union (UNION), intersection (INTERSECT) et
différence (EXCEPT)
Tous les noms de régions dans la base :
SELECT region FROM Station
UNION
SELECT region FROM Client
Les régions où l’on trouve à la fois des clients et des stations :
SELECT region FROM Station
INTERSECT
SELECT region FROM Client
Les régions où l’on trouve des stations mais pas des clients :
SELECT region FROM Station
EXCEPT
SELECT region FROM Client
25
Requêtes imbriquées
Jusqu’à présent, les conditions exprimées consistent à comparer des
valeurs scalaires.
Pour aller plus loin : on veut pouvoir exprimer des conditions
(d’existence, d’appartenance) sur des relations.
Requêtes imbriquées
26
Conditions portant sur des relations
Premier exemple
SELECT Station
FROM Sejour
WHERE idClient IN
(SELECT id FROM Client
WHERE ville=’Paris’)
27
• EXISTS R : renvoie TRUE si R n’est pas vide, FALSE sinon.
• t IN R : renvoie TRUE si t est dans R, FALSE sinon.
• v comp ANY R : où comp est un opérateur de comparaison,
renvoie TRUE si la comparaison avec au moins un des éléments
de R renvoie TRUE
• v comp ALL R : si la comparaison avec tous les éléments de R
renvoie TRUE
28
Quelques exemples
Où ne peut-on pas faire de ski ?
SELECT nomStation, lieu
FROM Station
WHERE nomStation NOT IN
(SELECT nomStation FROM Activite
WHERE libelle=’Ski’)
Quelle station pratique le tarif le plus élevé
SELECT nomStation
FROM Station
WHERE tarif >= ALL
(SELECT tarif FROM Station)
29
Dans quelle station pratique-t-on une activité au même prix qu’à
Santalba
SELECT nomStation, libelle
FROM Activite
WHERE prix IN
(SELECT prix FROM Activite
WHERE nomStation = ’Santalba’)
30
Évaluations inter-dépendantes – Sous-requêtes
corrélées
Quels sont les clients qui ont séjurné à Santalba ? :
SELECT nom, prenom
FROM Client
WHERE EXISTS (SELECT * FROM Sejour
WHERE station=’Santalba’
idClient = id)
Ici id appartient à Client.
31
Autre exemple
Dans quelle station pratique-t-on une activité au même prix qu’à
Santalba ?
SELECT nomStation
FROM Activite A1
WHERE EXISTS (SELECT * FROM Activite A2
WHERE nomStation=’Santalba’
AND A1.libelle=A2.libelle
AND A1.prix=A2.prix)
32
Agrégation
Les fonctionnalités d’agrégation permettent d’exprimer des
conditions sur des groupes de lignes d’une relation.
Pour cela, il faut fournir :
1. le moyen de partitionner une relation en groupes selon certains
critères.
2. le moyen d’exprimer des conditions sur ces groupes
3. des fonctions d’agrégation : COUNT, MAX, MIN, AVG, SUM.
33
Quelques exemples
SELECT COUNT(nomStation), AVG(tarif), MIN(tarif), MAX(tarif)
FROM Station
Requête incorrecte !
SELECT nomStation, AVG(tarif)
FROM Station
SELECT SUM(nbPlaces)
FROM Client, Sejour
WHERE nom=’Kerouac’ AND =id=idClient
34
La clause GROUP BY
Objectif : partitionner le résultat en sous-groupes pour y appliquer
des fonctions d’agrégation
Les régions avec leur nombre de stations :
SELECT region, COUNT(nomStation)
FROM Station
GROUP BY region
Le nombre de places réservées par client :
SELECT nom, SUM(nbPlaces)
FROM Client, Sejour
WHERE id=idClient
GROUP BY id, nom
35
La clause HAVING
Nombre de places rérvées par clients, pour les clients ayant réservé
plus de 10 places :
SELECT nom, SUM(nbPlaces)
FROM Client, Sejour
WHERE id=idClient
GROUP BY nom
HAVING SUM(nbPlaces)>=10
36
Mises-à-jour des données – Insertion
INSERT INTO R(A1, A2, ...)
VALUES (v1, v2, ...)
INSERT INTO Client (id, nom, prenom) VALUES (40, ’Toto’,
’Titi’)
Insertion du résultat d’une requête :
INSERT INTO Sites SELECT lieu, region FROM Station
37
Destruction
DELETE FROM R WHERE condition
Exemple :
DELETE FROM Client
WHERE nom LIKE ’M%’
38
Modification
UPDATE R SET A1=v1, A2=v2, ....
WHERE condition
Exemple :
UPDATE Activite
SET prix = prix * 1.1
WHERE nomStation = ’Passac’
39
Compléments
• Gestion des utilisateurs (administration du système, privilèges)
• Création de la base en tant que telle (création des vues,
d’index, des triggers)
• Processus de gestion simplifié dans beaucoup de systèmes
(phpMyAdmin)
• Interfaces Web (php)
• Interfaces Programmation (SQL/Java, SQL/C, SQL/Fortran)
40

Documents pareils