# MySQL/Opérateurs

* 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 ]
MySQL propose plus que les standards des opérateurs SQL. Ils peuvent être utilisés pour rédiger des expressions contenant des constantes, variables, valeurs contenues dans des champs ou autres expressions.

## Opérateurs d'assignation

L'opérateur = peut assigner une valeur à une colonne :
Par contre pour assigner une valeur à une variable, l'opérateur est :=, car = est déjà utilisé pour la comparaison.
SELECT INTO peut aussi remplir les variables.

## Opérateurs de comparaison
### Égalité

Pour vérifier si deux valeurs sont égales, utiliser = :
Pour vérifier si deux valeurs sont différentes, c'est <> ou != :

### Comparaison IS NULL

Pour savoir si une valeur est nulle, utiliser IS :
Pour savoir si une valeur n'est pas nulle :
Il existe par ailleurs l'opérateur vaisseau spatial : <=>, qui considère NULL comme une valeur normale :

### Comparaison IS booléen

IS et IS NOT fonctionnent aussi avec TRUE, FALSE et UNKNOWN (qui est purement un synonyme de NULL).

### Plus grand et plus petit que

Avec des nombres :
Avec du texte dans l'ordre alphabétique :
Cet ordre alphabétique est défini par COLLATION (l'interclassement), pour un CHARACTER SET donné. Par exemple, une COLLATION peut être sensible à la casse ou pas (suffixe utf8_general_cs = case sensitive, utf8_general_ci = case insensitive).
Exemple :

### BETWEEN

l’opérateur BETWEEN ... AND ... permet de vérifier si une valeur appartient à une plage (bornes incluses) :

### IN

IN permet de s'assurer si une valeur est dans une liste :
Attention : si la liste contient des nombres et des chaines, il faut tout mettre entre apostrophe pour obtenir le résultat escompté.
Il n'y a aucune limite théorique au nombre de valeurs de la liste.

## Opérateurs logiques
### Booléens logiques

MySQL n'a pas vraiment de type BOOLEAN.
FALSE est un synonyme de 0. Les chaines vides sont considérées FALSE.
TRUE est un synonyme de 1. Tout ce qui n'est ni FALSE, ni NULL est considéré TRUE.
UNKNOWN est un synonyme de NULL. La date spéciale 0/0/0 est nulle.

### NOT

NOT est le seul opérateur qui n'a qu'une seule opérande. Il renvoie 0 si l'opérande est TRUE, 1 si elle est FALSE, et NULL si elle est NULL.
! est synonyme de NOT.

### AND

AND renvoie 1 si les deux opérandes sont TRUE, sinon 0 ; si au moins l'une des deux opérandes est nulle, il renvoie NULL.
&& est synonyme de AND.

### OR

OR renvoie TRUE si au moins une des opérandes est TRUE, sinon FALSE ; si les deux opérandes sont nulles, il renvoie NULL.
|| est un synonyme de OR.

### XOR

XOR (ou exclusif) renvoie :
* 1 si une seule des deux opérandes est TRUE et l'autre FALSE.
* 0 si les deux sont TRUE ou FALSE.
* NULL si au moins l'une des deux est NULL.

## Opérateurs arithmétiques
### Divisions

Renvoie un nombre de type FLOAT :
Pour retourner la valeur entière du résultat d'une division sous forme de type INTEGER, utiliser DIV :
Le reste de la division (modulo) se trouve avec '%' ou MOD :

### Utiliser + pour convertir des données

Pour convertir un INTEGER en FLOAT :
Il est impossible de convertir une valeur FLOAT en ajoutant 0.0, mais on peut forcer le type en INTEGER :

### ROUND

Pour arrondit en définissant le nombre de chiffres après la virgule. Ex :

## Opérateurs de texte

Il n'y a pas d'opérateurs de concaténation en MySQL. Les opérateurs arithmétiques convertissent les valeurs en nombres et pour leurs opérations, donc la concaténation avec + est impossible.
La fonction CONCAT pallie à cela.

### LIKE

L'opérateur LIKE si la chaîne recherchée est inclue dans une colonne :
Généralement cette chaine est sensible à la casse, mais il y a deux exceptions, quand :
* une comparaison LIKE touche une colonne déclarée en BINARY ;
* l'expression contient une clause BINARY :
Les comparaisons LIKE acceptent deux caractères spéciaux :
* _ : n'importe quel caractère (un seul, ni zéro ni deux).
* % : n'importe quel séquence de caractères (par exemple zéro ou mille).
À noter que dans les expressions LIKE, \ est aussi le caractère d'échappement pour ', et son comportement ne peut pas être changé par la clause ESCAPE. Il peut aussi échapper d'autres caractères, mais pas lui-même.
Utilisations courantes de LIKE :
* Trouver tous les titres commençant par "hello" :
* Trouver tous les titres finissant par "world" :
* Trouver tous les titres contenant la chaine "gnu" :
Ces caractères spéciaux peuvent être contenus dans le pattern lui-même. Par exemple, pour rechercher les symboles _ ou % dans la base :
/ peut-être une alternative à \ si on le précise :
Quand on utilise l'opérateur =, les espaces des chaines sont ignorés, mais avec LIKE ils sont reconnus :
De même, contrairement à "=", "LIKE" compare uniquement les caractères, même si leurs règles d'interclassement les regroupent :
LIKE fonctionne aussi avec les nombres :
Pour tester si un pattern ne fonctionne pas alors qu'il devrait, utiliser NOT LIKE :

### SOUNDS LIKE

SOUNDS LIKE permet de vérifier si deux textes se prononcent pareils. Il utilise l'algorithme SOUNDEX, basé sur les règles de l'anglais, et peut s'avérer assez approximatif :
SOUNDS LIKE est une extension apparue depuis MySQL 4.1.

## Opérateur bit à bit

Il existe des opérateurs pour les opérations bit à bit.

## Conditions
### IF

La structure IF ... THEN ... ELSE ... END IF; ne fonctionne que dans les procédures stockées (contenant plusieurs requêtes). Pour gérer une condition en dehors d'elles, on peut utiliser : IF(condition, siVraie, siFausse);.
Exemple : SELECT IF(-1 < 0, 0, 1); renvoie 0.
Exemple avec plusieurs conditions (switch) :

### CASE

SELECT CASE WHEN condition THEN siVraie ELSE siFausse END;
Exemple : SELECT CASE WHEN '-1 < 0' THEN 0 ELSE 1 END; renvoie 0.
Exemple avec plusieurs conditions :
Dans une seule requête :

## Précédence
### Précédence des opérateurs

Du plus au moins prioritaire :
Modificateurs :
* PIPES_AS_CONCAT : si activé, || est prioritaire sur ^, mais - et ~ le reste sur ||.
* HIGH_NOT_PRECEDENCE : si activé, NOT est au niveau de !.

### Utilisation des parenthèses

Tout comme en mathématiques, les parenthèses permettent d'évaluer des sous-expressions avant d'autres :
Cela peut aussi se faire pour rendre les requêtes plus lisibles aux humains :

## Références

* ↑ https://www.bennadel.com/blog/3918-performing-a-case-sensitive-search-on-a-case-insensitive-column-using-collate-in-mysql-5-6-49.htm
* ↑ https://docs.oracle.com/cd/E17952_01/mysql-5.0-en/string-comparison-functions.html
* ↑ http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html
* ↑ https://dev.mysql.com/doc/refman/5.7/en/if.html
* ↑ https://dev.mysql.com/doc/refman/5.7/en/case.html
* ↑ https://dev.mysql.com/doc/refman/5.7/en/case.html