• Aucun résultat trouvé

Extensions MySQL au standard SQL-92

Chapitre 1. Informations générales

1.5. Quels standards respecte MySQL ?

1.5.4. Extensions MySQL au standard SQL-92

Le serveur MySQL inclut des extensions que vous ne trouverez probablement pas dans les autres bases de données. Soyez prévenus que si vous les utilisez, votre code ne sera probablement pas portable sur d'autres serveurs SQL. Dans certains cas, vous pouvez écrire du code qui inclut des spécificités de MySQL, mais qui restent portables, en les incluant dans des commentaires de la forme/*! ...

*/. Dans ce cas, le serveur MySQL va analyser la chaîne et exécuter le code à l'intérieur de ces commentaires comme une commande normale, mais d'autres serveurs ignoreront ces commentaires. Par exemple :

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

Si vous ajoutez le numéro de version après le point d'exclamation ‘!’, la syntaxe sera exécutée uniquement si la version du serveur MySQL est égale ou plus récente que le numéro de version utilisé.

CREATE /*!32302 TEMPORARY */ TABLE t (a int);

Cela signifie que si vous avez la version 3.23.02 ou plus récente, le serveur MySQL va utiliser le mot réservéTEMPORARY.

Voici une liste des apports spécifiques de MySQL :

• Organisation des données sur le disque

MySQL fait correspondre à chaque base un dossier dans le dossier de données MySQL, et à chaque table des fichiers portant le même nom. Ceci a plusieurs implications :

• Les noms des bases de données et des tables sont sensibles à la casse sur les systèmes d'exploitation qui ont des systèmes de fichiers sensibles à la casse (comme la plupart des systèmes Unix). SeeSection 9.2.2, « Sensibilité à la casse pour les noms ».

• Vous pouvez utiliser les commandes systèmes standard pour sauver, renommer, déplacer, effacer et copier des tables. Par exemple, pour renommer une table, il suffit de renommer les fichiers.MYD,.MYIet.frmet de leur donner un nouveau nom.

Les noms de bases, tables, index, colonnes ou alias peuvent commencer par des chiffres, mais ne peuvent pas être constitués uniquement de noms.

• Syntaxe générale du langage

• Les chaînes de caractères peuvent être soit délimitées par ‘"’, soit par ‘'’. Pas seulement par ‘'’.

• L'utilisation du caractère de protection ‘\’.

• Dans une requête SQL, vous pouvez accéder à des tables situées dans différentes bases de données, avec la syntaxe db_name.tbl_name. Certains serveurs SQL fournissent la même fonctionnalité, mais l'appellent unUser space. Le serveur MySQL ne supporte par les espaces de nom de tables, comme dans :create table ralph.my_table...IN my_tablespace.

• Syntaxe de commande SQL

• Les commandesANALYZE TABLE,CHECK TABLE,OPTIMIZE TABLEetREPAIR TABLE.

• Les commandesCREATE DATABASEetDROP DATABASE. SeeSection 13.2.3, « Syntaxe deCREATE DATABASE».

• La commandeDO.

• La commandeEXPLAIN SELECTpour avoir le détail des jointures de tables.

• Les commandesFLUSHetRESET.

• La commandeSET. SeeSection 13.5.2.8, « Syntaxe deSET».

• La commandeSHOW. SeeSection 13.5.3, « Syntaxe deSHOW».

• L'utilisation de la commandeLOAD DATA INFILE. Dans de nombreuses situations, cette syntaxe est compatible avec la commande d'OracleLOAD DATA INFILE. SeeSection 13.1.5, « Syntaxe deLOAD DATA INFILE».

• L'utilisation deRENAME TABLE. SeeSection 13.2.9, « Syntaxe deRENAME TABLE».

• L'utilisation deREPLACEau lieu deDELETE+INSERT. SeeSection 13.1.6, « Syntaxe deREPLACE».

• L'utilisation deCHANGE col_name,DROP col_nameouDROP INDEX,IGNOREouRENAMEdans une commande ALTER TABLE. SeeSection 13.2.2, « Syntaxe deALTER TABLE».

• L'utilisation de noms d'index, de préfixes d'index, et l'utilisation des mots-cléINDEXorKEYdans une commande de création de tableCREATE TABLE. SeeSection 13.2.5, « Syntaxe deCREATE TABLE».

Informations générales

• L'utilisation des clausesTEMPORARYetIF NOT EXISTSavecCREATE TABLE.

• L'utilisation deDROP TABLEavec les mots-cléIF EXISTS.

• Vous pouvez effacer plusieurs tables avec une seule commandeDROP TABLE.

• La clauseLIMITde la commandeDELETE.

• La syntaxeINSERT INTO ... SET col_name = ....

• La clauseDELAYEDdes commandesINSERTetREPLACE.

• La clauseLOW_PRIORITYdes commandesINSERT,REPLACE,DELETEetUPDATE.

• L'utilisation deINTO OUTFILEetSTRAIGHT_JOINdans les requêtesSELECT. SeeSection 13.1.7, « Syntaxe de SELECT».

• L'optionSQL_SMALL_RESULTde la commandeSELECT.

• Vous n'êtes pas obligé de nommer toutes les colonnes que vous sélectionnez dans la clauseGROUP BY. Cela donne de

meilleures performances pour certaines situations spécifiques, mais classiques. SeeSection 12.9, « Fonctions et options à utiliser dans les clausesGROUP BY».

• Vous pouvez spécifierASCouDESCdans la clauseGROUP BY.

• La possibilité de modifier les variables dans les commandes avec l'opérateur:=:

SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table;

SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

• Types de colonnes

• Les types de colonnesMEDIUMINT,SET,ENUMet les typesBLOBetTEXT.

• Les attributs de champsAUTO_INCREMENT,BINARY,NULL,UNSIGNEDetZEROFILL.

• Fonctions et opérateurs

• Pour aider les utilisateurs qui viennent d'autres environnements SQL, le serveur MySQL supporte des alias de nombreuses fonctions. Par exemple, toutes les fonctions de chaînes de caractères supportent simultanément les syntaxes ANSI SQL et ODBC.

• Le serveur MySQL comprend les opérateurs||et&&comme opérateurs logiquesORetAND, comme en langage C. Pour le serveur MySQL, les opérateurs||etORsont synonymes, ainsi que&&etAND. En conséquence, MySQL ne supporte pas l'opérateur de concaténation de chaînes ANSI SQL||. Utilisez plutôt la fonctionCONCAT(). CommeCONCAT()prend un nombre illimité d'arguments, il est facile de convertir des expressions utilisant||, pour qu'elles fonctionnent sur le serveur MySQL.

• L'utilisation deCOUNT(DISTINCT list)oùlistcontient plus d'un élément.

• Toutes les comparaisons de chaînes sont insensibles à la casse par défaut, et l'ordre de tri est déterminé par le jeu de caractères courant (ISO-8859-1 Latin1par défaut). Si vous en souhaitez un autre, il faut déclarer les colonnes avec l'attributBINARY ou utiliser l'opérateurBINARYpour forcer les comparaisons à prendre en compte la casse, en fonction du jeu de caractères utilisé sur l'hôte du serveur MySQL.

• L'opérateur%est synonyme deMOD(). C'est à dire queN % Mest équivalent àMOD(N,M).%est supporté pour les programmeurs C, et pour la compatibilité avecPostgreSQL.

• Les opérateurs=,<>,<=,<,>=,>,<<,>>,<=>,AND,ORouLIKEpeuvent être utilisés pour les comparaisons de colonnes à gauche de la clauseFROMdans les commandesSELECT. Par exemple :

mysql> SELECT col1=1 AND col2=2 FROM tbl_name;

• La fonctionLAST_INSERT_ID(), qui retourne la plus récente valeur de colonneAUTO_INCREMENT. SeeSection 12.8.3,

« Fonctions d'informations ».

• LIKEest possible avec des colonnes numériques.

• Les opérateurs d'expressions régulières étendusREGEXPetNOT REGEXP.

• CONCAT()etCHAR()avec un argument ou plus de deux arguments. Avec le serveur MySQL, ces fonctions peuvent prendre n'importe quel nombre d'arguments.

• Les fonctionsBIT_COUNT(),CASE,ELT(),FROM_DAYS(),FORMAT(),IF(),PASSWORD(),ENCRYPT(),MD5(), ENCODE(),DECODE(),PERIOD_ADD(),PERIOD_DIFF(),TO_DAYS()etWEEKDAY().

• L'utilisation de la fonctionTRIM()pour réduire les chaînes. L'ANSI SQL ne supporte que les suppressions de caractères uniques.

• Les fonctions de groupe de la clauseGROUP BY STD(),BIT_OR(),BIT_AND(),BIT_XOR()etGROUP_CONCAT(). See Section 12.9, « Fonctions et options à utiliser dans les clausesGROUP BY».

Pour une liste hiérarchisée des nouvelles extensions qui seront ajoutées à MySQL, vous pouvez consulter la liste de tâche en ligne sur http://dev.mysql.com/doc/mysql/en/TODO.html. C'est la dernière liste qui est utilisée dans ce formulaire. SeeSection B.8, « Les évolutions de MySQL (la liste des tâches) ».