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

Documents pareils