Maison > base de données > tutoriel mysql > le corps du texte

Tutoriel de base de MySQL 5 - Opérateurs

黄舟
Libérer: 2017-02-24 11:07:55
original
836 Les gens l'ont consulté


1. Priorité des opérateurs

La liste suivante montre l'ordre de priorité des opérateurs de bas en haut. Les opérateurs répertoriés sur la même ligne ont la même priorité.

:=

||, OU, XOR

&&, ET

PAS

ENTRE, CAS, QUAND, ALORS, ELSE

=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN

|

&

<<, >>

-,

*, /, p, %, MOD

^

- (Signe moins d'un dollar), ~ (Inversion de bit d'un dollar)

!

BINAIRE, COLLATE

Commentaires  : Si le mode SQL HIGH_NOT_PRECEDENCE est activé, la priorité de NOT est la même que celle de l'opérateur !.

2. Parenthèses

  • ( ... ) utilisez des parenthèses pour spécifier l'ordre des opérations des expressions, par exemple :

    mysql> SELECT 1+2*3;
            -> 7
    mysql> SELECT (1+2)*3;
            -> 9
    Copier après la connexion

3. Fonctions et opérateurs de comparaison

Le résultat de l'opération de comparaison est 1 (VRAI), 0 (FAUX) ou NULL. Ces opérations peuvent être utilisées sur des nombres et des chaînes. Les chaînes sont automatiquement converties en nombres, et les nombres sont automatiquement convertis en chaînes, selon les besoins.

Certaines fonctions de ce chapitre (telles que LEAST() et GREATEST()) n'incluent pas 1 (TRUE), 0 (FALSE) et NULL. Cependant, la valeur résultante est basée sur une opération de comparaison qui fonctionne selon les règles suivantes :

MySQL effectue des comparaisons numériques selon les règles suivantes :

  • S'il y a un ou deux paramètres sont NULL, à moins que des opérateurs tels que NULL-safe <=> ne soient utilisés, le résultat de l'opération de comparaison est NULL.

  • Si les deux paramètres dans la même opération de comparaison sont tous deux des chaînes, la comparaison sera basée sur des chaînes.

  • Si les deux paramètres sont des entiers, la comparaison sera basée sur des entiers.

  • Les valeurs hexadécimales sont traitées comme des chaînes binaires lorsqu'elles n'ont pas besoin d'être comparées comme des nombres.

  • Si l'un des paramètres est une colonne TIMESTAMP ou DATETIME et que les autres paramètres sont des constantes, les constantes seront converties en horodatage avant comparaison. Le but est de rendre ODBC plus fluide. Notez que cela ne s'applique pas aux paramètres dans IN() ! Pour plus de fiabilité, des chaînes datetime/date/heure complètes sont généralement utilisées lors des comparaisons.

  • Dans d'autres cas, les arguments sont comparés sous forme de nombres à virgule flottante.

Par défaut, les comparaisons de chaînes ne sont pas sensibles à la casse et utilisent le jeu de caractères existant (cp1252 Latin1 par défaut, convient également à l'anglais).

À titre de comparaison, vous pouvez utiliser la fonction CAST() pour convertir une valeur en un autre type. Utilisez CONVERT() pour convertir une valeur de chaîne en un jeu de caractères différent.

L'exemple suivant illustre le processus de conversion d'une chaîne en nombre lors d'une opération de comparaison :

mysql> SELECT 1 > &#39;6x&#39;;
-> 0
mysql> SELECT 7 > &#39;6x&#39;;
-> 1
mysql> SELECT 0 > &#39;x6&#39;;
-> 0
mysql> SELECT 0 = &#39;x6&#39;;
-> 1
Copier après la connexion

Notez que lors de la comparaison d'une colonne de chaîne avec le même numéro, MySQL ne peut pas utiliser la colonne indexez pour une recherche rapide. Si str_col est une colonne de chaîne indexée, l'index ne peut pas exécuter la fonction de recherche dans l'instruction suivante :

SELECT * FROM tbl_name WHERE str_col =1;

La raison est que de nombreuses chaînes différentes peuvent être converties à la valeur 1 : '1', '1', '1a', ...

  • =

est égal à :

mysql> SELECT 1 = 0;
-> 0
mysql> SELECT &#39;0&#39; = 0;
-> 1
mysql> SELECT &#39;0.0&#39; = 0;
-> 1
mysql> SELECT &#39;0.01&#39; = 0;
-> 0
mysql> SELECT &#39;.01&#39; = 0.01;
-> 1
Copier après la connexion
  • <=>

Égal à NULL-safe. Cet opérateur effectue la même opération de comparaison que l'opérateur =, mais lorsque les deux opcodes sont NULL, la valeur résultante est 1 au lieu de NULL, et lorsqu'un opcode est NULL, la valeur résultante est 0 et non NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
Copier après la connexion
  • <> !=

n'est pas égal à :

mysql> SELECT &#39;.01&#39; <> &#39;0.01&#39;;
-> 1
mysql> SELECT .01 <> &#39;0.01&#39;;
-> 0
mysql> SELECT &#39;zapp&#39; <> &#39;zappp&#39;;
-> 1
Copier après la connexion
  • <=

Inférieur ou égal à :

mysql> SELECT 0.1 <= 2;
-> 1
Copier après la connexion
  • <

Inférieur à :

mysql> SELECT 2 < 2;
-> 0
Copier après la connexion
  • >=

est supérieur ou égal à :

mysql> SELECT 2 >= 2;
-> 1
Copier après la connexion
  • > >

Testez une valeur basée sur une valeur booléenne, où la valeur booléenne peut être VRAI, FAUX ou INCONNU.

mysql> SELECT 2 > 2;
-> 0
Copier après la connexion
  • IS NULL IS NOT NULL

    Vérifie si une valeur est NULL.

  • Afin de fonctionner correctement avec les programmes ODBC, MySQL prend en charge les fonctionnalités supplémentaires suivantes lors de l'utilisation de IS NULL :

mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
-> 1, 1, 1
mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
-> 1, 1, 0
Copier après la connexion
    Après la génération d'une valeur, exécutez immédiatement une instruction au format suivant pour trouver la ligne avec la dernière valeur AUTO_INCREMENT :
o SELECT * FROM

tbl_name

WHERE
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
Copier après la connexion
auto_col

EST NULL

当设置SQL_AUTO_IS_NULL=0时,这项操作无法运行。

    • 对于命名为NOT NULL 的DATE 和DATETIME列,可通过使用如下的 语句找到特定日期 '0000-00-00':

o SELECT * FROM tbl_name WHERE date_column IS NULL

运行这一步需要使用一些 ODBC 应用软件,因为 ODBC本身不支持 一个 '0000-00-00'的时间值。

  • expr BETWEEN min AND max

假如expr大于或等于 minexpr 小于或等于max, 则BETWEEN 的返回值为1,或是0。若所有参数都是同一类型,则上述关系相当于表达式 (min <= expr AND expr <= max)。其它类型的转换根据本章开篇所述规律进行,且适用于3种参数中任意一种。

mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT &#39;b&#39; BETWEEN &#39;a&#39; AND &#39;c&#39;;
-> 1
mysql> SELECT 2 BETWEEN 2 AND &#39;3&#39;;
-> 1
mysql> SELECT 2 BETWEEN 2 AND &#39;x-3&#39;;
-> 0
Copier après la connexion
  • expr NOT BETWEEN min AND max

这相当于NOT(expr BETWEEN min AND max)。

· COALESCE(value,...)

返回值为列表当中的第一个非 NULL值,在没有非NULL 值得情况下返回值为 NULL 。

mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL
· GREATEST(value1,value2,...)
Copier après la connexion

当有2或多个参数时,返回值为最大(最大值的)参数。比较参数所依据的规律同LEAST()相同。

mysql> SELECT GREATEST(2,0);
-> 2
mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
-> 767.0
mysql> SELECT GREATEST(&#39;B&#39;,&#39;A&#39;,&#39;C&#39;);
-> &#39;C&#39;
Copier après la connexion

在没有自变量为NULL的情况下,GREATEST()的返回值为NULL。

· expr IN (value,...)

  • expr 为IN列表中的任意一个值,则其返回值为 1 , 否则返回值为0。假如所有的值都是常数,则其计算和分类根据 expr 的类型进行。这时,使用二分搜索来搜索信息。如IN值列表全部由常数组成,则意味着IN 的速度非常之快。如expr 是一个区分大小写的字符串表达式,则字符串比较也按照区分大小写的方式进行。

mysql> SELECT 2 IN (0,3,5,&#39;wefwf&#39;);
-> 0
mysql> SELECT &#39;wefwf&#39; IN (0,3,5,&#39;wefwf&#39;);
-> 1
Copier après la connexion

IN 列表中所列值的个数仅受限于 max_allowed_packet 值。

为了同SQL 标准相一致,在左侧表达式为NULL的情况下,或是表中找不到匹配项或是表中一个表达式为NULL 的情况下,IN的返回值均为NULL。

IN() 语构也可用书写某些类型的子查询。

· expr NOT IN (value,...)

这与NOT (expr IN (value,...))相同。

  • ISNULL(expr)

expr 为NULL,那么ISNULL() 的返回值为 1,否则返回值为 0。

mysql> SELECT ISNULL(1+1);
-> 0
mysql> SELECT ISNULL(1/0);
-> 1
Copier après la connexion

使用= 的NULL 值对比通常是错误的。

ISNULL() 函数同 IS NULL比较操作符具有一些相同的特性。请参见有关IS NULL 的说明。

· INTERVAL(N,N1,N2,N3,...)

假如N < N1则返回值为0;假如N < N2 等等,则返回值为1;假如N 为NULL,则返回值为 -1 。所有的参数均按照整数处理。为了这个函数的正确运行,必须满足 N1 < N2 < N3 < ……< Nn 。其原因是使用了二分查找(极快速)。

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
· LEAST(value1,value2,...)
Copier après la connexion

在有两个或多个参数的情况下, 返回值为最小 (最小值) 参数。用一下规则将自变量进行对比:

    • 假如返回值被用在一个 INTEGER 语境中,或是所有参数均为整数值,则将其作为整数值进行比较。

    • 假如返回值被用在一个 REAL语境中,或所有参数均为实值,则 将其作为实值进行比较。

    • 假如任意一个参数是一个区分大小写的字符串,则将参数按照区分大小写的字符串进行比较。

    • 在其它情况下,将参数作为区分大小写的字符串进行比较。

假如任意一个自变量为NULL,则 LEAST()的返回值为NULL 。

mysql> SELECT LEAST(2,0);
-> 0
mysql> SELECT LEAST(34.0,3.0,5.0,767.0);
-> 3.0
mysql> SELECT LEAST(&#39;B&#39;,&#39;A&#39;,&#39;C&#39;);
-> &#39;A&#39;
Copier après la connexion

注意,上面的转换规则在一些边界情形中会产生一些奇特的结果:

mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED);
-> -9223372036854775808
Copier après la connexion

发生这种情况的原因是MySQL在整数语境中读取9223372036854775808.0。整数表示法不利于保存数值,因此它包括一个带符号整数。

4. 逻辑操作符

在SQL中,所有逻辑 操作符的求值所得结果均为 TRUE、FALSE或 NULL (UNKNOWN)。在 MySQL中,它们体现为 1 (TRUE)、 0 (FALSE)和 NULL。其大多数都与不同的数据库SQL通用,然而一些服务器对TRUE的返回值可能是任意一个非零值。

  • NOT !

逻辑 NOT。当操作数为0 时,所得值为 1 ;当操作数为非零值时,所得值为 0 ,而当操作数为NOT NULL时,所得的返回值为 NULL。

mysql> SELECT NOT 10;
-> 0
mysql> SELECT NOT 0;
-> 1
mysql> SELECT NOT NULL;
-> NULL
mysql> SELECT ! (1+1);
-> 0
mysql> SELECT ! 1+1;
-> 1
Copier après la connexion

最后一个例子产生的结果为 1,原因是表达式的计算方式和(!1)+1相同。

  • AND &&

逻辑AND。当所有操作数均为非零值、并且不为NULL时,计算所得结果为 1 ,当一个或多个操作数为0 时,所得结果为0 ,其余情况返回值为 NULL 。

mysql> SELECT 1 && 1;
-> 1
mysql> SELECT 1 && 0;
-> 0
mysql> SELECT 1 && NULL;
-> NULL
mysql> SELECT 0 && NULL;
-> 0
mysql> SELECT NULL && 0;
-> 0
Copier après la connexion
  • OR ||

逻辑 OR。当两个操作数均为非 NULL值时,如有任意一个操作数为非零值,则结果为1,否则结果为0。当有一个操作数为NULL时,如另一个操作数为非零值,则结果为1,否则结果为 NULL 。假如两个操作数均为 NULL,则所得结果为NULL。

mysql> SELECT 1 || 1;
-> 1
mysql> SELECT 1 || 0;
-> 1
mysql> SELECT 0 || 0;
-> 0
mysql> SELECT 0 || NULL;
-> NULL
mysql> SELECT 1 || NULL;
-> 1
Copier après la connexion
  • XOR

逻辑XOR。当任意一个操作数为 NULL时,返回值为NULL。对于非 NULL 的操作数,假如一个奇数操作数为非零值,则计算所得结果为 1 ,否则为 0 。

mysql> SELECT 1 XOR 1;
-> 0
mysql> SELECT 1 XOR 0;
-> 1
mysql> SELECT 1 XOR NULL;
-> NULL
mysql> SELECT 1 XOR 1 XOR 1;
-> 1
Copier après la connexion

a XOR b 的计算等同于  (a AND (NOT b)) OR ((NOT a)和 b)。

 以上就是MySQL基础教程5 —— 操作符的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!