Différences entre dialectes SQL : ce qui change d'une base à l'autre
SELECT, WHERE, GROUP BY, JOIN et CASE fonctionnent de la même manière dans toutes les grandes bases de données. Les différences se trouvent dans les détails qui les entourent. Les exemples s'exécutent dans PostgreSQL, utilisé par ce site ; chaque section indique comment font les autres.
Limiter le nombre de lignes
PostgreSQL, MySQL et SQLite utilisent LIMIT (avec OFFSET pour sauter des lignes). SQL Server utilise SELECT TOP n, ou OFFSET ... FETCH après ORDER BY. Oracle 12c et versions ultérieures, ainsi que PostgreSQL, acceptent la syntaxe standard FETCH FIRST n ROWS ONLY.
SELECT name, unit_price FROM products ORDER BY unit_price DESC FETCH FIRST 3 ROWS ONLY;
Résultat : Les trois produits les plus chers, avec la syntaxe standard que partagent PostgreSQL et Oracle.
Concaténer du texte
PostgreSQL, SQLite et Oracle concatènent le texte avec ||. SQL Server utilise + (ou CONCAT). Dans MySQL, || signifie OR, sauf si un paramètre est modifié ; utilisez donc CONCAT(). CONCAT fonctionne dans PostgreSQL, MySQL et SQL Server, et c'est la solution la plus portable.
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM customers ORDER BY customer_id;
Résultat : Le nom complet de chaque client.
La date du jour
PostgreSQL dispose de CURRENT_DATE et NOW(). MySQL de CURDATE() et NOW(). SQL Server de GETDATE(). SQLite utilise date('now'). Oracle utilise SYSDATE. CURRENT_DATE est standard en SQL et fonctionne dans PostgreSQL, MySQL et Oracle.
SELECT CURRENT_DATE AS today;
Résultat : Une ligne avec la date du jour.
Division entière
Dans PostgreSQL, SQL Server et SQLite, 7 / 2 donne 3 lorsque les deux nombres sont entiers. Dans MySQL et Oracle, il donne 3.5. Pour obtenir le même résultat partout, convertissez d'abord un des deux côtés en type décimal.
SELECT 7 / 2 AS integer_division, 7 / 2.0 AS with_decimal;
Résultat : 3 et 3.5 dans PostgreSQL.
Joindre les valeurs d'un groupe
STRING_AGG existe dans PostgreSQL et dans SQL Server 2017 et versions ultérieures. MySQL et SQLite l'appellent GROUP_CONCAT. Oracle l'appelle LISTAGG.
SELECT city, STRING_AGG(first_name, ', ' ORDER BY first_name) AS names FROM customers GROUP BY city ORDER BY city;
Résultat : Les clients de chaque ville dans un seul texte.
Casse, guillemets et numérotation automatique
Comparaison de texte : LIKE de PostgreSQL est sensible à la casse (utilisez ILIKE pour le contraire) ; MySQL et SQL Server ne distinguent généralement pas la casse par défaut, selon le classement ; le LIKE de SQLite ignore la casse pour les lettres simples de l'alphabet anglais.
Mettre un nom entre guillemets : le SQL standard utilise les guillemets doubles, comme PostgreSQL, Oracle et SQLite. MySQL utilise les accents graves et SQL Server les crochets.
Numérotation automatique d'une clé : PostgreSQL utilise GENERATED ... AS IDENTITY (ou serial), MySQL AUTO_INCREMENT, SQL Server IDENTITY(1,1), SQLite INTEGER PRIMARY KEY, et Oracle 12c et versions ultérieures GENERATED AS IDENTITY.
SELECT name FROM products WHERE name ILIKE 'CROISSANT';
Résultat : Le Croissant, trouvé malgré les majuscules, car ILIKE ignore la casse.
Questions fréquentes
- Quelle base de données dois-je apprendre en premier ?
- N'importe laquelle. Le noyau se transpose presque entièrement. PostgreSQL suit de près la norme, ce qui en fait un bon premier choix.
- Mes requêtes de ce site fonctionneront-elles dans MySQL ou SQL Server ?
- La plupart des requêtes simples, oui. Les éléments à modifier sont ceux de ce guide : LIMIT, ILIKE, ||, les fonctions de date, STRING_AGG et la clause RETURNING.