Article de reference

SQL

[[Raymond F. Boyce]]"},"developer":{"wt":"[[ISO/IEC JTC 1/SC 32|ISO/IEC JTC 1 (Joint Technical Committee 1) / SC 32 (Subcommittee 32)]] / WG 3 (Working ...

"sequel") est unlangage dédié à un domaine spécifiqueutilisé pour gérer des données, notamment dans unsystème de gestion de bases de données relationnelles(SGBDR). Il est particulièrement utile pour la gestionde données structurées, c'est-à-dire de données intégrant des relations entre entités et variables.

Apparu dans les années 1970, SQL offrait deux avantages majeurs par rapport aux anciennes API de lecture - écriture telles qu'ISAM ou VSAM . Premièrement, il a introduit le concept d'accès à de nombreux enregistrements avec une seule commande . Deuxièmement, il élimine la nécessité de spécifier comment accéder à un enregistrement, c'est-à-dire avec ou sans index .

Initialement basé sur l'algèbre relationnelle et le calcul relationnel des tuples , SQL se compose de nombreux types d'instructions, qui peuvent être classés de manière informelle comme des sous-langages , généralement : langage de requête de données (DQL), langage de définition de données (DDL), langage de contrôle de données (DCL) et langage de manipulation de données (DML).

Le champ d'application de SQL englobe l'interrogation, la manipulation (insertion, mise à jour et suppression) et la définition ( création et modification de schémas ) des données, ainsi que le contrôle d'accès aux données. Bien que SQL soit essentiellement un langage déclaratif ( 4GL ), il comprend également des éléments procéduraux .

SQL fut l'un des premiers langages commerciaux à utiliser le modèle relationnel d' Edgar F. Codd . Ce modèle fut décrit dans son article influent de 1970, « A Relational Model of Data for Large Shared Data Banks » . Bien qu'il n'adhère pas entièrement au modèle relationnel décrit par Codd , SQL est devenu le langage de base de données le plus utilisé

SQL est devenu une norme de l' American National Standards Institute (ANSI) en 1986 et de l' Organisation internationale de normalisation (ISO) en 1987. Depuis, la norme a été révisée à plusieurs reprises afin d'inclure un plus grand nombre de fonctionnalités et d'intégrer des extensions courantes. Malgré l'existence de normes, pratiquement aucune implémentation existante ne les respecte pleinement, et la plupart du code SQL nécessite au moins quelques modifications avant d'être porté sur d'autres systèmes de bases de données .

IBM par Donald D. Chamberlin et Raymond F. Boyce après avoir découvert le modèle relationnel auprès d' Edgar F. Codd au début des années 1970. Cette version, initialement appelée SEQUEL (Structured English Query Language), a été conçue pour manipuler et récupérer des données stockées dans le système de gestion de base de données quasi-relationnel original d'IBM, System R , qu'un groupe du laboratoire de recherche IBM de San Jose avait développé au cours des années 1970.

La première tentative de Chamberlin et Boyce pour créer un langage de base de données relationnelle fut SQUARE (Specifying Queries in A Relational Environment), mais son utilisation s'avérait complexe en raison de la notation indice/exposant. Après leur arrivée au Laboratoire de recherche de San José en 1973, ils entreprirent le développement d'une suite à SQUARE. Le nom original, SEQUEL, souvent considéré comme un jeu de mots avec QUEL , le langage de requêtes d' Ingres , fut par la suite simplifié en SQL (sans les voyelles) car « SEQUEL » était une marque déposée de la société britannique Hawker Siddeley Dynamics Engineering Limited. L'acronyme SQL est ensuite devenu celui de Structured Query Language (langage de requête structuré).

Après avoir testé SQL sur des sites clients afin de déterminer l'utilité et la praticité du système, IBM a commencé à développer des produits commerciaux basés sur son prototype System R, notamment System/38 , SQL/DS et IBM Db2 , commercialisés respectivement en 1979, 1981 et 1983. Le soutien d'IBM a incité l'industrie à adopter SQL, abandonnant des alternatives comme QUEL.

À la fin des années 1970, Relational Software, Inc. (aujourd'hui Oracle Corporation ) a perçu le potentiel des concepts décrits par Codd, Chamberlin et Boyce et a développé son propre SGBDR basé sur SQL , avec l'ambition de le vendre à l' US Navy , à la CIA et à d'autres agences gouvernementales américaines . En juin 1979, Relational Software a lancé l'une des premières implémentations commerciales de SQL, Oracle V2 (Version 2) pour ordinateurs VAX .

En 1986, les groupes de normalisation ANSI et ISO ont officiellement adopté la définition du langage standard « SQL ». De nouvelles versions de la norme ont été publiées en 1989, 1992 , 1996, 1999 , 2003 , 2006 , 2008 , 2011 , 2016 et, plus récemment , 2023.

Interopérabilité et normalisation

la sensibilité à la casse lors des comparaisons varient d'un fournisseur à l'autre. PostgreSQL et Mimer SQL s'efforcent d'être conformes aux normes, bien que PostgreSQL ne les respecte pas systématiquement. Par exemple, la conversion en minuscules des noms non entre guillemets dans PostgreSQL est incompatible avec la norme SQL , qui stipule que ces noms doivent être convertis en majuscules . Ainsi, selon la norme, ` a` Foodevrait être équivalent à `a` FOO, et non à `b` foo.

Les implémentations courantes de SQL omettent souvent la prise en charge de fonctionnalités de base du SQL standard, telles que les types de données ` DATET` ou ` WHERE`. Les exemples les plus flagrants, et par ailleurs les SGBD SQL commerciaux et propriétaires les plus répandus, sont Oracle (dont ` T` se comporte comme ` WHERE` et ne possède pas de type `WHERE`) et MS SQL Server (avant la version 2008). De ce fait, le code SQL est rarement portable d'un système de base de données à un autre sans modifications.TIMEDATEDATETIMETIME

Raisons de l'incompatibilité

Plusieurs raisons expliquent le manque de portabilité entre les systèmes de bases de données :

  • La complexité et la taille de la norme SQL font que la plupart des développeurs ne prennent pas en charge l'intégralité de la norme.
  • La norme SQL ne spécifie pas le comportement de la base de données dans certains domaines importants (par exemple, les index , le stockage de fichiers), laissant aux implémentations le soin de décider comment se comporter.
  • La norme SQL laisse certaines décisions aux implémentations individuelles, comme la façon de nommer une colonne de résultats qui n'a pas été nommée explicitement.
  • La norme SQL spécifie précisément la syntaxe qu'un système de base de données conforme doit implémenter. Cependant, la spécification de la sémantique des constructions du langage par cette norme est moins bien définie, ce qui engendre des ambiguïtés.
  • De nombreux fournisseurs de bases de données disposent d'une large clientèle existante ; lorsque la nouvelle version de la norme SQL entre en conflit avec le comportement antérieur de la base de données du fournisseur, ce dernier peut être réticent à rompre la rétrocompatibilité .
  • Les fournisseurs ont peu d’incitations commerciales à faciliter le changement de fournisseur de bases de données (voir dépendance vis-à-vis du fournisseur ).
  • Les utilisateurs qui évaluent les logiciels de bases de données ont tendance à accorder plus de priorité à d'autres facteurs, tels que les performances, qu'à la conformité aux normes.

Historique de la normalisation

SQL a été adopté comme norme par l'ANSI en 1986 sous le nom de SQL-86 et par l'ISO en 1987. Il est maintenu par l'ISO/IEC JTC 1, Technologies de l'information, Sous-comité SC 32, Gestion et échange de données .

Jusqu’en 1996, le programme de normes de gestion des données du National Institute of Standards and Technology (NIST) certifiait la conformité des SGBD SQL à la norme SQL. Désormais, les fournisseurs auto-certifient la conformité de leurs produits.

: / abrégée Chronologie du langage SQLAnnéeNorme officielleNom informelCommentaires1986 1987ANSI X3.135:1986 ISO/CEI 9075 :1987 FIPS PUB 127FIPS PUB 1271989ANSI X3.135-1989 ISO/IEC 9075:1989 FIPS PUB 127-1SQL-92 SQL2Révision majeure (ISO 9075), SQL-92 de niveau d'entrée , adoptée comme FIPS PUB 127-21999ISO/CEI 9075:1999SQL:1999 SQL3Ajout de la correspondance d'expressions régulières, des requêtes récursives (par exemple, fermeture transitive ), des déclencheurs , de la prise en charge des instructions procédurales et de contrôle de flux, des types non scalaires (tableaux) et de certaines fonctionnalités orientées objet (par exemple, types structurés ), de la prise en charge de l'intégration de SQL dans Java ( SQL/OLB ) et vice versa ( SQL/JRT ).2003ISO/CEI 9075:2003SQL:2003Introduction de fonctionnalités liées à XML ( SQL/XML ), de fonctions de fenêtrage , de séquences standardisées et de colonnes à valeurs auto-générées (y compris les colonnes d'identité).2006XQuery , le langage de requêtes XML publié par le World Wide Web Consortium ( W3C ), afin d'accéder simultanément à des données SQL et à des documents XML. 2008ISO/IEC 9075:2008SQL:2008Légalise l'utilisation de ORDER BY en dehors des définitions de curseur. Ajoute les déclencheurs INSTEAD OF, l'instruction TRUNCATE et la clause FETCH 2011ISO/IEC 9075:2011SQL:2011Ajoute des données temporelles (PERIOD FOR) (plus d'informations dans Base de données temporelle#Historique ). Améliorations des fonctions de fenêtre et de la clause FETCH. 2016ISO/IEC 9075:2016SQL:2016Ajoute la correspondance de modèles de lignes, les fonctions de table polymorphes et les opérations sur les données JSON stockées dans des champs de chaînes de caractères.2019ISO/IEC 9075-15:2019Ajoute la partie 15, tableaux multidimensionnels (type MDarray et opérateurs)2023ISO/IEC 9075:2023SQL:2023Ajoute le type de données JSON (SQL/Foundation) ; ajoute la partie 16, Requêtes de graphe de propriétés (SQL/PGQ)

La norme est généralement désignée par le modèle suivant : ISO/IEC 9075-n:yyyy Partie n: titre , ou, en abrégé, ISO/IEC 9075. Les parties intéressées peuvent se procurer les documents normatifs auprès de l’ISO, de la CEI ou de l’ANSI. Certaines versions préliminaires anciennes sont disponibles gratuitement.

La norme ISO/IEC 9075 est complétée par la norme ISO/IEC 13249 : SQL Multimedia et packages d’applications et par certains rapports techniques .

Syntaxe

Un graphique illustrant plusieurs éléments du langage SQL qui composent une seule instruction

Le langage SQL est subdivisé en plusieurs éléments, notamment :

  • Les clauses sont des éléments constitutifs des instructions et des requêtes. (Dans certains cas, elles sont facultatives.)
  • Les expressions peuvent produire soit des valeurs scalaires , soit des tableaux composés de colonnes et de lignes de données.
  • Les prédicats , qui spécifient des conditions pouvant être évaluées en logique à trois valeurs SQL (3VL) (vrai/faux/inconnu) ou en valeurs de vérité booléennes , sont utilisés pour limiter les effets des instructions et des requêtes, ou pour modifier le flux du programme.
  • Les requêtes permettent de récupérer des données en fonction de critères spécifiques. Il s'agit d'un élément important du SQL .
  • Les instructions peuvent avoir un effet persistant sur les schémas et les données, ou peuvent contrôler les transactions , le flux du programme, les connexions, les sessions ou les diagnostics.
    • Les instructions SQL incluent également le point-virgule (« ; ») comme terminateur. Bien que non obligatoire sur toutes les plateformes, il fait partie intégrante de la syntaxe SQL.
  • Les espaces blancs insignifiants sont généralement ignorés dans les instructions et les requêtes SQL, ce qui facilite la mise en forme du code SQL pour une meilleure lisibilité.

Extensions procédurales

SQL est conçu dans un but précis : interroger les données contenues dans une base de données relationnelle . SQL est un langage de programmation déclaratif , orienté ensembliste , et non un langage impératif comme C ou BASIC . Cependant, des extensions à SQL standard ajoutent des fonctionnalités de programmation procédurale , telles que les structures de contrôle de flux.

Outre les extensions SQL/PSM standard et les extensions SQL propriétaires, la programmabilité procédurale et orientée objet est disponible sur de nombreuses plateformes SQL grâce à l'intégration de SGBD avec d'autres langages. La norme SQL définit les extensions SQL/JRT (SQL Routines and Types for the Java Programming Language) pour la prise en charge du code Java dans les bases de données SQL. Microsoft SQL Server 2005 utilise SQLCLR (SQL Server Common Language Runtime) pour héberger des assemblys .NET managés dans la base de données , tandis que les versions précédentes de SQL Server étaient limitées aux procédures stockées étendues non managées, principalement écrites en C. PostgreSQL permet aux utilisateurs d'écrire des fonctions dans une grande variété de langages, notamment Perl , Python , Tcl , JavaScript (PL/V8) et C.

Alternatives

Il convient de distinguer les alternatives au langage SQL et les alternatives au modèle relationnel lui-même. Vous trouverez ci-dessous des alternatives relationnelles proposées au langage SQL. Pour des alternatives au modèle relationnel, veuillez consulter les sections Bases de données navigationnelles et NoSQL .

.QL : Datalog orienté objet
  • Langage de requête 4D (4D QL)
  • Datalog : les critiques suggèrent que Datalog présente deux avantages par rapport à SQL : sa sémantique est plus claire, ce qui facilite la compréhension et la maintenance des programmes, et il est plus expressif, notamment pour les requêtes récursives.
  • HTSQL : méthode de requête basée sur une URL
  • IBM Business System 12 (IBM BS12) : l'un des premiers systèmes de gestion de bases de données entièrement relationnelles, introduit en 1982.
  • ISBL
  • jOOQ : SQL implémenté en Java comme langage interne spécifique au domaine
  • JPQL ( Java Persistence Query Language ) : langage de requête utilisé par l’API de persistance Java et la bibliothèque de persistance Hibernate.
  • JavaScript : MongoDB implémente son langage de requête dans une API JavaScript.
  • LINQ : Exécute des instructions SQL écrites comme des constructions de langage pour interroger directement des collections depuis du code .NET
  • Langage de requête objet
  • QBE ( Query By Example ) a été créé par Moshè Zloof, IBM, en 1977.
  • QUEL, introduit en 1974 par le projet Ingres de l'UC Berkeley, est plus proche du calcul relationnel par tuples que SQL.
  • XQuery
  • Traitement SQL distribué

    L'architecture de base de données relationnelle distribuée (DRDA) a été conçue par un groupe de travail au sein d'IBM entre 1988 et 1994. La DRDA permet aux bases de données relationnelles connectées au réseau de coopérer pour répondre aux requêtes SQL.

    Un utilisateur ou un programme interactif peut envoyer des requêtes SQL à une base de données relationnelle locale et recevoir en réponse des tables de données ainsi que des indicateurs d'état provenant de bases de données relationnelles distantes. Les requêtes SQL peuvent également être compilées et stockées dans des bases de données relationnelles distantes sous forme de packages, puis appelées par leur nom. Ceci est essentiel au bon fonctionnement des applications effectuant des requêtes complexes et fréquentes, notamment lorsque les tables à consulter se trouvent sur des systèmes distants.

    Les messages, les protocoles et les composants structurels de DRDA sont définis par l' architecture de gestion de données distribuées . Le traitement SQL distribué selon DRDA se distingue des bases de données SQL distribuées contemporaines .

    Critiques

    Conception

    SQL s'écarte à plusieurs égards de son fondement théorique, le modèle relationnel et son calcul de tuples. Dans ce modèle, une table est un ensemble de tuples, tandis qu'en SQL, les tables et les résultats de requêtes sont des listes de lignes ; une même ligne peut apparaître plusieurs fois, et l'ordre des lignes peut être utilisé dans les requêtes (par exemple, dans la LIMITclause WHERE). Les critiques soutiennent que SQL devrait être remplacé par un langage qui renoue strictement avec le fondement originel : voir par exemple « The Third Manifesto » de Hugh Darwen et CJ Date (2006, ISBN).0-321-39942-0).

    Orthogonalité et complétude

    Les premières spécifications ne prenaient pas en charge les fonctionnalités majeures, telles que les clés primaires. Les ensembles de résultats ne pouvaient pas être nommés et les sous-requêtes n'avaient pas été définies. Celles-ci ont été ajoutées en 1992.

    L’absence de types somme a été décrite comme un obstacle à la pleine utilisation des types définis par l’utilisateur de SQL. La prise en charge de JSON, par exemple, a dû être ajoutée par une nouvelle norme en 2016.

    Nul

    Le concept de valeur nulle fait l'objet de débats . Le marqueur de valeur nulle indique l'absence de valeur et se distingue de la valeur 0 pour une colonne d'entiers ou d'une chaîne vide pour une colonne de texte. Le concept de valeur nulle impose la logique à trois valeurs en SQL , qui est une implémentation concrète de la logique générale à trois valeurs .

    Doublons

    Une autre critique fréquente concerne la présence de lignes dupliquées, ce qui complique l'intégration avec des langages comme Python , dont les types de données peuvent rendre difficile une représentation précise des données , notamment en termes d'analyse syntaxique et d'absence de modularité. On contourne généralement ce problème en déclarant une clé primaire, ou contrainte d'unicité, avec une ou plusieurs colonnes identifiant de manière unique chaque ligne de la table.

    Inadéquation d'impédance

    Dans un sens similaire à l'inadéquation d'impédance objet-relationnel , une inadéquation se produit entre le langage SQL déclaratif et les langages procéduraux dans lesquels SQL est généralement intégré.

    types de données SQL

    La norme SQL définit trois types de données (chapitre 4.1.1 de SQL/Foundation) :

    • types de données prédéfinis
    • types construits
    • types définis par l'utilisateur.

    Les types construits sont de type `int` ARRAY, MULTISET`int`, REF`int` (référence) ou ` int` ROW. Les types définis par l'utilisateur sont comparables aux classes des langages orientés objet, avec leurs propres constructeurs, observateurs, mutateurs, méthodes, héritage, surcharge, redéfinition, interfaces, etc. Les types de données prédéfinis sont pris en charge nativement par l'implémentation.

    types de données prédéfinis

    • Types de caractères
      • Personnage ( CHAR)
      • Caractère variable ( VARCHAR)
      • Objet de grande taille ( CLOB)
    • Types de caractères nationaux
      • caractère national ( NCHAR)
      • Caractère national variable ( NCHAR VARYING)
      • Objet de grande taille à caractère national ( NCLOB)
    • Types binaires
      • Binaire ( BINARY)
      • Variable binaire ( VARBINARY)
      • Objet binaire de grande taille ( BLOB)
    • Types numériques
      • Types numériques exacts ( NUMERIC, DECIMAL, SMALLINT, INTEGER, BIGINT)
      • Types numériques approximatifs ( FLOAT, REAL, DOUBLE PRECISION)
      • Type décimal à virgule flottante ( DECFLOAT)
    • Types de date et d'heure ( DATE, TIME, TIMESTAMP)
    • Type d'intervalle ( INTERVAL)
    • booléen
    • XML (voir SQL/XML )
    • JSON