5.1 Extensions au langage ANSI SQL92

MySQL apporte quelques extensions à la norme ANSI SQL 92 que vous ne trouverez probablement dans aucune autre base de données. Soyez conscient que si vous utilisez ces extensions, votre code ne sera pas portable sur une autre base SQL. Dans certains cas, vous pouvez écrire du code qui utilise ces extensions MySQL, mais qui est portable, en utilisant les commentaires de la forme /*! ... */. Dans ce cas, MySQL va analyser puis exécuter le code de ce commentaire comme n'importe quelle commande MySQL, mais les autres serveur SQL les ignoreront. Par exemple :

SELECT /*! STRAIGHT_JOIN */ nom_colonne FROM table1,table2 WHERE ...

Voici la liste des extensions MySQL:

  • Les types de colonnes MEDIUMINT, SET, ENUM et tous les types BLOB et TEXT.
  • Les attributs de champs AUTO_INCREMENT, BINARY, UNSIGNED et ZEROFILL.
  • Toutes les comparaisons de chaînes sont insensibles à la casse par défaut, et le classement des chaînes est basé sur la table de caractère courante (par défaut, ISO-8859-1 Latin1). Si vous souhaitez que ces opérations soient sensible à la casse, ajoutez l'attribut BINARY aux colonnes concernés, ou bien utiliser l'opérateur de transptypage BINARY lors des comparaisons pour qu'elles prennent en compte l'ordre ASCII en cours sur l'hôte MySQL.
  • MySQL fait correspondre à chaque base de données un dossier dans le dossier de données MySQL, et les tables de cette base seront représentées par des fichiers. Cela a deux conséquences :
    • Les noms de bases de donnés et de tables sont dépendants du système d'exploitation sur lequel MySQL tourne, notamment concertant la casse des noms. Si vous avez des difficultés à vous souvenir des noms de tables, utilisez une convention cohérente, comme par exemple celle de mettre tous les noms en minuscules.
    • Les noms de bases, de table, d'index, de colonne ou d' alias peuvent commencer par un chiffre (mais de doivent pas être consistitués seulement de chiffres).
    • Vous pouvez utiliser les commandes du système pour sauvegarder, renommer, déplacer, effacer et copier des tables. Par exemple, vous pouvez copier le ``.ISD'', ``.ISM'' et ``.frm'' pour créer une nouvelle table.
  • En SQL pur, vous pouvez accéder à une table d'une autre base de données avec la syntaxe : nom_base_de_donnees.nom_table. Certains serveurs SQL propose la même fonctionnalité, mais l'appelle User space. MySQL n'accepte pas les espaces de tables comme dans : create table ralph.my_table...IN my_tablespace.
  • LIKE est utilisable avec les colonnes de type numérique
  • Possibilité d'utilisation de INTO OUTFILE et STRAIGHT_JOIN dans les commandes SELECT. SELECT.
  • L'option SQL_SMALL_RESULT dans une commande SELECT.
  • EXPLAIN SELECT permet de voir de quelle manière les tables ont été regroupées.
  • L'utilisation des index de noms, ou des index sur le préfixe d'un champs et l'utilisation de INDEX ou KEY dans une commande CREATE TABLE. CREATE TABLE
  • Attribut TEMPORARY et IF NOT EXISTS dans la commande CREATE TABLE.
  • Utilisation de COUNT(DISTINCT liste) lorsque 'liste' contient plus d'un élément.
  • Utilisation de CHANGE nom_colonne, DROP nom_colonne ou DROP INDEX dans les commandes ALTER TABLE. ALTER TABLE.
  • Utilisation de IGNORE dans les commandes ALTER TABLE.
  • Utilisation de multiples ADD, ALTER, DROP ou CHANGE dans les commandes ALTER TABLE.
  • Utilisation de DROP TABLE avec les mots clés IF EXISTS.
  • Vous pouvez supprimer plusieurs tables avec une seule commande DROP TABLE.
  • Clause LIMIT dans les commandes DELETE.
  • L'option DELAYED dans les commandes INSERT et REPLACE.
  • L'option LOW_PRIORITY dans les commandes INSERT, REPLACE, DELETE et UPDATE.
  • Utilisation de LOAD DATA INFILE. Dans certains cas, cette syntaxe est compatibles avec la fonction LOAD DATA INFILE d'Oracle. LOAD DATA.
  • La commande OPTIMIZE TABLE. OPTIMIZE TABLE.
  • La commande SHOW. SHOW.
  • Les chaînes de caractères peuvent être définies avec ``"'' ou ``''', et pas seulement avec ``'''.
  • Utilisation du caractère d'échappement ``\''.
  • La commande SET OPTION. SET OPTION.
  • Vous n'avez pas à nommer expressément toutes les colonnes dans une clause GROUP BY. Mais cela peut permettre d'accélérer quelques requêtes très spécifiques. 7.3.13 Fonctions à utiliser dans les clauses GROUP BY.
  • Pour aider les utilisateurs d'autres environnements SQL, MySQL dispose d'aliases pour de nombreuses fonctions. Par exemple, toutes les fonctions sur les chaînes de caractère supporte la syntaxe ANSI SQL et ODBC.
  • MySQL accepte les opérateurs logiques || et && (OR et AND, comme en langage C). Sous MySQL, || et OR sont synonymes, tout comme le sont && et AND. A cause de ce double emploi, MySQL n'accepte pas les opérateurs ANSI SQL || comme additionneur de chaînes; (utilisez à la place CONCAT() ).. Etant donné que CONCAT() prend un nombre arbitraire d'arguments, il est facile de remplacer ||.
  • CREATE DATABASE ou DROP DATABASE. CREATE DATABASE
  • L'opérateur % est synonyme de MOD(). C'est à dire que, N % M est équivalent à MOD(N,M). % est hérité du langage C, et permet la compatibilité avec PostgreSQL.
  • Les opérateurs =, <>, <= ,<, >=,>, <<, >>, <=>, AND, OR ou LIKE peuvent être utilisés dans les comparaisons de colonnes avec la clause FROM dans les commandes SELECT. Par exemple :
mysql> SELECT col1=1 AND col2=2 FROM nom_table;
  • La fonction LAST_INSERT_ID(). mysql_insert_id.
  • Les opérateurs d'expressions régulières REGEXP et NOT REGEXP.
  • CONCAT() ou CHAR() avec plus d'un one argument. (Avec MySQL, ces fonctions peuvent prendre un nombre arbitraire d'arguments).
  • Les fonctions supplémentaires BIT_COUNT(), ELT(), FROM_DAYS(), FORMAT(), IF(), PASSWORD(), ENCRYPT(), md5(), ENCODE(), DECODE(), PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(), ou WEEKDAY().
  • Utilisation de TRIM() pour supprimer les espaces de début et fin de chaîne. ANSI SQL ne supporte que la suppression de caractères uniques.
  • Les fonctions de GROUP BY : STD(), BIT_OR() et BIT_AND().
  • Utilisation de REPLACE à la place de DELETE + INSERT. REPLACE.
  • La commande FLUSH flush_option.