10 Lenguaje SQL Operadores

MySQL dispone de multitud de operadores diferentes para cada uno de los tipos de columna. Esos operadores se utilizan para construir expresiones que se usan en cláusulas ORDER BY y HAVING de la sentencia SELECT y en las cláusulas WHERE de las sentencias SELECT, DELETE y UPDATE. Además se pueden emplear en sentencias SET.

Operador de asignación

En MySQL podemos crear variables y usarlas porteriormente en expresiones.

Para crear una variable hay dos posibilidades. La primera consiste en ulsar la sentencia SET de este modo:

mysql> SET @hoy = CURRENT_DATE();
Query OK, 0 rows affected (0.02 sec)

mysql> SELECT @hoy;
+------------+
| @hoy       |
+------------+
| 2005-03-23 |
+------------+
1 row in set (0.00 sec)

mysql>

La otra alternativa permite definir variables de usuario dentro de una sentencia SELECT:

mysql> SELECT @x:=10;
+--------+
| @x:=10 |
+--------+
|     10 |
+--------+
1 row in set (0.00 sec)

mysql> SELECT @x;
+------+
| @x   |
+------+
| 10   |
+------+
1 row in set (0.00 sec)

mysql>

En esta segunda forma es donde se usa el operador de asignación :=. Otros ejemplos del uso de variables de usuario pueden ser:

mysql> SELECT @fecha_min:=MIN(fecha), @fecha_max:=MAX(fecha) FROM gente;
+------------------------+------------------------+
| @fecha_min:=MIN(fecha) | @fecha_max:=MAX(fecha) |
+------------------------+------------------------+
| 1978-06-15             | 2001-12-02             |
+------------------------+------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM gente WHERE fecha=@fecha_min;
+----------+------------+
| nombre   | fecha      |
+----------+------------+
| Mengano  | 1978-06-15 |
| Pimplano | 1978-06-15 |
+----------+------------+
2 rows in set (0.00 sec)

mysql>

Una variable sin asignar será de tipo cadena y tendrá el valor NULL.

Operadores lógicos

Los operadores lógicos se usan para crear expresiones lógicas complejas. Permiten el uso de álgebra booleana, y nos ayudarán a crear condiciones mucho más precisas.

En el álgebra booleana sólo existen dos valores posibles para los operandos y los resultados: verdadero y falso. MySQL dispone de dos constantes para esos valores: TRUE y FALSE, respectivamente.

MySQL añade un tercer valor: desconocido. Esto es para que sea posible trabajar con valores NULL. El valor verdadero se implementa como 1 o TRUE, el falso como 0 o FALSE y el desconocido como NULL.

mysql> SELECT TRUE, FALSE, NULL;
+------+-------+------+
| TRUE | FALSE | NULL |
+------+-------+------+
|    1 |     0 | NULL |
+------+-------+------+
1 row in set (0.00 sec)

mysql>

Operador Y

En MySQL se puede usar tanto la forma AND como &&, es decir, ambas formas se refieren al mismo operador: Y lógico.

Se trata de un operador binario, es decir, require de dos operandos. El resultado es verdadero sólo si ambos operandos son verdaderos, y falso si cualquier operando es falso. Esto se representa mediante la siguiente tabla de verdad:

A B A AND B
falso falso falso
falso verdadero falso
verdadero falso falso
verdadero verdadero verdadero
falso NULL falso
NULL falso falso
verdadero NULL NULL
NULL verdadero NULL

Al igual que todos lo operadores binarios que veremos, el operador Y se puede asociar, es decir, se pueden crear expresiones como A AND B AND C. El hecho de que se requieran dos operandos significa que las operaciones se realizan tomando los operandos dos a dos, y estas expresiones se evalúan de izquierda a derecha. Primero se evalúa A AND B, y el resultado, R, se usa como primer operando de la siguiente operación R AND C.

mysql> SELECT 1 AND 0, 1 AND NULL, 0 AND NULL, 1 AND 0 AND 1;
+---------+------------+------------+---------------+
| 1 AND 0 | 1 AND NULL | 0 AND NULL | 1 AND 0 AND 1 |
+---------+------------+------------+---------------+
|       0 |       NULL |          0 |             0 |
+---------+------------+------------+---------------+
1 row in set (0.00 sec)

mysql>

Operador O

En MySQL este operador también tiene dos formas equivalentes OR y ||

El operador O también es binario. Si ambos operandos son distintos de NULL y el resultado es verdadero si cualquiera de ellos es verdadero, y falso si ambos son falsos. Si uno de los operandos es NULL el resultado es verdadero si el otro es verdadero, y NULL en el caso contrario. La tabla de verdad es:

A B A OR B
falso falso falso
falso verdadero verdadero
verdadero falso verdadero
verdadero verdadero verdadero
falso NULL NULL
NULL falso NULL
verdadero NULL verdadero
NULL verdadero verdadero
mysql> SELECT 1 OR 0, 1 OR NULL, 0 OR NULL, 1 OR 0 OR 1;
+--------+-----------+-----------+-------------+
| 1 OR 0 | 1 OR NULL | 0 OR NULL | 1 OR 0 OR 1 |
+--------+-----------+-----------+-------------+
|      1 |         1 |      NULL |           1 |
+--------+-----------+-----------+-------------+
1 row in set (0.00 sec)

mysql>

Operador O exclusivo

XOR también es un operador binario, que devuelve NULL si cualquiera de los operandos es NULL. Si ninguno de los operandos es NULL devolverá un valor verdadero si uno de ellos es verdadero, y falso si ambos son verdaderos o mabos falsos. La tabla de verdad será:

A B A XOR B
falso falso falso
falso verdadero verdadero
verdadero falso verdadero
verdadero verdadero falso
falso NULL NULL
NULL falso NULL
verdadero NULL NULL
NULL verdadero NULL
mysql> SELECT 1 XOR 0, 1 XOR NULL, 0 XOR NULL, 1 XOR 0 XOR 1;
+---------+------------+------------+---------------+
| 1 XOR 0 | 1 XOR NULL | 0 XOR NULL | 1 XOR 0 XOR 1 |
+---------+------------+------------+---------------+
|       1 |       NULL |       NULL |             0 |
+---------+------------+------------+---------------+
1 row in set (0.00 sec)

mysql>

Operador de negación

El operador NOT, que también se puede escribir como !, es un operador unitario, es decir sólo afecta a un operando. Si el operando es verdadero devuelve falso, y viceversa. Si el operando es NULL el valor devuelto también es NULL.

A NOT A
falso verdadero
verdadero falso
NULL NULL
mysql> SELECT NOT 0, NOT 1, NOT NULL;
+-------+-------+----------+
| NOT 0 | NOT 1 | NOT NULL |
+-------+-------+----------+
|     1 |     0 |     NULL |
+-------+-------+----------+
1 row in set (0.02 sec)

mysql>