13.1 Opérateurs et fonctions tout-types
13 Fonctions à utiliser dans les clauses SELECT et WHERE
Manuel de Référence MySQL 4.1 : Version Française
. Parenthèses ->Opérateurs de comparaison . Opérateurs logiques . Sensibilité à la casse
|
13.1.2 Opérateurs de comparaison
Les opérations de comparaison donnent comme résultats
1
(TRUE),
0
(FALSE), ou
NULL
. Ces fonctions fonctionnent pour les nombres comme pour les
chaînes. Les nombres sont automatiquement transformés en chaînes et les
chaînes en nombres si besoin en est. (comme en Perl)
MySQL effectue les comparaisons suivant les règles suivantes :
-
Si l'un ou les deux arguments sont
NULL
, le résultat de la comparaison est
NULL
,
exception faite pour l'opérateur
<=>
.
-
Si les deux arguments de la comparaison sont des chaînes, ils seront comparés
en tant que chaînes.
-
Si les deux arguments sont des entiers, ils sont comparés en tant qu'entiers.
-
Les valeurs hexadécimales sont traitées en tant que chaînes binaires si elles ne sont
pas comparées à un nombre.
-
Si l'un des arguments est une colonne de type
TIMESTAMP
ou
DATETIME
et que l'autre est une
constante, celle ci est convertie en timestamp avant que la comparaison ne s'opère.
Cela est fait pour être mieux compatible avec ODBC.
-
Dans tous les autres cas, les arguments sont comparés en tant que nombres à décimale
flottante. (réels)
Par défaut, la comparaison des chaînes s'effectue d'une façcon insensible à la casse
en utilisant le jeu de charactères courant (ISO-8859-1 Latin1 par défaut, qui fonctionne
aussi très bien pour l'anglais).
Si vous comparez des chaînes insensibles à la chasse, avec les opérateurs
standards (
=
,
<>
..., mais pas avec
LIKE
) les espaces terminaux
seront ignorés (espaces, tabulations et nouvelles lignes).
mysql> SELECT "a" ="A \n"; -> 1
|
Les exemples suivants, montrent la conversion des chaînes en nombres pour les opérations de
comparaison :
mysql> SELECT 1 > '6x'; -> 0 mysql> SELECT 7 > '6x'; -> 1 mysql> SELECT 0 > 'x6'; -> 0 mysql> SELECT 0 = 'x6'; -> 1
|
-
=
-
Egal :
mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 1
|
-
<>
-
-
!=
-
Différent :
mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1
|
-
<=
-
Inférieur ou égal :
mysql> SELECT 0.1 <= 2; -> 1
|
-
<
-
Strictement inférieur :
mysql> SELECT 2 < 2; -> 0
|
-
>=
-
Supérieur ou égal :
mysql> SELECT 2 >= 2; -> 1
|
-
>
-
Strictement supérieur :
mysql> SELECT 2 > 2; -> 0
|
-
<=>
-
Egalité sure avec NULL :
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1 1 0
|
-
IS NULL
-
-
IS NOT NULL
-
Tester si une valeur est ou n'est pas
NULL
:
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; -> 0 0 1 mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1 1 0
|
Pour être compatible avec les autres programmes, MySQL gère les appels
qui utilisent
IS NULL
de la façon suivante :
-
Vous pouvez trouver le dernier enregistrement inséré en utilisant :
SELECT * FROM nom_de_table WHERE auto_col IS NULL
|
Cela peut être interdit en mettant
SQL_AUTO_IS_NULL=0
. Syntaxe de
SET
.
-
For
NOT NULL
DATE
and
DATETIME
columns you can find
the special date
0000-00-00
by using:
SELECT * FROM nom_de_table WHERE date_column IS NULL
|
This is needed to get some ODBC applications to work (as ODBC doesn't
support a
0000-00-00
date)
-
expression BETWEEN min AND max
-
Si
expression
est supérieure ou égale à
min
et
expression
est inférieure
ou égale à
max
,
BETWEEN
retourne
1
, sinon
0
. Ceci est équivalent
à l'expression
(min <= expression AND expression <= max)
si tous les arguments sont
du même type. Dans tous les autres cas, la conversion de type prends place, selon les règles
suivantes, mais appliquée aux trois arguments.
Notez
que avant la 4.0.5, les arguments
étaient convertis au type de
expr
.
mysql> SELECT 1 BETWEEN 2 AND 3; -> 0 mysql> SELECT 'b' BETWEEN 'a' AND 'c'; -> 1 mysql> SELECT 2 BETWEEN 2 AND '3'; -> 1 mysql> SELECT 2 BETWEEN 2 AND 'x-3'; -> 0
|
-
expr NOT BETWEEN min AND max
-
Même chose que
NOT (expr BETWEEN min AND max)
.
-
expr IN (valeur,...)
-
Retourne
1
si
expr
est l'une des valeurs dans la liste
IN
,
sinon retourne
0
. Si toutes les valeurs sont des constantes, toutes les
valeurs sont évaluées avec le type de
expr
et triées.
La recherche de l'élément est alors faite en utilisant la recherche binaire.
Cela signifie que
IN
est très rapide si les valeurs contenues dans la liste
IN
sont toutes des constantes. Si
expr
est une chaîne sensible
à la casse, la comparaison est faite dans un contexte sensible à la casse :
mysql> SELECT 2 IN (0,3,5,'wefwf'); -> 0 mysql> SELECT 'wefwf' IN (0,3,5,'wefwf'); -> 1
|
Depuis MySQL version 4.1, une clause IN() peut aussi contenir une sous-requête.
Sous-requêtes avec
ANY
,
IN
et
SOME
.
-
expr NOT IN (value,...)
-
Même chose que
NOT (expr IN (valeur,...))
.
-
ISNULL(expr)
-
Si
expr
est
NULL
,
ISNULL()
retourne
1
, sinon
il retourne
0
:
mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1
|
Notez que la comparaison de deux valeurs
NULL
en utilisant
=
donnera toujours false !
-
COALESCE(list)
-
Retourne le premier élément non-
NULL
de la liste :
mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL
|
-
INTERVAL(N,N1,N2,N3,...)
-
Retourne
0
si
N
<
N1
,
1
si
N
<
N2
etc... Tous les arguments sont traités en tant qu'entiers. Il est requis que
N1
<
N2
<
N3
<
...
<
Nn
pour que cette fonction
fonctionne correctement. Cela est due à la recherche binaire utilisée (très rapide) :
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); -> 2 mysql> SELECT INTERVAL(22, 23, 30, 44, 200); -> 0
|
Si vous comparez des chaînes non sensibles à la casse avec l'un des opérateurs standards
(
=
,
<>
..., mais pas
LIKE
) les espaces en début et fin de chaîne
(espaces, tabulations et nouvelles lignes) seront ignorées.
mysql> SELECT "a" ="A \n"; -> 1
|
|