Upload
hakiet
View
222
Download
0
Embed Size (px)
Citation preview
Catégorie : Informatique / Base de données
STRUCTURED QUERY LANGUAGE
(SQL)
Version 1.4 du 01/03/2017
Emmanuel Fruchart
Le langage SQL
Page 2/99 01/03/17
SOMMAIRE
SOMMAIRE ..................................................................................................................................................................... 2
AVANT-PROPOS............................................................................................................................................................. 4
INTRODUCTION AU LANGAGE SQL ........................................................................................................................ 5
I PRESENTATION HISTORIQUE ................................................................................................................................. 5 II DESCRIPTION TECHNIQUE ...................................................................................................................................... 6
BASE DE DONNEES EXEMPLE : BDCOURS ............................................................................................................ 7
I CAHIER DES CHARGES ........................................................................................................................................... 7
A Années scolaires .............................................................................................................................................. 8 B Périodes scolaires ............................................................................................................................................ 9 C Classes ........................................................................................................................................................... 10 D Matières ......................................................................................................................................................... 11 E Professeurs .................................................................................................................................................... 12 F Professeurs de remplacement ........................................................................................................................ 13
G Enseignements ............................................................................................................................................... 14 II MODELE RELATIONNEL ....................................................................................................................................... 15
LE LANGAGE DE DEFINITION DES DONNEES ................................................................................................... 17
I INTRODUCTION.................................................................................................................................................... 17
II LES TYPES DE DONNEES SQL .............................................................................................................................. 17 A Les types chaînes de caractères ..................................................................................................................... 17
B Les types numériques ..................................................................................................................................... 19 C Les types temporels ........................................................................................................................................ 21 D Les types binaires .......................................................................................................................................... 22 E Les types pour la base exemple bdcours ........................................................................................................ 23
III CREATION ET SUPPRESSION D'UNE BASE DE DONNEES ......................................................................................... 24
A Création d'une base de données .................................................................................................................... 24
B Suppression d'une base de données ............................................................................................................... 24
IV CREATION, MISE A JOUR, SUPPRESSION D'UNE TABLE .......................................................................................... 25
A Création d'une table ...................................................................................................................................... 25 B Mise à jour d'une table .................................................................................................................................. 28 C Suppression d'une table ................................................................................................................................. 28
D Création de la base exemple bdcours ............................................................................................................ 29
LE LANGAGE DE MANIPULATION DES DONNEES ............ ............................................................................... 31
I INTRODUCTION.................................................................................................................................................... 31
II INSERTION D'UNE DONNEE DANS UNE TABLE ....................................................................................... 32
A Commande d'insertion d'une seule donnée .................................................................................................... 32
B Insertion de données primaires dans la base exemple bdcours ..................................................................... 33 III INTERROGATION DES DONNEES ................................................................................................................ 35
A Interrogation des données d'une seule table, sans regroupement ................................................................. 35 1) Introduction ................................................................................................................................................................. 35 2) Les mots clés SELECT, ALL, DISTINCT .................................................................................................................. 36
3) Les clauses de sélection............................................................................................................................................... 39 4) Critères de sélection .................................................................................................................................................... 50 5) Critères de tri ............................................................................................................................................................... 60
B Interrogation des données d'une seule table, avec regroupement(s) ............................................................. 63 1) Clauses de regroupement ............................................................................................................................................ 64 2) Critères de regroupement ............................................................................................................................................ 66
C Interrogation des données de plusieurs tables ............................................................................................... 67
1) Requêtes imbriquées ................................................................................................................................................... 68 2) Union, intersection, différence .................................................................................................................................... 75 3) Jointures ...................................................................................................................................................................... 81
IV INSERTION D'UN ENSEMBLE DE DONNEES EN UNE SEULE FOIS ............................................................................. 93 V M ISE A JOUR DE DONNEES ................................................................................................................................... 94
VI SUPPRESSION DE DONNEES .................................................................................................................................. 95
Le langage SQL
Page 3/99 01/03/17
TRANSACTIONS / ACCES CONCURRENTS. ......................................................................................................... 96
I TRANSACTIONS ................................................................................................................................................... 96
II ACCES CONCURRENTS ......................................................................................................................................... 96
CONFIDENTIALITE (OU CONTROLE) DES DONNEES ......... ............................................................................. 97
I OCTROI DE PRIVILEGES ....................................................................................................................................... 98
II RETRAIT DE PRIVILEGES ...................................................................................................................................... 99
Le langage SQL
Page 4/99 01/03/17
AVANT-PROPOS Le langage SQL étant fortement lié à ces concepts, des connaissances dans les domaines
suivants sont supposées acquises : � systèmes de gestion de bases de données (couramment appelés SGBD) � modèle relationnel / algèbre relationnelle
Le langage SQL
Page 5/99 01/03/17
INTRODUCTION AU LANGAGE SQL
I PRESENTATION HISTORIQUE
SQL (Structured Query Language) est, comme sa traduction en français l'indique, un langage structuré de requêtes.
A l'origine, SQL est une évolution du langage SEQUEL (Structured English as a QUEry
Language") développé par la compagnie IBM dans les années 70 pour accompagner son premier SGBD relationnel appelé SYSTEM-R.
SQL est peu à peu devenu la norme en matière de langage relationnel. Plusieurs versions
apparaissent successivement :
� SQL/86 (datant de 1986) est le premier standard officiel ratifié par les comités ISO (International Organization for Standardization) et ANSI (American National Standards Institute).
� SQL/89 permet en plus la définition des contraintes de référence. � SQL/92, encore appelé SQL-2 ou SQL Standard, étend la norme avec les caractéristiques
suivantes : � Mise en place des connexions et sessions pour le client / serveur. � Normalisation des types de données date et heure. � Ajout explicite des opérateurs d'intersection et de différence. � Généralisation de l'opérateur de jointure. � Définition des contraintes d'intégrité. � Traitement du SQL dynamique. � Introduction d'un catalogue pour chaque base de données.
C'est sur cette norme SQL/92, qu'on appellera dans toute la suite SQL Standard, que ce support de cours sera basé.
Le langage SQL
Page 6/99 01/03/17
II DESCRIPTION TECHNIQUE
SQL admet les caractéristiques suivantes :
� C'est un langage relationnel de type ensembliste (en particulier, il n'utilise pas de variable !) � On dit que le langage SQL réalise une intégration verticale : il est adapté aussi bien à
l'administrateur de base de données qu'à l'architecte d'applications et qu'au développeur. Les trois types d'utilisateurs utilisent la même gamme de mots réservés, dans des portées peut-être différentes.
� On dit que le langage SQL. réalise une intégration horizontale : il met à la disposition d'un
utilisateur quelconque d'une base de données relationnelle des commandes qui permettent de : � définir les données (on parle de LDD ou Langage de Définition des Données). � manipuler les données (on parle de LMD ou Langage de Manipulation des Données). � contrôler les données (on parle de LCD, ou Langage de Contrôle des Données).
� Il peut être interprété directement, ou encore incorporé (embedded) dans un langage procédural (type C ou Pascal).
� Tous les principaux SGBD relationnels (SGBDR) du marché, dont DB2, Oracle, Informix, SQL
Server, Sybase, Ingres ou Access ont adopté SQL. Cependant, chaque SGBDR utilise sa propre version, sa propre variante du langage SQL. Il existe donc un ensemble de dialectes SQL, mais ceux ci étant relativement proches les uns des autres, SQL est un langage relativement portable.
Le langage SQL
Page 7/99 01/03/17
BASE DE DONNEES EXEMPLE : BDCOURS
I CAHIER DES CHARGES
Le responsable des enseignements d’un lycée souhaite gérer les enseignements dispensés. Il souhaite mettre en place la base de données bdcours, contenant les informations et tables suivantes :
Le langage SQL
Page 8/99 01/03/17
A Années scolaires Nom de la table : annee Champs : id_annee entier desc_annee 50 caractères nb_filles entier nb_garcons entier Une année scolaire de la table annee se définit de manière unique par son identifiant id_annee. Le champ desc_annee contient quant à lui une description littérale de l'année scolaire ainsi définie. Les champs nb_filles et nb_garçons sont là pour permettre d'établir des statistiques. Exemple :
id_annee desc_annee nb_filles nb_garcons
2014 Année Scolaire 2014-2015 150 150 2015 Année Scolaire 2015-2016 157 142
Le langage SQL
Page 9/99 01/03/17
B Périodes scolaires Nom de la table : periode Champs : id_periode 2 caractères desc_periode 50 caractères
Une période de la table periode représente un trimestre de l’année scolaire. Chaque période se définit de manière unique par son identifiant littéral id_periode. Le champ desc_periode contient quant à lui une description littérale de la periode ainsi définie. Exemple :
id_periode desc_periode
1T Premier trimestre 2T Deuxième trimestre 3T Troisième trimestre
Le langage SQL
Page 10/99 01/03/17
C Classes Nom de la table : classe Champs : id_classe 4 caractères desc_classe 50 caractères
Au sein du lycée, on retrouve chaque année les mêmes classes (avec des élèves différents). Une classe de la table classe se définit de manière unique par son identifiant littéral id_classe. Le champ desc_classe contient quant à lui une description littérale de la classe ainsi définie. Exemple :
id_classe desc_classe
2ND1 Seconde 1 2ND2 Seconde 2 2ND3 Seconde 3 1LIT 1ère L 1SES 1ère ES 1SCI 1ère S TLIT Terminale L TSES Terminale ES TSCI Terminale S
Le langage SQL
Page 11/99 01/03/17
D Matières Nom de la table : matiere Champs : id_matiere 4 caractères desc_matiere 50 caractères Chaque matière enseignée de la table matiere se définit de manière unique par son identifiant littéral id_matiere. Le champ desc_matiere contient quant à lui sa description. Exemple : id_matiere desc_matiere
ANGL Anglais FRAN Français HGEO Histoire Géographie MATH Mathématiques PHCH Physique Chimie PHIL Philosophie SCVT Sciences et Vie de la Terre SECS Sciences Economiques et Sociales
Le langage SQL
Page 12/99 01/03/17
E Professeurs Nom de la table : professeur Champs : id_professeur 8 caractères nom 50 caractères prenom 50 caractères sexe 1 caractère date_naissance date id_matiere 4 caractères Un professeur du lycée est caractérisé dans la table professeur par son identifiant littéral id_professeur. Les champs nom, prenom et date_naissance donnent les informations minimales sur le professeur. A noter qu’un même professeur peut enseigner éventuellement plusieurs matières mais possède une matière de rattachement qui est donnée par le champ id_matiere. Exemple :
id_professeur nom prenom sexe date_naissance id_matiere
DUBOISAM Dubois Amélie F 1980-01-30 ANGL LEROYTHO Leroy Thomas H 1985-06-05 ANGL DUBOISGE Dubois Gérard H 1981-02-25 FRAN MOREAUPA Moreau Patrick H 1986-07-01 FRAN DURANDST Durand Stéphane H 1983-04-15 HGEO MORELSTE Morel Stéphanie F 1990-11-16 HGEO FOURNIER Fournier Nicolas H 1989-10-21 MATH PETITCHR Petit Christophe H 1982-03-20 MATH GARCIATH Garcia Thierry H 1988-09-26 PHCH THOMASVI Thomas Vincent H 1991-12-11 PHCH GIRARDAN Girard Antoine H 1992-01-21 PHIL LAMBERTA Lambert Alice F NULL PHIL LEFEBVRE Lefebvre Géraldine F 1987-08-31 SCVT MARTINEZ Martinez Nathalie F 1993-02-14 SCVT LEROYPHI Leroy Philippe H 1984-05-10 SECS ROUSSELJ Roussel Jeanne F NULL SECS
Le langage SQL
Page 13/99 01/03/17
F Professeurs de remplacement Nom de la table : professeur_rem Champs : id_professeur 8 caractères nom 50 caractères prenom 50 caractères sexe 1 caractère date_naissance date id_matiere 4 caractères Un professeur remplaçant du lycée est caractérisé dans la table professeur_rem par son identifiant littéral id_professeur. Les champs nom, prenom et date_naissance donnent les informations minimales sur le professeur. Exemple :
id_professeur nom prenom sexe date_naissance id_matiere
DUBOISAM Dubois Amélie F 1980-01-30 ANGL LEROYTHO Leroy Thomas H 1985-06-05 ANGL DUBOISGE Dubois Gérard H 1981-02-25 FRAN MOREAUPA Moreau Patrick H 1986-07-01 FRAN DURANDST Durand Stéphane H 1983-04-15 HGEO MORELSTE Morel Stéphanie F 1990-11-16 HGEO FOURNIER Fournier Nicolas H 1989-10-21 MATH PETITCHR Petit Christophe H 1982-03-20 MATH GARCIATH Garcia Thierry H 1988-09-26 PHCH THOMASVI Thomas Vincent H 1991-12-11 PHCH GIRARDAN Girard Antoine H 1992-01-21 PHIL LAMBERTA Lambert Alice F NULL PHIL LEFEBVRE Lefebvre Géraldine F 1987-08-31 SCVT MARTINEZ Martinez Nathalie F 1993-02-14 SCVT LEROYPHI Leroy Philippe H 1984-05-10 SECS ROUSSELJ Roussel Jeanne F NULL SECS
Le langage SQL
Page 14/99 01/03/17
G Enseignements Nom de la table : enseignement Champs :
id_annee entier id_periode 2 caractères id_classe 4 caractères id_matiere 4 caractères id_professeur 8 caractères moyenne_classe réel Un enseignement se définit de manière unique dans la table enseignement par un quatuor (id_annee, id_periode, id_classe, id_matiere). Un professeur, caractérisé par son identifiant id_professeur, ainsi qu'une moyenne de classe moyenne_classe lui sont attribués. Nécessairement, les champs id_annee, id_periode, id_classe, id_matiere, id_professeur de la table enseignement doivent être respectivement référencés dans les tables annee, periode, classe, matiere et professeur. Exemple : id_annee id_periode id_classe id_matiere id_professeur moyenne_classe
2014 1T 2ND1 ANGL DUBOISAM 11.5 2014 1T 2ND1 FRAN DUBOISGE 10.1 2014 1T 2ND1 HGEO DURANDST 13 2014 1T 2ND1 MATH FOURNIER 10.4 2014 1T 2ND1 PHCH GARCIATH 12.1 2014 1T 2ND1 SCVT LEFEBVRE 11.8 2014 1T 2ND1 SECS LEROYPHI 14.3
Le langage SQL
Page 15/99 01/03/17
II MODELE RELATIONNEL Le schéma relationnel de la base de données est donné ci-dessous :
Le(s) champ(s) formant la clé primaire des tables est (sont) en gras dans le schéma. Les liens entre les champs de différentes tables représentent les clés étrangères. La clé primaire de la table annee est le champ id_annee. La clé primaire de la table periode est le champ id_periode. La clé primaire de la table classe est le champ id_classe. La clé primaire de la table matiere est le champ id_matiere. La clé primaire de la table professeur est le champ id_professeur. La clé primaire de la table professeur_rem est le champ id_professeur. La clé primaire de la table enseignement est le quatuor id_annee, id_periode, id_classe, id_matiere.
Le langage SQL
Page 16/99 01/03/17
Le champ id_matiere de la table matiere est une clé étrangère pour le champ id_matiere de la table professeur Le champ id_matiere de la table matiere est une clé étrangère pour le champ id_matiere de la table professeur_rem Le champ id_annee de la table annee est une clé étrangère pour le champ id_annee de la table enseignement. Le champ id_periode de la table periode est une clé étrangère pour le champ id_periode de la table enseignement. Le champ id_classe de la table classe est une clé étrangère pour le champ id_classe de la table enseignement. Le champ id_matiere de la table matiere est une clé étrangère pour le champ id_matiere de la table enseignement. Le champ id_professeur de la table professeur est une clé étrangère pour le champ id_professeur de la table enseignement.
Le langage SQL
Page 17/99 01/03/17
LE LANGAGE DE DEFINITION DES DONNEES
I INTRODUCTION Le LDD, Langage de Définition des Données (DDL en anglais, Data Definition Language)
est l'ensemble des commandes permettant de définir , modifier et supprimer un objet d'une base de données relationnelle.
Nous allons d'abord nous intéresser aux différents types SQL possibles pour les champs.
II LES TYPES DE DONNEES SQL
Il existe 4 grandes classes de types : les types chaînes de caractères, les types numériques, les types temporels et les types binaires.
A Les types chaînes de caractères
Introduction
SQL Standard introduit les 2 types chaînes de caractères suivants :
� CHAR(n) � VARCHAR(n) Définition de CHAR(n)
CHAR(n) s'utilise pour une chaîne de caractères de longueur fixe, avec n entre 1 et 16383.
Pour ce type :
� On ne peut insérer de chaîne dont la longueur dépasse n. � Une chaîne dont la longueur est inférieure à n sera complétée par des espaces (primordial
pour la comparaison de chaînes).
Le langage SQL
Page 18/99 01/03/17
Définition de VARCHAR(n)
VARCHAR(n), quant à lui, s'utilise pour une chaîne de caractères de longueur variable, avec n compris entre 1 et 16383.
Comme pour CHAR(n), il faut consulter la documentation du SGBD pour connaître la valeur maximale de n.
Comment choisir ? De manière générale, l'utilisation de CHAR est à privilégier si le contenu de la colonne est
imprévisible, mais de taille maximale connue. A l'opposé, si les valeurs de la colonne occupent en général peu d'espace et que l'utilisation de la taille maximale de la colonne fait exception, on utilisera de préférence le type VARCHAR. Utilisation de constantes chaînes
En SQL Standard, les constantes chaînes de caractères sont entourées par des apostrophes (les guillemets sont aussi souvent tolérés). Si la chaîne elle-même contient une apostrophe, celle ci doit être doublée.
Par exemple 'L''eau vive'.
Portabilité Chaque SGBD impose sa propre longueur maximale pour n. Il faut donc dans tous les cas
consulter la documentation pour avoir ce renseignement. Pour le reste, les types standard sont quasiment implémentés sur tous les SGBD relationnels courants (le cas Oracle est traité au paragraphe suivant).
Le langage SQL
Page 19/99 01/03/17
B Les types numériques Introduction
SQL Standard introduit les types numériques suivants :
� SMALLINT � INTEGER � NUMERIC(p,d) � DECIMAL(p,d) � REAL � DOUBLE PRECISION � FLOAT
Définition de SMALLINT
SMALLINT s'utilise pour un entier signé entre –32768 et 32767.
Définition de INTEGER
INTEGER s'utilise pour un entier signé entre –231 et 231 - 1. Définition de NUMERIC(p, d) et DECIMAL(p, d)
NUMERIC(p,d) ou DECIMAL(p,d) s'emploie pour un nombre décimal à p chiffres significatifs dont d après la virgule. Définition de REAL
REAL s'utilise pour un nombre réel dit à simple précision, avec au moins 7 chiffres significatifs.
Le langage SQL
Page 20/99 01/03/17
Définition de DOUBLE PRECISION et FLOAT
DOUBLE PRECISION ou FLOAT s'emploie pour un nombre réel dit à double précision, avec au moins 15 chiffres significatifs.
Utilisation de constantes numériques
A noter que les constantes numériques ont un format "classique". Par exemple, –5 ou 2.5 ou même 5.4E-5 (pour le réel 5.4 * 10-5).
Portabilité Il existe des divergences quant à l’implémentation de ces types numériques standard et
l’ajout d’autres types numériques dans les différents SGBD existants. Comme pour les types littéraux, la documentation spécifique au SGBD utilisé doit donc être consultée avant d'utiliser les types numériques.
Le langage SQL
Page 21/99 01/03/17
C Les types temporels Introduction
SQL Standard introduit les types temporels suivants :
� DATE � TIME � TIMESTAMP � INTERVAL
Définition de DATE
Le type DATE, comme son nom l'indique, s'utilise pour une date, 2 chiffres étant réservés
pour le jour, 2 pour le mois et 4 pour l'année. Définition de TIME Le type TIME représente une heure, au format "heure minute seconde". Attention, les secondes peuvent éventuellement contenir un certain nombre de décimales. Définition de TIMESTAMP
Le type TIMESTAMP s'emploie pour un moment précis, c'est à dire une date avec heures, minutes et secondes avec 6 chiffres après la virgule, c'est à dire une précision en microsecondes. Définition de INTERVAL
Le type INTERVAL s'emploie pour un intervalle de temps.
Utilisation de constantes temporelles Le format des constantes de type temporel dépend des options que l'administrateur de la
base de données a choisies à la création de la base (par exemple, '01/01/2000' si mode "français" ou '2000/01/01' si mode "anglais").
Le langage SQL
Page 22/99 01/03/17
Portabilité Il existe des divergences quant à l’implémentation des types temporels SQL Standard et
l’ajout d’autres types temporels dans les différents SGBD relationnels existants. Là encore, la documentation spécifique au SGBD utilisé doit donc être consultée avant d'utiliser les types temporels.
D Les types binaires
Introduction Ces types peuvent servir pour l'enregistrement de données type images et sons, mais nous ne
les utiliserons pas dans le cadre de ce cours. SQL Standard introduit les types binaires suivants :
� BIT � BIT VARYING
Définition de BIT
BIT s'utilise pour un type binaire de longueur constante. Définition de BIT VARYING
BIT VARYING s'emploie pour un type binaire de longueur variable.
Le langage SQL
Page 23/99 01/03/17
E Les types pour la base exemple bdcours
Afin de facilement pouvoir porter notre base exemple sur des S.G.B.D. multiples, on va utiliser les types CHAR(n) pour les chaînes de caractères, INTEGER pour les entiers, FLOAT pour les réels et DATE pour les dates.
Ainsi, on obtiendra les types suivants :
annee id_annee INTEGER
desc_annee CHAR(50) nb_filles INTEGER nb_garcons INTEGER periode
id_periode CHAR(2) desc_periode CHAR(100) classe
id_classe CHAR(4) desc_classe CHAR(100)
matiere
id_matiere CHAR(4) desc_matiere CHAR(100) professeur professeur_rem
id_professeur CHAR(8) id_professeur CHAR(8) nom CHAR(50) nom CHAR(50) prenom CHAR(50) prenom CHAR(50) sexe CHAR(1) sexe CHAR(1) date_naissance DATE date_naissance DATE id_matiere CHAR(4) id_matiere CHAR(4) enseignement
id_annee INTEGER id_periode CHAR(2) id_classe CHAR(4) id_matiere CHAR(4) id_professeur CHAR(8) moyenne_classe FLOAT
Le langage SQL
Page 24/99 01/03/17
III CREATION ET SUPPRESSION D'UNE BASE DE DONNEES A Création d'une base de données
Instruction standard SQL de création d'une base CREATE DATABASE nom_base; Le caractère ";" marque la fin de toute requête S.Q.L. Attention, sous certains S.G.B.D, les bases de données sont en fait créés par l'administrateur
au moment de la configuration du S.G.B.D. par des outils dédiés, de sorte que l'instruction ci-dessus est obsolète. L'utilisateur, lors de la connexion à une base de données, spécifie son nom d'utilisateur, son mot de passe, et l'alias de base utilisée. Il peut alors accéder alors aux objets de cette base de données.
B Suppression d'une base de données Instruction standard SQL de suppression d'une base DROP DATABASE nom_base; Attention, sous certains S.G.B.D., les bases de données sont en fait gérées par
l'administrateur au moyen d'outils dédiés, de sorte que l'instruction ci-dessus est obsolète.
Le langage SQL
Page 25/99 01/03/17
IV CREATION, MISE A JOUR, SUPPRESSION D'UNE TABLE A Création d'une table
Instruction standard SQL de création d'une table (aussi valable sous Oracle)
CREATE TABLE nom_table ( nom_ colonne type_ colonne [DEFAULT valeur] [contrainte_colonne] , …………………. …………………. […………………...] [……………..……..], nom_ colonne type_ colonne [DEFAULT valeur] [contrainte _colonne], CONSTRAINT nom_contrainte_table contrainte_table , ……………….. ……………………….. ………………… , CONSTRAINT nom_contrainte_table contrainte_table ) ;
Il est important de noter que les paramètres entre crochets sont facultatifs donc optionnels. Il
faut faire très attention à la syntaxe précise (notamment, ne pas oublier de virgules, ni en rajouter avant de fermer la parenthèse finale de l'instruction).
Noms des colonnes Les noms des colonnes seront, de préférence, des noms communs, sans caractères spéciaux,
ni accents. Types des colonnes Les types de colonnes ont été étudiées dans II. Valeurs par défaut Ces valeurs sont des constantes du type de la colonne (ex : 2000 pour une colonne de type
INTEGER, 500.00 pour une colonne de type FLOAT, 'Chaîne par défaut' pour une colonne chaîne de caractères).
Le langage SQL
Page 26/99 01/03/17
Contraintes de colonnes Les contraintes de colonne possibles sont :
� PRIMARY KEY : pour dire que la colonne en question est la clé primaire de la table. � NOT NULL : pour dire que les valeurs de la colonne doivent absolument être renseignées. � UNIQUE : pour empêcher la présence de doublons dans les valeurs de la colonne. � CHECK (expression_de_condition_colonne) : pour spécifier que les données de la colonne
doivent respecter une certaine condition portant sur la colonne uniquement. � REFERENCES nom_table_reference (nom_colonne_reference) : pour spécifier que la
colonne est reliée à une clé étrangère extérieure qui est le champ nom_colonne_reference de la table nom_table_reference.
Noms des contraintes de tables Les noms des contraintes de table seront, de préférence, des noms communs, sans caractères
spéciaux, ni accents, composés classiquement de symboles représentant les types de contrainte (exemple PKperiode pour la clé primaire de la table periode).
Contraintes de tables Les contraintes de table possibles sont :
� PRIMARY KEY (nom_colonne1, nom_colonne2, … ) : pour dire que la clé primaire de la table est formée des champs nom_colonne1, nom_colonne2, …
� UNIQUE(nom_colonne1, nom_colonne2, … ) : pour empêcher la présence de doublons dans
les valeurs des t - uplets (valeur_colonne1, valeur_colonne2, …). � CHECK (expression_de_condition_table) : pour spécifier que les données de la table doivent
respecter une certaine condition portant sur tout ou partie des colonnes de la table. � FOREIGN KEY(nom_colonne) REFERENCES nom_table_ref (nom_colonne_ref) : pour
spécifier que la colonne est reliée à une clé étrangère extérieure qui est le champ nom_colonne_ref de la table nom_table_ref.
Les expressions de conditions sur une colonne ou sur la table (contraintes CHECK colonne
ou table) seront étudiées plus en détails dans IV. En effet, elles ont la même syntaxe que les critères d'interrogation dans les requêtes SQL. Des exemples de telles expressions seront étudiées à la fin de ce chapitre lors de la création de la base exemple bdcours.
Le langage SQL
Page 27/99 01/03/17
Remarque
Sous certains autres S.G.B.D. du marché, on peut aussi créer une table en utilisant le résultat d'une requête de sélection (voir ci-après, chapitre IV.) de la manière suivante :
CREATE TABLE nom_table AS SELECT …. FROM … ; La table créée comportera les colonnes sélectionnées dans la requête effectuée (avec leur
type d'origine) et sera initialisée avec les données résultant de cette même requête.
Le langage SQL
Page 28/99 01/03/17
B Mise à jour d'une table
Instruction standard SQL de mise à jour d'une table (aussi valable sous Oracle) ALTER TABLE nom_table ordre_de_mise_a_jour; Ordres de mise à jour Ils se déclinent sous 5 formes :
� Ajout d'une colonne à la définition de la table ADD COLUMN nom_ colonne type_ colonne [DEFAULT valeur] [contrainte_colonne] � Ajout d'une contrainte de table à la définition de la table ADD CONSTRAINT nom_contrainte_table contrainte_table � Modification de la définition d'une colonne (nécessairement déjà existante) ALTER nom_ colonne type_ colonne [DEFAULT valeur] [contrainte_colonne] � Suppression d'une colonne à la définition de la table DROP COLUMN nom_ colonne � Suppression d'une contrainte de table à la définition de la table DROP CONSTRAINT nom_contrainte_table C Suppression d'une table
Instruction standard SQL de suppression d'une table (aussi valable sous Oracle) DROP TABLE nom_ table;
Le langage SQL
Page 29/99 01/03/17
D Création de la base exemple bdcours
Un script SQL est un certain nombre de commandes SQL, séparées par des points-virgules, visant à effectuer un certain nombre d’opérations sur une base de données (définition d’une base, insertion de données, mise à jour…)
Voici un exemple de script SQL standard de création des tables de la base de données
exemple bdcours :
------------------------------------------------------------------------------------------------------------------------ create database if not exists bdcours; use bdcours; drop table if exists enseignement; drop table if exists professeur; drop table if exists professeur_rem; drop table if exists annee; drop table if exists periode; drop table if exists classe; drop table if exists matiere; create table annee ( id_annee integer NOT NULL, desc_annee char(50), nb_filles integer, nb_garcons integer, constraint PK_annee PRIMARY KEY(id_annee), constraint CK_annee CHECK(id_annee >= 2014 and id_annee < 2500) ); create table periode ( id_periode char(2) NOT NULL, desc_periode char(100), constraint PK_periode PRIMARY KEY(id_periode) ); create table classe ( id_classe char(4) NOT NULL, desc_classe char(100), constraint PK_classe PRIMARY KEY(id_classe) ); create table matiere ( id_matiere char(4) NOT NULL, desc_matiere char(100), constraint PK_matiere PRIMARY KEY(id_matiere) );
Le langage SQL
Page 30/99 01/03/17
create table professeur ( id_professeur char(8) NOT NULL, nom char(50) NOT NULL, prenom char(50) NOT NULL, sexe char(1) NOT NULL, date_naissance date, id_matiere char(4) NOT NULL, constraint PK_professeur PRIMARY KEY(id_professeur), constraint FK_prof_mat FOREIGN KEY(id_matiere) REFERENCES MATIERE(id_matiere), constraint CK_prof_sexe CHECK(sexe IN ('H', 'F')) ); create table professeur_rem ( id_professeur char(8) NOT NULL, nom char(50) NOT NULL, prenom char(50) NOT NULL, sexe char(1) NOT NULL, date_naissance date, id_matiere char(4) NOT NULL, constraint PK_profrem PRIMARY KEY(id_professeur), constraint FK_profrem_mat FOREIGN KEY(id_matiere) REFERENCES MATIERE(id_matiere), constraint CK_profrem_sexe CHECK(sexe IN ('H', 'F')) ); create table enseignement ( id_annee integer NOT NULL, id_periode char(2) NOT NULL, id_classe char(4) NOT NULL, id_matiere char(4) NOT NULL, id_professeur char(8) NOT NULL, moyenne_classe float, constraint PK_enseign PRIMARY KEY
(id_annee, id_periode, id_classe, id_matiere), constraint FK_enseign_ann FOREIGN KEY(id_annee) REFERENCES ANNEE(id_annee), constraint FK_enseign_per FOREIGN KEY(id_periode) REFERENCES PERIODE(id_periode), constraint FK_enseign_cla FOREIGN KEY(id_classe) REFERENCES CLASSE(id_classe), constraint FK_enseign_mat FOREIGN KEY(id_matiere) REFERENCES MATIERE(id_matiere), constraint FK_enseign_prof FOREIGN KEY(id_professeur) REFERENCES PROFESSEUR(id_professeur), constraint CK_moyenne CHECK(moyenne_classe BETWEEN 0 AND 20) );
------------------------------------------------------------------------------------------------------------------------
Le langage SQL
Page 31/99 01/03/17
LE LANGAGE DE MANIPULATION DES DONNEES
I INTRODUCTION Le langage de manipulation des données (LMD, ou DML en anglais pour Data Manipulation
Language) est l'ensemble des commandes permettant d'interroger et de modifier les données d'une base de données relationnelle.
L'interrogation consiste en l'obtention de l'ensemble des tuplets qui satisfont un critère de
qualification. En S.Q.L., la commande d'interrogation est SELECT. On dit alors qu'on effectue une requête de sélection sur la base de données.
La modification revêt un triple aspect : ajout, mise à jour, et suppression de données. Il s'agit
respectivement des commandes INSERT, UPDATE et DELETE . Quand un champ (d'une colonne) d'un enregistrement d'une table est non renseigné, ou
encore vide, on dit que sa valeur est la valeur NULL. Ceci est vrai quel que soit le type du champ, chaîne de caractère, numérique, ou temporel. NULL ne représente ni zéro, ni une valeur par défaut quelconque. NULL représente une absence de valeur.
Un problème se pose lorsque dans un critère SQL par exemple, l'une des valeurs d'un des
attributs est la valeur NULL. Comment comparer par exemple un champ comme le nom d'un professeur et 2 valeurs comme "Sarlat" et NULL ?
La règle est qu'en pratique aucune règle de gestion de la valeur NULL n'existe en tant que
standard. Autrement dit, il faut soit consulter la documentation du S.G.B.D. sur lequel on travaille, soit utiliser en plus le test IS NULL ou IS NOT NULL (voir par la suite) en plus dans le critère à utiliser.
Le langage SQL
Page 32/99 01/03/17
II INSERTION D'UNE DONNEE DANS UNE TABLE
A Commande d'insertion d'une seule donnée
Instruction standard SQL d’insertion d'une seule donnée dans une table INSERT INTO nom_table VALUES (valeur_colonne1, valeur_colonne2, …);
Avec cette syntaxe, les valeurs de toutes les colonnes doivent être renseignées, éventuellement au besoin avec la valeur NULL.
Une deuxième syntaxe possible est :
INSERT INTO nom_table (colonneA, colonneB, …) VALUES (valeur_colonneA, valeur_colonneB, …); Avec cette syntaxe, seules les valeurs des colonnes A, B (quelles qu'elles soient) sont renseignées, les valeurs des autres colonnes pour la ligne insérée étant positionnés à NULL, ou à la valeur par défaut de la colonne s'il en existe une. Cette syntaxe est donc possible seulement si parmi les colonnes non renseignées ne figure aucune colonne avec la contrainte NOT NULL (notamment aucune colonne faisant partie de la clé primaire de la table).
Exemple illustratif de la première syntaxe
INSERT INTO professeur VALUES (' SARLATJE ', 'Sarlat', 'Jean-Michel', ‘H’, NULL, ‘AN GL’);
Exemple illustratif de la seconde syntaxe
INSERT INTO professeur (id_professeur, nom, prenom, sexe) VALUES (' SARLATJE ', 'Sarlat', 'Jean-Michel', ‘H’);
Le langage SQL
Page 33/99 01/03/17
B Insertion de données primaires dans la base exemple bdcours
Voici un exemple de script SQL standard d'insertion de données dans les tables de la base de données exemple bdcours, aussi applicable sous Oracle :
------------------------------------------------------------------------------------------------------------------------
use bdcours; delete from enseignement; delete from professeur; delete from annee; delete from periode; delete from classe; delete from matiere; insert into annee values (2014, 'Année Scolaire 2014-2015', 150, 150); insert into annee values (2015, 'Année Scolaire 2015-2016', 157, 142); insert into periode values ('1T', 'Premier trimestre'); insert into periode values ('2T', 'Deuxième trimestre'); insert into periode values ('3T', 'Troisième trimestre'); insert into classe values ('2ND1', 'Seconde 1'); insert into classe values ('2ND2', 'Seconde 2'); insert into classe values ('2ND3', 'Seconde 3'); insert into classe values ('1LIT', '1ère L'); insert into classe values ('1SES', '1ère ES'); insert into classe values ('1SCI', '1ère S'); insert into classe values ('TLIT', 'Terminale L'); insert into classe values ('TSES', 'Terminale ES'); insert into classe values ('TSCI', 'Terminale S'); insert into matiere values ('ANGL', 'Anglais'); insert into matiere values ('FRAN', 'Français'); insert into matiere values ('HGEO', 'Histoire Géographie'); insert into matiere values ('MATH', 'Mathématiques'); insert into matiere values ('PHCH', 'Physique Chimie'); insert into matiere values ('PHIL', 'Philosophie'); insert into matiere values ('SCVT', 'Sciences et Vie de la Terre'); insert into matiere values ('SECS', 'Sciences Economiques et Sociales');
Le langage SQL
Page 34/99 01/03/17
insert into professeur values ('DUBOISAM', 'Dubois', 'Amélie', 'F', '1980-01-30', 'ANGL'); insert into professeur values ('LEROYTHO', 'Leroy', 'Thomas', 'H', '1985-06-05', 'ANGL'); insert into professeur values ('DUBOISGE', 'Dubois', 'Gérard', 'H', '1981-02-25', 'FRAN'); insert into professeur values ('MOREAUPA', 'Moreau', 'Patrick', 'H', '1986-07-01', 'FRAN'); insert into professeur values ('DURANDST', 'Durand', 'Stéphane', 'H', '1983-04-15','HGEO'); insert into professeur values ('MORELSTE', 'Morel', 'Stéphanie','F', '1990-11-16', 'HGEO'); insert into professeur values ('FOURNIER', 'Fournier', 'Nicolas','H', '1989-10-21', 'MATH'); insert into professeur values ('PETITCHR', 'Petit', 'Christophe','H', '1982-03-20', 'MATH'); insert into professeur values ('GARCIATH', 'Garcia', 'Thierry','H','1988-09-26', 'PHCH'); insert into professeur values ('THOMASVI', 'Thomas', 'Vincent','H', '1991-12-11', 'PHCH'); insert into professeur values ('GIRARDAN', 'Girard', 'Antoine','H', '1992-01-21', 'PHIL'); insert into professeur values ('LAMBERTA', 'Lambert', 'Alice','F', NULL, 'PHIL'); insert into professeur values ('LEFEBVRE', 'Lefebvre', 'Géraldine','F', '1987-08-31','SCVT'); insert into professeur values ('MARTINEZ', 'Martinez', 'Nathalie','F', '1993-02-14', 'SCVT'); insert into professeur values ('LEROYPHI', 'Leroy', 'Philippe','H', '1984-05-10', 'SECS'); insert into professeur values ('ROUSSELJ', 'Roussel', 'Jeanne','F', NULL, 'SECS'); insert into professeur_rem values ('DUBOISAM', 'Dubois', 'Amélie', 'F', NULL, 'ANGL'); insert into professeur_rem values ('DURANDST', 'Durand', 'Stéphane', 'H', NULL, 'HGEO'); insert into professeur_rem values ('LEROYXAV', 'Leroy', 'Xavier', 'H', NULL, 'FRAN'); insert into professeur_rem values ('LAMBERTP', 'Lambert', 'Pierre', 'H', NULL, 'FRAN'); insert into professeur_rem values ('RICHARDP', 'Richard', 'Pascal', 'H', NULL, 'FRAN'); insert into professeur_rem values ('CASTELAI', 'Castelain', 'Alice', 'F', NULL, 'FRAN'); insert into enseignement values (2014, '1T', '2ND1', 'ANGL', 'DUBOISAM', 11.5); insert into enseignement values (2014, '1T', '2ND1', 'FRAN', 'DUBOISGE', 10.1); insert into enseignement values (2014, '1T', '2ND1', 'HGEO', 'DURANDST', 13); insert into enseignement values (2014, '1T', '2ND1', 'MATH', 'FOURNIER', 10.4); insert into enseignement values (2014, '1T', '2ND1', 'PHCH', 'GARCIATH', 12.1); insert into enseignement values (2014, '1T', '2ND1', 'SCVT', 'LEFEBVRE', 11.8); insert into enseignement values (2014, '1T', '2ND1', 'SECS', 'LEROYPHI', 14.3); insert into enseignement values (2014, '2T', '2ND1', 'ANGL', 'DUBOISAM', 11.4); insert into enseignement values (2014, '2T', '2ND1', 'FRAN', 'DUBOISGE', 10.8); insert into enseignement values (2014, '2T', '2ND1', 'HGEO', 'DURANDST', 13.2); insert into enseignement values (2014, '2T', '2ND1', 'MATH', 'FOURNIER', 10.7); insert into enseignement values (2014, '2T', '2ND1', 'PHCH', 'GARCIATH', 13.1); insert into enseignement values (2014, '2T', '2ND1', 'SCVT', 'LEFEBVRE', 11.4); insert into enseignement values (2014, '2T', '2ND1', 'SECS', 'LEROYPHI', 13.4); insert into enseignement values (2014, '3T', '2ND1', 'ANGL', 'DUBOISAM', 12.5); insert into enseignement values (2014, '3T', '2ND1', 'FRAN', 'DUBOISGE', 11.1); insert into enseignement values (2014, '3T', '2ND1', 'HGEO', 'DURANDST', 12.2); insert into enseignement values (2014, '3T', '2ND1', 'MATH', 'FOURNIER', 10.8); insert into enseignement values (2014, '3T', '2ND1', 'PHCH', 'GARCIATH', 13.1); insert into enseignement values (2014, '3T', '2ND1', 'SCVT', 'LEFEBVRE', 14.8); insert into enseignement values (2014, '3T', '2ND1', 'SECS', 'LEROYPHI', 11.3);
------------------------------------------------------------------------------------------------------------------------
Le langage SQL
Page 35/99 01/03/17
III INTERROGATION DES DONNEES
L'interrogation consiste en l'obtention de l'ensemble des t-uplets qui satisfont un critère de qualification. En S.Q.L., la commande d'interrogation est SELECT. On dit alors qu'on effectue une requête de sélection sur la base de données. On étudiera d'abord les mécanismes d'interrogation des données sur une seule table, avant de généraliser l'étude à l'interrogation de données provenant d'un ensemble de tables. A Interrogation des données d'une seule table, sans regroupement 1) Introduction
Instruction standard SQL la plus simple d’interrogation des données d’une table SELECT [ALL | DISTINCT] clause_de_selection FROM nom_table [WHERE critere_de_selection] [ORDER BY critere_de_tri];
Comme précédemment, il est important de noter que les paramètres entre crochets sont
facultatifs donc optionnels. Le symbole « | » montre un choix optionnel (de type l’un ou l’autre). Typiquement, le SELECT de base permet de "récupérer" certaines données d'une table dont
les valeurs satisfont une condition spécifique.
Le langage SQL
Page 36/99 01/03/17
2) Les mots clés SELECT, ALL, DISTINCT
Exemple d'illustration SELECT de base Liste des couples (nom, prénom) des professeurs dont le nom est Dubois
SELECT nom, prenom FROM professeur WHERE nom = 'Dubois';
L’expression "nom, prenom" est dans cette requête la clause de sélection. L'expression "professeur" est le nom de la table. L'expression "nom = 'Dubois'" est le critère de sélection. On remarque qu'aucun mot clé ALL ou DISTINCT n'est ici utilisé (voir ci-après). La réponse du S.G.B.D. à la requête est :
nom prenom
Dubois Amélie Dubois Gérard
Le langage SQL
Page 37/99 01/03/17
Exemple d'illustration SELECT de base avec le mot clé ALL Le mot clé ALL permet de garder tous les t-uplets réponse à la requête, même si certains
sont en double (c'est l'option par défaut, lorsqu'aucun mot ALL ou DISTINCT n'est présent) Liste des noms des professeurs répertoriés
SELECT nom FROM professeur;
D'après les définitions précédentes, cette requête peut tout aussi bien être remplacée par la
requête équivalente
SELECT ALL nom FROM professeur;
L’expression "nom" est dans cette requête la clause de sélection. L'expression "professeur" est le nom de la table. Il n'y a pas de critère de sélection.
Pour traiter cette requête, le S.G.B.D. va lister les lignes de la table professeur et
sélectionner uniquement les données de la colonne nom, sans éliminer d'éventuels doublons dans les réponses.
La réponse du S.G.B.D. à la requête sera donc :
nom
Dubois Leroy Dubois Moreau Durand Morel Fournier Petit Garcia Thomas Girard Lambert Lefebvre Martinez Leroy Roussel
On remarque que la réponse à la requête contient plusieurs données en doublons.
Le langage SQL
Page 38/99 01/03/17
Exemple d'illustration SELECT de base avec le mot clé DISTINCT Le mot clé DISTINCT permet d'éliminer les doublons dans les t-uplets réponse à la requête. Liste des noms distincts des professeurs répertoriés
SELECT DISTINCT nom FROM professeur;
Pour traiter cette requête, le S.G.B.D. va lister les lignes de la table professeur et
sélectionner les données de la colonne nom, en éliminant après coup les éventuels doublons dans les réponses.
Et la réponse du S.G.B.D. à la requête serait donc :
nom
Dubois Leroy Moreau Durand Morel Fournier Petit Garcia Thomas Girard Lambert Lefebvre Martinez Roussel
Le langage SQL
Page 39/99 01/03/17
3) Les clauses de sélection
Exemple d'illustration sélection de toutes les colonnes Liste des professeurs répertoriés (sous entendu avec toutes leurs caractéristiques)
SELECT * FROM professeur;
Dans cette requête, le symbole "*" représente l'ensemble des colonnes de la table professeur.
La requête est donc équivalente à la requête : SELECT id_professeur, nom, prenom, sexe, date_naissance, id_matiere FROM professeur; La réponse du S.G.B.D. serait donc le contenu de la table professeur, soit :
id_professeur nom prenom sexe date_naissance id_matiere
DUBOISAM Dubois Amélie F 1980-01-30 ANGL LEROYTHO Leroy Thomas H 1985-06-05 ANGL DUBOISGE Dubois Gérard H 1981-02-25 FRAN MOREAUPA Moreau Patrick H 1986-07-01 FRAN DURANDST Durand Stéphane H 1983-04-15 HGEO MORELSTE Morel Stéphanie F 1990-11-16 HGEO FOURNIER Fournier Nicolas H 1989-10-21 MATH PETITCHR Petit Christophe H 1982-03-20 MATH GARCIATH Garcia Thierry H 1988-09-26 PHCH THOMASVI Thomas Vincent H 1991-12-11 PHCH GIRARDAN Girard Antoine H 1992-01-21 PHIL LAMBERTA Lambert Alice F NULL PHIL LEFEBVRE Lefebvre Géraldine F 1987-08-31 SCVT MARTINEZ Martinez Nathalie F 1993-02-14 SCVT LEROYPHI Leroy Philippe H 1984-05-10 SECS ROUSSELJ Roussel Jeanne F NULL SECS
Le langage SQL
Page 40/99 01/03/17
Exemple d'illustration sélection de certaines colonnes Liste (nom, prenom, date_naissance) des professeurs répertoriés
SELECT nom, prenom, date_naissance FROM professeur; La réponse du S.G.B.D. serait donc le contenu de la table professeur, en éliminant les colonnes non sélectionnées, soit :
nom prenom date_naissance
Dubois Amélie 1980-01-30 Leroy Thomas 1985-06-05 Dubois Gérard 1981-02-25 Moreau Patrick 1986-07-01 Durand Stéphane 1983-04-15 Morel Stéphanie 1990-11-16 Fournier Nicolas 1989-10-21 Petit Christophe 1982-03-20 Garcia Thierry 1988-09-26 Thomas Vincent 1991-12-11 Girard Antoine 1992-01-21 Lambert Alice NULL Lefebvre Géraldine 1987-08-31 Martinez Nathalie 1993-02-14 Leroy Philippe 1984-05-10 Roussel Jeanne NULL
Le langage SQL
Page 41/99 01/03/17
Exemple d'illustration incorporation de colonnes constantes chaines de caractères Liste des caractéristiques (sauf les identifiants) des professeurs répertoriés et incorporation
de la colonne constante chaîne de caractères 'DATE DE NAISSANCE' SELECT nom, prenom, sexe, 'DATE DE NAISSANCE', date_naissance FROM professeur; La réponse du S.G.B.D. serait donc le contenu de la table professeur, en éliminant les colonnes id_professeur et id_matiere, non sélectionnées ici, et en insérant une colonne constante chaîne de caractère, soit :
nom prenom sexe DATE DE NAISSANCE date_naissance
Dubois Amélie F DATE DE NAISSANCE 1980-01-30 Leroy Thomas H DATE DE NAISSANCE 1985-06-05 Dubois Gérard H DATE DE NAISSANCE 1981-02-25 Moreau Patrick H DATE DE NAISSANCE 1986-07-01 Durand Stéphane H DATE DE NAISSANCE 1983-04-15 Morel Stéphanie F DATE DE NAISSANCE 1990-11-16 Fournier Nicolas H DATE DE NAISSANCE 1989-10-21 Petit Christophe H DATE DE NAISSANCE 1982-03-20 Garcia Thierry H DATE DE NAISSANCE 1988-09-26 Thomas Vincent H DATE DE NAISSANCE 1991-12-11 Girard Antoine H DATE DE NAISSANCE 1992-01-21 Lambert Alice F DATE DE NAISSANCE NULL Lefebvre Géraldine F DATE DE NAISSANCE 1987-08-31 Martinez Nathalie F DATE DE NAISSANCE 1993-02-14 Leroy Philippe H DATE DE NAISSANCE 1984-05-10 Roussel Jeanne F DATE DE NAISSANCE NULL
Le langage SQL
Page 42/99 01/03/17
Exemple d'illustration incorporation de colonnes constantes numériques Liste des caractéristiques (sauf les identifiants) des professeurs répertoriés et incorporation
de la colonne constante numérique 2015 SELECT 2015, nom, prenom, sexe, date_naissance FROM professeur; La réponse du S.G.B.D. serait donc le contenu de la table professeur, en éliminant les colonnes id_professeur et id_matiere, non sélectionnées ici, et en insérant une colonne constante numérique, soit :
2015 nom prenom sexe date_naissance
2015 Dubois Amélie F 1980-01-30 2015 Leroy Thomas H 1985-06-05 2015 Dubois Gérard H 1981-02-25 2015 Moreau Patrick H 1986-07-01 2015 Durand Stéphane H 1983-04-15 2015 Morel Stéphanie F 1990-11-16 2015 Fournier Nicolas H 1989-10-21 2015 Petit Christophe H 1982-03-20 2015 Garcia Thierry H 1988-09-26 2015 Thomas Vincent H 1991-12-11 2015 Girard Antoine H 1992-01-21 2015 Lambert Alice F NULL 2015 Lefebvre Géraldine F 1987-08-31 2015 Martinez Nathalie F 1993-02-14 2015 Leroy Philippe H 1984-05-10 2015 Roussel Jeanne F NULL
Le langage SQL
Page 43/99 01/03/17
Exemple d'illustration fonctions arithmétiques sur les colonnes sélectionnées
Liste des années répertoriées avec identifiant indicé à 0 pour 2000, 1 pour 2001, etc…
SELECT id_annee - 2000, desc_annee FROM annee; La réponse du S.G.B.D. serait :
id_annee - 2000 desc_annee
14 Année Scolaire 2014-2015 15 Année Scolaire 2015-2016
Liste (id_annee, nombre total d'élèves) des années repertoriées
SELECT id_annee, nb_filles + nb_garcons FROM annee; La réponse du S.G.B.D. serait :
id_annee nb_filles + nb_garcons 2014 300 2015 299
Liste (id_annee, 'Pourcentage de filles : ', % de filles) des années répertoriées
SELECT id_annee, 'Pourcentage de filles :', nb_filles * 100 / (nb_filles + nb_garcons) FROM annee; La réponse à la requête serait :
id_annee Pourcentage de filles : nb_filles * 100 / (nb_filles + nb_garcons) 2014 Pourcentage de filles : 50.0000 2015 Pourcentage de filles : 52.5084
Le langage SQL
Page 44/99 01/03/17
Exemple d'illustration fonctions littérales LOWER et UPPER sur les colonnes sélectionnées Liste (nom en majuscules, prénom en minuscules, date_naissance) des professeurs
répertoriés
SELECT UPPER(nom), LOWER(prenom), date_naissance FROM professeur; La réponse du S.G.B.D. serait :
UPPER(nom) LOWER(prenom) date_naissance
DUBOIS amélie 1980-01-30 LEROY thomas 1985-06-05 DUBOIS gérard 1981-02-25 MOREAU patrick 1986-07-01 DURAND stéphane 1983-04-15 MOREL stéphanie 1990-11-16 FOURNIER nicolas 1989-10-21 PETIT christophe 1982-03-20 GARCIA thierry 1988-09-26 THOMAS vincent 1991-12-11 GIRARD antoine 1992-01-21 LAMBERT alice NULL LEFEBVRE géraldine 1987-08-31 MARTINEZ nathalie 1993-02-14 LEROY philippe 1984-05-10 ROUSSEL jeanne NULL
Le langage SQL
Page 45/99 01/03/17
Exemple d'illustration fonction littérale CONCAT (c oncaténation) sur les colonnes sélectionnées Liste (nom en majuscule espace prenom en minuscule, date_naissance) des professeurs
répertoriés SELECT CONCAT(UPPER(nom), ' ', LOWER(prenom)), date_naissance FROM professeur; La réponse du S.G.B.D. serait : A noter que la syntaxe de l'expression de concaténation est fortement dépendante du S.G.B.D. sur lequel on travaille (ex : CONCAT() ou || ou autre). Consulter la documentation pour de plus amples détails. CONCAT(UPPER(nom), ' ', LOWER(prenom)) date_naissance
DUBOIS amélie 1980-01-30 LEROY thomas 1985-06-05 DUBOIS gérard 1981-02-25 MOREAU patrick 1986-07-01 DURAND stéphane 1983-04-15 MOREL stéphanie 1990-11-16 FOURNIER nicolas 1989-10-21 PETIT christophe 1982-03-20 GARCIA thierry 1988-09-26 THOMAS vincent 1991-12-11 GIRARD antoine 1992-01-21 LAMBERT alice NULL LEFEBVRE géraldine 1987-08-31 MARTINEZ nathalie 1993-02-14 LEROY philippe 1984-05-10 ROUSSEL jeanne NULL
Le langage SQL
Page 46/99 01/03/17
Exemple d'illustration fonction littérale SUBSTRING (sous-chaine) sur les colonnes
sélectionnées
Liste sans doublons des 3 premières lettres des prénoms des professeurs répertoriés
SELECT DISTINCT SUBSTRING(prenom FROM 1 FOR 3) FROM professeur; La réponse du S.G.B.D. serait :
SUBSTRING(prenom FROM 1 FOR 3)
Amé Tho Gér Pat Sté Nic Chr Thi Vin Ant Ali Nat Phi Jea
Le langage SQL
Page 47/99 01/03/17
Exemple d'illustration fonction littérale CHARACTER _LENGTH (nombre de
caractères d'une chaîne) sur les colonnes sélectionnées Liste globale (prénom, longueur du prénom) des professeurs répertoriés
SELECT ALL prenom, CHARACTER_LENGTH(prenom) FROM professeur; La réponse du S.G.B.D. serait : prenom CHARACTER_LENGTH(prenom)
Amélie 6 Thomas 6 Gérard 6 Patrick 7 Stéphane 8 Stéphanie 9 Nicolas 7 Christophe 10 Thierry 7 Vincent 7 Antoine 7 Alice 5 Géraldine 9 Nathalie 8 Philippe 8 Jeanne 6 A noter que la syntaxe de l'expression du nombre de caractères est fortement dépendante du S.G.B.D. sur lequel on travaille (ex : CHARACTER_LENGTH () ou len() ou autre). Consulter la documentation pour de plus amples détails.
Le langage SQL
Page 48/99 01/03/17
Exemples d'illustration utilisation du mot clé COUNT S.Q.L. permet aussi de compter les lignes résultat d'une requête au moyen du mot clé
COUNT.
Nombre de professeurs répertoriés SELECT COUNT(*) FROM professeur;
Requête équivalente à
SELECT COUNT(prenom) FROM professeur; En pratique, on privilégie de loin la première forme. Dans les 2 cas, le S.G.B.D. va effectuer les requêtes SELECT sans les COUNT et va compter le nombre de lignes trouvées. Le résultat est donc ici :
COUNT(prenom)
16
Nombre de noms distincts répertoriés de professeurs SELECT COUNT(DISTINCT nom) FROM professeur; Le S.G.B.D. va effectuer la requête SELECT sans les COUNT, et récupérer 14 noms distincts (deux doublons). Il va compter le nombre de lignes trouvées. Le résultat est donc ici :
COUNT(DISTINCT nom)
14
Le langage SQL
Page 49/99 01/03/17
Exemples d'illustration utilisation des mot clé SUM, MIN, MAX, AVG S.Q.L. permet aussi de faire des calculs sur les lignes résultat d'une requête au moyen des
mots clé SUM (somme de), MIN (minimum), MAX (maximum), AVG (moyenne).
Plus grand nombre de filles, et plus petit nombre de filles des années
SELECT MAX(nb_filles), MIN(nb_filles) FROM annee; La réponse du S.G.B.D. serait :
MAX(nb_filles) MIN(nb_filles)
157 150
Somme des nombres de filles, moyenne du nombre de garçons de la table annee
SELECT SUM(nb_filles), AVG(nb_garcons) FROM annee; La réponse du S.G.B.D. serait : SUM(nb_filles) AVG(nb_garcons) 307 146.0000
Le langage SQL
Page 50/99 01/03/17
4) Critères de sélection
Exemples d'illustration utilisation des mots clé =, <> (différent de), <, >, <=, >=
Liste des caractéristiques du ou des professeurs dont le nom est 'Leroy'
SELECT * FROM professeur WHERE nom = 'Leroy'; La réponse du S.G.B.D. serait :
id_professeur nom prenom sexe date_naissance id_matiere
LEROYTHO Leroy Thomas H 1985-06-05 ANGL LEROYPHI Leroy Philippe H 1984-05-10 SECS
Liste des caractéristiques du ou des professeurs dont le nom est après 'Lombart' dans l'ordre
alphabétique
SELECT * FROM professeur WHERE nom > 'Lombart'; La réponse du S.G.B.D. serait (critère classique comparant les chaînes de caractères) :
id_professeur nom prenom sexe date_naissance id_matiere MOREAUPA Moreau Patrick H 1986-07-01 FRAN MORELSTE Morel Stéphanie F 1990-11-16 HGEO PETITCHR Petit Christophe H 1982-03-20 MATH THOMASVI Thomas Vincent H 1991-12-11 PHCH MARTINEZ Martinez Nathalie F 1993-02-14 SCVT ROUSSELJ Roussel Jeanne F NULL SECS
Le langage SQL
Page 51/99 01/03/17
Liste des années où il y a eu plus de 150 filles
SELECT * FROM annee WHERE nb_filles > 150; La réponse du S.G.B.D. serait :
id_annee desc_annee nb_filles nb_garcons
2015 Année Scolaire 2015-2016 157 142
Le langage SQL
Page 52/99 01/03/17
Exemples d'illustration utilisation des mots clé AND et OR
Liste des caractéristiques du ou des professeurs dont le nom est 'Leroy' ou le prénom est 'Géraldine'
SELECT * FROM professeur WHERE (nom = 'Leroy') OR (prenom = 'Géraldine'); La réponse du S.G.B.D. serait : id_professeur nom prenom sexe date_naissance id_matiere
LEROYTHO Leroy Thomas H 1985-06-05 ANGL LEFEBVRE Lefebvre Géraldine F 1987-08-31 SCVT LEROYPHI Leroy Philippe H 1984-05-10 SECS
Liste des caractéristiques du ou des professeurs dont le nom est après 'Lombart' dans l'ordre
alphabétique et dont le prénom est avant 'Marc' dans l'ordre alphabétique
SELECT * FROM professeur WHERE (nom > 'Lombart') AND (prenom < 'Marc'); La réponse du S.G.B.D. serait (critère classique comparant les chaînes de caractères) : id_professeur nom prenom sexe date_naissance id_matiere PETITCHR Petit Christophe H 1982-03-20 MATH ROUSSELJ Roussel Jeanne F NULL SECS
Le langage SQL
Page 53/99 01/03/17
Liste des enseignements dont id_periode est '1T' et pour lesquels la moyenne de classe est
supérieure ou égale à 12 ou inférieure à 8.5
SELECT * FROM enseignement WHERE (id_periode = '1T') AND ( (moyenne_classe >= 12) OR (moyenne_classe < 8.5) ); La réponse du S.G.B.D. serait : id_annee id_periode id_classe id_matiere id_professeur moyenne_classe
2014 1T 2ND1 HGEO DURANDST 13 2014 1T 2ND1 PHCH GARCIATH 12.1 2014 1T 2ND1 SECS LEROYPHI 14.3
Le langage SQL
Page 54/99 01/03/17
Exemples d'illustration utilisation des mots clé BETWEEN et IN
Liste des enseignements pour lesquels la moyenne de classe est comprise entre 11 et 11.5
SELECT * FROM enseignement WHERE moyenne_classe BETWEEN 11.0 AND 11.5; La réponse du S.G.B.D. serait :
id_annee id_periode id_classe id_matiere id_professeur moyenne_classe
2014 1T 2ND1 ANGL DUBOISAM 11.5 2014 2T 2ND1 ANGL DUBOISAM 11.4 2014 2T 2ND1 SCVT LEFEBVRE 11.4 2014 3T 2ND1 FRAN DUBOISGE 11.1 2014 3T 2ND1 SECS LEROYPHI 11.3
Liste des caractéristiques du ou des professeurs dont le prénom est dans l'ensemble
{'Jacques', 'Thomas', 'Pierre')
SELECT * FROM professeur WHERE prenom IN ('Jacques', 'Thomas', 'Pierre'); La réponse du S.G.B.D. serait :
id_professeur nom prenom sexe date_naissance id_matiere LEROYTHO Leroy Thomas H 1985-06-05 ANGL
Liste des caractéristiques du ou des professeurs dont le prénom est dans l'ensemble
{'Géraldine', 'Thomas', 'Antoine') et le nom est avant ''Latour' dans l'ordre alphabétique
SELECT * FROM professeur WHERE prenom IN ('Géraldine', 'Thomas', 'Antoine') AND nom < 'Latour'; La réponse du S.G.B.D. serait : id_professeur nom prenom sexe date_naissance id_matiere GIRARDAN Girard Antoine H 1992-01-21 PHIL
Le langage SQL
Page 55/99 01/03/17
Exemples d'illustration utilisation du mot clé LIK E
Dans ces critères, on cherche des valeurs chaînes de caractères correspondant à un modèle donné. Au sein des modèles, le caractère '%' modélise une chaine quelconque de caractères (incluant une chaine vide), et le caractère '_' modélise 1 seul caractère.
Liste des caractéristiques du ou des professeurs dont le nom est de la forme '_e_o_'
SELECT * FROM professeur WHERE nom LIKE '_e_o_'; La réponse du S.G.B.D. serait :
id_professeur nom prenom sexe date_naissance id_matiere
LEROYTHO Leroy Thomas H 1985-06-05 ANGL LEROYPHI Leroy Philippe H 1984-05-10 SECS
Liste des caractéristiques du ou des professeurs dont le prénom comporte un 'r' en 4ème
position
SELECT * FROM professeur WHERE prenom LIKE '___r%'; La réponse du S.G.B.D. serait : id_professeur nom prenom sexe date_naissance id_matiere
MOREAUPA Moreau Patrick H 1986-07-01 FRAN
Le langage SQL
Page 56/99 01/03/17
Exemples d'illustration utilisation du mot clé NOT
Liste des enseignements pour lesquels la moyenne de classe n'est pas comprise entre 8 et 14
SELECT * FROM enseignement WHERE moyenne_classe NOT BETWEEN 8.0 AND 14.0; La réponse du S.G.B.D. serait :
id_annee id_periode id_classe id_matiere id_professeur moyenne_classe
2014 1T 2ND1 SECS LEROYPHI 14.3 2014 3T 2ND1 SCVT LEFEBVRE 14.8
Liste des caractéristiques du ou des professeurs dont le prénom n'est ni 'Amélie' ni 'Thomas'
ni 'Gérard' ni 'Stéphane' ni 'Patrick'
SELECT * FROM professeur WHERE prenom NOT IN ('Amélie', 'Thomas', 'Gérard', 'Stéphane', 'Patrick'); La réponse du S.G.B.D. serait :
id_professeur nom prenom sexe date_naissance id_matiere MORELSTE Morel Stéphanie F 1990-11-16 HGEO FOURNIER Fournier Nicolas H 1989-10-21 MATH PETITCHR Petit Christophe H 1982-03-20 MATH GARCIATH Garcia Thierry H 1988-09-26 PHCH THOMASVI Thomas Vincent H 1991-12-11 PHCH GIRARDAN Girard Antoine H 1992-01-21 PHIL LAMBERTA Lambert Alice F NULL PHIL LEFEBVRE Lefebvre Géraldine F 1987-08-31 SCVT MARTINEZ Martinez Nathalie F 1993-02-14 SCVT LEROYPHI Leroy Philippe H 1984-05-10 SECS ROUSSELJ Roussel Jeanne F NULL SECS
Le langage SQL
Page 57/99 01/03/17
Liste des caractéristiques du ou des professeurs dont le prénom ne comporte pas un 'r' en
4ème position
SELECT * FROM professeur WHERE prenom NOT LIKE '___r%'; La réponse du S.G.B.D. serait : id_professeur nom prenom sexe date_naissance id_matiere
DUBOISAM Dubois Amélie F 1980-01-30 ANGL LEROYTHO Leroy Thomas H 1985-06-05 ANGL DUBOISGE Dubois Gérard H 1981-02-25 FRAN DURANDST Durand Stéphane H 1983-04-15 HGEO MORELSTE Morel Stéphanie F 1990-11-16 HGEO FOURNIER Fournier Nicolas H 1989-10-21 MATH PETITCHR Petit Christophe H 1982-03-20 MATH GARCIATH Garcia Thierry H 1988-09-26 PHCH THOMASVI Thomas Vincent H 1991-12-11 PHCH GIRARDAN Girard Antoine H 1992-01-21 PHIL LAMBERTA Lambert Alice F NULL PHIL LEFEBVRE Lefebvre Géraldine F 1987-08-31 SCVT MARTINEZ Martinez Nathalie F 1993-02-14 SCVT LEROYPHI Leroy Philippe H 1984-05-10 SECS ROUSSELJ Roussel Jeanne F NULL SECS
Le langage SQL
Page 58/99 01/03/17
Exemples d'illustration utilisation du mot clé IS NULL
Liste (nom, prenom) des professeurs dont la date de naissance n'est pas renseignée SELECT nom, prenom FROM professeur WHERE date_naissance IS NULL;
On retrouve bien la spécificité de la valeur NULL.(voir II) La réponse du S.G.B.D. serait :
nom prenom
Lambert Alice Roussel Jeanne
Liste (nom, prenom) des professeurs dont on connaît la date de naissance et dont le prénom
ne possède pas de 't' en 6ème position SELECT nom, prenom FROM professeur WHERE date_naissance IS NOT NULL and prenom NOT LIKE '_____t%'; La réponse du S.G.B.D. serait :
nom prenom Dubois Amélie Leroy Thomas Dubois Gérard Moreau Patrick Durand Stéphane Morel Stéphanie Fournier Nicolas Garcia Thierry Thomas Vincent Girard Antoine Lefebvre Géraldine Martinez Nathalie Leroy Philippe
Le langage SQL
Page 59/99 01/03/17
Exemples d'illustration utilisation des mots clés LOWER, UPPER, SUBSTRING,
CHARACTER_LENGTH et CONCAT (concaténation) Liste (nom en majuscules, prénom en minuscules, date_naissance) des professeurs
répertoriés dans la base bdcours pour lesquels la longueur nom + prénom est entre 12 et 15
SELECT UPPER(nom), LOWER(prenom), date_naissance FROM professeur WHERE CHARACTER_LENGTH(CONCAT(nom, prenom)) BETWEEN 12 AND 15; La réponse du S.G.B.D. serait : UPPER(nom) LOWER(prenom) date_naissance
DUBOIS amélie 1980-01-30 DUBOIS gérard 1981-02-25 MOREAU patrick 1986-07-01 DURAND stéphane 1983-04-15 MOREL stéphanie 1990-11-16 FOURNIER nicolas 1989-10-21 PETIT christophe 1982-03-20 GARCIA thierry 1988-09-26 THOMAS vincent 1991-12-11 GIRARD antoine 1992-01-21 LAMBERT alice NULL LEROY philippe 1984-05-10 ROUSSEL jeanne NULL
Liste complète des prénoms des professeurs répertoriés dans la base bdcours pour lesquels les 3 premières lettres du prénom sont dans l'ensemble {'Pie', 'Mar', 'Dan', 'Pat') et pour lesquels la date de naissance est connue
SELECT prenom FROM professeur WHERE SUBSTRING(prenom FROM 1 FOR 3) IN ('Pie', 'Mar', 'Dan', 'Pat')
AND date_naissance IS NOT NULL; La réponse du S.G.B.D. serait : prenom
Patrick
Le langage SQL
Page 60/99 01/03/17
5) Critères de tri
Exemple d'utilisation des mots clés ASC et DESC, tri sur une seule colonne
Le mot clé ASC s'emploie pour un tri croissant (ou ascendant) alors que le mot clé DESC s'entend pour un tri décroissant (ou descendant). Si aucun mot clé n'est précisé, le tri est par défaut croissant.
Liste sans doublon des prénoms des professeurs répertoriés dans l'ordre alphabétique
SELECT DISTINCT prenom FROM professeur ORDER BY prenom;
Une autre syntaxe possible est : SELECT DISTINCT prenom FROM professeur ORDER BY prenom ASC;
Une troisième syntaxe possible est : SELECT DISTINCT prenom FROM professeur ORDER BY 1;
Une quatrième syntaxe possible est : SELECT DISTINCT prenom FROM professeur ORDER BY 1 ASC;
Le langage SQL
Page 61/99 01/03/17
La réponse du S.G.B.D. serait en tout cas :
prenom
Alice Amélie Antoine Christophe Géraldine Gérard Jeanne Nathalie Nicolas Patrick Philippe Stéphane Stéphanie Thierry Thomas Vincent
Le langage SQL
Page 62/99 01/03/17
Exemple d'utilisation des mots clés ASC et DESC, tri sur plusieurs colonnes
Le principe est le même.
Liste complète des nom, prénom des professeurs répertoriés pour lesquels les 3 premières lettres du prénom font partie de l'ensemble {'Ant', 'Mar', 'Dan', 'Pat'), triée par prénom dans l'ordre inverse alphabétique, puis par nom dans l'ordre alphabétique
SELECT nom, prenom FROM professeur WHERE SUBSTRING(prenom FROM 1 FOR 3) IN ('Ant', 'Ma r', 'Dan', 'Pat') ORDER BY prenom DESC, nom ASC;
Une autre syntaxe possible est : SELECT nom, prenom FROM professeur WHERE SUBSTRING(prenom FROM 1 FOR 3) IN ('Ant', 'Ma r', 'Dan', 'Pat') ORDER BY 2 DESC, 1 ASC; La réponse du S.G.B.D. serait en tout cas :
nom prenom Moreau Patrick Girard Antoine
Le langage SQL
Page 63/99 01/03/17
B Interrogation des données d'une seule table, avec regroupement(s)
Certaines requêtes SQL permettent de regrouper les lignes d'une table selon un certain
nombre d'attributs. Instruction standard SQL d’interrogation des données d’une table avec regroupement (aussi valable sous Oracle)
SELECT [ALL | DISTINCT] clause_de_selection FROM nom_table [WHERE critere_de_selection] [GROUP BY clause_de_regroupement] [HAVING critere_de_regroupement] [ORDER BY critere_de_tri];
Comme précédemment, il est important de noter que les paramètres entre crochets sont
facultatifs. Le symbole « | » montre un choix optionnel (de type l’un ou l’autre). Au moyen de la clause GROUP BY, il est possible de subdiviser la table en groupes,
chaque groupe étant l'ensemble des lignes ayant une valeur commune. Typiquement, on groupe suivant un certain nombre de colonnes. Dans ce cas, la clause de sélection se compose obligatoirement de ces colonnes ainsi que de fonctions de groupe.
Les fonctions de groupe sont les fonctions COUNT, AVG , MAX , MIN , SUM déjà rencontrées dans la découverte des diverses clauses de sélection. Ces fonctions calculent respectivement le nombre, la moyenne, le maximum, le minimum, et la somme d'une collection d'expressions.
Il est aussi possible de déterminer des critères sur les groupes constitués, à savoir des conditions sur le nombre d'éléments des groupes, sur la somme, moyenne, le minimum, le maximum des données des groupes, au moyen de la clause HAVING . Cette ou ces conditions sera ou seront évaluée(s) pour chaque groupe formé en fonction de la clause GROUP BY. Les groupes qui ne satisfont pas à la condition sont éliminés. On peut donc dire que la clause HAVING est aux groupes ce que la clause WHERE est aux lignes. Enfin, comme précédemment, le résultat de la requête peut faire l'objet d'un tri au moyen de la clause ORDER BY.
Le langage SQL
Page 64/99 01/03/17
1) Clauses de regroupement
Nombre de professeurs répertoriés dont le prénom ne commence pas par un 'J' groupé par nom
SELECT nom, COUNT(*) FROM professeur WHERE SUBSTRING(prenom FROM 1 FOR 1) <> 'J' GROUP BY nom; On note bien que les colonnes dans la clause GROUP BY sont présentes dans la clause de sélection, accompagnées de la seule fonction de groupe COUNT(*). La réponse du S.G.B.D. serait :
nom
COUNT(*)
Dubois 2 Durand 1 Fournier 1 Garcia 1 Girard 1 Lambert 1 Lefebvre 1 Leroy 2 Martinez 1 Moreau 1 Morel 1 Petit 1 Thomas 1
Le langage SQL
Page 65/99 01/03/17
Moyenne des moyennes de classe des enseignements, par année (id_annee) et première lettre
du professeur (substring(id_professeur from 1 for 1))
SELECT id_annee, SUBSTRING(id_professeur FROM 1 FOR 1), AVG(moyenne_classe) FROM enseignement GROUP BY id_annee, SUBSTRING(id_professeur FROM 1 FOR 1);
On note bien que les colonnes dans la clause GROUP BY sont présentes dans la clause de sélection, accompagnées de la seule fonction de groupe AVG(moyenne_classe).
id_annee SUBSTRING(id_professeur FROM 1 FOR 1) AVG(moyenne_classe) 2014 D 11.755555576748318 2014 F 10.633333206176758 2014 G 12.766667048136393 2014 L 12.833333333333334
Le langage SQL
Page 66/99 01/03/17
2) Critères de regroupement
Nombre de professeurs répertoriés dont le prénom ne commence pas par un 'J' groupé par nom dont le nombre de professeurs est supérieur à 1 SELECT nom, COUNT(*) FROM professeur WHERE SUBSTRING(prenom FROM 1 FOR 1) <> 'J' GROUP BY nom HAVING COUNT(*) > 1; On note bien que les colonnes dans la clause GROUP BY sont présentes dans la clause de sélection, accompagnées de la seule fonction de groupe COUNT(*). La réponse du S.G.B.D. serait (on élimine tous les groupes vus dans la feuille précédente dont le nombre est 1) :
nom COUNT(*)
Dubois 2 Leroy 2
Moyenne des moyennes de classe des enseignements, par année (id_annee) et période (id_periode) pour les couples (année, période) dont la plus haute moyenne de classe dépasse 12.
SELECT id_annee, SUBSTRING(id_professeur FROM 1 FOR 1), AVG(moyenne_classe) FROM enseignement GROUP BY id_annee, SUBSTRING(id_professeur FROM 1 FOR 1) HAVING MAX(moyenne_classe) > 12.0;
On note bien que les colonnes dans la clause GROUP BY sont présentes dans la clause de sélection, accompagnées de la seule fonction de groupe AVG(moyenne_classe).
La réponse du S.G.B.D. serait (seul 2 groupes de la feuille précédente possèdent un maximum de la moyenne de classe supérieur à 12) : id_annee SUBSTRING(id_professeur FROM 1 FOR 1) AVG(moyenne_classe) 2014 D 11.755555576748318 2014 G 12.766667048136393 2014 L 12.833333333333334
Le langage SQL
Page 67/99 01/03/17
C Interrogation des données de plusieurs tables Souvent, les données qu’on désire obtenir doivent être issues de plusieurs tables. Le SELECT simple vu jusqu’alors ne peut répondre à ces besoins. Heureusement, S.Q.L. étend les possibilités à des requêtes mettant en jeu plusieurs relations, ou tables.
L'interrogation des données de plusieurs tables se décline sous 3 grandes formes distinctes :
� L'utilisation de requêtes dites imbriquées. � L'utilisation des opérateurs union, intersection et différence. � L'utilisation des jointures, internes ou externes, qui consiste en fait à spécifier dans la clause de
sélection de la requête des données issues de relations joignant plusieurs tables.
Le langage SQL
Page 68/99 01/03/17
1) Requêtes imbriquées
On appelle requête imbriquée, ou sous-requête SQL, toute requête d'interrogation utilisée dans le critère de sélection d'une requête principale. Le principe d'utilisation des requêtes dites imbriquées consiste en fait à se servir du résultat d'une ou plusieurs requêtes "filles" dans le critère de sélection de la requête "mère". On peut utiliser autant de sous-requêtes qu'on le souhaite dans le critère de sélection d'une requête principale.
Instruction standard SQL d’interrogation des données de plusieurs tables avec le principe des requêtes imbriquées (aussi valable sous Oracle)
SELECT [ALL | DISTINCT] clause_de_selection FROM nom_table [WHERE critere_de_selection_avec_sous_requetes] [GROUP BY clause_de_regroupement] [HAVING critere_de_regroupement] [ORDER BY critere_de_tri];
Le langage SQL
Page 69/99 01/03/17
Exemples d'illustration utilisation d'une sous-requête avec IN, =, <, >, <>, <=, >=
Liste des enseignements effectués dans l'id_periode '1T' par M. Leroy et Lefebvre
SELECT * FROM enseignement WHERE id_periode = '1T' AND id_professeur IN
(SELECT id_professeur FROM professeur WHERE nom = 'Leroy' OR nom = 'Lefebvre');
Le S.G.B.D. effectuerait d'abord la sous-requête et "ramènerait" les id_professeur 'LEROYPHI', 'LEROYTHO' et 'LEFEBVRE', enfin il chercherait les enseignements dispensés par l'un ou l'autre de ces professeurs au premier trimestre. La réponse serait donc : id_annee id_periode id_classe id_matiere id_professeur moyenne_classe
2014 1T 2ND1 SCVT LEFEBVRE 11.8 2014 1T 2ND1 SECS LEROYPHI 14.3
Liste des enseignements de l'année la plus récente répertoriée
SELECT * FROM enseignement WHERE id_annee = (SELECT MAX(id_annee) FROM annee); Le S.G.B.D. effectuerait d'abord la sous-requête et "ramènerait" l'id_annee 2015, enfin il chercherait les enseignements dispensés en 2015 et n'en trouverait pas.
En vertu de quoi la réponse serait : (Aucune ligne réponse) On pourrait tout aussi bien utiliser une autre fonction de groupe dans la sous-requête, comme MIN ou AVG , ou dans un autre contexte COUNT ou SUM. L'essentiel est ici de noter que dans un critère de type =, ou <, <=, >, >=, <> on doit comparer au résultat d'une requête qui renvoie une et une seule valeur. D'où l'utilisation des fonctions de groupes dans l'exemple ci-dessus. Selon la tolérance de l'implémentation de S.Q.L. sur chaque SGBD, d'autres sous-requêtes n'utilisant pas de fonctions de groupe, mais renvoyant quand même une seule valeur seraient ou ne seraient pas acceptées.
Le langage SQL
Page 70/99 01/03/17
Requêtes imbriquées : utilisation d'une sous-requête avec ANY et ALL
Liste des enseignements du '1T' '2014' dont la moyenne de classe est supérieure à celle de tous les enseignements du '2T' '2014'
SELECT * FROM enseignement WHERE id_periode = '1T' AND id_annee = 2014 AND moyenne_classe > ALL
(SELECT moyenne_classe FROM enseignement WHERE id_periode = '2T' AND id_annee = 2014);
La réponse serait ici : id_annee id_periode id_classe id_matiere id_professeur moyenne_classe
2014 1T 2ND1 SECS LEROYPHI 14.3
Liste des enseignements du '1T' '2014' dont la moyenne de classe est supérieure à au moins une moyenne du '2T' '2014'
SELECT * FROM enseignement WHERE id_periode = '1T' AND id_annee = 2014 AND moyenne_classe > ANY
(SELECT moyenne_classe FROM enseignement WHERE id_periode = '2T' AND id_annee = 2014);
La réponse serait ici : id_annee id_periode id_classe id_matiere id_professeur moyenne_classe 2014 1T 2ND1 ANGL DUBOISAM 11.5 2014 1T 2ND1 HGEO DURANDST 13 2014 1T 2ND1 PHCH GARCIATH 12.1 2014 1T 2ND1 SCVT LEFEBVRE 11.8 2014 1T 2ND1 SECS LEROYPHI 14.3
Le langage SQL
Page 71/99 01/03/17
Requêtes imbriquées : utilisation d'une sous-requête avec EXISTS
Nom, prénom des professeurs ayant enseigné en 2014
SELECT nom, prenom FROM professeur WHERE EXISTS
(SELECT * FROM enseignement WHERE enseignement. id_professeur = professeur. id_professeur AND id_annee = 2014);
La réponse serait ici :
nom prenom
Dubois Amélie Dubois Gérard Durand Stéphane Fournier Nicolas Garcia Thierry Lefebvre Géraldine Leroy Philippe
Liste des noms des professeurs avec le nombre de professeurs associé n'ayant pas enseigné
en 2014
SELECT nom, COUNT(*) FROM professeur WHERE NOT EXISTS
(SELECT * FROM enseignement WHERE enseignement. id_professeur = professeur. id_professeur AND id_annee = 2014)
GROUP BY nom;
Le langage SQL
Page 72/99 01/03/17
La réponse serait ici :
nom COUNT(*)
Girard 1 Lambert 1 Leroy 1 Martinez 1 Moreau 1 Morel 1 Petit 1 Roussel 1 Thomas 1
Le langage SQL
Page 73/99 01/03/17
Exemple d'illustration utilisation d'une sous-requête avec UNIQUE
Nom des professeurs ayant eu un seul enseignement en 2000
SELECT nom FROM professeur WHERE UNIQUE
(SELECT * FROM enseignement WHERE enseignement. id_professeur = professeur. id_professeur AND id_annee = 2014);
Sous MySQL, le mot clé UNIQUE n'existe pas. On peut donc remplacer par : SELECT nom FROM professeur WHERE (SELECT count(*) FROM enseignement
WHERE enseignement. id_professeur = professeur. id_professeur AND id_annee = 2014) = 1;
(Aucune ligne résultat)
Liste des noms des professeurs avec le nombre de professeurs associé n'ayant pas eu un et un seul enseignement en 2014
SELECT nom, COUNT(*) FROM professeur WHERE NOT UNIQUE
(SELECT * FROM enseignement WHERE enseignement. id_professeur = professeur. id_professeur AND id_annee = 2014)
GROUP BY nom; Sous MySQL, le mot clé UNIQUE n'existe pas. On peut donc remplacer par : SELECT nom, COUNT(*) FROM professeur WHERE (SELECT count(*) FROM enseignement
WHERE enseignement. id_professeur = professeur. id_professeur AND id_annee = 2014) <> 1
GROUP BY nom;
Le langage SQL
Page 74/99 01/03/17
La réponse serait ici :
nom COUNT(*)
Dubois 2 Durand 1 Fournier 1 Garcia 1 Girard 1 Lambert 1 Lefebvre 1 Leroy 2 Martinez 1 Moreau 1 Morel 1 Petit 1 Roussel 1 Thomas 1
Le langage SQL
Page 75/99 01/03/17
2) Union, intersection, différence
S.Q.L. dispose des trois opérateurs ensemblistes que sont l’union, l’intersection et la différence.
Instruction standard SQL d’interrogation des données de plusieurs tables avec le principe des union, intersection, différence (aussi valable sous Oracle)
SELECT [ALL | DISTINCT] clause_de_selection1 FROM nom_table1 [WHERE critere_de_selection1] [GROUP BY clause_de_regroupement1] [HAVING critere_de_regroupement1] UNION [ALL] SELECT [ALL | DISTINCT] clause_de_selection2 FROM nom_table2 [WHERE critere_de_selection2] [GROUP BY clause_de_regroupement2] [HAVING critere_de_regroupement2]; La même syntaxe est applicable avec INTERSECT ou EXCEPT à la place de UNION Par défaut, les doublons sont éliminés. La clause ALL permet de conserver les doublons dans la réponse à la requête.
Le langage SQL
Page 76/99 01/03/17
Exemples d'illustration UNION
Réunion des couples (nom, prenom) des tables professeur et professeur_rem
SELECT nom, prenom FROM professeur UNION SELECT nom, prenom FROM professeur_rem;
La réponse serait ici :
nom prenom
Dubois Amélie Leroy Thomas Dubois Gérard Moreau Patrick Durand Stéphane Morel Stéphanie Fournier Nicolas Petit Christophe Garcia Thierry Thomas Vincent Girard Antoine Lambert Alice Lefebvre Géraldine Martinez Nathalie Leroy Philippe Roussel Jeanne Leroy Xavier Lambert Pierre Richard Pascal Castelain Alice
Le langage SQL
Page 77/99 01/03/17
Exemples d'illustration UNION ALL
Réunion totale des couples (nom, prenom) des tables professeur et professeur_rem
SELECT nom, prenom FROM professeur UNION ALL SELECT nom, prenom FROM professeur_rem;
La réponse serait ici :
nom prenom
Dubois Amélie Leroy Thomas Dubois Gérard Moreau Patrick Durand Stéphane Morel Stéphanie Fournier Nicolas Petit Christophe Garcia Thierry Thomas Vincent Girard Antoine Lambert Alice Lefebvre Géraldine Martinez Nathalie Leroy Philippe Roussel Jeanne Dubois Amélie Durand Stéphane Leroy Xavier Lambert Pierre Richard Pascal Castelain Alice
Le langage SQL
Page 78/99 01/03/17
Exemples d'illustration INTERSECT
Intersection des couples (nom, prenom) des tables professeur et professeur_rem
SELECT nom, prenom FROM professeur INTERSECT SELECT nom, prenom FROM professeur_rem;
Sous MySQL, le mot clé INTERSECT n'existe pas. On peut donc remplacer par : SELECT nom, prenom FROM professeur WHERE EXISTS(SELECT * from professeur_rem
WHERE professeur.nom = professeur_rem. nom AND professeur.prenom = professeur_rem.prenom);
La réponse serait ici :
nom prenom
Dubois Amélie Durand Stéphane
Le langage SQL
Page 79/99 01/03/17
Exemples d'illustration INTERSECT ALL
Intersection totale des couples (nom, prenom) des tables professeur et professeur_rem
SELECT nom, prenom FROM professeur INTERSECT ALL SELECT nom, prenom FROM professeur_rem; Sous MySQL, le mot clé INTERSECT n'existe pas. On peut donc remplacer par : SELECT nom, prenom FROM professeur WHERE EXISTS(SELECT * from professeur_rem
WHERE professeur.nom = professeur_rem. nom AND professeur.prenom = professeur_rem.prenom)
UNION ALL SELECT nom, prenom FROM professeur_rem WHERE EXISTS(SELECT * from professeur
WHERE professeur_rem.nom = professeur. nom AND professeur_rem.prenom = professeur.prenom);
La réponse serait ici :
nom prenom
Dubois Amélie Durand Stéphane Dubois Amélie Durand Stéphane
Le langage SQL
Page 80/99 01/03/17
Exemples d'illustration EXCEPT
Différence des couples (nom, prenom) des tables professeur et professeur_rem
SELECT nom, prenom FROM professeur EXCEPT SELECT nom, prenom FROM professeur_rem;
Sous MySQL, le mot clé EXCEPT n'existe pas. On peut donc remplacer par : SELECT nom, prenom FROM professeur WHERE NOT EXISTS(SELECT * from professeur_rem
WHERE professeur.nom = professeur_rem. nom AND professeur.prenom = professeur_rem.prenom);
La réponse serait ici :
nom prenom
Leroy Thomas Dubois Gérard Moreau Patrick Morel Stéphanie Fournier Nicolas Petit Christophe Garcia Thierry Thomas Vincent Girard Antoine Lambert Alice Lefebvre Géraldine Martinez Nathalie Leroy Philippe Roussel Jeanne
Le langage SQL
Page 81/99 01/03/17
3) Jointures
S.Q.L. donne à l'utilisateur la possibilité d'interroger des données de plusieurs tables grace au mécanisme dit de jointure.
Instruction standard SQL d’interrogation des données de plusieurs tables avec le principe des jointures (aussi valable sous Oracle)
SELECT [ALL | DISTINCT] clause_de_selection FROM liste_noms_tables [WHERE critere_de_selection_multi_table] [GROUP BY clause_de_regroupement_multi_table] [HAVING critere_de_regroupement_multi_table] [ORDER BY critere_de_tri_multi_table];
Le langage SQL
Page 82/99 01/03/17
Utilisation du produit cartésien
Produit cartésien des tables annee et periode
SELECT * FROM annee, periode; Une autre syntaxe possible (mais peu utilisée) est : SELECT * FROM annee CROSS JOIN periode;
La réponse serait ici : id_annee desc_annee nb_filles nb_garcons id_periode desc_periode
2014 Année Scolaire 2014-2015 150 150 1T Premier trimestre 2015 Année Scolaire 2015-2016 157 142 1T Premier trimestre 2014 Année Scolaire 2014-2015 150 150 2T Deuxième trimestre 2015 Année Scolaire 2015-2016 157 142 2T Deuxième trimestre 2014 Année Scolaire 2014-2015 150 150 3T Troisième trimestre 2015 Année Scolaire 2015-2016 157 142 3T Troisième trimestre
Produit cartésien des tables annee et periode avec critère sur des colonnes non communes
SELECT * FROM annee, periode WHERE id_annee = 2014; Une autre syntaxe possible (mais peu utilisée) est : SELECT * FROM annee CROSS JOIN periode WHERE id_annee = 2014;
La réponse serait ici :
id_annee desc_annee nb_filles nb_garcons id_periode desc_periode
2014 Année Scolaire 2014-2015 150 150 1T Premier trimestre 2014 Année Scolaire 2014-2015 150 150 2T Deuxième trimestre 2014 Année Scolaire 2014-2015 150 150 3T Troisième trimestre
Le langage SQL
Page 83/99 01/03/17
Exemples d'illustration jointure interne
Jointure interne basique entre les tables enseignement et professeur
SELECT * FROM enseignement, professeur WHERE enseignement. id_professeur = professeur. id_professeur; Une deuxième syntaxe possible (peu utilisée) est : SELECT * FROM enseignement INNER JOIN professeur ON (enseignement. id_professeur =
professeur. id_professeur);
Une troisième syntaxe possible (peu utilisée) est : SELECT * FROM enseignement INNER JOIN professeur USING id_professeur;
Une quatrième syntaxe possible (peu utilisée) est :
SELECT * FROM enseignement NATURAL INNER JOIN professeur;
Le langage SQL
Page 84/99 01/03/17
La réponse serait ici :
id_annee
id_periode
id_classe
id_matiere
id_professeur
moyenne_classe
id_professeur nom prenom sexe
date_naissance
id_matiere
2014 1T 2ND1 ANGL DUBOISAM 11.5 DUBOISAM Dubois Amélie F 1980-01-30 ANGL
2014 1T 2ND1 FRAN DUBOISGE 10.1 DUBOISGE Dubois Gérard H 1981-02-25 FRAN
2014 1T 2ND1 HGEO DURANDST 13 DURANDST Durand Stéphane H 1983-04-15 HGEO
2014 1T 2ND1 MATH FOURNIER 10.4 FOURNIER Fournier Nicolas H 1989-10-21 MATH
2014 1T 2ND1 PHCH GARCIATH 12.1 GARCIATH Garcia Thierry H 1988-09-26 PHCH
2014 1T 2ND1 SCVT LEFEBVRE 11.8 LEFEBVRE Lefebvre Géraldine F 1987-08-31 SCVT
2014 1T 2ND1 SECS LEROYPHI 14.3 LEROYPHI Leroy Philippe H 1984-05-10 SECS
2014 2T 2ND1 ANGL DUBOISAM 11.4 DUBOISAM Dubois Amélie F 1980-01-30 ANGL
2014 2T 2ND1 FRAN DUBOISGE 10.8 DUBOISGE Dubois Gérard H 1981-02-25 FRAN
2014 2T 2ND1 HGEO DURANDST 13.2 DURANDST Durand Stéphane H 1983-04-15 HGEO
2014 2T 2ND1 MATH FOURNIER 10.7 FOURNIER Fournier Nicolas H 1989-10-21 MATH
2014 2T 2ND1 PHCH GARCIATH 13.1 GARCIATH Garcia Thierry H 1988-09-26 PHCH
2014 2T 2ND1 SCVT LEFEBVRE 11.4 LEFEBVRE Lefebvre Géraldine F 1987-08-31 SCVT
2014 2T 2ND1 SECS LEROYPHI 13.4 LEROYPHI Leroy Philippe H 1984-05-10 SECS
2014 3T 2ND1 ANGL DUBOISAM 12.5 DUBOISAM Dubois Amélie F 1980-01-30 ANGL
2014 3T 2ND1 FRAN DUBOISGE 11.1 DUBOISGE Dubois Gérard H 1981-02-25 FRAN
2014 3T 2ND1 HGEO DURANDST 12.2 DURANDST Durand Stéphane H 1983-04-15 HGEO
2014 3T 2ND1 MATH FOURNIER 10.8 FOURNIER Fournier Nicolas H 1989-10-21 MATH
2014 3T 2ND1 PHCH GARCIATH 13.1 GARCIATH Garcia Thierry H 1988-09-26 PHCH
2014 3T 2ND1 SCVT LEFEBVRE 14.8 LEFEBVRE Lefebvre Géraldine F 1987-08-31 SCVT
2014 3T 2ND1 SECS LEROYPHI 11.3 LEROYPHI Leroy Philippe H 1984-05-10 SECS
Le langage SQL
Page 85/99 01/03/17
Exemple d'application jointure interne et conditions supplémentaires
Jointure simple entre les tables enseignements et professeur avec critère complémentaire
SELECT id_annee, nom FROM enseignement, professeur WHERE enseignement. id_professeur = professeur. id_professeur AND moyenne_classe < 10.2; Une deuxième syntaxe possible (peu utilisée) est : SELECT * FROM enseignement INNER JOIN professeur ON (enseignement. id_professeur =
professeur. id_professeur) WHERE moyenne_classe < 10.2;
Une troisième syntaxe possible (peu utilisée) est :
SELECT * FROM enseignement INNER JOIN professeur USING id_professeur WHERE moyenne_classe < 10.2;
Une quatrième syntaxe possible (peu utilisée) est :
SELECT * FROM enseignement NATURAL INNER JOIN professeur WHERE moyenne_classe < 10.2;
La réponse serait ici : id_annee nom 2014 Dubois
Le langage SQL
Page 86/99 01/03/17
Exemple d'illustration remplacement du nom des tables par des alias
Jointure simple entre les tables enseignement et professeur avec critère complémentaire
SELECT t1.moyenne_classe FROM enseignement t1, professeur t2 WHERE t1. id_professeur = t2. id_professeur AND t1.moyenne_classe > 13.0 ;
Une deuxième syntaxe possible (peu utilisée) est :
SELECT t1.moyenne_classe FROM enseignement INNER JOIN professeur ON (enseignement. id_professeur =
professeur. id_professeur) t1 WHERE t1.moyenne_classe > 13.0;
Une troisième syntaxe possible (peu utilisée) est : SELECT t1.moyenne_classe FROM enseignement INNER JOIN professeur USING id_professeur t1 WHERE t1.moyenne_classe > 13.0;
Une quatrième syntaxe possible (peu utilisée) est : SELECT t1.moyenne_classe FROM enseignement NATURAL INNER JOIN professeur t1 WHERE t1.moyenne_classe > 10.0;
La réponse serait ici :
moyenne_classe
14.3 13.2 13.1 13.4 13.1 14.8
Le langage SQL
Page 87/99 01/03/17
Exemple d'illustration jointures internes et groupement de lignes
Plus haute moyenne de classe par professeur pour l'année 2014
SELECT t2.nom, max(t1.moyenne_classe) FROM enseignement t1, professeur t2 WHERE t1. id_professeur = t2. id_professeur AND t1.id_annee = 2014 GROUP BY t2.nom; Les 3 autres syntaxes de la jointure interne restent aussi possibles
La réponse serait ici :
nom max(t1.moyenne_classe)
Dubois 12.5 Durand 13.2 Fournier 10.8 Garcia 13.1 Lefebvre 14.8 Leroy 14.3
Plus haute moyenne de classe par professeur pour l'année 2014 quand cette plus haute moyenne de classe dépasse 13
SELECT t2.nom, max(t1.moyenne_classe) FROM enseignement t1, professeur t2 WHERE t1. id_professeur = t2. id_professeur AND t1.id_annee = 2014 GROUP BY t2.nom HAVING max(t1.moyenne_classe) > 13; Les 3 autres syntaxes de la jointure interne restent aussi possibles
La réponse serait ici :
nom max(t1.moyenne_classe) Durand 13.2 Garcia 13.1 Lefebvre 14.8 Leroy 14.3
Le langage SQL
Page 88/99 01/03/17
Exemple d'illustration jointures internes et utilisation de plus que 2 tables
Liste détaillée des enseignements sans les professeurs
SELECT t1.desc_annee, t2.desc_periode, t3.desc_classe, t4.desc_matiere, t5.moyenne_classe
FROM annee t1, periode t2, classe t3, matiere t4, enseignement t5 WHERE t1. id_annee = t5. id_annee AND t2.id_periode = t5.id_periode AND t3.id_classe = t5.id_classe AND t4.id_matiere = t5.id_matiere;
La réponse serait ici :
desc_annee desc_periode desc_classe desc_matiere moyenne_classe
Année Scolaire 2014-2015 Premier trimestre Seconde 1 Anglais 11.5 Année Scolaire 2014-2015 Premier trimestre Seconde 1 Français 10.1 Année Scolaire 2014-2015 Premier trimestre Seconde 1 Histoire Géographie 13 Année Scolaire 2014-2015 Premier trimestre Seconde 1 Mathématiques 10.4 Année Scolaire 2014-2015 Premier trimestre Seconde 1 Physique Chimie 12.1 Année Scolaire 2014-2015 Premier trimestre Seconde 1 Sciences et Vie de la Terre 11.8
Année Scolaire 2014-2015 Premier trimestre Seconde 1 Sciences Economiques et Sociales
14.3
Année Scolaire 2014-2015 Deuxième trimestre Seconde 1 Anglais 11.4 Année Scolaire 2014-2015 Deuxième trimestre Seconde 1 Français 10.8 Année Scolaire 2014-2015 Deuxième trimestre Seconde 1 Histoire Géographie 13.2 Année Scolaire 2014-2015 Deuxième trimestre Seconde 1 Mathématiques 10.7 Année Scolaire 2014-2015 Deuxième trimestre Seconde 1 Physique Chimie 13.1 Année Scolaire 2014-2015 Deuxième trimestre Seconde 1 Sciences et Vie de la Terre 11.4
Année Scolaire 2014-2015 Deuxième trimestre Seconde 1 Sciences Economiques et Sociales
13.4
Année Scolaire 2014-2015 Troisième trimestre Seconde 1 Anglais 12.5 Année Scolaire 2014-2015 Troisième trimestre Seconde 1 Français 11.1 Année Scolaire 2014-2015 Troisième trimestre Seconde 1 Histoire Géographie 12.2 Année Scolaire 2014-2015 Troisième trimestre Seconde 1 Mathématiques 10.8 Année Scolaire 2014-2015 Troisième trimestre Seconde 1 Physique Chimie 13.1 Année Scolaire 2014-2015 Troisième trimestre Seconde 1 Sciences et Vie de la Terre 14.8
Année Scolaire 2014-2015 Troisième trimestre Seconde 1 Sciences Economiques et Sociales
11.3
Le langage SQL
Page 89/99 01/03/17
Jointures externes gauches
Instruction standard SQL d’interrogation des données par une jointure externe gauche entre 2 tables A et B
SELECT [ALL | DISTINCT] clause_de_selection FROM A LEFT OUTER JOIN B USING (C 1, …, Cn) [WHERE …] [GROUP BY …] [HAVING …] [ORDER BY …];
Une deuxième syntaxe possible est : SELECT [ALL | DISTINCT] clause_de_selection FROM A LEFT OUTER JOIN B ON (A.C1 = B.C1 AND … AND A.Cn=B.Cn) [WHERE …] [GROUP BY …] [HAVING …] [ORDER BY …];
Une troisième syntaxe possible est : SELECT [ALL | DISTINCT] clause_de_selection FROM A NATURAL LEFT OUTER JOIN B [WHERE …] [GROUP BY …] [HAVING …] [ORDER BY …];
C1, …, Cn sont les colonnes communes de A et B, sur lesquelles s'effectuent la jointure externe.
Le langage SQL
Page 90/99 01/03/17
Jointures externes droites
Instruction standard SQL d’interrogation des données par une jointure externe droite entre 2 tables A et B
SELECT [ALL | DISTINCT] clause_de_selection FROM A RIGHT OUTER JOIN B USING (C 1, …, Cn) [WHERE …] [GROUP BY …] [HAVING …] [ORDER BY …];
Une deuxième syntaxe possible est : SELECT [ALL | DISTINCT] clause_de_selection FROM A RIGHT OUTER JOIN B ON (A.C1 = B.C1 AND … AND A.Cn=B.Cn) [WHERE …] [GROUP BY …] [HAVING …] [ORDER BY …];
Une troisième syntaxe possible est : SELECT [ALL | DISTINCT] clause_de_selection FROM A NATURAL RIGHT OUTER JOIN B [WHERE …] [GROUP BY …] [HAVING …] [ORDER BY …];
C1, …, Cn sont les colonnes communes de A et B, sur lesquelles s'effectuent la jointure externe.
Le langage SQL
Page 91/99 01/03/17
Jointures externes totales
Instruction standard SQL d’interrogation des données par une jointure externe totale entre 2 tables A et B
SELECT [ALL | DISTINCT] clause_de_selection FROM A FULL OUTER JOIN B USING (C 1, …, Cn) [WHERE …] [GROUP BY …] [HAVING …] [ORDER BY …];
Une deuxième syntaxe possible est : SELECT [ALL | DISTINCT] clause_de_selection FROM A FULL OUTER JOIN B ON (A.C1 = B.C1 AND … AND A.Cn=B.Cn) [WHERE …] [GROUP BY …] [HAVING …] [ORDER BY …];
Une troisième syntaxe possible est : SELECT [ALL | DISTINCT] clause_de_selection FROM A FULL LEFT OUTER JOIN B [WHERE …] [GROUP BY …] [HAVING …] [ORDER BY …];
Le langage SQL
Page 92/99 01/03/17
Généralisation de l'utilisation des synonymes
L'utilisation des synonymes peut se généraliser aux colonnes et aux tables utilisés : Plus haute moyenne de classe par professeur pour l'année 2014 triée par nom
SELECT t1.nom AS nom_prof, max(t1.moyenne_classe) FROM (enseignement NATURAL INNER JOIN professeur) AS t1 WHERE t1.id_annee = 2014 GROUP BY t1.nom ORDER BT nom_prof;
La réponse serait ici :
(Non compatible avec MySql)
Le langage SQL
Page 93/99 01/03/17
IV INSERTION D'UN ENSEMBLE DE DONNEES EN UNE SEULE FOIS
Instruction standard SQL d’insertion multiple de données dans une table
INSERT INTO nom_table SELECT … FROM … [WHERE …] [GROUP BY …] [HAVING …];
Avec cette syntaxe, les colonnes successives sélectionnées dans la clause de sélection doivent être compatibles avec le type des colonnes successives de la table dans laquelle les données sont insérées.
Une deuxième syntaxe possible est :
INSERT INTO nom_table (colonneA, colonneB, …) SELECT … FROM … [WHERE …] [GROUP BY …] [HAVING …]; Avec cette syntaxe, seules les valeurs des colonnes A, B (quelles qu'elles soient) sont renseignées, les valeurs des autres colonnes pour la ligne insérée étant positionnés à NULL, ou a la valeur par défaut de la colonne s'il en existe une. Cette syntaxe est donc possible seulement si parmi les colonnes non renseignées ne figure aucune colonne avec la contrainte NOT NULL (notamment aucune colonne faisant partie de la clé primaire de la table).
De la même façon qu'avec la première syntaxe, les colonnes successives sélectionnées dans la clause de sélection doivent être compatibles avec le type des colonnes successives de la table dans laquelle les données sont insérées.
Exemple illustratif
INSERT INTO enseignement SELECT 2015, id_periode, id_classe, id_matiere, id_professeur, moyenne_classe FROM enseignement WHERE id_annee = 2014;
Le langage SQL
Page 94/99 01/03/17
V MISE A JOUR DE DONNEES
Instruction standard SQL de mise à jour des données d'une table
UPDATE nom_table SET colonne1 = expr1, colonne2 = expr2, …, colonneN = exprN [WHERE …];
Avec cette syntaxe, les colonnes 1, 2, …, N des lignes vérifiant éventuellement un critère de clause WHERE seront mises à jour au moyen des expressions 1, 2, …, N;
Exemple illustratif
UPDATE annee SET nb_filles = nb_filles + 2, nb_garcons = nb_filles, desc_annee = concat(desc_annee, ' 3 trimestres scolaires') WHERE id_annee = 2015;
Exemple illustratif 2
UPDATE professeur SET prenom = 'Eric' WHERE id_professeur = 'SADRIJAC';
Le langage SQL
Page 95/99 01/03/17
VI SUPPRESSION DE DONNEES
Instruction standard SQL de suppression de données d'une table
DELETE FROM nom_table [WHERE …]
Avec cette syntaxe, les lignes vérifiant un critère de clause WHERE seront supprimées. Si aucune clause WHERE n'est présente, toutes les données de la table sont effacées.
Exemple illustratif
DELETE FROM enseignement WHERE id_annee = 2015;
Exemple illustratif 2
DELETE FROM professeur WHERE id_professeur = 'SADRIJAC';
Le langage SQL
Page 96/99 01/03/17
TRANSACTIONS / ACCES CONCURRENTS.
I TRANSACTIONS
Une base de données est dans un état dit cohérent si les valeurs contenues dans la base vérifient toutes les contraintes d'intégrité définies sur la base
Une transaction peut être définie comme un ensemble d'actions (en pratique de requêtes) sur la base de données. Les actions sont des unités de traitement indivisibles.
Une transaction possède la propriété d'atomicité : elle doit être traitée comme une seule opération. Le gestionnaire des transactions doit assurer que toutes les actions de la transactions sont exécutées, ou alors qu'aucune ne l'est.
Une transaction est marqué par un début (parfois implicite) et par une fin , définie soit par une action valider (COMMIT en S.Q.L.) soit par l'action annuler (ROLLBACK en S.Q.L.) .
Une transaction possède en outre la propriété de durabilité : lorsqu'une transaction a exécuté valider, ses effets deviennent permanents et ne peuvent plus être effacés de la base. Ils doivent survivre à toute espèce de panne.
En cas d'arrêt interne (violation de contrainte par exemple) ou externe (panne par exemple), le S.G.B.D. doit, pour assurer l'atomicité de la transaction, procéder à un ROLLBACK implicite. En cas de panne, effacer les traces du passage de la transaction ne peut être réalisé qu'après le redémarrage du système. Ceci est traité par un mécanisme spécial appelé reprise après panne ou recovery en anglais.
II ACCES CONCURRENTS
On dit que 2 transactions sont concurrentes si elles accèdent en même temps aux mêmes
données.
Dans ce cas, il faut que le S.G.B.D. gère les exécutions concurrentes de sorte à ne pas conduire la base dans un état incohérent. En effet, si aucun mécanisme de contrôle de l'exécution n'est présent, 3 types d'anomalies peuvent se produire : perte de mise à jour, lecture impropre, et lecture non reproductible. Ces problèmes d'interférence de transaction concurrentes amènent à une autre propriété des transactions : l'isolation , qui exige que chaque transaction perçoive à tout moment la base dans un état cohérent. Ainsi, une transaction en cours d'exécution peut ne pas dévoiler ses effets aux autres transactions concurrentes avant d'avoir été confirmée.
Le langage SQL
Page 97/99 01/03/17
CONFIDENTIALITE (OU CONTROLE) DES DONNEES Des privilèges (principalement SELECT, INSERT, UPDATE, DELETE , ALL ) peuvent être octroyées ou retirés à un utilisateur de base de données. Seul le créateur d'un objet possède tous les privilèges sur l'objet. Pour qu'un utilisateur puisse accéder à un objet qu'il n'a pas créé, il doit avoir au préalable reçu explicitement les autorisations nécessaires. Ce principe de privilèges sur une base de données permet d'obtenir une confidentialité, en tout cas une sécurisation des accès des utilisateurs aux données.
Le langage SQL
Page 98/99 01/03/17
I OCTROI DE PRIVILEGES
Instruction standard SQL d'octroi de privilèges sur une table GRANT privilege ON TABLE nom_table TO utilisateur [WITH GRANT OPTION]; L'option WITH GRANT OPTION octroie à l'utilisateur le privilege d'octroyer lui même des privilèges de moindre importance sur la table
Exemple illustratif 1
GRANT ALL ON TABLE enseignement TO directeur WITH GRANT OPTION;
Exemple illustratif 2
GRANT INSERT ON TABLE enseignement TO professeur, principal;
Exemple illustratif 3
GRANT SELECT, UPDATE (moyenne_classe) ON TABLE enseignement TO professeur, principal ;
Le langage SQL
Page 99/99 01/03/17
II RETRAIT DE PRIVILEGES
Instruction standard SQL d'octroi de privilèges sur une table REVOKE privilege ON TABLE nom_table FROM utilisateu r ;
Exemple illustratif 1
REVOKE SELECT ON TABLE enseignement FROM eleve;