Structured Query Language
Structured query language (SQL), traduisez Langage structuré de requêtes, est un langage informatique standard, destiné à interroger ou piloter (modifier contenu et structure) une base de données.
SQL est 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), et un langage de contrôle de données (LCD, ou en anglais DCL, Data control language), pour les bases de données relationnelles.
| Sommaire |
Bref historique
C'est Edgar F. Codd qui en juin 1970 rédigea l'article « A Relational Model of Data for Large Shared Data Banks » ("Un modèle de données relationel 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 systèmes de gestion de base de données (SGBD). Un langage, Structured English Query Language ("SEQUEL") (langage d'interrogation structuré en anglais ) a été développée par IBM pour mettre en œuvre le modèle de Codd.
En 1979, Relational Software, Inc. (actuellement Oracle Corporation) présenta la première version commercialement disponible d'SQL, rapidement imité par d'autres fournisseurs.
SQL a été adopté comme recommendation par l'institut de normalisation américaine (ANSI) en 1986, puis comme norme internationale par l'ISO en 1987 sous le nom de ISO/IEC 9075 - Information Technologie - Database Language - SQL.
La norme internationale SQL est passée par un certain nombre de révisions :
| Année | Nom | Appelation | Commentaires |
| 1986 | ISO/IEC 9075:1986 | SQL-86 ou SQL-87 | Édité par l'ANSI puis adopté par l'ISO en 1987. |
| 1989 | ISO/IEC 9075:1989 | SQL-89 ou SQL-1 | Révision mineure. |
| 1992 | ISO/IEC 9075:1992 | SQL-92 ou SQL2 | Révision majeure. |
| 1999 | ISO/IEC 9075:1992 | SQL-99 ou SQL3 | Expressions régulières, 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/IEC 9075:2003 | SQL:2003 | Introduction de fonctions pour la manipulation XML,"window functions", ordres standardisés et colonnes avec valeurs auto-produites (incluant colonnes d'identité). |
Comme toute norme internationale publié par l'ISO, ISO/IEC 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 a cette adresse http://www.wiscorp.com/sql/sql_2003_standard.zip sur le site de Information Systems Corporation.
Usage
SQL se décompose en 5 parties
Ordres DDL : Data Definition Language : Ordres permettant de modifier la structure de la base de donnée
Ordres DML : Data Manipulation Language : Ordres permettant de consulter / modifier le contenu de la base de donnée
Ordres DCL : Data Control Language : Ordres permettant de gérer les privilèges, c'est à dire les utilisateurs et les actions qu'ils peuvent entreprendre
Ordres TCL : Transaction Control Language : Ordres permettant de gérer les transactions, c'est à dire rendre atomique divers ordres enchainés en séquence
SQL procédural : PSM (Persistent Stored Module), CLI (Call Level Interface), Embedded SQL... Un ensemble d'outils pour que SQL s'interface avec des langages hôtes.
Ordres DDL
Creation de table
CREATE TABLE TABLE1 (Champ1 Integer, Champ2 integer, Champ3 Date, Champ4 Date);
Modification de table
ALTER TABLE TABLE1 ADD COLUMN (Champ5 Integer); ALTER TABLE TABLE1 MODIFY COLUMN (Champ5 Long); ALTER TABLE TABLE1 DROP COLUMN (Champ5);
Suppression de table
DROP TABLE TABLE1 ;
Ajout d'une contrainte sur une table Ajout d'un index sur une table
Ordres DML
Consultation d'un enregistrement
Exemple de syntaxe SQL pour un ordre simple (sélection) :0 De base :
SELECT {champs} FROM {tables} WHERE {conditions};
SELECT (prenom, telephone) FROM (entrants, sortants) WHERE nom='Dupont';
Plus générique :
SELECT {expressions} FROM {tables} WHERE {prédicats} GROUP BY {expressions} HAVING {condition} ORDER BY {expressions};
SELECT (name, service) FROM employees WHERE (statut='stagiaire') GROUP BY (service, manager) ORDER BY lieu;
Par exemple, si on a une tables employes, contenant 2 champs nom et salaire, la requête permettant de trouver le nom des salariés touchant plus de 1500€ 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 enregistrements d'une table TABLE1 de clé primaire champ1 non présents dans une seconde table TABLE2:
SELECT * FROM TABLE1 WHERE TABLE1.champ1 NOT IN (SELECT champ2 FROM TABLE2) (Logique d'exclusion : NOT + enumeration IN : A eviter pour de bonnes performances)
SELECT * FROM TABLE1 WHERE TABLE1.champ1 IN (SELECT champ1 FROM TABLE2 MINUS SELECT champ2 FROM TABLE2 ) (Logique ensembliste MINUS + enumeration IN )
SELECT * FROM TABLE1 , (SELECT champ1 FROM TABLE2 MINUS SELECT champ2 FROM TABLE2) TMP WHERE WHERE TABLE1.champ1 = TMP.champ1 (Logique ensembliste : MINUS + jointure : = )
SELECT * FROM TABLE1 LEFT OUTER JOIN TABLE2 ON TABLE1.champ1 = TABLE2.champ2 WHERE TABLE2.champ2 IS NULL (Logique de jointure complete a gauche et imcomplete a droite + restriction : IS NULL) (Syntaxe SQLANSI Compatible Oracle à partir de 9i)
SELECT * FROM TABLE1, TABLE2 WHERE TABLE1.champ1 = TABLE2.champ2(+) AND TABLE2.champ2 IS NULL (Variation Spécifique Oracle sur la syntaxe de la jointure gauche LEFT OUTER )
NB : Dans la mesure du possible on privilégiera les operateurs d'egalité et ensemblistes aux operateurs d'exclusion <>, NOT IN qui n'utlisent que très rarement les indexs
Ajout d'un enregistrement
INSERT INTO employees (name, service) values ('Martin','comptabilité');
Ajout de données à partir des informations d'une autre table :
INSERT INTO TABLE1 ( champ1, champ2, champ3) Select (Val1, val2, val2+val3/2) from TABLE2;
Modification d'un enregistrement
Mise a jour de données:
UPDATE employees SET service='accueil' Where name = 'Martin';
Mise à jour d'une table à partir des informations d'une autre table : UPDATE TABLE1 SET ( champ3, champ4 ) = ( SELECT val32, val13 FROM TABLE2 WHERE TABLE1.CHAMP1 = TABLE2.CHAMP2 ) WHERE ( CHAMP1 ) IN ( SELECT CHAMP2 FROM TABLE2)
Suppression d'un enregistrement DELETE employees WHERE name = 'Martin';
Ordres DCL
Attribution et révoquation de privilèges
Exemple de syntaxe SQL pour un octroi de privilège d'exécution de l'ordre SELECT sur un objet de type table pour l'utilisateur toto avec possibilité de rétrocéder le privilège acquis :
GRANT SELECT ON TABLE T_CLIENT TO toto WITH GRANT OPTION;
Ordres TCL
Gestion des transactions
Exemple de syntaxe SQL pour le lancement d'une transaction avec annulation :
START TRANSACTION ISOLATION LEVEL REPEATABLE READ ... ROLLBACK WORK AND NO CHAIN
commandes SQL procédural
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)
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 MS SQL Server et Sybase, SQL PL pour IBM DB2, PL/PgSQL pour PostGreSQL...
Candidats au remplacement
SQL possède quelques anomalies, dont l'une est de permettre l'enchassement 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 affirmé plus cohérent et plus simple d'emploi par ses inventeurs. Il permet de surcroit, pour alléger le libellé des requêtes, l'emploi d'une clause with inspirée du langage Pascal.
Un autre candidat est BS12, qui lui aussi s'est attaqué à ce problème de l'enchassement et de la perte de lisibilité qu'il entraîne.
- 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).
Bases de données utilisant SQL
- Access
- DB2
- Firebird
- FoxPro
- HyperFile
- Informix
- Ingres
- InterBase
- MaxDB (anciennement SAP db)
- Microsoft SQL Server
- Mimer
- MySQL
- Ocelot
- Oracle
- PostgreSQL
- SmallSQL
- SQL 2000 i (Pervasive)
- SQLBase (Centura)
- SQLite
- Sybase
- Paradox
Principaux ouvrages sur le langage SQL
- SQL - Frédéric Brouard, Christian Soutou - Pearson Education, 2005
- SQL bible - A. Kriegel, B. M. Trukhnov - John Wiley, 2003
- Advanced SQL:1999 - Jim Melton - Morgan Kaufmann, 2003
- SQL:1999, Understanding Relational Language Components - Jim Melton, Alan R. Simon - Morgan Kauffman - 2002
- SQL - Frédéric Brouard - Campus Press, 2001
- SQL pour les nuls - Allen G. Taylor - First Interractive, 2001
- SQL2 - SQL3, Applications à Oracle (3eme édition) - Pierre Delmal - Do Boeck Université, 2001
- SQL in a nutshell - Kevin Kline, Daneil Kline - O'Reilly, 2001
- SQL avancé (2eme édition) - Joe Celko - Vuibert 2000
- The Complete Reference SQL - J. R. Groff, P. N. Weinberg - Osborne, 1999
- SQL-99 complete really - Peter Gulutzan, Trudy Pelzer - R&D Books, 1999
- SQL 3, Implementing the SQL Foundation Standard - Paul Fortier - Mc Graw Hill, 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
Anecdote
Wikipédia utilise SQL, et en particulier la commande :
SELECT user_name, user_rights from user where user_rights not like "" LIMIT 100.
