Tabla de contenidos
- 12.1. Operadores
- 12.2. Funciones de control de flujo
- 12.3. Funciones para cadenas de caracetres
- 12.4. Funciones numéricas
- 12.5. Funciones de fecha y hora
- 12.6. Qué calendario utiliza MySQL
- 12.7. Funciones de búsqueda de texto completo (Full-Text)
-
- 12.7.1. Búsquedas booleanas de texto completo (Full-Text)
- 12.7.2. Búsquedas de texto completo (Full-Text) con expansión de consulta
- 12.7.3. Limitaciones de las búsquedas de texto completo (Full-Text)
- 12.7.4. Afinar búsquedas de texto completo (Full-Text) con MySQL
- 12.7.5. Cosas por hacer en búsquedas de texto completo (Full-Text)
- 12.8. Funciones y operadores de cast
- 12.9. Otras funciones
-
12.10. Funciones y modificadores para cláusulas
GROUP BY
Las expresiones pueden usarse en varios puntos de los comandos SQL,
tales como en las cláusulas ORDER BY o
HAVING de los comandos SELECT
, en la cláusula WHERE de los comandos
SELECT, DELETE, o
UPDATE o en comandos, SET .
Las expresiones pueden escribirse usando valores literales, valores
de columnas, NULL, funciones y operadores. Este
capítulo describe las funciones y operadores permitidos para
escribir expresiones en MySQL.
Una expresión que contiene NULL siempre produce
un valor NULL 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
--sql-mode=IGNORE_SPACE. Los programas cliente
pueden pedir este comportamiento usando la opción
CLIENT_IGNORE_SPACE para
mysql_real_connect(). 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
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 NOT es desde
MySQL 5.0.2. En versiones anteriores, o desde 5.0.2 si el modo
HIGH_NOT_PRECEDENCE está activo, la
precedencia de NOT es la misma que la del
operador ! . Consulte
Sección 5.3.2, “El modo SQL del servidor”.
-
( ... )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
Las operaciones de comparación dan un valor de
1 (CIERTO), 0 (FALSO), o
NULL. 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
LEAST() y GREATEST())
retornan valores distintos a 1 (CIERTO),
0 (FALSO), o NULL. 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
NULL, el resultado de la comparación esNULL, excepto para el operador de comparaciónNULL-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
TIMESTAMPoDATETIMEy 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 enIN()! 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 CAST() .
Los valores de cadenas de carácteres pueden convertirse a un
conjunto de carácteres distinto usando
CONVERT(). 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
str_col es una columna de cadenas
indexada, el índice no puede usarse al realizar la búsqueda en
el siguiente comando:
SELECT * FROMtbl_nameWHEREstr_col=1;
La razón es que hay diferentes cadenas que pueden convertirse
al valor 1: '1',
' 1', '1a', ...
-
=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 -
<=>NULL-safe equal. Este operador realiza una comparación de igualdad como el operador=, pero retorna 1 en lugar deNULLsi ambos operandos sonNULL, y 0 en lugar deNULLsi un operando esNULL.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 -
ISvalor booleano,IS NOTvalor booleanoComprueba si un valor contra un valor booleano, donde
boolean_valuepuede serTRUE,FALSE, oUNKNOWN.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, 0IS [NOT]valor booleanosintaxis se añadió en MySQL 5.0.2. -
IS NULL,IS NOT NULLTestea si un valor es o no
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, 0Para poder trabajar con programas ODBC, MySQL soporta las siguientes características extra al usar
IS NULL:-
Puede encontrar el registro que contiene el valor
AUTO_INCREMENTmás reciente realizando un comando de la siguiente forma inmediatamente tras generar el valor:SELECT * FROM
tbl_nameWHEREauto_colIS NULLEste comportamiento puede desactivarse asignando
SQL_AUTO_IS_NULL=0. Consulte Sección 13.5.3, “Sintaxis deSET”. -
Para columnas
DATEyDATETIMEque se declaran comoNOT NULL, puede encontrar la fecha especial'0000-00-00'con un comando como este:SELECT * FROM
tbl_nameWHEREdate_columnIS NULLEsto es necesario para algunas aplicaciones ODBC, ya que ODBC no soporta un valor de fecha
'0000-00-00'.
-
-
exprBETWEENminANDmaxSi
expres mayor o igual queminyexpres menor o igual amax,BETWEENretorna1, de otro modo retorna0. Esto es equivalente a la expresión(min<=exprANDexpr<=max) 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 -
exprNOT BETWEENminANDmaxEsto es lo mismo que
NOT (exprBETWEENminANDmax). -
COALESCE(value,...)Retorna el primer valore no
NULLde la lista.mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL -
GREATEST(value1,value2,...)Con dos o más argumentos, retorna el argumento mayor (con valor mayor). Los argumentos se comparan usando las mismas reglas que para
LEAST().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' -
exprIN (value,...)Retorna
1siexpres uno de los valores en la listaIN, de lo contrario retorna0. Si todos los valores son constantes, se evalúan según el tipo y ordenación deexpr. La búsqueda para el elemento se hace usando búsqueda binaria. Esto significa queINes muy rápido si la listaINconsiste enteramente en constantes. Siexpres 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'); -> 1El número de valores en la lista
INsólo está limitado por el valormax_allowed_packet.En MySQL 5.0, para cumplir el estándar SQL
INretornaNULLno sólo si la expresión de la parte izquierda esNULL, también si no encuentra coincidencias en la lista y una de las expresiones en la lista esNULL.La sintaxis de
IN()puede usarse para escribir algunas subconsultas. Consulte Sección 13.2.8.3, “Subconsultas conANY,INySOME”. -
exprNOT IN (value,...)Esto es lo mismo que
NOT (exprIN (value,...)). -
ISNULL(expr)Si
expresNULL,ISNULL()retorna1, sino retorna0.mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1Una comparación de valores
NULLusando=siempre es falsa.La función
ISNULL()comparte algunos comportamientos especiales con el operador de comparaciónIS NULL, consulte la descripción deIS NULLen Sección 12.1.3, “Funciones y operadores de comparación”. -
INTERVAL(N,N1,N2,N3,...)Retorna
0ifN<N1,1siN<N2y así o-1siNesNULL. Todos los argumentos se tratan como enteros. Esto requiere queN1<N2<N3<...<Nnpara 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 -
LEAST(value1,value2,...)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
INTEGERo todos los argumentos son enteros, se comparan como enteros. -
Si el valor retornado se usa en un contexto
REALo 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); -> -9223372036854775808Esto ocurre porque MySQL lee
9223372036854775808.0en un contexto entero. La representación entera no es lo bastante buena para tratar el valor, así que lo cambia a entero con signo. -
En SQL, todos los operadores lógicos se evalúan a
TRUE, FALSE, o
NULL (UNKNOWN). En MySQL,
se implementan como 1 (TRUE), 0
(FALSE), y NULL. 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 TRUE.
-
NOT,!NOT lógica. Se evalúa a
1si el operando es0, a0si el operando es diferente a cero, yNOT NULLretornaNULL.mysql> SELECT NOT 10; -> 0 mysql> SELECT NOT 0; -> 1 mysql> SELECT NOT NULL; -> NULL mysql> SELECT ! (1+1); -> 0 mysql> SELECT ! 1+1; -> 1El último ejemplo produce
1porque la expresión se evalúa igual que(!1)+1. -
AND,&&AND lógica. Se evalúa a
1si todos los operandos son distintos a cero y noNULL, a 0 si uno o más operandos son0, de otro modo retornaNULL.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 lógica. Cuando ambos ooperandos son no
NULL, el resultado es 1 si algún operando es diferente a cero, y 0 de otro modo. Con un operandoNULLel resultado es 1 si el otro operando no es cero, yNULLde otro modo. Si ambos operandos sonNULL, el resultado esNULL.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 -
XORXOR lógica. Retorna
NULLsi algún operando esNULL. Para operandos noNULL, 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; -> 1a XOR bes matemáticamente igual a(a AND (NOT b)) OR ((NOT a) and b).