>  기사  >  데이터 베이스  >  MySQL 기초 튜토리얼 5 - 연산자

MySQL 기초 튜토리얼 5 - 연산자

黄舟
黄舟원래의
2017-02-24 11:07:55838검색


1. 연산자 우선 순위

다음 목록은 연산자 우선 순위를 낮은 것부터 보여줍니다. 같은 줄에 나열된 연산자는 동일한 우선순위를 갖습니다.

:=

||, OR, XOR

&&, AND

NOT

BETWEEN, CASE, WHEN, THEN, ELSE

=, 96b4fef55684b9312718d5de63fb7121, >=, >, 59ed3ba4284a0a81c059290362cbdd58, !=, IS, LIKE, REGEXP, IN

|

&

071af19a55f4da1989e8c02b755ba052>

-, +

*, /, p, %, MOD

^

-(단항 빼기 기호), ~(단항 비트 반전)

!

BINARY, COLLATE

댓글 : HIGH_NOT_PRECEDENCE SQL 모드가 활성화된 경우 NOT의 우선순위는 ! 연산자와 동일합니다.

2. 괄호

  • ( ... ) 괄호를 사용하여 표현식의 연산 순서를 지정합니다. 예:

    mysql> SELECT 1+2*3;
            -> 7
    mysql> SELECT (1+2)*3;
            -> 9

3. 비교 함수 및 연산자

비교 연산의 결과는 1(TRUE), 0(FALSE) 또는 NULL입니다. 이러한 연산은 숫자와 문자열에 사용할 수 있습니다. 필요에 따라 문자열은 자동으로 숫자로 변환되고, 숫자는 자동으로 문자열로 변환됩니다.

이 장의 일부 함수(예: LEAST() 및 GREATEST())에는 1(TRUE), 0(FALSE) 및 NULL이 포함되지 않습니다. 그러나 결과 값은 다음 규칙에 따라 작동하는 비교 연산을 기반으로 합니다.

MySQL은 다음 규칙에 따라 수치 비교를 수행합니다.

  • 하나 또는 두 개의 매개변수가 NULL입니다. NULL 안전 96b4fef55684b9312718d5de63fb7121와 같은 연산자를 사용하지 않는 한 비교 작업의 결과는 NULL입니다.

  • 동일 비교 연산의 두 매개변수가 모두 문자열인 경우 비교는 문자열로 수행됩니다.

  • 두 매개변수가 모두 정수인 경우 비교는 정수를 기준으로 이루어집니다.

  • 16진수 값은 숫자로 비교할 필요가 없을 때 2진수 문자열로 처리됩니다.

  • 매개변수 중 하나가 TIMESTAMP 또는 DATETIME 열이고 다른 매개변수가 상수인 경우 비교 전에 상수가 타임스탬프로 변환됩니다. 이는 ODBC가 보다 원활하게 진행되도록 하기 위한 것입니다. 이는 IN()의 매개변수에는 적용되지 않습니다. 신뢰성을 높이기 위해 일반적으로 비교 시 완전한 날짜/날짜/시간 문자열이 사용됩니다.

  • 다른 경우에는 인수가 부동 소수점 숫자로 비교됩니다.

기본적으로 문자열 비교는 대소문자를 구분하지 않으며 기존 문자 집합을 사용합니다(기본적으로 cp1252 Latin1, 영어에도 적합).

비교를 위해 CAST() 함수를 사용하여 값을 다른 유형으로 변환할 수 있습니다. CONVERT()를 사용하여 문자열 값을 다른 문자 집합으로 변환합니다.

다음 예에서는 비교 작업에서 문자열을 숫자로 변환하는 프로세스를 보여줍니다.

mysql> SELECT 1 > '6x';
-> 0
mysql> SELECT 7 > '6x';
-> 1
mysql> SELECT 0 > 'x6';
-> 0
mysql> SELECT 0 = 'x6';
-> 1

문자열 열을 동일한 숫자와 비교할 때 MySQL은 인덱스 열을 사용할 수 없습니다. 빠른 검색. str_col이 인덱스된 문자열 열인 경우 인덱스는 다음 문에서 검색 기능을 수행할 수 없습니다.

SELECT * FROM tbl_name WHERE str_col =1;

'1', '1', '1a', ...

  • =

은 다음과 같습니다:

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

  • 96b4fef55684b9312718d5de63fb7121

NULL- 안전 같음. 이 연산자는 = 연산자와 동일한 비교 작업을 수행하지만 두 opcode가 모두 NULL인 경우 반환되는 값은 NULL 대신 1입니다. 값은 0이며 NULL이 아닙니다. .

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL

  • a8093152e673feb7aba1828c43532094 !=

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

  • < ;=

작거나 같음:

mysql> SELECT 0.1 <= 2;
-> 1

  • e253ef1f50e6fdb5dfa9bc87fe975cdd=

mysql> SELECT 2 >= 2;
-> 1

  • >보다 크거나 같습니다.

보다 큼:

mysql> SELECT 2 > 2;
-> 0

  • IS

    boolean_value IS NOT boolean_value

값을 테스트하는 부울 값에 따라 여기서 부울 값은 TRUE, FALSE 또는 UNKNOWN이 될 수 있습니다.

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

  • IS NULL IS NOT NULL

값이 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

ODBC 프로그램과 원활하게 작동하기 위해 MySQL은 IS NULL을 사용할 때 다음과 같은 추가 기능을 지원합니다.

    • 값이 생성된 후 즉시 실행 최신 AUTO_INCREMENT 값이 포함된 행을 찾기 위한 다음 형식의 문: IS 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大于或等于 min 且expr 小于或等于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
      • 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,...)

      当有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;

      在没有自变量为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

      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

      使用= 的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,...)

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

        • 假如返回值被用在一个 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;

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

      mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED);
      -> -9223372036854775808

      发生这种情况的原因是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

      最后一个例子产生的结果为 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
      • 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
      • 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

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

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


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.