Lo que se pretende abordar en este capítulo principalmente es la lógica booleana, que es la que nos permite establecer condiciones.
Recordemos la primera consulta de este curso:
SELECT Nombre, Apellidos
FROM Empleados
WHERE Salario > 1350
Cuando indicábamos en la cláusula WHERE: Salario > 1350 (¿Es Salario mayor a 1350?), estábamos estableciendo una expresión booleana donde: ">" es el operador, "Salario" es un operando variable, que tomará valores de cada registro de la tabla Empleados, y "1350" es un operando constante. El resultado de esta expresión depende del valor que tome la variable Salario, pero en cualquier caso sólo puede dar dos posibles resultados, o verdadero o falso. Por lo tanto diremos que una expresión booleana sólo tiene dos posibles resultados.
El motor SQL evalúa la expresión booleana de la cláusula WHERE para cada registro de la tabla, y el resultado determina si el registro que se está tratando se tomará en consideración. Lo hará si el resultado de evaluar la expresión es verdadero, y lo ignorará si el resultado es falso.
Ejemplo de expresiones booleanas:
- "4 > 3": ¿Es cuatro mayor que tres?
- "3 = 12": ¿Es tres igual a doce?
Notar que los operandos son del mismo tipo, en este caso tipo INT. Sin embargo el resultado obtenido no es un dato de tipo INT, sino booleano, sus posibles valores son verdadero o falso.
(4 > 3) = verdadero
(3 = 12) = falso
Operadores
Un operador corresponde a un símbolo matemático que nos indica que debe ser llevada a cabo una operación especificada. Al construir expresiones con estos operadores, los dos operandos deben ser del mismo tipo, ya sean números, cadenas o fechas. Existen tres tipos de operadores:
1.- Aritméticos: realizan operaciones matemáticas con dos expresiones de uno o más de los tipos de datos numéricos.
2.- Comparación: dan como resultado valores booleanos. Cuando al menos uno de los operadores es NULL (nulo), el resultado final es NULL.
3.- Lógicos: comprueban la veracidad de una condición. Éstos, así como los operadores de comparación, devuelven el tipo de dato boolean.
- AND: "A and B" devuelve verdadero si A y B son verdaderos, y falso en cualquier otro caso.
- OR: "A or B" devuelve verdadero si A o B son verdaderos, y falso únicamente cuando tanto A como B son falsos.
- NOT: "not A" devuelve falso si A es verdadero, y verdadero si A es falso.
Veamos una aplicación en el mundo cotidiano:
Supongamos que tu jefe quiere contratar a una persona para repartir genero, solamente pueden optar a la vacante aquellos candidatos que tengan vehículo propio y licencia de conducir. Como candidatos tenemos a Ángela, que tiene licencia pero no tiene vehículo. A Salomé, que tiene licencia y vehículo. Y a Teresa, que tiene vehículo pero de momento no tiene licencia. ¿Quiénes pueden pasar al proceso de selección?
Convertimos el anunciado en una expresión booleana:
Sea C: pasa al proceso de selección.
Sea A: tiene vehículo propio.
Sea B: tiene licencia de conducir.
Entonces para que un candidato satisfaga C, se debe dar A y B:
C = A and B
Resolvamos la expresión para cada candidato:
Aplicado a Ángela: C = (A and B) = (falso and verdadero) = falso.
Aplicado a Salomé: C = (A and B) = (verdadero and verdadero) = verdadero.
Aplicado a Teresa: C = (A and B) = (verdadero and falso) = falso.
Luego, Salomé pasa al proceso de selección.
Veamos ahora esto mismo aplicado en SQL:
Consideremos ahora la tabla Personas, donde hemos guardado una "S" en el campo "Rubia" si la persona es rubia y una "N" en caso contrario, análogamente se ha aplicado el mismo criterio para "Alta" y "Gafas", es decir, para indicar si es alta y si lleva gafas.
El operador AND
Como ya hemos dicho, el operador AND devuelve verdadero si ambas expresiones son ciertas, y falso en cualquier otro caso.
Supongamos que queremos saber ¿Qué personas son rubias y altas?, para ello construimos la siguiente consulta SQL:
SELECT Nombre
FROM Personas
WHERE (Rubia = 'S') AND (Alta = 'S')
Resultado:
Evaluar RUBIA = 'S' da como resultado verdadero o falso, al igual que evaluar ALTA = 'S'; son de echo los dos operandos booleanos del operador AND. Si para un registro ambos son verdaderos el resultado es verdadero, y se mostrarán los datos de ese registro que indica la cláusula SELECT.
En el caso de tener una expresión de la forma: "A and B and D" la expresión se evalúa por partes por orden de aparición:
Primero se evalúa (A and B) = E y finalmente (E and D)
Si todos los operadores de la expresión son AND, entonces todas las expresiones deben ser verdaderas para que el resultado sea verdadero.
El operador OR
Con el operador OR basta que uno de los dos operandos sea verdadero para que el resultado sea verdadero.
Supongamos que queremos saber las personas que son rubias o bien altas, es decir, queremos que si es rubia la considere con independencia de su altura, y a la inversa, también queremos que la seleccione si es alta independientemente del color de pelo. La consulta sería la siguiente:
SELECT Nombre
FROM Personas
WHERE (Rubia = 'S') OR (Alta = 'S')
Resultado:
Si todos los operadores de la expresión son OR, por ejemplo "A or B or C", entonces todas las expresiones deben ser falsas para que el resultado sea falso, basta que una sea verdadera para que el resultado sea verdadero.
Supongamos que se quieren seleccionar tres registros concretos de la tabla Empleados para ver sus datos, interesan los registros con identificador 1, 2 y 4. Para esta situación, se debe usar el operador OR, puesto que la consulta debe establecer la condición "que el identificador sea 1, 2 o 4":
SELECT *
FROM Empleados
WHERE Id_Empleado = 1 OR Id_Empleado = 2 OR Id_Empleado = 4
Resultado:
El asterisco (*) presente en la cláusula SELECT equivale a indicar todos los campos de la tabla.
Notar que en la consulta anterior, para cualquier registro de la tabla Empleados donde el campo Id_Empleado contenga un valor distinto a 1, 2 o 4, el resultado de evaluar la expresión será falso, puesto que todas las expresiones booleanas darán falso, pero con que una de ellas sea verdadera, el registro será seleccionado.
Un modo de simplificar la consulta anterior es mediante la palabra clave IN, donde se establece una lista de valores posibles que debe contener el campo indicado para que el registro sea seleccionado. La palabra clave IN equivale a establecer condiciones sobre un mismo campo conectadas por el operador OR.
SELECT *
FROM Empleados
WHERE Id_Empleado IN (1,2,4)
Resultado:
El operador NOT
Este operador tiene solo un operando, el resultado es negar el valor del operando de modo que:
"(4 > 3) = verdadero", luego "not (4 > 3) = falso"
Si negamos dos veces una expresión booleana es equivalente a la expresión original:
"(4 > 3) = verdadero", luego "not (not (4 > 3)) = verdadero"
Ejemplo:
SELECT Nombre
FROM Personas
WHERE (Rubia = 'S') AND NOT(Alta = 'S') AND (Gafas = 'S')
Resultado:
El uso de paréntesis
Los paréntesis se comportan como en matemáticas, no es lo mismo "5 + 4 / 3" donde primero se calculará la división y después se sumará 5, que "(5 + 4) / 3" donde primero se resolverá la suma y el resultado parcial se dividirá por 3. Sin paréntesis la división tiene prioridad sobre la suma, con paréntesis forzamos a que la operación se realice en el orden deseado.
Los operadores AND y OR tienen la misma prioridad de modo que se evalúa la expresión por orden de aparición:
No es lo mismo: "Rubia and Alta or Gafas" = "(Rubia and Alta) or Gafas" que, "Rubia and (Alta or Gafas)". En el primer caso estamos diciendo: "que sea rubia y alta, o bien lleve gafas", y en el segundo "que sea rubia y, sea alta o lleve gafas".
SELECT Nombre
FROM Personas
WHERE Rubia = 'S' AND Alta = 'S' OR Gafas = 'S'
Resultado:
SELECT Nombre
FROM Personas
WHERE Rubia = 'S' AND (Alta = 'S' OR Gafas = 'S')
Resumen
En esta lección se ha descrito como construir expresiones booleanas y como trabajar con ellas para establecer condiciones en la cláusula WHERE de una consulta SQL.
Las expresiones booleanas con operadores de comparación (tales como >, =, !=, etc.) precisan operandos de tipo número, cadena o fecha, y el resultado de evaluar la expresión devuelve siempre verdadero o falso.
Ejemplo: Salario > 1350
Las expresiones con operadores lógicos (tales como AND, OR y NOT) precisan expresiones booleanas como operandos, el conjunto es una nueva expresión booleana que al evaluarla devolverá siempre verdadero o falso.
Ejemplo: Rubia = 'S' AND Alta = 'S'
El uso de paréntesis garantiza que, en una expresión compleja las expresiones simples que la forman se evalúen en el orden que uno desea.
Ejemplo: NOT((Rubia = 'S' OR Alta = 'S') AND (Alta ='N' OR Gafas = 'S'))
Ejercicios propuestos
1.- Cree una consulta SQL que devuelva las personas que son altas, o bien son rubias con gafas.
2.- Cree una consulta SQL que devuelva los empleados que son de sexo femenino y cobran más de 1300 euros (en la tabla empleados se guarda una "H" en el campo SEXO para indicar que es hombre, o una "M" para indicar que es mujer).