Implémentation de SQL chez les principaux éditeurs
Transcription
Implémentation de SQL chez les principaux éditeurs
1 Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition Implémentation de SQL chez les principaux éditeurs Versions prises en compte Les comparaisons ci-dessous sont effectuées entre différents SGBD disponibles sur le marché. Les trois SGBD commerciaux principaux sont listés, ainsi que trois SGBD en licence libre, disponibles gratuitement. Deux de ceux-ci font l'objet de développements communautaires. Les versions retenues pour cette comparaison sont : • Oracle Database 11g release 1. • Oracle Express, version gratuite (www.oracle.com/technology/xe/index.html). • IBM DB2 9.1 Data Server (DB2 UDB for Linux, UNIX, Windows). • DB2 Express, version gratuite (www.ibm.com/software/data/db2/express). • SQL Server 2008. • SQL Server Express, version gratuite (www.microsoft.com/express/sql). • PostgreSQL 8.2.5-1 (www.postgresql.org). • MySQL 5.1.22 Community Edition - Release Candidate Development Release (www.mysql.com). • Firebird 2.1 RC1 (http://firebirdsql.org). Remerciements à Philippe Makowski, viceprésident de la Fondation Firebird, pour la relecture apportée sur la partie Firebird. Tableau des différents types SQL disponibles Type SQL Oracle IBM DB2 SQL Server 2008 PostgreSQL MySQL Firebird CHAR Oui. Limite 2000 Oui. Limite 254 Oui. Limite 8000 (10) Oui. Limite ~1GO Oui Oui VARCHAR Oui. Limite 4000 Oui. Limite 32672 Oui. Limite 8000 (10) Oui. Limite ~1GO Oui Oui NCHAR Oui. Limite 2000 GRAPHIC. Limite 127 Oui. Limite 4000 (10) Non (1) Oui CHAR(x) CHARACTER SET UNICODE_FS S (2) NVARCHAR Oui. Limite 4000 VARGRAPHIC. Limite 16336 Oui. Limite 4000 (10) Non(1) Oui VARCHAR(x) CHARACTER SET UNICODE_FS S (2) CLOB Oui. Limite 8TO Oui. Limite 2GO VARCHAR(max) TEXT LONGTE XT BLOB SUB_TYPE TEXT NCLOB Oui. Limite 8TO DBCLOB. Limite 1GO NVARCHAR(max ) Non (1) LONGTE XT CHARAC TER SET ... BLOB SUB_TYPE TEXT DATE Non (3) Oui Oui Oui Oui Oui © Pearson Education France 2 Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition TIME Non (3) Oui(4) Oui Oui Oui Oui TIMESTAMP Oui Oui DATETIME Oui DATETIM E (5) Oui INTERVAL Oui Non Non Type Spécifique Non Non TIME WITH TIME ZONE Non Non Oui Oui Non Non TIMESTAMP Oui WITH TIME ZONE Non DATETIMEOFFS ET Oui Non Non INTEGER Oui (6) Oui Oui Oui Oui Oui SMALLINT Oui (6) Oui Oui Oui Oui Oui BIGINT NUMBER Oui Oui Oui Oui Bigint FLOAT Oui (6) ou BINARY_FL OAT Oui Oui Oui Oui Oui REAL Oui (6) ou BINARY_D OUBLE Oui Oui Oui Oui DOUBLE DOUBLE PRECISION Oui (6) Oui Oui Oui Oui Oui NUMERIC Oui (6) Oui Oui Oui Oui Oui DECIMAL Oui (6) Oui Oui Oui Oui Oui BIT Non Non BINARY Oui Oui Non BIT VARYING RAW. Limite Non 2000 VARBINARY Oui VARBINA RY Non BOOLEAN Non Non BIT Oui Oui Non BLOB Oui. Limite 8TO Oui. Limite 2GB VARBINARY (max) bytea LONGBL OB Oui DATALINK BFILE Oui Filestream Non Non Non XML Oui Oui Oui Non (7) Non Non ARRAY Collections Non Non Oui Non Oui (8) Type DISTINCT Non Oui Non Non Non Non Type hérité Oui Structured Type Partiel (9) Partiel (10) Non Non REF Oui Oui Non Non Non Non Objet Oui Non Type .NET Non Non Non (1) Pour stocker des chaînes unicode en PostgreSQL, vous devez définir l'encodage de votre base de données en Unicode. (2) Sur Firebird, les types nchar et nvarchar sont des versions spécialisées de char et varchar, prédéfinis avec le jeu de caractères ISO8859_1. Ils ne sont donc pas adaptés à l'unicode. (2) Sur Oracle, Le type DATE correspond à un TIMESTAMP avec précision à la seconde. (3) Le type TIME en DB2 a une précision à la seconde. (4) MySQL limite le date time à une précision de la seconde. (5) Sur Oracle, INTEGER, SMALLINT, NUMERIC, DECIMAL, FLOAT, REALsont des « sous-types » du type NUMBER . (6) Le type XML conforme à SQL:2003 est annoncé pour la version PostgreSQL 8.3. © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 3 (7) Firebird permet d'indiquer un tableau de valeurs du même type, faisant suivre le type du nombre d'éléments. Par exemple : INTEGER[4]. (8) SQL Server permet de créer un type utilisateur qui va simplement indiquer la précision d'un type natif. Des types plus complexes peuvent être écrits en objets .NET. (9) En PostgreSQL, le type Structured Type est un tableau de types divers. Il ne permet pas l'héritage. (10) On peut dépasser cette limite mais dans ce cas le stockage des lignes de la table s'étend à travers différentes pages Types de données complémentaires Voici les types de données complémentaires spécifiques aux principaux éditeurs de SGBDR. Pour Oracle : Type Spécificité LONG [VARCHAR] Équivalent du CLOB, max. 4 Go, obsolète mais présent pour compatibilité. LONG RAW Équivalent du BLOB, max. 2 Go, obsolète mais présent pour compatibilité. NUMBER [(précision, échelle)] Représentation de toutes les variables numériques de type entier, réel et décimal, avec possibilité d'exprimer une précision et une échelle. Précision de 1 à 38. Un numérique en Oracle ne se dimensionne pas selon le nombre de bits, mais la quantité de chiffres. Ainsi, un SMALLINT codé sur 2 octets (16 bits), pouvant contenir un nombre de – 2^16 à 2^16 (65536), sera exprimable dans un NUMBER(5) . RAW Équivalent du BIT VARYING, actuellement remplacé par BLOB, max.2 Go, obsolète mais présent pour compatibilité. TIMESTAMP WITH LOCAL TIME ZONE Encodage date/heure avec décalage relatif à la date/heure du serveur en fonction du fuseau horaire du client par rapport à l'heure UTC. (N)VARCHAR2(n) Équivalent à (N)VARCHAR. BINARY_FLOAT et BINARY_DOUBLE Équivalents à NUMBER, mais stockant une précision en binaire. Plus rapide et plus compact. Pour IBM DB2 : Type Spécificité LONG VARCHAR Limite 32700 octets. Restrictions égales au CLOB à l'utilisation dans les requêtes (par exemple, ne peut être utilisé dans un GROUP BY ou un ORDER BY). (VAR)GRAPHIC Le nom des N(VAR)CHAR en DB2, parce que considérés comme des « graphic strings ». LONG VARGRAPHIC Limite 16 350. Pour SQL Server : Type Spécificité DATETIME2 Timestamp codé sur 8 octets, avec une plage plus large et une précision plus fine que le type DATETIME : de 0001-01-01 à 9999-12-31, précision aux 100 nanosecondes. HIERARCHYID Type complexe (objet) stockant la position dans une hiérarchie. Publie des méthodes et propriétés pour gérer la hiérarchie. MONEY Numérique destiné à représenter une valeur monétaire comprise entre – 263 et 263 – 1 avec quatre chiffres après la virgule (codage sur 4 octets). © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 4 er SMALLDATETIME Combiné date + heure couvrant l'intervalle allant du 1 janvier 1900 au 6 juin 2079, avec une précision à la minute. SMALLMONEY Numérique censé représenter une valeur monétaire comprise entre – 214 748,3648 et + 214 748,3647 (codage sur 4 octets). TINYINT Entier non signé compris dans l'intervalle 0 .. 255 UNIQUIDENTIFIER Identifiant unique informatique (GUID). SQL_VARIANT Type polymorphe. Pour PostgreSQL : Type Spécificité CIDR Adresse réseau IPv4 ou Ipv6, saisie et affichage avec masque réseau. INET Adresse hôte IPv4 ou Ipv6. Masque réseau optionnel. MACADDR Adresse MAC (adresses physique des cartes Ethernet). MONEY Monétaire sur 4 octets, deux chiffres après la virgule. (BIG)SERIAL Entier de 4 ou 8 octets à incrémentation automatique. Pour MySQL : Les types numériques peuvent être indiqués comme non signés, à l'aide du mot clé UNSIGNED. Type Spécificité BLOB Limité à 65535 (2^16 – 1) caractères. ENUM Énumération. Une seule valeur possible à choisir dans la liste définie à la création. MEDIUMBLOB Limité à 16777215 (2^24 – 1) caractères. MEDIUMINT Entier codé sur 3 octets allant de – 8388608 à 8388607. MEDIUMTEXT Limité à 16777215 (2^24 – 1) caractères. SET Ensemble. Plusieurs valeurs possibles à choisir dans la liste définie à la création. TEXT Limité à 65535 (2^16 – 1) caractères. TIMESTAMP Horodatage particulier. TINTYBLOB Limité à 255 (2^8 – 1) caractères. TINYINT Entier codé sur 1 octet allant de – 128 à 127. TINYTEXT Limité à 255 (2^8 – 1) caractères. YEAR Année. Types géométriques ou spatiaux De plus en plus de SGBD proposent des types de données spécifiques pour stocker des informations géométriques, c'est-à-dire des objets spatiaux à deux dimensions ou plus, représentés sur une surface plane (données géométriques) ou sur une sphère (données géodésiques), pour exprimer des coordonnées géospatiales. L'OGC (Open Geospatial Consortium) publie une spécification nommée dans sa première version « OpenGIS® Simple Features Implementation Specification for SQL » ; il existe une norme ISO: « SQL/MM Spatial ». Les éditeurs du comparatif respectent tous au moins la spécification OpenGIS 1.1. © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 5 Oracle Spatial est une extension qui comporte des types spécifiques, des opérateurs, fonctions et procédures, des méthodes d'indexation particulières, etc., pour gérer des données spatiales jusqu'à quatre dimensions. Les figures géométriques ou géodésiques sont stockées dans une colonne de type SDO_GEOMETRY, qui est un objet complexe. DB2 Spatial Extender et DB2 Geodetic Extender sont des additions similaires pour DB2. Les données spatiales peuvent être exprimées à l'aide d'un grand nombre de types de données spécifiques. SQL Server 2008 dispose de deux types de données : GEOMETRY et GEOGRAPHY pour contenir des valeurs géométriques (planaires) ou géodésiques (spatiales). Environ 70 fonctions sont disponibles pour traiter ces coordonnées. PostgreSQL dispose de plusieurs types pour stocker des objets géométriques à deux dimensions : Type Spécificité BOX Boîte rectangulaire CIRCLE Cercle LINE Ligne infinie LSEG Segment de droite PATH Chemin ouvert ou fermé POINT Point géométrique POLYGON Polygone (correspond à un chemin fermé) Une extension pour PostgreSQL, nommée PostGIS, est disponible pour traiter plus complètement les données spatiales. MySQL contient également des extensions pour les données spatiales, sous forme de classes instantiables : Point, LineString, Polygon, GeometryCollection, MultiPoint, MultiLineString, et MultiPolygon, ainsi que les fonctions adaptées et les vues de métadonnées spécifiées par OpenGIS. Jeu de caractères et collation Peu d'éditeurs de SGBDR implémentent les concepts SQL de collation et jeu de caractères de manière aussi raffinée que le demande la norme SQL. Cependant, tous offrent un mécanisme proche plus ou moins paramétrable. Oracle supporte et étend la version 3.2 de la norme Unicode qui utilise le concept de NLS (National Language Support), un support général des paramètres linguistiques qui opèrent sur divers types de données (temporels et monétaires, entre autres). Le NLS permet de piloter la séquence de collation par le tri linguistique (paramètre NLS_SORT) monolingue ou multilingue (utile pour les langues asiatiques comme le japonais). On peut appliquer un NLS particulier au niveau de l'instance, de la base, ou dynamiquement dans une session. Les opérations, dans une base Oracle, sont sensibles à la casse et aux diacritiques. Pour effectuer des comparaisons ou des tris insensibles, vous pouvez changer dynamiquement le NLS_SORT de la session, généralement en choisissant nls_comp='LINGUISTIC' (introduit dans la version 10g). Vous © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 6 pouvez créer des index dits « linguistiques » pour augmenter les performances sur une colonne, dans un NLS particulier. Plusieurs index linguistiques sont possibles par colonne. IBM DB2 permet de créer une séquence de collation (un ordre défini pour chaque caractère) de toutes pièces pour chaque base de données, prenant par défaut celle du système d'exploitation. Certaines séquences de collation sont prédéfinies pour interopérer avec le langage hôte (C/C ++, COBOL, FORTRAN). On indique la collation de la base à la création en utilisant les mots clés COLLATE USING, le défaut étant SYSTEM. D'autre part, on peut préciser le jeu de caractères, ce que DB2 appelle CODESET et dont le tri est fixé par le paramètre TERRITORY. Ce paramétrage est très dépendant de l'OS. Enfin, la fonction TRANSLATE permet de s'affranchir de la casse, au dépend des performances. Exemple avec collation binaire CREATE DATABASE mabase CODESET ISO-8859-15 TERRITORY FR COLLATE USING IDENTITY; Dans MS SQL Server, une collation peut être définie : • au niveau du serveur ; • au niveau de la base ; • au niveau de la colonne. MS SQL Server prend en compte 16 pages de codes différents parmi lesquels : Latin1 (ANSI, cp1252), Multilingue (MS-DOS Latin1, cp850) et Anglais (É-U MS-DOS, 437). Il propose, en outre, le choix de 1100 collations. Certaines sont binaires, d'autres proposent différents paramétrages combinables (sensibilité à la casse, aux caractères diacritiques, à la largeur d'encodage et aux idéogrammes japonais, etc.). Sa syntaxe est très proche de la norme SQL. Une collation peut être appliquée à toute expression figurant dans une requête ou au code Transact SQL, à l'aide du mot clé COLLATE. PostgreSQL contient un support limité des collations, en appliquant une définition de localisation du système d'exploitation à une instance de serveur, via la commande initdb. Il permet ensuite de définir un jeu de caractères, appelé encodage, pour chaque base créée. Exemple CREATE DATABASE mabase WITH ENCODING = 'LATIN1' MySQL supporte de multiples jeux de caractères et de nombreuses collations relatives au jeu de caractères spécifié. Le paramétrage d'une collation et de son jeu de caractères peut se faire : • au niveau du serveur ; • au niveau de la base ; • au niveau de la table ; • au niveau de la colonne ; • au niveau de la connexion (session). En outre MySQL possède une fonction COERCIBILITY qui permet de connaître le niveau de coercibilité d'une collation vis-à-vis d'une autre. Firebird implémente une instruction CREATE COLLATION qui permet de définir une collation à partir d'un jeu de caractère du système d'exploitation, ou d'une collation disponible dans un fichier .conf du SGBD. Une collation doit être enregistrée au niveau de la base de données, avec cette instruction. Vous pouvez indiquer un jeu de caractères par défaut à la création d'une base, © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 7 et, si nécessaire, un jeu de caractères spécifique pour chaque colonne à la création de la table. Par défaut, aucune collation n'est appliquée : la comparaison est binaire. Vous devez indiquer la collation colonne par colonne, à la création de la table. Le mot clé COLLATE est disponible pour appliquer une collation dynamiquement dans les requêtes. En Firebird 2, vous pouvez créer – comme sur PostgreSQL – un « index sur expression » pour créer un index sur une expression appliquant une collation à une colonne, donc pour créer un index avec une collation particulière. Colonnes calculées et expressions par défaut Certains SGBDR permettent de définir des colonnes calculées et d'autres de spécifier une expression par défaut plus complète que l'usage de simples fonctions niladiques. Colonne calculée Une colonne calculée, ou colonne générée selon SQL:2003, est une colonne virtuelle dont la valeur est définie à la volée par une expression de calcul pouvant prendre en compte des fonctions et colonnes de la table. Ce type de colonne (en soi, le stockage dans le modèle du résultat d'un calcul) viole les fondements de la modélisation de données en introduisant une forme de redondance. Les colonnes calculées sont des colonnes virtuelles dont le résultat n'est pas stocké physiquement dans la table, mais évalué à chaque requête d'extraction. Oracle implémente les colonnes calculées, nommées « colonnes virtuelles » (virtual columns) depuis la version 11g. DB2 les nomme des colonnes « générées par expression » (expression generated). Elles sont déclarée dans le CREATE TABLE par une syntaxe conforme à SQL:2003 : NOM_DE_COLONNE GENERATED ALWAYS AS (Expression) Dans SQL Server, le mot clé AS permet de définir une colonne calculée dans un ordre de création de table. Exemple (MS SQL Server) CREATE TABLE T_UTILISATEUR_USR (USR_ID INT NOT NULL PRIMARY KEY, USR_NOM CHAR(32) NOT NULL, USR_PRENOM VARCHAR(16) NOT NULL, USR_LOGIN AS SUBSTRING(USR_NOM, 1, 1) + SUBSTRING(USR_PRENOM, 1, 1), USR_PASSWORD VARCHAR(32)) Ici, la colonne USR_LOGIN est calculée à partir de l'expression formée par les initiales du nom et du prénom de l'utilisateur. La fonction MS SQL Server SUBSTRING extrait une sous-chaîne d'une chaîne de caractères. PostgreSQL ne permet pas la création de colonnes calculées, mais offre la capacité des créer des index sur des expressions, ce qui permet d'optimiser des comparaisons où l'opérande de gauche est une expression, sans que le résultat de cette expression ne se voie dans le schéma de la table, ce qui est un compromis élégant entre l'exigence de normalisation et les besoins de performance. © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 8 Exemple CREATE INDEX I_USR_NOM ON T_UTILISATEUR_USR ((USR_PRENOM || ' ' || USR_NOM)); SELECT * FROM T_UTILISATEUR_USR WHERE (USR_PRENOM || ' ' || USR_NOM) = 'Larry Wall'; Avec Firebird, une colonne calculée est créée à l'aide de l'une des syntaxes suivantes : NOM_DE_COLONNE COMPUTED BY (Expression) NOM_DE_COLONNE [type] GENERATED ALWAYS AS (Expression) Expression par défaut SQL a volontairement restreint la spécification de valeur par défaut à une expression de valeur, à une fonction niladique, c'est-à-dire sans argument, ou au marqueur NULL. Mais de nombreux SGBDR permettent de préciser des valeurs par défaut de colonne ou de domaine à partir d'expressions plus complexes que ce qu'offre SQL en standard. Oracle permet largement l'utilisation de fonctions. Exemple CREATE TABLE T_LOG ( LOG_DATE date default SYSDATE, LOG_USER varchar2(30) default USER LOG_HOST varchar2(256) default SYS_CONTEXT('USERENV','HOST') ); INSERT INTO T_LOG (LOG_DATE) VALUES (DEFAULT); En DB2, vous ne pouvez utiliser qu'une constante, une valeur de registre spécial comme CURRENT_DATE ou USER, et une fonction de transtypage. Vous ne pouvez indiquer de valeur par défaut pour des colonnes de type DATALINK, XML ou Structured Type. Vous pouvez aussi utiliser le mot clé DEFAULT sans spécifier de valeur : DB2 choisit selon le type de la colonne (par exemple, 0 pour un numérique, la date courante pour un timestamp, etc.). SQL Server permet aussi l'utilisation de fonctions. Exemple CREATE TABLE T_UTILISATEUR_USR (USR_ID INT NOT NULL PRIMARY KEY, USR_NOM CHAR(32) NOT NULL, USR_PASSWORD VARCHAR(32), USR_EXPIRE_PASS DATETIME DEFAULT (DATEADD(DAY, 90, CURRENT_TIMESTAMP))) Dans cet exemple, la valeur par défaut de la date d'expiration du mot de passe est calculée comme étant la date/heure courante plus quatre-vingt-dix jours. La fonction MS SQL Server DATEADD ajoute une quantité numérique de constante de temps (heure, minute, jour, etc.) à une date. Ce type d'expression génère une forme de redondance mais ce n'est pas toujours le cas. Dans l'exemple précédent, on aurait pu stocker la date/heure courante et calculer à la volée la date d'expiration lors de chaque restitution. Cependant la combinaison de fonctions non déterministes ne viole pas en soi le principe de redondance. Tel est le cas de l'exemple suivant : © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 9 Exemple (MS SQL Server) CREATE TABLE T_UTILISATEUR_USR (USR_ID INT NOT NULL PRIMARY KEY, USR_NOM CHAR(32) NOT NULL, USR_PASSWORD VARCHAR(32), USR_EXPIRE_PASS DATETIME DEFAULT (DATEADD(DAY, RAND()*90, CURRENT_TIMESTAMP))) Dans laquelle la date d'expiration du mot de passe est calculée comme la date/heure courante plus un nombre de jours aléatoires compris entre 0 et 90 jours. La fonction RAND () de MS SQL Server renvoie une valeur aléatoire comprise entre 0 et 1. Ce type d'expression peut être intéressant pour éviter l'écriture d'un déclencheur. On peut aller plus loin en utilisant une fonction utilisateur (UDF) sur les SGBD qui le supportent, comme MS SQL Server. On peut aussi utiliser une fonction (et une UDF) en PostgreSQL. Par exemple, la fonction nextval() retourne la prochaine valeur d'une séquence en l'incrémentant, permettant ainsi de nourrir une colonne autoincrémentielle. DEFAULT nextval('sequence') peut être remplacé par un alias : SERIAL. Les deux syntaxes suivantes (dans un CREATE TABLE) sont donc fonctionnellement identiques : USR_ID integer DEFAULT nextval('T_UTILISATEUR_USR_USR_ID_SEQ') USR_ID integer SERIAL Remarque : comme PostgreSQL supporte la commande CREATE DOMAIN, vous pouvez définir votre valeur par défaut dans la déclaration du domaine. En MySQL, vous ne pouvez définir qu'une constante, ou la fonction CURRENT_TIMESTAMP sur une colonne de type TIMESTAMP. MySQL permet, comme DB2, d'utiliser le mot clé DEFAULT sans spécifier de valeur. Vous ne pouvez définir de valeur par défaut sur un BLOB ou un TEXT (CLOB). Firebird ne permet que l'utilisation de valeurs constantes et de fonctions système, respectant la norme SQL. Expressions de valeurs constantes Sur Oracle, une valeur binaire est écrite en hexadécimal délimité par des guillemets simples, sans préfixe. Les suffixes F et D ajoutés à un nombre forcent celui-ci en BINARY_FLOAT ou BINARY_DOUBLE, respectivement. Les date/heure sont exprimées en format ISO 8601 : AAAA-MM-JJ HH:MM:SS… (avec un espace, et non un T comme séparateur entre date et heure)!, ou dans un format local déterminé par le paramètre NLS_DATE_FORMAT. À noter l'expression des intervalles : Oracle supporte deux notations, YEAR TO MONTH et DAY TO MINUTE. Exemple INTERVAL '50' MONTH INTERVAL '4-2' YEAR TO MONTH Qui sont équivalentes et signifient un intervalle de cinquante mois, c'est-à-dire quatre années et deux mois. © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 10 SQL Server exprime ses chaînes binaires sans délimiteur mais avec le suffixe 0x (zéro et lettre x minuscule) pour spécifier une expression hexadécimale de chaîne binaire. Exemple : 0xFF3A. SQL Server ne prend en compteni le préfixe X (hexadécimal), ni le préfixe B (binaire). SQL Server utilise le format de date ISO à encodage court AAAAMMJJ pour un typage explicite de date. Exemple : CAST('20041224 23:59:59.999' AS DATETIME). Sinon, pour un format particulier transtypé depuis un littéral, il faut utiliser l'option de session DATEFORMAT. La valeur binaire hexadécimale, en DB2, est délimitée par des guillemets simples et préfixée par la lettre X. Les chaînes de longueur variable (graphic strings) ont une notation particulière : elles sont préfixées par une lettre G, ou N. Exemple : G'chaîne variable'. Préfixe GX, pour une chaîne hexadécimale dans une base unicode, UX pour une chaîne hexadécimale dans une base unicode UCS-2. DB2 supporte plusieurs formats de date : ISO, IBM US, IBM Europe, ODBC (en entrée). Exemple de date/heure valide : 1991-03-02-08.30.00.000000. La plage de dates en DB2 va du 1 janvier 0000 au 31 décembre 9999, la date 0000-01-01 est donc parfaitement valide et constitue la valeur par défaut d'un timestamp avec un DEFAULT sans valeur spécifiée. PostgreSQL supporte les deux options décrites par la norme SQL pour l'expression des chaînes binaires : X'F0' B'11110000' Les dates peuvent être saisies dans différents formats, dont les différentes variantes de l'ISO 8601, y compris pour les variantes avec fuseau horaire. Les timestamps spéciaux infinity et – infinity sont présents pour exprimer une date supérieure ou inférieure à toutes les autres. La plage de dates disponibles va de l'an 4713 avant J.-C. à 1465001 après J.-C., ce qui rend PostgreSQL utile pour les futurologues, d'autant plus que le type interval peut exprimer une différence de 178 000 000 années. L'intervalle s'exprime soit en chiffres pour les jours/heures/minutes/secondes, soit dans un format très lisible : '1 day 12 hours 59 min 10 sec'. Vous pouvez utiliser tout type de délimiteur pour une chaîne de caractères à l'aide d'un double signe dollar : vous inscrivez le délimiteur entre dollars, écrivez la chaîne, et terminez par le même délimiteur entre dollars. Exemple : $delimiteur$ma chaîne$delimiteur$. MySQL supporte deux notations pour les valeurs hexadécimales : délimitées par des guillemets simples et préfixées par la lettre x (norme SQL), ou préfixées par 0x sans délimiteur (syntaxe ODBC). Leur type est évalué en entier ou chaîne selon le contexte. Une notation particulière existe pour le type bit : b'valeur' ou 0bvaleur. MySQL supporte l'utilisation des guillemets doubles pour délimiter une chaîne. Vous pouvez aussi préfixer une chaîne par un jeu de caractères. Exemple : _latin1'je suis français'. Le format de date est ISO : 'AAAA-MM-JJ HH:MM:SS', dans une plage de '1000-01-01' à '9999-12-31'. Domaine Oracle ne gère pas les domaines. Vous devez implémenter les différents éléments du domaine directement dans la déclaration de la colonne. Vous pouvez créer une contrainte de validité (CHECK) complexe en utilisant la fonction REGEXP_LIKE avec une expression rationnelle. IBM DB2 ne permet pas non plus la création de domaines mais autorise la création de types distincts respectant SQL:1999, donc sans association de contrainte. Un type distinct doit être © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 11 créé avec l'option WITH COMPARISONS pour permettre la comparaison entre instances du même type. MS SQL Server n'intègre pas le CREATE DOMAIN mais utilise un mécanisme proche en plusieurs phases : • • • • • création d'un type utilisateur ; création optionnelle d'une règle de validation (RULE) ; création optionnelle d'une valeur par défaut (DEFAULT) ; liaison d'une règle de validation à un type utilisateur ; liaison de la valeur par défaut au type utilisateur. Exemple Création d'un type utilisateur D_POURCENT basé sur le type SQL FLOAT, obligatoire dont la valeur doit être comprise entre 0 et 100. create type D_POURCENT FROM float; create rule R_D_POURCENT as @value between 0 and 100; create default D_D_POURCENT as 0; exec sp_bindrule R_D_POURCENT, D_POURCENT; exec sp_bindefault D_D_POURCENT, D_POURCENT; Remarque : les règles et valeurs par défaut génériques (CREATE RULE et CREATE DEFAULT) sont considérées comme obsolètes par Microsoft, qui recommande l'utilisation directe de contraintes de colonnes. MySQL n'implémente pas le domaine. PostgreSQL accepte la création des domaines SQL avec un ordre CREATE DOMAIN, mais n'implémente pas la contrainte de validation CHECK. Les seules options possibles sont la valeur par défaut et l'option NULL / NOT NULL. Exemple : CREATE DOMAIN D_POURCENT AS FLOAT DEFAULT 0.0 CONSTRAINT CK_NON_NULL NOT NULL Firebird implémente l'instruction CREATE DOMAIN et sa partie CHECK, avec des opérateurs particuliers comme VALUE [NOT] CONTAINING ou VALUE [NOT] STARTING. Relationnel objet Beaucoup d'éditeurs se sont accordés pour ajouter à la norme des types particuliers leur permettant une plus grande souplesse. Il en est ainsi du type SQL_VARIANT de MS SQL Server qui n'est autre qu'un type polymorphe pouvant être converti à la volée en type SQL de base. Ce type s'appelle ANY dans PostgreSQL. Oracle permet la création d'objets et de méthodes directement par instruction DDL, alors que les objets SQL Server sont des classes .NET, développées dans un langage objet .NET (C# ou visual basic.NET par exemple) et importés dans le SGBD. © Pearson Education France 12 Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition DB2 permet simplement la création de types distincts. PostgreSQL permet l'héritage de structures de tables : une table fille, créée avec le mot clé INHERITS, hérite des colonnes de sa table mère. Cet héritage n'est pas supporté par les contraintes UNIQUE et l'intégrité référentielle. MySQL et Firebird ne proposent pas de fonctionnalités relationnel-objet. Longueur maximale des noms des objets Objet Oracle IBM DB2 MS SQL Server PostgreSQL MySQL Firebird Base Table, vue 8 30 8 128 128 128 63 63 64 (1) 64 (1) 31 31 Colonne 30 30 128 63 64 31 Contrainte Index 30 30 18 128 128 128 63 63 64 64 31 31 (1) Peut être moins long en fonction de l'OS. Connexion et authentification La plupart du temps, les fournisseurs de SGBDR pourvoient leur moteur avec un utilisateur, son mot de passe et un certain nombre de bases de données précréées. La notion de mot de passe n'existe pas dans la norme SQL. Voici quelques-uns des différents noms et mots de passe que les éditeurs de SGBDR prévoient par défaut pour accéder au serveur : SGBDR Utilisateur Mot de passe Oracle Sys change_on_install Oracle System manager IBM DB2 MS SQL Server db2admin sa (1) <aucun> <aucun> MySQL PostgreSQL mysqladm <aucun> (2) <aucun> <aucun> (2) Firebird SYSDBA (1) masterkey (1) Ou compte système de l'OS. (2) Compte système de l'OS. En fait, tout ces « comptes » sont des connexions au serveur et ils correspondent souvent à la fois à la notion de connexion et d'utilisateur. Mais La norme SQL fait une différence entre le concept de connexion et celui d'utilisateur. © Pearson Education France Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition 13 Schéma et bases de données Le concept de schéma est très différemment implémenté. Pour MS SQL Server, par exemple, la notion de CATALOG se confond avec celle de base de données, tandis que la notion de schéma est devenue proche de la norme depuis la version 2005. Notons que les six SGBD de ce comparatif proposent un ordre CREATE SCHEMA proche de la syntaxe SQL. Comme le schéma est une notion très théorique alors que l'implémentation d'une base de données repose sur des objets physiques (fichiers, index, disques par exemple), la plupart des éditeurs ont ajouté un ordre pseudo SQL, CREATE DATABASE, qui permet de créer les éléments physiques d'une base de données et valuer certains paramètres propres au fonctionnement du SGBDR. Voici quelques exemples de syntaxe de l'ordre CREATE DATABASE pour différents SGBDR : Oracle : CREATE DATABASE database_name [ <option> [, <option> ... ] ] <option> ::= DATAFILE filespec AUTOEXTEND OFF DATAFILE filespec AUTOEXTEND ON [NEXT int K | M] [MAXSIZE int K | M] LOGFILE [GROUP int] filespec MAXDATAFILES int MAXLOGFILES int MAXLOGMEMBERS int MAXLOGHISTORY int MAXINSTANCES int CONTROLFILE REUSE CHARACTER SET charset MS SQL Server : CREATE DATABASE nom_schéma [ ON [ <spécification_fichier> [ , <spécification_fichier> ... ] ] [ , <spécification_groupe_fichier> [ , <spécification_groupe_fichier> ... ] ] ] [ LOG ON { <spécification_fichier> [ , <spécification_fichier> ... ] } ] [ COLLATE collation ] [ FOR LOAD | FOR ATTACH ] PostgreSQL : CREATE DATABASE name [ [ WITH ] [ OWNER [=] dbowner [ LOCATION [=] ' dbpath' [ TEMPLATE [=] template [ ENCODING [=] encoding ] ] ] ] ] Points communs à toutes ces syntaxes : la spécification de localisation des espaces de stockage des données comme les fichiers, groupe de fichiers et la spécification du jeu de caractères ou de la collation. Pour tous ces éditeurs il convient, avant de créer un schéma, de s'occuper de créer la base de données. © Pearson Education France 14 Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition Firebird : Sur Firebird, l'instruction CREATE SCHEMA est un synonyme de CREATE DATABASE. Création des objets Des différences importantes subsistent pour la création des tables temporaires chez les divers éditeurs. Voici la position des éditeurs sur le sujet: Oracle IBM DB2 MS SQL Server CREATE TABLE #nom (1) Locale Non Non Globale CREATE GLOBAL TEMPORARY TABLE nom CREATE CREATE GLOBAL TABLE TEMPORARY ##nom TABLE nom PostgreSQL MySQL Firebird CREATE [LOCAL] TEMPORARY TABLE nom Non CREATE TEMPORA RY TABLE Non(2) Non CREATE GLOBAL TEMPORARY TABLE nom ... [ON COMMIT <DELETE | PRESERVE> ROWS] (3) (1) Dans ce cas, le nom de la table est limité à 116 caractères au lieu de 128, pour permettre à SQL Server de placer un unifiant à la fin du nom. (2) Firebird permet de retourner une table à partir d'une procédure stockée. Ce mécanisme est appelé « selectable stored procedure ». (3) La table est créée globalement, mais la durée de vie des lignes insérées est déterminée par le choix de la partie ON COMMIT. DELETE : les lignes sont supprimées à la fin de la transaction; PRESERVE : les lignes sont supprimées à la fin de la connexion. Contraintes Quelques SGBDR ne respectent pas la norme en matière de contrainte d'unicité, en refusant la multiplicité d'absences de valeur (plusieurs valeurs NULL) avec une contrainte d'unicité (ce qui équivaut à considérer l'absence de valeur... comme une valeur). Sont dans ce cas DB2 et MS SQL Server. DB2 n'accepte pas les colonnes nullables sur une contrainte UNIQUE. Un index unique pourrait être utilisé, mais il n'accepte pas les valeurs NULL multiples. Sur MS SQL Server 2008, un index unique « filtré » pourrait être utilisé à la place de la contrainte. L'index filtré s'applique seulement à un sous-ensemble de lignes, donc un critère comme « WHERE col IS NOT NULL » permet d'atteindre le comportement voulu. Oracle, PostgreSQL, MySQL, Firebird acceptent plusieurs valeurs NULL avec une contrainte UNIQUE. Firebird est le seul SGBDR du comparatif à implémenter la syntaxe de la contrainte de validité en accord avec la norme SQL, tous les autres n'utilisent pas le mot clé VALUE. Il faut donc y inscrire directement l'expression de validation. Exemple (MS SQL Server) CREATE TABLE T_UTILISATEUR_USR (USR_NOM CHAR(32) NOT NULL © Pearson Education France 15 Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition CONSTRAINT CK_USR_NOM CHECK (USR_NOM BETWEEN 'A' AND 'ZZZ'), ... MySQL accepte le mot clé CHECK dans la syntaxe de création de table, mais jusqu'à présent, la contrainte n'est pas implémentée : sa déclaration n'a aucun effet. Pour simuler une contrainte CHECK, vous pouvez créer une vue avec l'option : WITH CASCADED CHECK OPTION. Position des éditeurs sur le mode de validation de la contrainte d'intégrité référentielle : Oracle MATCH SIMPLE MATCH PARTIAL MATCH FULL IBM DB2 MS SQL PostgreSQL MySQL Server Oui par défaut Oui par défaut Oui par défaut Oui par défaut Oui par défaut Firebird Non Non Non Non Non Non Non Non Non Oui Non Non Oui par défaut On constate que la plupart des éditeurs ont adopté la même politique en ne gérant que le niveau par défaut. Position des éditeurs sur le mode de gestion de l'intégrité : Oracle IBM DB2 NO ACTION / RESTRICT CASCADE DELETE UPDATE DELETE DELETE UPDATE DELETE SET NULL DELETE DELETE SET DEFAULT Non Non MS SQL Server DELETE UPDATE (1) DELETE UPDATE DELETE UPDATE DELETE UPDATE PostgreSQL MySQL Firebird DELETE UPDATE DELETE UPDATE DELETE UPDATE DELETE UPDATE DELETE UPDATE DELETE UPDATE DELETE UPDATE DELETE UPDATE DELETE UPDATE (1) DELETE UPDATE DELETE UPDATE DELETE UPDATE (1) uniquement NO ACTION Aucun éditeur à ce jour ne supporte le concept d'assertion pouvant être implémenté par la programmation de déclencheurs. Position des éditeurs sur la déférabilité des contraintes : Déférabilité de la contrainte Paramétrage de la déférabilité Oracle IBM DB2 PostgreSQL MySQL Firebird Non MS SQL Server Non Oui Oui Non Non Oui Non Non Oui, sauf CHECK et UNIQUE Non Non Position des éditeurs sur les vues : Création de vue Mise à jour de vue CHECK OPTION CASCADE Oracle IBM DB2 PostgreSQL MySQL Firebird Oui MS SQL Server Oui Oui Oui Oui Oui Oui Oui Oui Non(1) Oui Oui Oui (à défaut) Oui Oui (à défaut) Non Oui Oui (à défaut) © Pearson Education France 16 Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition CHECK OPTION LOCAL Non Oui Non Non Oui Non (1) La mise à jour sur les vues est possible en PostgreSQL via les « règles » (rules), des genres de déclencheurs. ALTER et DROP La plupart des éditeurs proposent le pseudo ordre SQL DROP DATABASE, et la modification d'une base de données à l'aide de l'ordre pseudo SQL ALTER DATABASE qui est spécifique à chaque SGBDR. Le comportement des objets qui incluent des références à une base supprimée différent selon les éditeurs. Ainsi la suppression d'une base de données dans MS SQL Server alors qu'une autre base inclut une vue utilisant un objet de la base ne lève pas d'exception (sauf si la vue est créée avec le mot clé WITH SCHEMABINDING). En revanche, lors de l'utilisation de la vue, une erreur sera rapportée. Exemple de commande ALTER DATABASE propre à MS SQL Server ALTER DATABASE B_FORUM SET SINGLE_USER, READ_ONLY Position des éditeurs sur la modification des tables : ADD COLUMN DROP COLUMN ALTER COLUMN SET DEFAULT ALTER COLUMN DROP DEFAULT ADD CONSTRAINT DROP CONSTRAINT Oracle IBM DB2 Oui Oui Oui MS SQL Server Oui (1) PostgreSQL MySQL Firebird Oui Oui Oui Oui (1) Oui Oui Oui Non Non Non Oui Oui Oui Non Non Non Oui Oui Oui Oui Oui Oui Oui Oui (1) Oui Oui Oui Oui Oui Oui (1) Oui (1) Ne pas spécifier le mot clé COLUMN. Certains SGBDR sont plus permissifs et autorisent des modifications plus étendues avec désactivation temporaire des contraintes et déclencheurs (Oracle, MS SQL Server, PostgreSQL, Firebird). Quelques SGBDR offrent des possibilités de renommage des objets. MS SQL Server comporte une procédure stockée : sp_rename. Oracle, PostgreSQL, MySQL et Firebird permettent le renommage d'une colonne via un ALTER TABLE : Renommer une colonne en Oracle ou PostgreSQL © Pearson Education France 17 Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition ALTER TABLE table RENAME COLUMN old_col_name TO new_col_name; Renommer une colonne en MySQL ALTER TABLE table CHANGE old_col_name new_col_name INTEGER; Renommer une colonne en Firebird ALTER TABLE table ALTER COLUMN old_col_name TO new_col_name Création de table à la volée Position des éditeurs sur la modification des tables : CREATE TABLE ... ( LIKE ... ) CREATE TABLE AS (SELECT ... ) WITH [ NO ] DATA Oracle IBM DB2 PostgreSQL MySQL Firebird Oui MS SQL Server Non Non Oui Oui Non Oui (1) Oui Non (1) Oui (2) (1) Non (3) Non (1) Accepte le SELECT... INTO (PL/SQL sur Oracle) qui est un équivalent avec copie des données. Pour éviter la copie de données, une clause WHERE 1 = 0 peut être utilisée. (2) Il n'y a pas de clause WITH et les données sont systématiquement copiées. (3) MySQL accepte un ordre combiné : CREATE TABLE [ (...) ] SELECT, etc. Index Position des éditeurs sur la création des index : Oracle IBM DB2 HACHAGE ARBRE ÉQUILIBRÉ CLUSTER BITMAP textuel dewey, cutter, soundex Non Oui Oui (2) Oui Oui soundex Non Oui Oui Non Non soundex, difference MS SQL Server Non (6) Oui Oui Non Oui soundex, difference ASC / DESC collation unicité inverse FILL FACTOR Vues indexées Oui Oui (3) Oui Oui Oui (5) Oui (7) Oui Non Oui Non Oui (5) Oui Oui Oui Oui Non (6) Oui Oui (8) PostgreSQL MySQL Firebird Oui Oui Oui Non Oui soundex, levenshtein, metaphone Non Non Oui (4) Non Oui Non Non (1) Oui Oui (1) Non Oui soundex Non Oui Non Non Externe Soundex: external function Oui Non Oui Non Non Non (1) Possible selon le moteur de stockage. (2) « Index-organized table ». (3) Index linguistique. (4) Uniquement index en arbre équilibré. (5) PCTFREE. © Pearson Education France Oui Non Oui Non Non Non 18 Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition (6) SQL Server permet de créer des index sur des colonnes calculées, tant est si bien qu'il est possible de créer un index avec une clef de hachage en utilisant la fonction CHECKSUM ou un index inversé avec la fonction REVERSE. (7) Asynchrones (8) Synchrones Syntaxes SQL implémentées Syntaxe Oracle IBM DB2 SQL Server PostgreSQL MySQL Firebird CASE Oui Oui Oui Oui Oui Oui Fonctions de fenêtrage Oui Oui Oui Non Non Non Constructeurs de lignes valuées Oui Oui Oui (1) Oui Oui Non MULTISET Oui Non Non Non Non Non Limitation ROWNU M FETCH FIRST n ROWS TOP LIMIT/OFFS ET LIMIT FIRST/SKI P (1) Seulement pour les instructions INSERT et UPDATE, pas disponible dans la clause WHERE du SELECT. Tous les SGBDR de cette comparaison ont implémenté leur propre façon de limiter les lignes en retour d'une requête d'extraction. Ces méthodes sont notoirement antirelationnelles, mais fort pratiques et en général optimisées. Par souci de compatibilité, il vaut mieux utiliser les fonctions de fenêtrage lorsqu'elles sont implémentées. Voici comment obtenir les dix premières lignes d'une requête dans chaque SGBDR. Oracle : SELECT * FROM T_UTILISATEUR_USR WHERE ROWNUM <= 10; DB2 : SELECT * FROM T_UTILISATEUR_USR FETCH FIRST 10 ROWS ONLY; MS SQL Server : SELECT TOP (10) * FROM T_UTILISATEUR_USR; PostgreSQL et MySQL : SELECT * FROM T_UTILISATEUR_USR LIMIT 10 Firebird : SELECT FIRST (10) * FROM T_UTILISATEUR_USR --ou SELECT * FROM T_UTILISATEUR_USR ORDER BY USR_ID ROWS 1 TO 10 Jointures et opérations ensemblistes Syntaxe Oracle IBM DB2 SQL Server PostgreSQL MySQL Firebird UNION Oui Oui Oui Oui Oui Oui INTERSECT Oui Oui Oui Oui Non Non © Pearson Education France 19 Implémentation de SQL chez les principaux éditeurs – Synthex SQL, deuxième édition Syntaxe Oracle IBM DB2 SQL Server PostgreSQL MySQL Firebird EXCEPT MINUS Oui Oui Oui Non Non Expressions de Oui (1) table Oui Oui Non Non Oui (2) Firebird (1) Appelé « subquery factoring ». Pas de récursivité. (2) Mot clé WITH RECURSIVE pour indiquer une expression de table récursive. Mise à jour des données Syntaxe Oracle IBM DB2 SQL Server 2008 PostgreSQL MySQL MERGE Oui Oui Oui Non REPLACE Oui Extensions procédurales PL/SQL SQL PL Transact-SQL PL/PgSQL, PL/TK, PL/Perl, PL/Python Limitées(1 PSQL ) Curseurs Oui Oui Oui Oui Oui Oui Déclencheurs : portée Global Par ligne Global Par ligne Global Global Par ligne Par ligne Par ligne Déclencheurs : moment BEFORE INSTEAD OF AFTER BEFORE INSTEAD OF AFTER INSTEAD OF AFTER BEFORE AFTER BEFORE AFTER BEFORE AFTER Déclencheurs DDL Oui Non Oui Non Non Non Fonctions UDF Oui Oui Oui Oui Non (2) Oui Auto-incrément Séquence Norme (3) Séquence IDENTITY SERIAL AUTO_IN CREMENT Séquence (1) Les extensions procédurales de MySQL ont été introduites dans la version 5. Elles sont encore limitées. (2) Seulement depuis une bibliothèque externe. (3) GENERATED ALWAYS ou GENERATED BY DEFAULT. La création de colonnes autoincrémentielle suit des modes diverses. Oracle, PostgreSQL et Firebird implémentent la séquence de la norme SQL, qui peut servir à gérer plus de cas que l'alimentation d'une colonne de compteur technique. Nous avons déjà vu que le mot clé SERIAL en PostgreSQL était un raccourci pour extraire une nouvelle valeur d'une séquence. Pour Oracle et Firebird, vous devez utiliser un déclencheur pour alimenter votre colonne auto-incrémentielle. Pour les autres SGBDR, leur syntaxe propre peut être utilisée dans un CREATE TABLE. © Pearson Education France