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