Structured Query Language
5298
31479749
2008-07-10T21:39:11Z
Van Rijn
147749
/* Exemples d'ordres LMD */
{{Infobox Langage de programmation
| nom = SQL
| paradigme = [[Langage de programmation à multi-paradigme|multi-paradigme]]: [[Programmation orientée objet|orienté objet]], [[Programmation fonctionnelle|fonctionnelle]], [[Programmation procédurale|procédurale]]
| année = [[1974]]
| auteur = [[Donald D. Chamberlin]] et [[Raymond F. Boyce]]
| développeur = [[International Business Machines Corporation|IBM]]
| dernière version = SQL:2006
| date = [[2006]]
| typage = [[Typage statique|statique]] et [[Typage fort|fort]]
| implémentations = [[Liste de SGBDR|beaucoup]]
}}
'''Structured query language''' ('''SQL'''), ou ''langage structuré de requêtes'', est un pseudo-[[langage informatique]] (de type [[Langage de requête | requête]]) standard et [[Normes et standards industriels|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]] ([[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]] ([[langage de contrôle de données|LCD]], ou en anglais ''DCL'', ''Data control language''),
* un [[langage de contrôle des transactions]] ([[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).
'''
{{Wikibooks|Programmation_SQL|la programmation SQL}}
== 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 ''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é par [[International Business Machines Corporation|IBM]] pour mettre en œuvre le modèle de Codd.
La première version de SQL a été développée à IBM en premier 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 IBM : le système R. Le nom SEQUEL a été abandonné et contracté en SQL<ref>[http://www.mcjones.org/System_R/SQL_Reunion_95/sqlr95-System.html#Index195 Interview de Donald Chamberlain]</ref> car il était déposé commercialement depuis 1984 par l'avionneur Hawker Siddeley pour un système d'acquisition de données<ref>[http://tmportal.uspto.gov/external/PA_1_2_V9/OpenServletWindow?serialNumber=73346503&scanDate=2005120555500&DocDesc=Registration+Certificate&docType=ORC¤tPage=1&rowNum=1&rowCount=1&formattedDate=02-Oct-1984 Dépot de la marque SEQUEL aux États-Unis par Hawker Siddeley]</ref>. 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. Malgré le succès du langage SQL qui a suivi, Codd dénoncera cet outil qu'il considère comme une interprétation incorrecte de ses théories.
SQL a été adopté comme recommandation par l'Institut de normalisation américaine ([[ANSI]]) en [[1986]], puis comme norme internationale par l'[[Organisation internationale de normalisation|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 :
{| class=wikitable
|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]]||en cours d'élaboration||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 que SQL s'interface avec des langages hôtes.
=== Exemples d'ordres LDD ===
*Création d'une table :
<source lang="sql">
CREATE TABLE table1 (colonne1 INTEGER,
colonne2 INTEGER,
colonne3 DATE,
colonne4 DATE);
</source>
*Modification d'une table :
<source lang="sql">
ALTER TABLE table1 ADD COLUMN colonne5 INTEGER NULL;
ALTER TABLE table1 DROP COLUMN colonne5;
</source>
*Suppression d'une table :
<source lang="sql">
DROP TABLE table1;
</source>
*Ajout d'une contrainte sur une table :
<source lang="sql">
ALTER TABLE table1
ADD CONSTRAINT ck_jour
CHECK (colonneJour IN ('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'));
</source>
=== Exemples d'ordres LMD ===
*recherche de lignes dans une table
**Requête de base :
<source lang="sql">
SELECT {liste_colonnes}
FROM {tables}
WHERE {conditions};
#exemple
SELECT prenom, telephone
FROM entrants
CROSS JOIN sortants
WHERE nom = 'Dupont';
</source>
**Requête plus générique :
<source lang="sql">
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;
</source>
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 1500€ par mois classés par salaire est la suivante :
<source lang="sql">
SELECT nom
FROM employes
WHERE salaire > 1500
ORDER BY salaire;
</source>
Exemples de requêtes pour afficher les lignes d'une table TABLE1 de clé primaire colonne1 non présents dans une seconde table TABLE2 :
<source lang="sql">
-- Logique d'exclusion : NOT + enumeration IN
-- à eviter pour de bonnes performances
SELECT *
FROM TABLE1
WHERE TABLE1.colonne1 NOT IN (SELECT colonne2 FROM TABLE2)
</source>
<source lang="sql">
-- Logique ensembliste de différence + enumeration IN
SELECT *
FROM TABLE1
WHERE TABLE1.colonne1 IN (SELECT colonne1
FROM TABLE2
EXCEPT
SELECT colonne2
FROM TABLE2)
</source>
<source lang="sql">
-- 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
</source>
<source lang="sql">
-- 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
</source>
<source lang="sql">
-- 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
</source>
Notez que 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
A noter : 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 :
<source lang="sql">
INSERT INTO employees (name, service) values ('Martin', 'comptabilité');
</source>
Ajout de données à partir des lignes d'une autre table :
<source lang="sql">
INSERT INTO TABLE1 (colonne1, colonne2, colonne3)
SELECT colonne10, colonne20, (colonne30 + colonne40) / 2
FROM TABLE2;
</source>
**Modification de lignes :
<source lang="sql">
UPDATE employees
SET service='accueil'
WHERE name = 'Martin';
</source>
Mise à jour d'une table à partir des informations d'une autre table :
<source lang="sql">
UPDATE TABLE1
SET (colonne3, colonne4) = (SELECT colonne32, colonne13
FROM TABLE2
WHERE TABLE1.colonneX = TABLE2.colonneY)
WHERE colonneZ IN (SELECT col FROM TABLE2)
</source>
**Suppression d'une ligne :
<source lang="sql">
DELETE FROM employees
WHERE name = 'Alpha';
</source>
=== Exemples d'ordres LCT ===
*Gestion des transactions :
<source lang="sql">
-- lancement d'une transaction avec annulation
START TRANSACTION ISOLATION LEVEL REPEATABLE READ
...
ROLLBACK WORK AND NO CHAIN
</source>
=== Exemples d'ordres SQL procedural ===
Exemple d'utilisation d'un curseur dans le cadre d'une procédure stockée (PSM) :
<source lang="SQL">
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
</source>
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 (base de données)|Oracle]], Transact SQL pour [[Microsoft 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'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 (langage)|Pascal]], bien que '''WITH''' ne contribue pas à faciliter la lecture du code.
Un autre candidat est [http://c2.com/cgi/wiki?BusinessSystemTwelve BS12], qui lui aussi s'est attaqué à ce problème de l'enchâssement et de la perte de [[lisibilité]] qu'il entraîne.
* [http://c2.com/cgi/wiki?SqlFlaws 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 (langage)|Java]], [[Microsoft .NET|DotNet]], [[C++]]…), de nouveaux langages de requête sont venus compléter SQL :
* [[OQL]] (Object Query Langage)
* En java : [[JDOQL]] spécifié par le standard [[JDO]]
== Systèmes de gestion de base de données utilisant SQL ==
{| cellpadding=0 cellspacing=15
|-
|width="33%" valign="top"|
* [[4ème Dimension (langage)|4{{e}} Dimension (4D)]]
* [[Microsoft Access|Access]]
* [[Advantage Database]]
* [[Adonix X3]]
* [[OOo_Base|Base]]
* [[DB2]]
* [[Firebird (SGBDR)|Firebird]]
* [[FoxPro - Visual Foxpro]]
* [[HyperFile]]
* [[Informix]]
* [[Ingres (base de données)|Ingres]]
|width="33%" valign="top"|
* [[InterBase]]
* [[MaxDB]] (anciennement SAP db)
* [[Microsoft SQL Server]]
* [[Mimer]]
* [[MySQL]]
* [[NexusDB (base de données) |Nexus ]]
* [[Ocelot (base de données)|Ocelot]]
* [[Oracle (base de données)|Oracle]]
* [[Paradox]]
* [[PostgreSQL]]
|width="34%" valign="top"|
* [http://www.rebol.org/cgi-bin/cgiwrap/rebol/view-script.r?script=sql-protocol.r Rebol sql-protocol (http://www.rebol.org)]
* [[SmallSQL]]
* [[SQL 2000 i]] (Pervasive)
* [[SQLBase]] (Centura)
* [[SQLite]]
* [[SQL/MM]]
* [[Sybase]]
* [[Teradata]]
|}
''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.''
== Principaux ouvrages sur le langage SQL ==
* ''SQL'' Synthèse de cours et exercices - 2e édition - Frédéric Brouard, Christian Soutou, Rudi Bruchez - Pearson Education 2008
* ''PHP et SQL '' - Cyril Pierre de Geyer, Guillaume Ponçon, et Stéphane Mariel (Broché - 13 avril 2006)
* ''Pratique de MySQL et PHP'' -Philippe Rigaux (Broché - 27 janvier 2005)
* ''SQL par l'exemple'' - Antony Molinaro - O'reilly, 2007
* ''The Art of SQL'' - Stéphane Faroult - O'Reilly, 2006
* ''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 pour les nuls'' - Allen G. Taylor - First Interractive, 2001
* ''SQL2 - SQL3, Applications à Oracle'' (3{{e}} édition) - Pierre Delmal - De Boeck Université, 2001
* ''SQL in a nutshell'' - Kevin Kline, Daneil Kline - O'Reilly, 2001
* ''SQL'' développement - Frédéric Brouard - Campus Press 2001
* ''SQL avancé'' (2{{e}} é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
== Voir aussi ==
* [[Base de données relationnelle]]
* [[Formes normales]]
* [[Pro*C]]
* [[Système de gestion de base de données]]
== Liens externes ==
*{{ODP|World/Français/Informatique/Programmation/Langages/SQL|Structured Query Language}}
== Notes et références ==
<references /> <!-- aide : http://fr.wikipedia.org/wiki/Aide:Notes et références -->
{{Portail|programmation informatique|bases de données}}
[[Catégorie:Base de données]]
[[Catégorie:Norme ISO]]
[[Catégorie:Langage de requête]]
[[ar:لغة الاستعلامات البنيوية]]
[[be:SQL]]
[[bg:SQL]]
[[bn:এসকিউএল]]
[[br:Areg SQL]]
[[bs:SQL]]
[[ca:Structured Query Language]]
[[cdo:SQL]]
[[cs:SQL]]
[[da:Structured Query Language]]
[[de:SQL]]
[[en:SQL]]
[[eo:SQL]]
[[es:SQL]]
[[eu:SQL]]
[[fa:اسکیوال]]
[[fi:SQL]]
[[ga:Teanga Struchtúrtha Iarratas]]
[[he:SQL]]
[[hr:SQL]]
[[hu:SQL]]
[[ia:SQL]]
[[id:SQL]]
[[is:SQL]]
[[it:SQL]]
[[ja:SQL]]
[[ko:SQL]]
[[ku:SQL]]
[[lt:SQL]]
[[lv:SQL]]
[[ms:SQL]]
[[nl:SQL]]
[[no:Structured Query Language]]
[[pl:SQL]]
[[pt:SQL]]
[[ro:SQL]]
[[ru:SQL]]
[[sk:SQL]]
[[sl:SQL]]
[[sr:SQL]]
[[sv:SQL]]
[[th:ภาษาสอบถามเชิงโครงสร้าง]]
[[tr:SQL]]
[[uk:SQL]]
[[vi:SQL]]
[[zh:SQL]]