Le Langage SQL
Le Langage SQL
Le Langage SQL
et de ses principales fonctionnalits. L'apprentissage du langage est facilit grce au couplage avec un SGBD relationnel qui permet un traitement interactif des requtes. Pour un apprentissage plus approfondi du language SQL, tlchargez IBEasy+, logiciel de conception, d'administration et d'utilisation de Bases de Donnes relationnelles. Toutes les interrogations se rapportent la base de donnes "ETUDIANTS" cre sous la rubrique Conception BD et dont le schma des donnes est accessible au niveau de chaque requte interactive. Caractristiques du langage SQL (Structured Query Language) est le langage unique qui permet de dcrire, manipuler, contrler l'accs et interroger les bases de donnes relationnelles. C'est un langage dclaratif, qui s'adresse la fois aux utilisateurs "novices" et aux programmeurs confirms. Il est rgi par une norme (ANSI/ISO) qui assure la portabilit du langage sur diffrentes plates-formes aussi bien matrielles que logicielles. Une commande SQL crite dans un environnement Windows sous ACCESS peut, souvent sans modification, tre utilise directement dans un environnement ORACLE sous Unix... Les commandes SQL Commandes SQL Cration de tables Description CREATE des donnes ALTER Modification de tables (DDL) Suppression de tables DROP Insertion de lignes dans une table INSERT Manipulation Mise jour de lignes dans une UPDATE des donnes table (DML) Suppression de lignes dans une DELETE table Attribution de droits d'accs GRANT Contrle des REVOKE Suppression de droits d'accs donnes Prise en compte des mises jour COMMIT (DCL) ROLLBACK Suppression des mises jour Interrogation SELECT Interrogations diverses Catgorie
des donnes Nous ne traiterons dans cette prsentation que des commandes lies l'interrogation de donnes : clause SELECT. Syntaxe de la commande SELECT
SELECT [DISTINCT] {* FROM table [alias], ... [WHERE { conditions | [GROUP BY expr, [ORDER BY {expr | num}{ASC | DESC}, ...]; | expr [AS alias], ... sous ...] }
Conventions syntaxiques
MAJUSCULES : (SELECT ... ) Entrer les valeurs exactement comme prsent. Italique : colonne, table. Paramtre devant tre remplac par la valeur approprie. Alias : Synonyme d'un nom de table ou de colonne. Conditions : Expression prenant la valeur vraie ou fausse. Sous conditions : Expression contenant une sous-interrogation. Expr : Colonne, ou attribut calcul (+, -, *, /) num : Numro de colonne { } : Ex {ON|OFF}. Une des valeurs spares par '|' doit obligatoirement tre saisie. [ ] : Valeur optionnelle. ( ) : Les parenthses et les virgules doivent tre saisies comme prsent. ... : Les valeurs prcdentes peuvent tre rptes plusieurs fois _ Soulign : Indique la valeur par dfaut.
Signification des diffrentes clauses Prcise les colonnes qui vont apparatre dans la rponse Prcise la (ou les) table intervenant dans FROM l'interrogation Prcise les conditions appliquer sur les lignes. On peut trouver : - Des comparateurs : =, >, <, >=, <=,<> WHERE - Des oprateurs logiques : AND, OR, NOT - Les prdicats : IN, LIKE, NULL, ALL, SOME, ANY, EXISTS... GROUP BY Prcise la (ou les) colonne de regroupement Prcise la (ou les) conditions associes un HAVING regroupement Prcise l'ordre dans lequel vont apparatre les lignes de la rponse : ORDER BY - ASC : En ordre ascendant (par dfaut) - DESC: En ordre descendant SELECT
Apprentissage interactif de SQL Pour faciliter la prise en main du langage, chaque chapitre se compose de 2 parties : 1. Une partie "statique", illustre par des requtes "type" qui peuvent tre saisies et excutes titre d'entrainement dans un cadre intitul "Tester les exemples". 2. Une partie "dynamique" constitue par un ensemble de questions permettant de vrifier les connaissances prsentes. Ces questions sont signales par un libell en rouge Q01...et comportent un cadre permettant la saisie et l'excution de la requte SQL correspondante ainsi qu'un bouton "Rponse". L'apprentissage est organise en 6 sections : 1- Projection, 2- Prdicats : NULL, IN, LIKE, 3- Jointures 4- Regroupements, fonctions COUNT, SUM, AVG, 5- Sous-interrogations 6- Exercice rcapitulatif SQL : Projection, slection Projection L'opration de projection consiste choisir le nom des colonnes de la (ou des) table(s) que l'on souhaite voir apparatre dans la rponse. Si l'on veut afficher toutes les colonnes, il faut utiliser "*". Les colonnes sont donnes aprs la clause SELECT. - Afficher le Nom et le code sexe des tudiants. SELECT Nometu, FROM ETUDIANT; - Afficher le Contenu de la table ETUDIANT SELECT * FROM ETUDIANT; Tester les exemples Cdsexe slection BETWEEN MIN, MAX
Excuter
Sommaire SQL Q01 : Afficher le Nom le numro et date de naissance des tudiants
Excuter
Sommaire SQL Slection L'opration de slection consiste slectionner des lignes (n-uplets, tuples) d'une (ou plusieurs) table(s) qui satisfont certaines conditions. Les conditions sont exprimes aprs la clause WHERE. - Afficher la liste des tudiants de sexe masculin. SELECT * FROM ETUDIANT WHERE Cdsexe='H'; Q02 : Liste des enseignants qui ont plus de 2 ans d'anciennet dans le grade.
Excuter
Sommaire SQL
Projection et Slection Les oprations de projection et de slection peuvent videmment tre utilises dans la mme requte SQL. - Afficher le numro et le nom des tudiants ns en 1980 SELECT Numetu, Nometu FROM ETUDIANT WHERE Dtnaiss>='1980-01-01' AND Dtnaiss<='1980-12-31'; Conversion des donnes et traitement des dates Une date particulire doit tre exprim sous la forme : aaaa-mm-jj. On peut la considrer soit : - Comme une chane de caractres. Par exemple '1998-06-25' ( le 25 juin 1998). On ne peut pas dans ce cas faire de calcul mais on peut faire des comparaisons. - Comme une date. Il faut alors utiliser la fonction de conversion de donnes "CAST" et l'on peut alors faire des calculs. Syntaxe de la fonction de transtypage CAST : CAST(<col> AS <Datatype>) <col> : Nom de colonne ou valeur. <Datatype> : {Integer | Decimal | Char | Date | ...} La notation : '06-25-1998'-Dtnaiss n'est pas autorise, il faut donc utiliser CAST('1998-06-25' AS Date)-Dtnaiss La fonction CURRENT_DATE permet de rcuprer la date systme. Q03 : Nom des tudiants de sexe fminin ns aprs 1980
Excuter
Sommaire SQL
Clause ORDER BY Il est possible, grace la clause ORDER BY, d'ordonner les rsultats d'une requte en fonction de la valeur de certains attributs (colonnes). - Afficher la liste des enseignants par grade et par ordre alphabtique dcroissant des noms. SELECT Grade, Nomens FROM ENSEIGNANT ORDER BY Grade, Nomens DESC; La requte prcdente, qui utilise les noms des colonnes, est quivalente la requte suivante qui utilise les numros des colonnes qui servent ordonner les rsultats. SELECT Grade, Nomens FROM ENSEIGNANT ORDER BY 1, 2 DESC; Tester les exemples
SQL : les prdicats NULL, IN, LIKE, BETWEEN Prdicat NULL Un attribut (une colonne, un champ...) peut avoir la valeur "NULL" soit en raison d'information incomplte (la valeur n'tait pas connue au moment de la saisie des donnes) soit parce que la donne n'est pas pertinente. Dans une table qui modlise des individus, l'attribut "Nom Marital" n'est pas pertinent pour les individus de sexe masculin et a donc la valeur "NULL". La valeur "NULL" est diffrente de la valeur par dfaut de l'attribut : zro pour un attribut de type numrique et espace pour un attribut de type caractre. La syntaxe est : IS NULL et sa ngation IS NOT NULL. - Numro, nom et sexe des tudiants dont la date de naissance n'est pas connue
Nometu
Il comporte une liste de valeurs et vrifie si une valeur particulire apparat sur cette liste. La syntaxe est : IN(val1, val2, ...) et sa ngation NOT IN(val1, val2, ...). Lorsque la liste des valeurs est connue et fixe, le prdicat IN peut tre remplac par une suite d'oprateurs logiques OR. Lorsque la liste des valeurs n'est pas connue priori, comme dans certaines sous-interrogations, ce prdicat est ncessaire. - Numro et nom des enseignants qui sont soit assistants (ASS) soit professeurs (PR) Version IN SELECT Numens, Nomens FROM ENSEIGNANT WHERE Grade IN('ASS', 'PR'); Prdicat LIKE Ce prdicat permet de faire des recherches l'intrieur d'une chane de caractres, lorsque l'on dispose d'informations incompltes. Il utilise 2 caractres gnriques : % : utilis pour reprsenter une chane de caractre de longueur quelconque. _ : utilis pour reprsenter un caractre unique. La syntaxe est : LIKE 'Chane de recherche' et sa ngation NOT LIKE 'Chane de recherche' - Nom et date de naissance des tudiants dont la 2 lettre du nom est 'a'. SELECT Nometu, FROM ETUDIANT WHERE Nometu LIKE '_a%'; Tester les exemples Dtnaiss Version OR SELECT Numens, Nomens FROM ENSEIGNANT WHERE Grade='ASS' OR Grade='PR';
Excuter
Sommaire SQL Q04 : Afficher le Nom des tudiants de sexe fminin dont la premire lettre du prnom est un "J".
Excuter
Sommaire SQL Prdicat BETWEEN Il permet de comparer la valeur d'un champ par rapport une borne infrieure et une borne suprieure (bornes incluses). - Nom des matires qui ont un coefficient compris entre 1 et 2. SELECT Nomat FROM MATIERE WHERE Coeff BETWEEN 1 AND 2; Ce prdicat, est une simplication d'criture et peut tre remplac par : SELECT Nomat FROM MATIERE WHERE (Coeff >=1) AND (Coeff<=2); Tester les exemples SQL : Les jointures Jointure
C'est une opration fondamentale lorsque l'on manipule des bases de donnes et qui permet de runir, 2 par 2, des tables. Il faut prciser, aprs la clause FROM, le nom des tables qui vont intervenir et, aprs la clause WHERE, les conditions qui vont permettre de raliser la jointure. Notions d'alias Un alias permet de renommer une colonne ou une table. Cette opration est utile lorsque l'on veut qu'une colonne ait un nom plus "parlant" ou qu'une table puisse tre manipule plus facilement notamment quand il existe diffrentes conditions de jointure. Donner un nom d'alias une table est indispensable en cas d'auto-jointure. -Alias de colonne Syntaxe : Col1 AS "Nom de la colonne". Dans le rsultat de la requte correspondante, Col1 sera remplace par "Nom de la colonne". Les guillemets ne sont obligatoires que si le nom d'alias comporte des espaces. Alias de table Syntaxe : Table1 Alias1 Dans une requte, Alias1 sera identique Table1 Equi-jointure Cette opration permet de relier, avec une relation d'galit, des tables qui ont au moins un attribut commun. On doit avoir n-1 conditions de jointure, n tant le nombre de tables qui interviennent dans la requte. Si aucune condition de jointure est prcise, la requte correspondante ralisera le produit cartsien des tables impliques. - Nom et libell du sexe de chaque tudiant SELECT Nometu AS "Nom FROM ETUDIANT WHERE E.Cdsexe=S.Cdsexe; tudiant", E, SEXE Lbsexe AS Sexe S
Dans cette requte, la jointure s'effectue sur l'attribut commun (Cdsexe) entre les tables ETUDIANT et SEXE qui ont pour alias respectifs E et S. L'attribut de jointure (Cdsexe) ayant le mme nom dans les 2 tables, il est ncessaire de le prfixer par le nom de la table auquel il se rattache. Tester les exemples
Excuter
Sommaire SQL Q05 : Afficher la note obtenue par l'tudiante "Gros, Sophie" dans la matire numro 2.
Excuter
Sommaire SQL Auto-jointure C'est la jointure d'une table avec elle-mme. Cette opration est utile lorsque l'on souhaite relier des attributs qui se trouvent l'intrieur d'une mme table. - Afficher le numro des tudiants qui ont une note dans la matire numro 1 infrieure la note qu'ils ont obtenue dans la matire numro 2. SELECT N1.Numetu FROM NOTES N1, WHERE N1.Numetu=N2.Numetu AND N1.Numat=1 AND N2.Numat=2 AND N1.Note<N2.Note; NOTES N2
Q06 : Afficher le Nom des tudiants qui ont une note dans la matire numro 1 infrieure la note qu'ils ont obtenue dans la matire numro 2.
Excuter
Sommaire SQL Thta jointure Cette opration, qui doit tre utilise avec prcaution, permet de relier deux tables lorsque la colonne de jointure d'une table n'est pas relie la colonne de jointure de l'autre table par le signe gal. L'oprateur de comparaison peut tre : suprieur(>), infrieur(<), suprieur ou gal(>=), infrieur ou gal(<=), diffrent(<>). - Afficher pour chaque tudiant, combien se trouvent avant lui sur la liste alphabtique des noms. SELECT E1.Nometu, COUNT(*) FROM ETUDIANT E1, ETUDIANT E2 WHERE E1.Nometu>E2.Nometu GROUP BY E1.Nometu ORDER BY E1.Nometu; Cette requte donne un rsultat correct pour tous les tudiants, sauf pour le premier de la liste alphabtique qui n'apparat pas. Cette erreur peut tre vite en utilisant, entre autre, une jointure externe. Jointures externes Une jointure "classique" entre 2 tables, ou jointure interne, ne renvoie des lignes que si la colonne de jointure d'une table est gal la colonne de jointure de l'autre table. Il peut tre utile, dans certaines circonstances, d'afficher toutes les lignes d'une table particulire qu'il y ait ou non correspondance avec l'autre table de jointure. Les colonnes pour lesquelles il n'y a pas de correspondance sont remplies avec la valeur NULL. Cette opration s'appelle une jointure externe. Il existe 3 types de jointures externes et la faon dont est ralise une jointure externe dpend de la position des tables par rapport l'instruction de jointure. La syntaxe, en SQL-92, est la suivante : a) Jointure externe gauche SELECT ...
FROM table1 [alias] LEFT OUTER JOIN table2 [alias] ON <Conditions de jointure>
...
Toutes les lignes de table1 seront affiches que <Conditions de jointure> soit ralise ou non dans table2. La requte suivante affiche tous les tudiants, qu'ils aient ou non une note. Si un tudiant n'a pas de note, le champ Numetu de la table correspondante (NOTES) aura la valeur NULL. SELECT DISTINCT(E.Nometu), N.Numetu FROM ETUDIANT E LEFT OUTER JOIN NOTES N ON E.Numetu=N.Numetu; b) Jointure externe droite SELECT ...
FROM table1 [alias] RIGHT OUTER JOIN table2 [alias] ON <Conditions de jointure>
... Toutes les lignes de table2 seront affiches que <Conditions de jointure> soit ralise ou non dans table1. La requte suivante affiche tous les tudiants qui ont au moins une note. SELECT DISTINCT(E.Nometu), N.Numetu FROM ETUDIANT E RIGHT OUTER JOIN NOTES N ON E.Numetu=N.Numetu; c) Jointure externe complte SELECT ...
FROM table1 [alias] FULL OUTER JOIN table2 [alias] ON <Conditions de jointure>
... Toutes les lignes de table1 et de table2 seront affiches et les colonnes pour lesquelles il n'y a pas de correspondance sont remplies avec la valeur NULL. Voici, ci-dessous, deux utilisations possibles des jointures externes. - Afficher le nom des tudiants qui n'ont aucune note.
SELECT DISTINCT(E.Nometu), N.Numetu FROM ETUDIANT E LEFT OUTER JOIN NOTES N ON E.Numetu=N.Numetu WHERE N.Numetu is NULL; - Afficher pour chaque tudiant, combien se trouvent avant lui sur la liste alphabtique des noms. SELECT E1.Nometu, COUNT(E2.Numetu) FROM ETUDIANT E1 LEFT OUTER JOIN ETUDIANT E2 ON E1.Nometu>E2.Nometu GROUP BY E1.Nometu ORDER BY E1.Nometu; Tester les exemples
SQL : Regroupements Clause GROUP BY Cette clause permet de crer des sous-ensembles (regroupements) de lignes pour lesquels la valeur d'une (ou plusieurs) colonne est identique. Cette clause est lie l'utilisation defonctions statistiques qui seront appliques sur les sous-ensembles dfinis par GROUP BY. - Regroupement par grade des enseignants SELECT Grade FROM ENSEIGNANT GROUP BY Grade; Cette requte va crer autant de sous-ensembles que de valeurs possibles de l'attribut Grade. Ici 3 sous-ensembles : ASS, MCF, PR. Clause HAVING
Cette clause, contrairement la clause WHERE qui prcise les conditions appliquer sur les lignes d'une table, permet de prciser des conditions au niveau des sous-ensembles crs par GROUP BY. - Regroupement par grade des enseignants de type 'ASS' SELECT Grade FROM ENSEIGNANT GROUP BY Grade HAVING Grade='ASS'; Fonctions statistiques Fonctions COUNT([DISTINCT] expr [alias] Rle Renvoie le nombre de valeurs dans la colonne. Si DISTINCT est prcis, les doublons sont limins. Compte toutes les lignes de la table. Renvoie la moyenne des valeurs de la colonne spcifie. Renvoie la plus petite valeur de la colonne spcifie. Renvoie la plus grande valeur de la colonne spcifie. Renvoie la somme des valeurs de la colonne spcifie.
SUM(expr [alias])
- Afficher la date de naissance de l'tudiant le plus jeune et de l'tudiant le plus g. SELECT MIN(Dtnaiss) AS "Plus g", MAX(Dtnaiss) AS "Plus jeune" FROM ETUDIANT; - Afficher le nombre total d'tudiants SELECT COUNT(*) FROM ETUDIANT;
Excuter
Sommaire SQL Fonctions statistiques et clause GROUP BY Les fonctions statistiques oprent sur un ensemble de donnes et renvoient une valeur unique. D'une manire gnrale, lorsqu'un attribut est slectionn dans une clause SELECT le rsultat pourra comporter de zro n valeurs ce qui peut provoquer des conflits lorsque l'on utilise conjointement des fonctions statistiques qui elles ne renvoient qu'une seule valeur. L'ordre SELECT suivant, suppos calculer la moyenne des notes par tudiant, est donc incorrect et va gnrer l'erreur d'excution caractristique : "Invalid column reference" SELECT Numetu, AVG(Note) FROM NOTES; La formulation correcte est : SELECT Numetu, AVG(Note) FROM NOTES GROUP BY Numetu; Dans ce cas, un sous-ensemble va tre cr pour chaque numro tudiant et la moyenne sera calcule au niveau du sous-ensemble. Tester les exemples
Excuter
Sommaire SQL Q07 : Afficher pour chaque tudiant, identifi par son nom, le nombre total de notes qu'il a obtenues.
Excuter
Sommaire SQL Q08 : Afficher le nom des tudiants qui ont moins de 4 notes.
Excuter
Sommaire SQL Q09 : Afficher le nom du premier et du dernier tudiant sur la liste alphabtique.
Excuter
Sommaire SQL Q10 : Afficher pour chaque matire (numro) le nombre d'tudiants qui ont une note.
SQL : Sous-Interrogations SELECT imbriqus Les sous-interrogations, ou SELECT imbriqus, permettent de raliser des interrogations complexes qui ncessiteraient normalement plusieurs interrogations avec stockage des rsultats intermdiaires. Elles se caractrisent par une interrogation (clause SELECT) inclue dans la clause WHERE, la clause HAVING ou la clause SELECT d'une autre interrogation. - Dterminer le nom le sexe et l'ge de l'tudiant le plus g. SELECT Nometu, Cdsexe, DATEDIFF(CURRENT_DATE,Dtnaiss)/365 AS Age FROM ETUDIANT WHERE DATEDIFF(CURRENT_DATE,Dtnaiss)/365 = (SELECT MAX(DATEDIFF(CURRENT_DATE,Dtnaiss)/365) FROM ETUDIA NT); Prdicats IN, ANY, ALL, EXISTS Une sous-interrogation peut retourner un sous ensemble de zro n valeurs. En fonction des conditions que l'on veut exprimer au niveau des valeurs renvoyes par la requte, on peut utiliser les prdicats IN, ANY, ALL ou EXISTS. Prdicat IN ANY ALL EXISTS Utilisation L'oprateur de comparaison est l'galit et l'opration logique entre les valeurs est OU. Permet de vrifier si au moins une valeur de la liste satisfait la condition. Permet de vrifier si la condition est ralise pour toutes les valeurs de la liste. Si la sous-interrogation renvoie un rsultat, la valeur retourne est Vrai sinon la valeur Faux est retourne.
- Afficher les notes de l'tudiant numro 1 qui sont gales aux notes de l'tudiant numro 2. SELECT Note FROM NOTES WHERE Numetu=1 AND Note IN (SELECT Note FROM NOTES WHERE Numetu=2); - Afficher les notes de l'tudiant numro 1 qui sont suprieures aux notes de l'tudiant numro 2. SELECT Note FROM NOTES WHERE Numetu=1 AND Note > ANY (SELECT Note FROM NOTES WHERE Numetu=2); - Afficher les notes de l'tudiant numro 1 qui sont infrieures toutes les notes de l'tudiant numro 9. SELECT Note FROM NOTES WHERE Numetu=1 AND Note < ALL (SELECT Note FROM NOTES WHERE Numetu=9); - Afficher toutes les informations sur les tudiants qui n'ont aucune note. SELECT * FROM ETUDIANT E WHERE NOT EXISTS (SELECT Numetu FROM NOTES WHERE Numetu=E.Numetu); Tester les exemples
Excuter
Sommaire SQL
Q11 : Afficher le numro le nom et la note de l'tudiant qui a la meilleure note en informatique.