740 likes | 1.03k Views
Le 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
E N D
Le 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 Maria Berger - Maîtrise d'AES 2003-2004
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 C, ... • instruction SQL = requête • résultat d'une requête = table Maria Berger - Maîtrise d'AES 2003-2004
Caractéristiques • SQL est un langage à dimension triple : • le DDL (Data Definition Language) : commandes de SQL permettant de créer, modifier ou effacer la définition (schéma) d'une BD ou d'une table. • le DML (Data Manipulation Language) : interrogation et modification de l'information contenue dans les tables • le DCL (Data Control Language) : sécurité et confidentialité de la BD. Maria Berger - Maîtrise d'AES 2003-2004
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 Maria Berger - Maîtrise d'AES 2003-2004
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 ; Maria Berger - Maîtrise d'AES 2003-2004
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’; Maria Berger - Maîtrise d'AES 2003-2004
Interrogation d’une seule table CRU(Nom_Cru,Commune,Région,Coul) VINS(Région,Coul,Millésime,Qualité) CEPAGE_REGION(Cepage,R_PROD,Coul) OU EMP(Num,Nom,Fonction,N_Sup,Embauche, Salaire,Comm,N_Dep) DEPT(N_Dept,Nom,Lieu) Maria Berger - Maîtrise d'AES 2003-2004
PROJECTION • Extraction simple : afficher une table entièrement SELECT * FROM Nom_table; • Exemple : • Tous les crus ? • Expression algébrique : cru • SQL : SELECT * FROM CRU; Maria Berger - Maîtrise d'AES 2003-2004
PROJECTION SELECT Nom_Col1, ..., Nom_ColN FROM Nom_table; • Exemple : Requête : Liste des noms de crus Algèbre : Nom_Cru (CRU) SQL : SELECT Nom_Cru FROM CRU La clause DISTINCT permet d'éliminer les doublons. Maria Berger - Maîtrise d'AES 2003-2004
SELECTION SELECT Nom_Colonne FROM Nom_Table WHERE critère ; • Exemple : • Requête : La liste des noms de crus rouges • Algèbre : Nom_Cru ( Coul = rouge(CRU)) • SQL : SELECT Nom_Cru FROM CRU WHERE Coul=‘Rouge’ Maria Berger - Maîtrise d'AES 2003-2004
Opérateurs de comparaison • =,>,<,>=,<=,<> (ou != ou ^=) • In et not in • Requête : quels sont les bons millésimes de Bordeaux ? • SQL : SELECT Millésime FROM VINS WHERE Région = ‘Bordeaux’ AND Qualité =‘Bonne’ OR Qualité =‘Très Bonne’ OR Qualité =‘Excellente’ OU SELECT Millésime FROM VINS WHERE Région = ‘Bordeaux’ AND Qualité IN (‘Bonne’, ‘Très bonne’, Excellente’ ) Maria Berger - Maîtrise d'AES 2003-2004
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 cru qui commencent par Ch ? • SQL : SELECT Nom_Cru FROM CRU WHERE Nom_Cru like ‘Ch%’ • Requête : Quels sont les noms de cru possédant un ‘a’ en seconde position ? • SQL : SELECT Nom_Cru FROM CRU WHERE Nom_Cru like ‘_a%’ Maria Berger - Maîtrise d'AES 2003-2004
Opérateurs de comparaison • BETWEEN : appartenance à un intervalle • Exemple : • Requête : Quels sont les salariés gagnant entre 20000 et 25000 ? • SQL : SELECT Nom, Salaire FROM EMP WHERE Salaire BETWEEN 20000 AND 25000 Maria Berger - Maîtrise d'AES 2003-2004
Nom de colonne • Les colonnes constituant le résultat d’un SELECT peuvent être renommées dans le SELECT • Requête : salaire de chaque employé • SQL : SELECT Nom,Salaire « SALAIRE MENSUEL » FROM EMP; Maria Berger - Maîtrise d'AES 2003-2004
Opérateurs de comparaison • IS NULL et IS NOT NULL • Exemple : • Requête : le nom des crus dont la commune n’a pas été renseignée • SQL : SELECT Nom_Cru FROM CRU WHERE Commune IS NULL Maria Berger - Maîtrise d'AES 2003-2004
Tri des résultats • ORDER BY SELECT attribut1, attribut2, ... FROM Nom_table ORDER BY attribut1 [ASC], attribut2 [DESC], ... ; • Exemple : • Requête : Les bordeaux classés par millésimes et par couleur • SQL : SELECT * FROM VINS WHERE Région = ‘Bordeaux’ ORDER BY Millésime, Coul Maria Berger - Maîtrise d'AES 2003-2004
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 : Age moyen des professeurs • SQL : SELECT ‘2001-10-10’-AVG(Date_Naissance) FROM PROFESSEUR; • SUM : somme • Exemple : CA généré par les vendeurs de PACA: • SQL : SELECT SUM(CA) FROM Vendeur WHERE Region = 'PACA'’; Maria Berger - Maîtrise d'AES 2003-2004
Fonctions • COUNT : nombre d'éléments sélectionnés • Requête : Nombre de cépages bordelais ? • SQL : SELECT COUNT ( *) FROM CEPAGE_REGION WHERE R_Prod = ‘Bordeaux’; • MIN, MAX, ... • Expressions et Fonctions sur les chaînes de caractères • || : seul opérateur sur les chaînes de caractères : la concaténation. • Résultat : chaîne de caractères obtenue en écrivant d'abord la chaîne à gauche de || puis celle à droite de ||. • LOWER(chaîne) : Renvoie chaîne en ayant mis toutes ses lettres en minuscules. • ... Maria Berger - Maîtrise d'AES 2003-2004
Fonctions • Expressions et fonctions sur les dates • Opérateurs sur les dates : + et - • date +/- nombre : le resultat est une date obtenue en ajoutant le nombre de jours nombre à la date date. • date2 - date1 : le resultat est le nombre de jours entre les deux dates. Maria Berger - Maîtrise d'AES 2003-2004
Regroupements • Il est possible de subdiviser la table en groupes • Permet d’appliquer les fonctions d’aggrégation à des sous-groupes • Requête : Combien de crus rouges et de crus blancs sont produits dans chaque commune ? • SQL : SELECT Commune, Count(*) FROM CRU GROUP BY Commune, Coul; Maria Berger - Maîtrise d'AES 2003-2004
Résultat Maria Berger - Maîtrise d'AES 2003-2004
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 communes où au moins 2 crus rouges ou crus blancs sont produits? • SQL : SELECT Commune, Count(*) FROM CRU GROUP BY Commune, Coul HAVING Count(*) >2; Maria Berger - Maîtrise d'AES 2003-2004
Quantificateurs • ALL + opérateur de comparaison : teste si une expression est vérifiée dans tous les cas de figure • Requête : Tous les salariés ont-ils été recrutés avant le 1er janvier 2001 ? • SQL : ‘2001-01-01’ > ALL (SELECT Embauche FROM EMP) • SOME ou ANY : expression vraie si la comparaison est vérifiée pour au moins une valeur • Requête : vérifiez si au moins un salarié a été recruté depuis un an • SQL : ‘2000-10-01’ > ANY (SELECT Embauche FROM EMP) Maria Berger - Maîtrise d'AES 2003-2004
Quantificateurs • EXISTS, NOT EXISTS Maria Berger - Maîtrise d'AES 2003-2004
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. Maria Berger - Maîtrise d'AES 2003-2004
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. Maria Berger - Maîtrise d'AES 2003-2004
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 : à partir de quel cépage principal est produit le Meursault ? • SQL :SELECT Cépage FROM CEPAGE_REGION, CRU WHERE région = R_Prod AND Commune = Meursault’ Si l’attribut Région avait le même nom dans CRU que dans CEPAGE_REGION on aurait écrit : CRU.Région = CEPAGE_REGION.Région Maria Berger - Maîtrise d'AES 2003-2004
Auto-jointure : • Requête : Donner pour chaque employé le nom de son supérieur hiérarchique. • SQL : SELECT EMP.Nom, chef.Mom FROM EMP, EMP chef WHERE EMP.N_sup= chef.Num; Maria Berger - Maîtrise d'AES 2003-2004
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 EMP.nom, EMP.salaire, EMP.fonction FROM EMP, EMP empbis WHERE EMP.salaire > empbis.salaire AND empbis.nom = 'SIMON'; Maria Berger - Maîtrise d'AES 2003-2004
Requêtes imbriquées • une clause WHERE est elle-même le résultat d'un SELECT • renvoient une ou plusieurs valeurs Maria Berger - Maîtrise d'AES 2003-2004
Requêtes imbriquées • Sous-interrogation ramenant une seule valeur • Requête : Quels sont les vins qui sont produits dans la même commune que La Grappe d’Or ? • SQL : SELECT Nom_Cru FROM VINS WHERE Commune = (SELECT Commune FROM VINS WHERE Nom_Cru = ‘La Grappe d’Or’) • Remarque : auto-jointure possible pour répondre à cette question Maria Berger - Maîtrise d'AES 2003-2004
Requêtes imbriquées • une sous-interrogation qui ne ramène aucune ligne se termine avec un code d'erreur. • une sous-interrogation ramenant plusieurs lignes provoquera aussi, dans ce cas, une erreur Maria Berger - Maîtrise d'AES 2003-2004
Requêtes imbriquées • Sous-interrogation ramenant plusieurs lignes • Avec des opérateurs de comparaison admettant à leur droite un ensemble de valeurs comme : • l'opérateur IN • les opérateurs obtenus en ajoutant ANY ou ALL à la suite d'un opérateur de comparaison classique (=, <>, >, >=, <, <=) Maria Berger - Maîtrise d'AES 2003-2004
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); Maria Berger - Maîtrise d'AES 2003-2004
Requêtes imbriquées • Sous-interrogation ramenant plusieurs colonnes • Exemple : Quels sont les employés ayant la même fonction et le même supérieur que CODD ? • SQL : SELECT Nom, Fonction, N_Sup FROM Emp WHERE (Fonction,N_Sup) = (SELECT Fonction,N_Sup FROM Emp WHERE Nom = 'CODD'); Maria Berger - Maîtrise d'AES 2003-2004
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' AND N_Dept = Empbis.N_Dept); Maria Berger - Maîtrise d'AES 2003-2004
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 : MINUS • La syntaxe d'utilisation est la même pour ces trois opérateurs : • SELECT ... {UNION | INTERSECT | MINUS } SELECT ... Maria Berger - Maîtrise d'AES 2003-2004
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, MINUS. SELECT ... UNION SELECT ... MINUS SELECT ... • Expresion évaluée de gauche à droite. Modification de l'ordre d'évaluation par des parenthèses. SELECT ... UNION (SELECT ... MINUS SELECT ...) Maria Berger - Maîtrise d'AES 2003-2004
Les opérateurs ensemblistes • Exemple : Lister tous les enseignants SELECT Nom, Prénom FROM MdC UNION SELECT Nom, Prénom FROM Professeur ; Maria Berger - Maîtrise d'AES 2003-2004
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. Maria Berger - Maîtrise d'AES 2003-2004
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 Maria Berger - Maîtrise d'AES 2003-2004
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’) Maria Berger - Maîtrise d'AES 2003-2004
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'; Maria Berger - Maîtrise d'AES 2003-2004
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' ]; Maria Berger - Maîtrise d'AES 2003-2004
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é‘; Maria Berger - Maîtrise d'AES 2003-2004
Le language de définition de données • Création d'une table CREATE TABLE nom_table (nom_col1 TYPE1,[NOTNULL/ PRIMARY KEY/FOREIGN KEY] nom_col2 TYPE2,[.../.../...] ...); • Types acceptés : • CHAR(longueur), VARCHAR(longueur) • SMALLINT, INTEGER, DECIMAL(m,n), FLOAT, SERIAL(n) • DATE Maria Berger - Maîtrise d'AES 2003-2004
Création d'une table CREATE TABLE Departement (NDep SERIAL(20),NOTNULL,PRIMARY KEY, NomDep CHAR(20), Directeur CHAR(20), Budget DECIMAL(6,0)); CREATE TABLE Etudiant (NEtud SERIAL(20),NOTNULL,PRIMARY KEY, Nom CHAR(20), Prénom CHAR(20), DateNaissance DATE, Rue CHAR(80), CodePostal DECIMAL(5,0), Ville CHAR(20),DEFAULT ‘‘PARIS’’, NDep SERIAL(20),NOTNULL,FOREIGN KEY); Maria Berger - Maîtrise d'AES 2003-2004
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 DECIMAL(10,0) BEFORE NDep); Maria Berger - Maîtrise d'AES 2003-2004
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 Char(25)); Maria Berger - Maîtrise d'AES 2003-2004
Modification d'une table • Changement de nom de tables ou de colonnes : RENAME TABLE ancien_nom TO nouveau_nom ; RENAME COLUMN nom_relation.ancien_nom_col TO nouveau_nom_col ; • Exemple : RENAME COLUMN Etudiant.DateNaissance TO BirthDay; Maria Berger - Maîtrise d'AES 2003-2004