Langage SQL

Langage SQL

Structured Query Language

SQL
Importez le logo de ce langage de programmation
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 :

SQL fait partie de la même famille que les langages SEQUEL (dont il est le descendant), QUEL ou QBE (Zloof).

Wikibooks-logo-fr.png

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

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)

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 :

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

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.

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

Liens externes

  • Portail de la programmation informatique Portail de la programmation informatique
  • Portail des bases de données Portail des bases de données
Ce document provient de « Structured Query Language ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Langage SQL de Wikipédia en français (auteurs)

Игры ⚽ Поможем сделать НИР

Regardez d'autres dictionnaires:

  • Langage D'interrogation De Données — Un langage d interrogation de données est un langage informatique, destiné à la recherche, extraction, tri et mise en forme, de données dans une base de données. Sommaire 1 SQL ou le langage d interrogation de données (LID) 1.1 Terminologie 1.2 …   Wikipédia en Français

  • Langage d'interrogation de donnees — Langage d interrogation de données Un langage d interrogation de données est un langage informatique, destiné à la recherche, extraction, tri et mise en forme, de données dans une base de données. Sommaire 1 SQL ou le langage d interrogation de… …   Wikipédia en Français

  • Langage De Définition De Données — Le langage de définition de données (LDD, ou Data Definition Language, soit DDL en anglais) est un langage orienté au niveau de la structure de la base de données. C est à dire que les commandes manipulent les structures de données et non les… …   Wikipédia en Français

  • Langage de Définition de Données — Le langage de définition de données (LDD, ou Data Definition Language, soit DDL en anglais) est un langage orienté au niveau de la structure de la base de données. C est à dire que les commandes manipulent les structures de données et non les… …   Wikipédia en Français

  • Langage de definition de donnees — Langage de définition de données Le langage de définition de données (LDD, ou Data Definition Language, soit DDL en anglais) est un langage orienté au niveau de la structure de la base de données. C est à dire que les commandes manipulent les… …   Wikipédia en Français

  • Langage de définition de donnée — Langage de définition de données Le langage de définition de données (LDD, ou Data Definition Language, soit DDL en anglais) est un langage orienté au niveau de la structure de la base de données. C est à dire que les commandes manipulent les… …   Wikipédia en Français

  • Langage structuré de requêtes — Structured Query Language SQL Apparu en 1974 Auteur …   Wikipédia en Français

  • SQL — Structured Query Language SQL Apparu en 1974 Auteur …   Wikipédia en Français

  • Langage d'interrogation de données — Un langage d interrogation de données est un langage informatique, destiné à la recherche, extraction, tri et mise en forme, de données dans une base de données. Sommaire 1 SQL ou le langage d interrogation de données (LID) 1.1 Terminologie 1.2… …   Wikipédia en Français

  • Langage dédié — Un langage dédié (Domain specific language) est langage dont l utilisation est dédiée à un domaine d application. Sommaire 1 Tour d horizon technologique 1.1 Analogie 1.2 Définitions …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”