Structured Query Language

Un article de Wikipédia, l'encyclopédie libre.

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).

b:Accueil

Wikibooks propose un ouvrage abordant ce sujet : la programmation SQL.

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.

[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 :

  • OQL (Object Query Langage)
  • En java : JDOQL spécifié par le standard JDO

[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

[modifier] Notes et références

  1. Interview de Donald Chamberlain
  2. Dépot de la marque SEQUEL aux États-Unis par Hawker Siddeley