Le langage SQL (Structured Query Language) peut être considéré comme le langage d’accès normalisé aux bases de données. Il est aujourd’hui supporté par la plupart des produits commerciaux que ce soit par les systèmes de gestion de bases de données micro tel que Access ou par les produits plus professionnels tels que Oracle ou Sybase. Il a fait l’objet de plusieurs normes ANSI/ISO dont la plus répandue aujourd’hui est la norme SQL2 qui a été définie en 1992. Nous décrivons ici les principaux aspects de cette norme.
Le succès du langage SQL est du essentiellement à sa simplicité et au fait qu’il s’appuie sur le schéma conceptuel pour énoncer des requêtes en laissant le SGBD responsable de la stratégie d’exécution. Le langage SQL propose un langage de requêtes ensembliste et assertionnel. Néanmoins, le langage SQL ne possède pas la puissance d’un langage de programmation : entrées/sorties, instructions conditionnelles, boucles et affectations. Pour certains traitements il est donc nécessaire de coupler le langage SQL avec un langage de programmation complet au sens Turing du terme.
Le langage SQL comporte :
une partie sur la définition des données :
le langage de définition des données (LDD) qui permet de définir des relations, des vues externes et des contraintes d’intégrité;
une partie sur les requêtes :
le langage de manipulation des données (LMD) qui permet d’interroger une base de données sous forme déclarative sans se préoccuper de l’organisation physique des données;
une partie sur le contrôle des données :
le langage de contrôle des données (LCD) qui permet de contrôler la sécurité et les accès aux données.
Nous présentons ici les principaux aspects du langage en utilisant une méthode par l’exemple.
Le langage de définition des données permet de définir et de manipuler les concepts du modèle relationnel liés au schéma : relation, attribut, clé, contraintes d’intégrité, vues ainsi que certains éléments liés à l’administration de la base de données : index, droits des utilisateurs.
Les types de données disponibles dépendent du SGBD mais on retrouve généralement les types entier, réel, chaînes de caractères et date. Les principaux types de données disponibles en SQL sont : SMALLINT, INTEGER, DECIMAL, FLOAT, DOUBLE, DATE, TIME, TIMESTAMP, CHAR et VARCHAR.
| Relations | ||||
| Nom | Commentaires | Exemple | ||
| ALTER TABLE | | | ||
| CREATE TABLE | |
| ||
| DROP TABLE | | | ||
| Clause | ||||
| CASCADE CONSTRAINS | | | ||
La création d’un index permet de réduire les temps de recherche.
La création d’index ne fait pas partie de la norme ANSI SQL. Néanmoins, tous les produits sérieux SQL supportent la création d’index. L’effet de cette commande est la création d’un index en général de type B-arbre sur les attributs spécifiés avec les clés triées soit par ordre ascendant (ASC) ou descendant (DESC). Si le mot clé UNIQUE est utilisé, le SGBD interdit les doublons.
| Index | ||||
| Nom | Commentaires | Exemple | ||
| CREATE INDEX | | | ||
| DROP INDEX | |
| ||
| Vues | ||||
| Nom | Commentaires | Exemple | ||
| CREATE VIEW | | | ||
| DROP VIEW | | | ||
| Instructions de mises à jour | ||||
| Nom | Commentaires | Exemple | ||
| INSERT | |
| ||
| DELETE | |
| ||
| UPDATE | | | ||
Pour déterminer le comportement à adopter en fonction des contraintes d'intégrité, il est possible d'ajouter une clause lors de la définition de la contrainte.
| Contraintes d'intégrités | ||||
| Nom | Fonction | Exemple | ||
| RESTRICT | Interdit la suppression. | | ||
| CASCADE | Permet de faire des suppressions éventuellement en cascade. | | ||
| SET NULL | Remet les références à nul. | |||
Une requête se présente généralement sous la forme " SELECT ... FROM ... WHERE " :
la clause SELECT exprime le résultat attendu sous la forme d’une liste d’attributs auxquels il est possible d’appliquer différents opérateurs et fonctions.
la clause FROM liste les relations utilisées pour évaluer les requêtes;
la clause WHERE qui est facultative énonce une condition que doivent respecter les enregistrements sélectionnés.
SELECT [DISTINCT] { * | <nom_de_relation>,<nom_d’attribut> [alias] | <nom_d’attribut>[alias] [, ...]
FROM [<nom_d’utilisateur>]<nom_de_relation> [alias] [, ...]
[WHERE <condition>]
[GROUP BY <nom_d’attribut> [, ...] [HAVING <condition>] ]
[ {UNION | INTERSECT | MINUS [ALL]} <commande_SELECT>
[ ORDER BY {<nom_d’attribut> | <numéro_de_colonne>} [{ASC | DESC}] [, ... ]
Avant d’introduire l’utilité des différentes clauses facultatives ainsi que les différentes possibilités offertes par SQL, nous montrons le lien entre algèbre relationnel et SQL.
Soient les schémas relationnels R1, R2, R3 et R4 définis comme suit :
R1 (A :D1, B :D2)
R2 (C :D1, D :D2)
R3 (A :D1, E :D3)
R4 (B :D2)
| Opération | Expression algébrique | Expression SQL équivalente |
| Projection | P A ( R1 ) | SELECT A FROM R1 |
| Sélection | s < condition > ( R1 ) | SELECT * FROM R1 WHERE <condition > |
| Produit cartésien | R1 X R2 | SELECT * FROM R1, R2 |
| Jointure | R1 * R3 | SELECT * FROM R1, R3 WHERE R1.A = R3.A |
| Union | R1 U R2 | SELECT * FROM R1 UNION SELECT * FROM R2 |
| Intersection | R1 Ç R2 | SELECT * FROM R1, R2 WHERE R1.A = R2.C and R1.B = R2.D |
| Différence | R1 / R2 | SELECT * FROM R1 WHERE not exists (SELECT * FROM R2 WHERE R2.C = R1.A and R2.D = R1.B ) |
| Division | R1 : R2 | SELECT A FROM R1 GROUP BY A HAVING COUNT (distinct B ) = (SELECT count (distinct B ) FROM R4) |
| Requêtes imbriquées | ||||
| Nom | Commentaires | Exemple | ||
| IN | Permet de tester la présence d'une valeur particulière dans un ensemble. | | ||
| NOT IN | Permet de tester l'absence d'une valeur particulière dans un ensemble. | | ||
| ALL | Compare chacune des valeurs de l'ensemble à une valeur particulière et retourne "VRAI" si la comparaison est évaluée pour chacun des éléments. | | ||
| ANY | Compare chacune des valeurs de l'ensemble à une valeur particulière et retourne "VRAI" si la comparaison est évaluée à "VRAI" pour au moins un des éléments. | | ||
| EXISTS | Retourne "VRAI" si une requête imbriquée retourne au moins une ligne. | | ||
| Prédicats | ||||
| Nom | Commentaires | Exemple | ||
| BETWEEN | Teste l'appartenance d'une valeur à un intervalle. | | ||
| LIKE | Permet de faire une recherche approximative. | | ||
| IS NULL | Permet de tester si un champ a été affecté. | | ||
| Clauses | ||||
| Nom | Commentaires | Exemple | ||
| GROUP BY | Application de fonction agégats à des collections d'enregistrements reliées sémentiquement. | | ||
| HAVING | Cette clause ne s'emploie qu'avec un "GROUP BY". | | ||
| ORDER BY | Permet l'ordonnancement du résultat avant l'affichage. | | ||
| DISTINCT | Elimine les doublons avant d'utiliser une fonction agrégat. | | ||
Ces fonctions ne peuvent être utilisées que dans une clause SELECT ou dans une clause HAVING .
| Fonctions agrégats | ||||
| Nom | Commentaires | Exemple | ||
| COUNT | | | ||
| SUM | | | ||
| MIN | | | ||
| MAX | | | ||
| AVG | | | ||
On peut préfixer expr par les mots clés [DISTINCT | ALL] .
Fonction
La commande INSERT permet d’ajouter des enregistrements à une relation dont le schéma a été préalablement définie soit un enregistrement à la fois soit en utilisant une expression de sélection. La syntaxe de cette commande est :
Syntaxe
INSERT INTO <nom_de_relation > [(<liste_d’attributs>)] VALUES (<liste_de_valeurs >) ou
INSERT INTO <nom_de_relation> [(<liste_d’attributs>)] <expression_de_sélection>
Il est évident que dans beaucoup d’applications, il est préférable d’utiliser une interface graphique conviviale pour ajouter de nouvelles données à la base. Néanmoins, l’utilisation de fichiers de commandes permet une certaine indépendance vis à vis du SGBD cible et peut aider à la migration d’un système vers un autre. De plus, certaines interfaces graphiques génèrent automatiquement le code correspondant aux commandes.
Fonction
La commande DELETE permet de supprimer des enregistrements d’une relation. Cette opération n’affecte pas le schéma de la relation et ceci même dans le cas où la commande a pour effet de supprimer tous les enregistrements de la relation.
Syntaxe
DELETE FROM < nom_de_relation > [WHERE < expression_de_selection > ]
 
Problèmes
La suppression de certains enregistrements peut poser des problèmes de respect d’intégrité référentielle. Par exemple, si l’on souhaite supprimer un disque actuellement emprunté par un abonné, la contrainte " FOREIGN KEY NumDisque REFERENCES DISQUE " sera violée. Pour dicter au SGBD l’attitude à avoir dans un tel cas, une clause " ON DELETE " peut être ajoutée en même temps que la définition de la contrainte d’intégrité référentielle.
Quatre options sont disponibles :
ON DELETE RESTRICT
Permet d’interdire la suppression d’un enregistrement référencé par un enregistrement d’une autre relation. On trouve également l’expression NO ACTION à la place du mot clé RESTRICT dans certains SGBD.
ON DELETE SET NULL
Affecte la valeur NULL à la clé étrangère.
ON DELETE SET DEFAULT
Affecte la valeur par défaut (selon le type de données) à la clé étrangère.
ON DELETE CASCADE
Indique au SGBD qu’il est possible de détruire la clé étrangère en détruisant toutes les clés étrangères avec la même valeur.
Q1 : Quel est le contenu de la relation LIVRE ?
Solution
Q2 : Quels sont les titres des romans édités par Flammarion ?
Solution
Q3 : Liste des titres que l’on retrouve à la fois comme titre de disque et titre de livre ?
Solution
Q4 : Quelle est l’identité des auteurs qui ont fait des disques et écrit des livres ?
Solution
Q5 : Quels sont les différents styles de disques proposés ?
Solution
Q6 : Quel est le salaire annuel des membres du personnel gagnant plus de 150 000 F en ordonnant le résultat par salaire descendant et nom croissant ?
Solution
Q7 : Donnez le nombre de prêts en cours pour chaque famille en considérant qu’une famille regroupe des personnes de même nom et possédant le même numéro de téléphone ?
Solution
Q8 : Quel est le code du disque dont la médiathèque possède le plus grand nombre d’exemplaires?
Solution
Q9 : Quels sont les éditeurs pour lesquels l’attribut Collection n’a pas été renseigné ?
Solution
Q10 : Quels sont les abonnés dont le nom contient la chaîne " ALDO " et habitant en Isère ?
Solution
Q11 : Quel est le nombre de prêts en cours ?
Solution
Q12 : Quels sont les salaires minimum, maximum et moyen des employés exerçant une fonction de bibliothécaire ?
Solution
Q13 : Quel est le nombre de genres de livres différents ?
Solution
Q14 : Quel est le nombre de disques achetés en 1998 ?
Solution
Q15 : Quel est le salaire annuel des membres du personnel gagnant plus de 150 000 F ?
Solution
Q16 : Quel est le nom , le prénom et l’adresse des abonnés ayant emprunté un disque le ‘ 12-JAN-99 ’ ?
Solution
Q17 : Quels sont les titres des livres et des disques actuellement empruntés par Marlène Sirva ?
Solution
Q18 : Quels sont les titres des ouvrages livres policiers ou disques de jazz empruntés par Olivier Lobry ?
Solution
Q19 : Quelle est l’identité des auteurs qui n’ont écrit que des romans policiers (genre = policier) ?
Solution
Q20 : Quels sont les codes des ouvrages des livres pour lesquels il y a au moins un exemplaire emprunté et au moins un exemplaire disponible ?
Solution
Cette partie du langage SQL comporte deux commandes, la commande GRANT pour donner des droits à des utilisateurs et la commande REVOKE pour supprimer des droits préalablement accordés.
Fonction
La commande GRANT permet d’attribuer des privilèges. Un privilège est une autorisation d’exécuter un acte. Les privilèges les plus courants sont la permission d’insérer (INSERT) des enregistrements dans une relation donnée, la permission de supprimer (DELETE) des enregistrements dans une relation donnée et enfin la permission de sélectionner (SELECT) des enregistrements dans une relation donnée. Un utilisateur ne peut exécuter que les commandes SQL pour lesquelles les droits lui ont été explicitement attribués ou qu’il possède implicitement car l’objet accédé a été créé par lui-même.
Les privilèges sur un objet (TABLE, VIEW) sont distribués soit pour un utilisateur donné, soit pour tout le monde (PUBLIC).
Syntaxe
GRANT < privilège > [, ...] ON [TABLE] <nom_de_relation> TO {<nom_d’utilisateur > [, ...] | PUBLIC}
Fonction
La commande REVOKE permet de supprimer des privilèges.
Syntaxe
REVOKE <privilège > [, ...] ON [TABLE] <nom_de_relation> FROM {<nom_d’utilisateur> [, ...] | PUBLIC}
|
|
|---|