# MySQL/Fonctions

* Introduction
* PhpMyAdmin
* Parcourir les bases de données
* Spécifier les noms
* LDD, LMD et LCD
* Variables utilisateurs
* Alias
* Types de données
* Manipulation de base
** mysqldump
* Manipulation de table
* Manipulation de données
* Requêtes
* NULL
* Opérateurs
* Fonctions
* Procédures stockées
* Regex
* Bases de données spatiales
* Importer et exporter
* Réplication
* Optimisation
* API
* Sécurité
* Mots réservés
* Débogage
* Introduction
* PhpMyAdmin
* Parcourir les bases de données
* Spécifier les noms
* LDD, LMD et LCD
* Variables utilisateurs
* Alias
* Types de données
* Manipulation de base
** mysqldump
* Manipulation de table
* Manipulation de données
* Requêtes
* NULL
* Opérateurs
* Fonctions
* Procédures stockées
* Regex
* Bases de données spatiales
* Importer et exporter
* Réplication
* Optimisation
* API
* Sécurité
* Mots réservés
* Débogage
[ Modifier le sommaire ]

## Syntaxe

À l'instar des mots réservés SQL, les noms des fonctions ne sont pas sensibles à la casse :
Si le SQL_MODE IGNORE_SPACE SQL_MODE n'est pas défini, il est impossible de placer un espace entre le no de la fonction et la première parenthèse, sous peine de voir une erreur 1064. IGNORE_SPACE est généralement à 0, car cela accélère le parseur. Donc :
Toutefois, cette restriction ne s'applique qu'aux fonctions natives de MySQL (pas aux procédures stockées).

## Fonctions générales

Fonctions qui dépendent du type.

### BENCHMARK(nombre, expression)

Exécute l'expression n fois et retourne toujours zéro, le chiffre pertinent est donc le temps pris par cette opération de simulation. Utile pour trouver les goulots d'étranglement des expressions SQL :

### CAST(valeur AS type)

Renvoie la valeur convertie en chaine de caractères, comme les apostrophes.
Exemple avec encodage :

### CHARSET(chaine)

Renvoie le type de caractères de la chaine :

### COALESCE(valeur, ...)

Renvoie le premier paramètre non nul. S'ils sont tous nuls, renvoie NULL.

### COERCIBILITY(chaine)

Renvoie la coercibility d'une chaine (entre 0 et 5) :
| Coercibility | Signification | Exemple |
| 0 | Explicit collation | Value with COLLATE clause |
| 1 | No collation | Concatenation of strings with different collations |
| 2 | Implicit collation | Column value |
| 3 | System constant | USER return value |
| 4 | Coercible | Literal string |
| 5 | Ignorable | NULL or an expression derived from NULL |

### COLLATION(chaine)

Renvoie la collation d'une chaine :
Pour obtenir celle par défaut d'une base :

### CONCAT

Concaténation sans séparateur :

### CONCAT_WS

Concaténation avec séparateur de son choix :

### CONNECTION_ID

Renvoie l'identifiant du thread courant :

### CONVERT(valeur, type)

Tout comme CAST, retourne la valeur convertie dans le type mentionné :

### CONVERT(chaine USING charset)

Convertit la chaine string passée dans le CHARACTER SET spécifié :

### CURRENT_USER

Retourne les noms de l'utilisateur et de l'hôte courants :

### DATABASE

Retourne le nom de la base de données courante :

### FOUND_ROWS

Après un SELECT avec une LIMIT et le mot clé SQL_CALC_FOUND_ROWS, il est possible de lancer un autre SELECT avec FOUND_ROWS. En effet il renvoie le nombre de ligne de la clause précédente, sans la limite :

### GREATEST(valeur1, valeur2, ...)

Renvoie la plus grande valeur des paramètres :

### INTERVAL(valeur1, valeur2, valeur3, ...)

Renvoie l'emplacement du premier argument supérieur au premier, en partant du zéro dans la liste des entiers en paramètres :

### IF(valeur1, valeur2, valeur3)

If valeur1 est vraie, renvoie valeur2, sinon (fausse ou nulle) renvoie valeur3.

### IFNULL(valeur1, valeur2)

Si valeur1 est nulle, renvoie valeur2, sinon valeur1.

### ISNULL(valeur)

Si la valeur passée est nulle, renvoie 1, sinon 0.

### NULLIF(valeur1, valeur2)

Renvoie NULL si valeur1 = valeur2, sinon valeur1.

### LAST_INSERT_ID

Renvoie le dernier ID en AUTO_INCREMENT inséré dans la base, ce qui évite un SELECT lorsque l'on a besoin d'insérer deux enregistrements dont la deuxième avec une clé étrangère vers la première.

### LEAST(valeur1, valeur2, ...)

Renvoie la plus petite valeur dans la liste des paramètres passés :

### LENGTH(chaine)

Affiche la taille d'une chaine en octets.
Pour avoir le nombre de caractères, utiliser CHAR_LENGTH.

### SUBSTR(chaine, début, taille)

Son alias "substring" fonctionne aussi.
Découpe une chaine de caractère. Ex :

### SUBSTRING_INDEX

Découpe une chaine selon un séparateur. Le troisième paramètre désigne la énième occurrence de ce dernier :

### Fonctions JSON

MySQL (et MariaDB) offrent plusieurs fonctions de manipulation de champ varchar contenant du JSON.

#### JSON_VALID

Renvoie vrai si le champ est un JSON valide, faux sinon.

#### JSON_UNQUOTE

Retire les guillemets au début et à la fin d'une chaine (pour l'utiliser dans un JSON sans qu'ils soient interprétés). Ex :

#### JSON_KEYS

Renvoie toutes les clés du JSON en paramètre.

#### JSON_EXTRACT

Extrait un morceau du JSON par sa clé. Ex :
Cette fonction est combinable avec JSON_UNQUOTE pour les recherches dans des données JSON.. Ex :

#### JSON_SEARCH

Retourne les clés correspondant à la valeur recherchée. Son deuxième paramètre peut être "one" pour la première clé, ou "all" pour toutes. Ex :

#### JSON_VALUE

Retourne la valeur à partir de la clé en paramètre.

#### JSON_CONTAINS

Renvoie 1 si la JSON contient la valeur en paramètre, ou 0 sinon.

#### JSON_REMOVE

Retire la paire clé/valeur de la clé passée en paramètre.

## Date et heure

Il existe des dizaines de fonctions liées aux dates.
Pour trouver la date de l'an dernier :
Sélectionner toutes les pages du wiki non lues depuis plus un an :
Autres exemples de sélections :
convert('17/02/2016 15:49:03',datetime) ou convert('17-02-2016 15:49:03',datetime) donne null, donc une requête d'insertion le remplace par le même résultat que now. La syntaxe doit être convert('2016-02-17 15:49:03',datetime) ou convert('2016/02/17 15:49:03',datetime).

### DATE_ADD

Pour additionner deux dates. Par exemple pour calculer le jour d'une livraison prenant 48 h :
Pour la date d'hier :
Les unités à additionner ou soustraire les plus courantes sont :

### DATEDIFF

Pour soustraire une date à une autre. Par exemple pour calculer un âge :

### STR_TO_DATE

Un BETWEEN ou ">" de champ date avec une chaine de caractères ne marche pas. Il faut donc convertir la chaine en date :

## Fonctions d'agrégation
### COUNT(champ)

Si le paramètre est "*" au lieu d'un nom de colonne, COUNT renvoie les nombre de lignes total de la requête. Cela peut permettre de savoir combien de lignes possède une table, par exemple le nombre de pages d'un wiki :
Si le mot DISTINCT est employé, cela ignore les doublons :
Si le nom d'un champ est précisé, cela renvoie le nombre de valeurs non nulles :
Cela fonctionne aussi pour des expressions, des combinaisons de champs :
Pour afficher le décompte de plusieurs tables non jointes :

### MAX(champ)

MAX renvoie la valeur maximum d'une expression issue du résultat d'une requête, ou NULL s'il n'y en a pas :

#### Alternatives

Selon le contexte, la fonction MAX n'est pas toujours la meilleure option pour obtenir un maximum. Par exemple en cas de sous-requêtes ou sans agrégation possible :
* SELECT `user_editcount` FROM `wiki1_user` ORDER BY user_editcount DESC LIMIT 1;
* SELECT `user_editcount` FROM `wiki1_user` wu1 LEFT JOIN `wiki1_user` wu2 ON wu1.user_editcount > wu2.user_editcount WHERE wu2.user_editcount is null;

### MIN(champ)

MIN renvoie la valeur minimum d'une expression issue du résultat d'une requête, ou NULL s'il n'y en a pas :

### AVG(champ)

AVG renvoie la valeur moyenne d'une expression, ou NULL s'il n'y en a pas :
* Moyenne des valeurs d'un champ entier :
* Moyenne des valeurs d'un champ date :
* Moyenne d'un total obtenu par COUNT :

### SUM(champ)

SUM dresse la somme des valeurs d'une expression, ou NULL s'il n'y en a pas.
Si SUM(DISTINCT expression) est utilisé, les valeurs identiques ne sont ajoutées qu'une seule fois. Il a été ajouté après MySQL 5.1.
Cette fonction est impactée quand on ajoute des LEFT JOIN dans la même requête. Il faut alors les séparer dans des sous-requêtes.

### GROUP_CONCAT(champ)

GROUP_CONCAT concatène les valeurs de tous les enregistrements d'un groupe dans une seule chaine séparée par une virgule par défaut. En effet, le deuxième paramètre facultatif permet de définir un autre séparateur.

### Fonctions d'agrégation de bit

Syntaxe générale :
Ces fonctions bit à bit calculent expression pour chaque ligne du résultat et entre les expressions. La précision est de 64 bit.

#### OR

(retourne 0 s'il n'y a aucun résultat)

#### XOR

(retourne 0 s'il n'y a aucun résultat)

## Références

* ↑ http://dev.mysql.com/doc/refman/5.0/fr/information-functions.html
* ↑ https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html
* ↑ http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_coercibility
* ↑ https://mariadb.com/kb/en/json_search/
* ↑ https://www.startutorial.com/articles/view/how-to-search-json-data-in-mysql
* ↑ https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
* ↑ https://www.w3schools.com/sql/func_mysql_date_add.asp