Capítulo 12. Funciones y operadores

MySQL 5.0

Capítulo 12. Funciones y operadores

Las expresiones pueden usarse en varios puntos de los comandos SQL, tales como en las cláusulas o de los comandos , en la cláusula de los comandos , , o o en comandos, . Las expresiones pueden escribirse usando valores literales, valores de columnas, , funciones y operadores. Este capítulo describe las funciones y operadores permitidos para escribir expresiones en MySQL.

Una expresión que contiene siempre produce un valor a no ser que se indique de otro modo en la documentación para una función u operador particular.

Nota: Por defecto, no deben haber espacios en blanco entre un nombre de función y los paréntesis que lo siguen. Esto ayuda al parser de MySQL a distinguir entre llamadas a funciones y referencias a tablas o columnas que tengan el mismo nombre que una función. Sin embargo, se permiten espacios antre los argumentos de las funciones.

Puede decirle a MySQL server que acepte espacios tras los nombres de funciones arrancando con la opción . Los programas cliente pueden pedir este comportamiento usando la opción para . En cualquier caso, todos los nombres de función son palabras reservadas. Consulte Sección 5.3.2, “El modo SQL del servidor”.

Para una mayor brevedad, la mayoría de ejemplos de este capítulo muestran la salida del programa mysql de forma abreviada. En lugar de mostrar ejemplos en este formato:

mysql> SELECT MOD(29,9);
+-----------+
| mod(29,9) |
+-----------+
|         2 |
+-----------+
1 rows in set (0.00 sec)

Se usa este otro:

mysql> SELECT MOD(29,9);
        -> 2

12.1. Operadores

12.1.1. Precedencias de los operadores

La precedencia de operadores se muestra en la siguiente lista, de menor a mayor precedencia. Los operadores que se muestran juntos en una línea tienen la misma precedencia.

:=
||, OR, XOR
&&, AND
NOT
BETWEEN, CASE, WHEN, THEN, ELSE
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
|
&
<<, >>
-, +
*, /, DIV, %, MOD
^
- (resta unaria), ~ (inversión de bit unaria)
!
BINARY, COLLATE

La precedencia mostrada para es desde MySQL 5.0.2. En versiones anteriores, o desde 5.0.2 si el modo está activo, la precedencia de es la misma que la del operador . Consulte Sección 5.3.2, “El modo SQL del servidor”.

12.1.2. Paréntesis

  • Use paréntesis para forzar el orden de evaluación en una expresión. Por ejemplo:

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

12.1.3. Funciones y operadores de comparación

Las operaciones de comparación dan un valor de (CIERTO), (FALSO), o . Estas operaciones funcionan tanto para números como para cadenas de carácteres. Las cadenas de carácteres se convierten automáticamente en números y los números en cadenas cuando es necesario.

Algunas de las funciones de esta sección (tales como y ) retornan valores distintos a (CIERTO), (FALSO), o . Sin embargo, el valor que retornan se basa en operaciones de comparación realizadas como describen las siguientes reglas.

MySQL compara valores usando las siguientes reglas:

  • Si uno o ambos argumentos son , el resultado de la comparación es , excepto para el operador de comparación -safe .

  • Si ambos argumentos en una operación de comparación son cadenas, se comparan como cadenas.

  • Si ambos argumentos son enteros, se comparan como enteros.

  • Los valores hexadecimales se tratan como cadenas binarias si no se comparan con un número.

  • Si uno de los argumentos es una columna o y el otro argumento es una constante, la constante se convierte en timestamp antes de realizar la comparación. Esto se hace para acercarse al comportamiento de ODBC. Esto no se hace para argumentos en ! Para estar seguro, siempre use cadenas completas de fechas/horas al hacer comparaciones.

  • En todos los otros casos, los argumentos se comparan como números con punto flotante (reales).

Por defecto, la comparación de cadenas no es sensible a mayúsculas y usa el conjunto de carácteres actual (ISO-8859-1 Latin1 por defecto, que siempre funciona bien para inglés).

Par convertir un valor a un tipo específico para una comparación, puede usar la función . Los valores de cadenas de carácteres pueden convertirse a un conjunto de carácteres distinto usando . Consulte Sección 12.8, “Funciones y operadores de cast”.

Los siguientes ejemplos ilustran conversión de cadenas a números para operaciones de comparación:

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

Tenga en cuanta que cuando compara una columna de cadenas de carácteres con un número, MySQL no puede usar el índice de la columna para buscar rápidamente le valor. Si es una columna de cadenas indexada, el índice no puede usarse al realizar la búsqueda en el siguiente comando:

SELECT * FROM  WHERE =1;

La razón es que hay diferentes cadenas que pueden convertirse al valor : , , , ...

  • Igual:

    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
    

  • -safe equal. Este operador realiza una comparación de igualdad como el operador , pero retorna 1 en lugar de si ambos operandos son , y 0 en lugar de si un operando es .

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

  • ,

    Diferente:

    mysql> SELECT '.01' <> '0.01';
            -> 1
    mysql> SELECT .01 <> '0.01';
            -> 0
    mysql> SELECT 'zapp' <> 'zappp';
            -> 1
    

  • Menor que o igual:

    mysql> SELECT 0.1 <= 2;
            -> 1
    

  • Menor que:

    mysql> SELECT 2 < 2;
            -> 0
    

  • Mayor que o igual:

    mysql> SELECT 2 >= 2;
            -> 1
    

  • Mayor que:

    mysql> SELECT 2 > 2;
            -> 0
    

  • ,

    Comprueba si un valor contra un valor booleano, donde puede ser , , o .

    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
    

    sintaxis se añadió en MySQL 5.0.2.

  • ,

    Testea si un valor es o no .

    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
    

    Para poder trabajar con programas ODBC, MySQL soporta las siguientes características extra al usar :

    • Puede encontrar el registro que contiene el valor más reciente realizando un comando de la siguiente forma inmediatamente tras generar el valor:

      SELECT * FROM  WHERE  IS NULL
      

      Este comportamiento puede desactivarse asignando . Consulte Sección 13.5.3, “Sintaxis de .

    • Para columnas y que se declaran como , puede encontrar la fecha especial con un comando como este:

      SELECT * FROM  WHERE  IS NULL
      

      Esto es necesario para algunas aplicaciones ODBC, ya que ODBC no soporta un valor de fecha .

  • BETWEEN AND

    Si es mayor o igual que y es menor o igual a , retorna , de otro modo retorna . Esto es equivalente a la expresión <= AND <= ) si todos los argumentos son del mismo tipo. De otro modo la conversión de tipos tiene lugar según las reglas descritas al principio de la sección, pero aplicadas a todos los argumentos.

    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
    

  • NOT BETWEEN AND

    Esto es lo mismo que BETWEEN AND ).

  • ,...)

    Retorna el primer valore no de la lista.

    mysql> SELECT COALESCE(NULL,1);
            -> 1
    mysql> SELECT COALESCE(NULL,NULL,NULL);
            -> NULL
    

  • ,,...)

    Con dos o más argumentos, retorna el argumento mayor (con valor mayor). Los argumentos se comparan usando las mismas reglas que para .

    mysql> SELECT GREATEST(2,0);
            -> 2
    mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
            -> 767.0
    mysql> SELECT GREATEST('B','A','C');
            -> 'C'
    

  • IN (,...)

    Retorna si es uno de los valores en la lista , de lo contrario retorna . Si todos los valores son constantes, se evalúan según el tipo y ordenación de . La búsqueda para el elemento se hace usando búsqueda binaria. Esto significa que es muy rápido si la lista consiste enteramente en constantes. Si es una expresión de cadenas de carácteres sensible a mayúsculas, la comparación de cadenas se realiza sensible a mayúsculas.

    mysql> SELECT 2 IN (0,3,5,'wefwf');
            -> 0
    mysql> SELECT 'wefwf' IN (0,3,5,'wefwf');
            -> 1
    

    El número de valores en la lista sólo está limitado por el valor .

    En MySQL 5.0, para cumplir el estándar SQL retorna no sólo si la expresión de la parte izquierda es , también si no encuentra coincidencias en la lista y una de las expresiones en la lista es .

    La sintaxis de puede usarse para escribir algunas subconsultas. Consulte Sección 13.2.8.3, “Subconsultas con , y .

  • NOT IN (,...)

    Esto es lo mismo que IN (,...)).

  • )

    Si es , retorna , sino retorna .

    mysql> SELECT ISNULL(1+1);
            -> 0
    mysql> SELECT ISNULL(1/0);
            -> 1
    

    Una comparación de valores usando siempre es falsa.

    La función comparte algunos comportamientos especiales con el operador de comparación , consulte la descripción de en Sección 12.1.3, “Funciones y operadores de comparación”.

  • ,,,,...)

    Retorna if < , si < y así o si es . Todos los argumentos se tratan como enteros. Esto requiere que < < < < para que la función funcione correctamente. Esto es porque se usa una búsqueda binaria (muy rápida).

    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
    

  • ,,...)

    Con dos o más argumentos, retorna el argumento menor (con un valor menor). Los argumentos se comparan usando las siguientes reglas:

    • Si el valor retornado se usan en un contexto o todos los argumentos son enteros, se comparan como enteros.

    • Si el valor retornado se usa en un contexto o todos los argumentos son reales, se comparan como reales.

    • Si algún argumento es una cadena de carácteres sensible a mayúsculas, los argumentos se comparan como cadenas sensibles a mayúsculas.

    • En cualquier otro caso, los argumentos se comparan como cadenas no sensibles a mayúsculas.

    mysql> SELECT LEAST(2,0);
            -> 0
    mysql> SELECT LEAST(34.0,3.0,5.0,767.0);
            -> 3.0
    mysql> SELECT LEAST('B','A','C');
            -> 'A'
    

    Tenga en cuenta que las reglas de conversión precedentes pueden producir resultados extraños en algunos casos extremos:

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

    Esto ocurre porque MySQL lee en un contexto entero. La representación entera no es lo bastante buena para tratar el valor, así que lo cambia a entero con signo.

12.1.4. Operadores lógicos

En SQL, todos los operadores lógicos se evalúan a , , o (). En MySQL, se implementan como 1 (), 0 (), y . La mayoría de esto es común en diferentes servidores de bases de datos SQL aunque algunos servidores pueden retornar cualquier valor distinto a cero para .

  • ,

    NOT lógica. Se evalúa a si el operando es , a si el operando es diferente a cero, y retorna .

    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
    

    El último ejemplo produce porque la expresión se evalúa igual que .

  • ,

    AND lógica. Se evalúa a si todos los operandos son distintos a cero y no , a 0 si uno o más operandos son , de otro modo retorna .

    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 lógica. Cuando ambos ooperandos son no , el resultado es 1 si algún operando es diferente a cero, y 0 de otro modo. Con un operando el resultado es 1 si el otro operando no es cero, y de otro modo. Si ambos operandos son , el resultado es .

    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 lógica. Retorna si algún operando es . Para operandos no , evalúa a 1 si un número par de operandos es distinto a cero, sino retorna 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
    

    es matemáticamente igual a .