Structured Query Language
Un article de Wikipédia, l'encyclopédie libre.
Les contributeurs sont enjoints de ne pas participer à une guerre d'édition sous peine de blocage.
Cet article a subi récemment une guerre d’édition au cours de laquelle plusieurs contributeurs ont mutuellement annulé leurs modifications respectives. Ce comportement non collaboratif est proscrit par la règle dite des trois révocations. En cas de désaccord, un consensus sur la page de discussion doit être obtenu avant toute modification.
|
SQL | |
Apparu en | 1974 |
Auteur | Donald D. Chamberlin et Raymond F. Boyce |
Développeur | IBM |
Dernière version | SQL:2003 |
Date | 2003 |
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 intéragir 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 |
[modifier] 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 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[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. 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'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 | 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 distincs, 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.
[modifier] 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.
[modifier] 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'));
[modifier] 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 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 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 jointure 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
Notez que ces anciennes syntaxes de jointures externes posent de nombreux inconvénients : résultats diférents de la norme; impossibilité de jointure 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 :
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';
[modifier] Exemples d'ordres LCT
- Gestion des transactions :
-- lancement d'une transaction avec annulation START TRANSACTION ISOLATION LEVEL REPEATABLE READ ... ROLLBACK WORK AND NO CHAIN
[modifier] 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) 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.
[modifier] Extension du langage
PL/SQL pour Oracle, Transact SQL pour Microsoft SQL Server et Sybase, SQL PL pour IBM DB2, PL/pgSQL pour PostgreSQL.
[modifier] 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.
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.
- Principaux défauts reprochés à SQL (anglais)
[modifier] 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).
[modifier] 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 :
[modifier] Systèmes de gestion de base de données utilisant SQL
|
|
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.
[modifier] 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 (3e é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é (2e é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
[modifier] Voir aussi
[modifier] Liens externes
- Catégorie Structured Query Language de l’annuaire dmoz.