- Langage SQL
-
Structured Query Language
SQL Apparu en 1974 Auteur Donald D. Chamberlin et Raymond F. Boyce Développeur IBM Dernière version stable SQL:2008 (en 2009)[+/−] Paradigme multi-paradigme: orienté objet, fonctionnelle, procédurale Typage statique et fort Implémentations beaucoup Structured query language (SQL), ou langage structuré de requêtes, est un pseudo-langage informatique (de type requête) standard et normalisé, destiné à interroger ou à manipuler une base de données relationnelle avec :
- un langage de définition de données (LDD, ou en anglais DDL, Data definition language),
- un langage de manipulation de données (LMD, ou en anglais DML, Data manipulation language), la partie la plus courante et la plus visible de SQL,
- un langage de contrôle de données (LCD, ou en anglais DCL, Data control language),
- un langage de contrôle des transactions (LCT, ou en anglais TCL, Transaction control language),
- et d'autres modules destinés notamment à écrire des routines (procédures, fonctions ou déclencheurs) et interagir avec des langages externes.
SQL fait partie de la même famille que les langages SEQUEL (dont il est le descendant), QUEL ou QBE (Zloof).
Sommaire
Bref historique
En juin 1970 Edgar Frank Codd publia l'article « A Relational Model of Data for Large Shared Data Banks » ("Un modèle de données relationnel pour de grandes banques de données partagées") dans la revue Communications of the ACM (Association for Computing Machinery). Ce modèle a été rapidement admis comme modèle définitif pour les bases de données. Un langage, Structured English Query Language ("SEQUEL") (langage d'interrogation structuré en anglais) a été développé par IBM pour mettre en œuvre le modèle de Codd.
La première version de SQL a été développée chez IBM en 1970 par Donald Chamberlain et Raymond Boyce. Cette version d'origine (SEQUEL) a été conçue pour manipuler et éditer des données stockées dans la base de données relationnelle à l'aide du système de gestion de base de données IBM System R. Le nom SEQUEL a été abandonné et contracté en SQL[1] car il était déposé commercialement depuis 1984 par l'avionneur Hawker Siddeley pour un système d'acquisition de données[2]. Il était censé alors devenir un élément clé du futur projet FS.
En 1979, Relational Software, Inc. (actuellement Oracle Corporation) présenta la première version commercialement disponible de SQL, rapidement imité par d'autres fournisseurs.
SQL a été adopté comme recommandation par l'Institut de normalisation américaine (ANSI) en 1986, puis comme norme internationale par l'ISO en 1987 sous le nom de ISO/CEI 9075 - Technologies de l'information - Langages de base de données - SQL.
La norme internationale SQL est passée par un certain nombre de révisions :
Année Nom Appellation Commentaires 1986 ISO/CEI 9075:1986 SQL-86 ou SQL-87 Édité par l'ANSI puis adopté par l'ISO en 1987. 1989 ISO/CEI 9075:1989 SQL-89 ou SQL-1 Révision mineure. 1992 ISO/CEI 9075:1992 SQL-92 ou SQL2 Révision majeure. 1999 ISO/CEI 9075:1999 SQL-99 ou SQL3 Expressions rationnelles, requêtes récursives, déclencheurs, types non-scalaires et quelques fonctions orientées objet (les deux derniers points sont quelque peu controversés et pas encore largement implémentés). 2003 ISO/CEI 9075:2003 SQL:2003 Introduction de fonctions pour la manipulation XML,« window functions », ordres standardisés et colonnes avec valeurs auto-produites (y compris colonnes d'identité). 2008 ISO/CEI 9075:2008 SQL:2008 Ajout de quelques fonctions de fenêtrage (ntile, lead, lag, first value, last value, nth value), limitation du nombre de ligne (OFFSET / FETCH), amélioration mineure sur les types distincts, curseurs et mécanismes d'auto incréments. Comme toute norme internationale publié par l'ISO, ISO/CEI 9075 est disponible à l'achat sur le site de cette organisation : http://www.iso.org. Le dernier brouillon (working draft) de la norme est disponible à cette adresse http://www.wiscorp.com/sql_2003_standard.zip sur le site de http://www.wiscorp.com/about_wiscorp.html.
Usage
SQL se décompose en 5 parties, à savoir :
- Ordres LDD (langage de définition des données, ou DDL, Data Definition Language) : permet de modifier la structure de la base de données
- Ordres LMD (langage de manipulation des données, ou DML, Data Manipulation Language) : permet de consulter / modifier le contenu de la base de données
- Ordres LCD (langage de contrôle des données, ou DCL, Data Control Language) : permet de gérer les privilèges, c'est-à-dire les utilisateurs et les actions qu'ils peuvent entreprendre
- Ordres LCT (langage de contrôle des transactions, ou TCL, Transaction Control Language, ) : permet de gérer les transactions, c'est-à-dire rendre atomique divers ordres enchaînés en séquence
- SQL procedural : PSM (Persistent Stored Module), CLI (Call Level Interface), Embedded SQL, … qui est un ensemble d'outils pour développer des procédures, déclencheurs (triggers) et fonctions utilisateurs (UDF : User Define Function) et pour que SQL s'interface avec des langages hôtes.
Exemples d'ordres LDD
- Création d'une table :
CREATE TABLE table1 (colonne1 INTEGER, colonne2 INTEGER, colonne3 DATE, colonne4 DATE);
- Modification d'une table :
ALTER TABLE table1 ADD COLUMN colonne5 INTEGER NULL; ALTER TABLE table1 DROP COLUMN colonne5;
- Suppression d'une table :
DROP TABLE table1;
- Ajout d'une contrainte sur une table :
ALTER TABLE table1 ADD CONSTRAINT ck_jour CHECK (colonneJour IN ('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'));
Exemples d'ordres LMD
- recherche de lignes dans une table
- Requête de base :
SELECT {liste_colonnes} FROM {TABLES} WHERE {conditions}; #exemple SELECT prenom, telephone FROM entrants CROSS JOIN sortants WHERE nom = 'Dupont';
-
- Requête plus générique :
SELECT {expressions} FROM {TABLES} WHERE {prédicats} GROUP BY {expressions} HAVING {condition} ORDER BY {expressions}; #exemple SELECT name, service FROM employees WHERE statut='stagiaire' ORDER BY name;
Par exemple, si on a une table employes, contenant 2 colonnes nom et salaire, la requête permettant de trouver le nom des salariés touchant plus de 1 500 € par mois classés par salaire est la suivante :
SELECT nom FROM employes WHERE salaire > 1500 ORDER BY salaire;
Exemples de requêtes pour afficher les lignes d'une table TABLE1 de clé primaire colonne1 non présents dans une seconde table TABLE2 :
-- Logique d'exclusion : NOT + enumeration IN -- à eviter pour de bonnes performances SELECT * FROM TABLE1 WHERE TABLE1.colonne1 NOT IN (SELECT colonne2 FROM TABLE2)
-- Logique ensembliste de différence + enumeration IN SELECT * FROM TABLE1 WHERE TABLE1.colonne1 IN (SELECT colonne1 FROM TABLE2 EXCEPT SELECT colonne2 FROM TABLE2)
-- Logique ensembliste de différence + jointure SELECT * FROM TABLE1, INNER JOIN (SELECT colonne1 FROM TABLE2 EXCEPT SELECT colonne2 FROM TABLE2) TMP ON TABLE1.colonne1 = TMP.colonne1
-- Logique de jointure externe, c'est à dire complète à gauche et incomplète à droite + restriction : IS NULL SELECT * FROM TABLE1 LEFT OUTER JOIN TABLE2 ON TABLE1.colonne1 = TABLE2.colonne2 WHERE TABLE2.colonne2 IS NULL
-- Certains SGBDR (Oracle, Sybase, SQL Server...) utilisaient anciennement des syntaxes spécifiques pour les jointures externes -- exemple pour Oracle SELECT * FROM TABLE1, TABLE2 WHERE TABLE1.colonne1 = TABLE2.colonne (+) AND TABLE2.colonne2 IS NULL -- exemple pour Sybase SELECT * FROM TABLE1, TABLE2 WHERE TABLE1.colonne1 =* TABLE2.colonne AND TABLE2.colonne2 IS NULL
Ces anciennes syntaxes de jointures externes posent de nombreux inconvénients : résultats différents de la norme; impossibilité de jointures complexes (théta jointures externes notamment).
-
- Requêtes récursives
Depuis la norme SQL:1999, le langage SQL permet d'utiliser la récursivité dans les requêtes (parcours d'arbres, de graphes...). Ceci se fait à l'aide des expressions de tables.
-
- Ajout d'une ligne :
INSERT INTO employees (name, service) VALUES ('Martin', 'comptabilité');
Ajout de données à partir des lignes d'une autre table :
INSERT INTO TABLE1 (colonne1, colonne2, colonne3) SELECT colonne10, colonne20, (colonne30 + colonne40) / 2 FROM TABLE2;
-
- Modification de lignes :
UPDATE employees SET service='accueil' WHERE name = 'Martin';
Mise à jour d'une table à partir des informations d'une autre table :
UPDATE TABLE1 SET (colonne3, colonne4) = (SELECT colonne32, colonne13 FROM TABLE2 WHERE TABLE1.colonneX = TABLE2.colonneY) WHERE colonneZ IN (SELECT col FROM TABLE2)
-
- Suppression d'une ligne :
DELETE FROM employees WHERE name = 'Alpha';
Exemples d'ordres LCT
- Gestion des transactions :
-- lancement d'une transaction avec annulation START TRANSACTION ISOLATION LEVEL REPEATABLE READ ... ROLLBACK WORK AND NO CHAIN
Exemples d'ordres SQL procedural
Exemple d'utilisation d'un curseur dans le cadre d'une procédure stockée (PSM) :
DECLARE N INTEGER; SET N = 1; FOR C AS C_USR_MISE_A_JOUR CURSOR FOR SELECT USR_ID, USR_NOM FROM T_UTILISATEUR_USR ORDER BY USR_ID FOR UPDATE OF USR_NOM DO IF MOD(N, 2) = 0 THEN UPDATE T_UTILISATEUR_USR SET USR_NOM = UPPER(USR_NOM) WHERE CURRENT OF C_USR_MISE_A_JOUR; ELSE UPDATE T_UTILISATEUR_USR SET USR_NOM = LOWER(USR_NOM) WHERE CURRENT OF C_USR_MISE_A_JOUR; END IF END FOR
Dans cet exemple, la colonne USR_NOM de la table T_UTILISATEUR_USR est mise à jour en majuscule pour les lignes de position ordinale paires et en minuscule pour les autres.
Extension du langage
PL/SQL pour Oracle, Transact-SQL pour Microsoft SQL Server et Sybase, SQL PL pour IBM DB2, PL/pgSQL pour PostgreSQL, DQL pour Documentum de EMC.
Candidats au remplacement
SQL possède quelques anomalies, dont l'une est de permettre l'enchâssement de commandes à certains endroits et de les interdire dans d'autres, d'une façon qui peut sembler arbitraire à l'utilisateur, et l'oblige en tout cas à contorsionner sa pensée. Un langage plus récent nommé Tutorial D est présenté comme étant plus cohérent et plus simple d'emploi par ses inventeurs. Il permet, de surcroît, pour alléger le libellé des requêtes, l'emploi d'une clause WITH inspirée du langage Pascal, bien que WITH ne contribue pas à faciliter la lecture du code. A noter que la technique du WITH a été en partie reprise dans la norme SQL:1999 pour réaliser des "Common Table Expression" (CTE ou expression de table en français), c'est à dire des vues non instanciées utilisable par la requête dans laquelle elle figure, et ce afin de factoriser des expressions ou encore de permettre l'écriture de requêtes récursives de manière à résoudre élégamment des parcours d'arbres ou de graphes.
Un autre candidat est BS12, qui lui aussi s'est attaqué à ce problème de l'enchâssement et de la perte de lisibilité qu'il entraîne.
le TCL (voir système d'exploitation Pick)
- Principaux défauts reprochés à SQL (anglais)
Autres langages
Parmi les autres langages de requêtes, citons les ancêtres de SQL comme QUEL ou SEQUEL. Cependant le langage QBE, très différent de SQL, est encore en vigueur dans le SGBDR de type « fichier » qu'est Paradox (Ansa Software/Borland/Corel).
Langages objets
Afin de prendre en compte les spécificités (héritage, navigation transparente) des langages objets (Java, DotNet, C++…), de nouveaux langages de requête sont venus compléter SQL :
Systèmes de gestion de base de données utilisant SQL
- 4e Dimension (4D)
- Access
- Advantage Database
- Adonix X3
- Base
- DB2
- Firebird
- FoxPro - Visual Foxpro
- HyperFile
- Informix
- Ingres
- InterBase
- MaxDB (anciennement SAP db)
- Microsoft SQL Server
- Mimer
- MySQL
- Nexus
- Ocelot
- Oracle
- Paradox
- Pick
- PostgreSQL
Tous ces systèmes présentent certaines particularités dont certaines ne se retrouvent pas chez d'autres. Il est d'ailleurs toujours intéressant de se référer au manuel de référence du SGDBR, lors de requêtes particulières ou complexes, ainsi que pour leur optimisation.
Ouvrages sur le langage SQL
En français
- SQL Synthèse de cours et exercices - 2e édition - Frédéric Brouard, Christian Soutou, Rudi Bruchez - Pearson Education 2008
- SQL par l'exemple - Antony Molinaro - O'reilly, 2007
- SQL en concentré - Kevin Kline - O'reilly, 2005
- SQL développement - Frédéric Brouard - Campus Press 2001
- SQL pour les nuls - Allen G. Taylor - First Interractive, 2001
- SQL avancé (2e édition) - Joe Celko - Vuibert 2000
- Bases de données - de la modélisation au SQL - Laurent Audibert - Ellipses 2009
En anglais
- The Art of SQL - Stéphane Faroult - O'Reilly, 2006
- Advanced SQL:1999 - Jim Melton - Morgan Kaufmann, 2003
- SQL bible - A. Kriegel, B. M. Trukhnov - John Wiley, 2003
- SQL:1999, Understanding Relational Language Components - Jim Melton, Alan R. Simon - Morgan Kauffman, 2002
- SQL2 - SQL3, Applications à Oracle (3e édition) - Pierre Delmal - De Boeck Université, 2001
- SQL in a nutshell - Kevin Kline, Daneil Kline - O'Reilly, 2001
- SQL 3, Implementing the SQL Foundation Standard - Paul Fortier - Mc Graw Hill, 1999
- SQL-99 complete really - Peter Gulutzan, Trudy Pelzer - R&D Books, 1999
- The Complete Reference SQL - J. R. Groff, P. N. Weinberg - Osborne, 1999
- A guide to the SQL standard - Chris J. Date, Hugh Darwen - Addison Wesley - USA, 1997
- Understanding the new SQL - Jim Melton, Alan R. Simon - Morgan Kaufmann, 1993
Notes et références
Voir aussi
Articles connexes
- Les commandes SQL : Select, Insert, Update, Merge, Delete, From, Join, Union, Create, Drop, Begin work, Commit, Rollback, Truncate, Alter
- Base de données relationnelle
- Formes normales
- Pro*C
- Système de gestion de base de données
Liens externes
- (fr) Laurent Audibert, « Langage SQL » sur developpez.com
- Catégorie Structured Query Language de l’annuaire dmoz
- Portail de la programmation informatique
- Portail des bases de données
Catégories : Base de données | Norme ISO | Langage de requête
Wikimedia Foundation. 2010.