2 Consultas Condicionales¶
Clausula WHERE¶
Se puede realizar consultas que restrinjan los datos de salida de las tablas. Para ello se utiliza la cláusula WHERE
. Esta cláusula permite colocar una condición que han de cumplir todos los registros que queremos que se muestren. Las filas que no la cumplan no aparecerán en la ejecución de la consulta.
Ejemplo:
-- Tipo y modelo de las piezas cuyo precio es mayor que 3
SELECT tipo, modelo
FROM PIEZAS
WHERE precio > 3;
Operadores de comparación¶
Los operadores de comparación que se pueden utilizar en la cláusula WHERE son:
Operador | Significado |
---|---|
< | Menor que |
> | Mayor que |
<= | Menor o igual que |
>= | Mayor o igual que |
= | Igual |
!= | Distinto |
Se pueden utilizar tanto para comparar números como para comparar textos y fechas. En el caso de los textos, las comparaciones se hacen en orden alfabético. Sólo que es un orden alfabético estricto. Es decir el orden de los caracteres en la tabla de códigos. Así la letra Ñ y las vocales acentuadas nunca quedan bien ordenadas ya que figuran con códigos más altos. Las mayúsculas figuran antes que las minúsculas (la letra “Z” es menor que la “a”).
Operadores lógicos¶
Operador | Significado |
---|---|
AND | Devuelve verdadero si las expresiones a su izquierda y derecha son verdaderas |
OR | Devuelve verdadero si cualquiera de las dos expresiones a su izquierda y derecha son verdaderas |
AND | Invierta la lógica de la expresión que está a su derecha. Si era verdadera, mediante a NOT pasa a ser falso |
Ejemplos:
-- Personas entre 25 y 50 años
SELECT nombre, apellidos
FROM PERSONAS
WHERE edad >= 25 AND edad <= 50;
-- Personas de más de 60 y menos de 20
SELECT nombre, apellidos
FROM PERSONAS
WHERE edad > 60 OR edad < 20;
Between¶
El operador BETWEEN
nos permite obtener datos que se encuentren entre dos valores determinados (incluyendo los dos extremos).
Ejemplo:
-- Selección de las piezas cuyo precio está entre 3 y 8
-- (ambos valores incluidos)
SELECT tipo, modelo, precio
FROM PIEZAS
WHERE precio BETWEEN 3 AND 8;
El operador NOT BETWEEN
nos permite obtener los los valores que son menores (estrictamente) que el más pequeño y mayores (estrictamente) que el más grande. Es decir, no incluye los extremos.
-- Selección de las piezas cuyo precio sea menor que 3 o mayor que 8
-- (los de precio 3 y precio 8 no estarán incluidos)
SELECT tipo, modelo, precio
FROM PIEZAS
WHERE precio NOT BETWEEN 3 AND 8;
IN¶
El operador IN
nos permite obtener registros cuyos valores estén en una lista:
-- Selección de las piezas cuyo precio sea igual a 3, 5 u 8
SELECT tipo, modelo, precio
FROM PIEZAS
WHERE precio IN ( 3,5,8 );
-- Selección de las piezas cuyo precio no sea igual a 3, 5 u 8
SELECT tipo, modelo, precio
FROM PIEZAS
WHERE precio NOT IN ( 3,5,8 );
LIKE¶
El operador LIKE
se usa sobre todo con textos, permite obtener registros cuyo valor en un campo cumpla una condición textual. LIKE utiliza una cadena que puede contener estos símbolos:
Operador | Significado |
---|---|
% | Una serie cualquiera de caracteres. |
_ | Un carácter cualquiera. |
-- Selección el nombre de las personas que empiezan por A
SELECT nombre
FROM PERSONAS
WHERE nombre LIKE 'A%';
-- Selección el nombre y los apellidos de las personas
cuyo primer apellido sea Jiménez, Giménez, Ximénez
SELECT nombre, apellido1, apellido2
FROM PERSONAS
WHERE apellido1 LIKE '_iménez';
Si queremos que en la cadena de caracteres se busquen los caracteres % o _ le anteponemos el símbolo escape:
-- Seleccionamos el tipo, el modelo y el precio de las piezas
-- cuyo porcentaje de descuento sea 3%
SELECT tipo, modelo, precio
FROM PIEZAS
WHERE descuento LIKE '3\%' ESCAPE '\';
IS NULL¶
La cláusula IS NULL
devuelve verdadero si una expresión contiene un nulo, y Falso en caso contrario. La cláusula IS NOT NULL
devuelve verdadero si una expresión NO contiene un nulo, y Falso en caso contrario.
-- Devuelve el nombre y los apellidos de las personas que NO tienen teléfono
SELECT nombre, apellido1, apellido2
FROM PERSONAS
WHERE telefono IS NULL;
-- Devuelve el nombre y los apellidos de las personas que SÍ tienen teléfono
SELECT nombre, apellido1, apellido2
FROM PERSONAS
WHERE telefono IS NOT NULL;
Procedencias de operadores¶
A veces las expresiones que se producen en los SELECT son muy extensas y es difícil saber que parte de la expresión se evalúa primero, por ello se indica la siguiente tabla de precedencia:
Orden de procedencia | Operador |
---|---|
1 | * / |
2 | + - |
3 | Comparaciones |
4 | IS NULL, LIKE, IN, BETWEEN... |
5 | NOT |
6 | AND |
7 | OR |
Ordenación¶
El orden inicial de los registros obtenidos por un SELECT guarda una relación con al orden en el que fueron introducidos. Para ordenar en base a criterios más interesantes, se utiliza la cláusula ORDER BY
. En esa cláusula se coloca una lista de campos que indica la forma de ordenar.
Se ordena primero por el primer campo de la lista, si hay coincidencias por el segundo, si ahí también las hay por el tercero, y así sucesivamente. Se puede colocar las palabras ASC
O DESC
(por defecto se toma ASC). Esas palabras significan en ascendente (de la A a la Z, de los números pequeños a los grandes) o en descendente (de la Z a la a, de los números grandes a los pequeños) respectivamente.
Sintaxis completa de SELECT:
SELECT * | {[DISTINCT] columna | expresión [[AS] alias], ... }
FROM nombre_tabla
[WHERE condición]
[ORDER BY columna1[{ASC|DESC}]][,columna2[{ASC|DESC}]]...;
Ejemplo:
-- Devuelve el nombre y los apellidos
-- de las personas que tienen teléfono, ordenados por
-- apellido1, luego por apellido2 y finalmente por nombre
SELECT nombre, apellido1, apellido2
FROM PERSONAS
WHERE telefono IS NOT NULL
ORDER BY apellido1, apellido2, nombre;
Limitación¶
Si se desea limitar una consulta, existe la cláusula LIMIT
seguida del rango o número que se desea limitar la consulta.
Sintaxis completa de SELECT:
SELECT * | {[DISTINCT] columna | expresión [[AS] alias], ... }
FROM nombre_tabla
[WHERE condición]
[ORDER BY columna1[{ASC|DESC}]][,columna2[{ASC|DESC}]]...
[LIMIT number|range];
Ejemplo: