2.5. Consultas a una base de datos relacional
2.5. Consultas a una base de datos relacional Dataprix 18 Septiembre, 2009 - 11:35Para hacer consultas sobre una tabla con el SQL es preciso utilizar la sentencia SELECT FROM, que tiene el siguiente formato:
SELECT nombre_columna_a_seleccionar [[AS] col_renombrada]
[,nombre_columna_a_seleccionar [[AS] col_renombrada]...]
FROM tabla_a_consultar [[AS] tabla_renombrada];
La opción AS nos permite renombrar las columnas que queremos seleccionar o las tablas que queremos consultar que en este caso, es sólo una. Dicho de otro modo, nos permite la definición de alias. Fijémonos en que la palabra clave AS es opcional, y es bastante habitual poner sólo un espacio en blanco en lugar de toda la palabra.
Consultas a BDUOC
A continuación presentamos un ejemplo de consulta a la base de datos BDUOC para conocer todos los datos que aparece en la tabla clientes:
SELECT *
FROM clientes;
El * después de SELECT indicaque queremos ver todos los atributos que aparecen en la tabla.
La respuesta a esta consulta sería:
codigo_cli | nombre_cli | nif | direccion | ciudad | telefono |
---|---|---|---|---|---|
10 | EGICSA | 38.567.893-C | Aragón 11 | Barcelona | NULL |
20 | CME | 38.123.898-E | Valencia 22 | Girona | 972.23.57.67 |
30 | ACME | 36.432.127-A | Mallorca 33 | Lleida | 973.23.45.67 |
40 | JGM | 38.782.345-B | Rosellon 44 | Tarragona | 977.33.71.43 |
Si hubiésemos querido ver sólo el código, el nombre, la dirección y la ciudad, habríamos hecho:
SELECT codigo_cli, nombre_cli, direccion, ciudad
FROM clientes;
Y habríamos obtenido la respuesta siguiente:
codigo_cli | nombre_cli | direccion | ciudad |
---|---|---|---|
10 | EGICSA | Aragón 11 | Barcelona |
20 | CME | Valencia 22 | Girona |
30 | ACME | Mallorca 33 | Lleida |
40 | JGM | Rosellon 44 | Tarragona |
Con la sentencia SELECT FROM podemos seleccionar columnas de una tabla, pero para seleccionar filas de una tabla es preciso añadirle la cláusula WHERE. El formato es:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE condiciones;
La cláusula WHERE nos permite obtener las filas que cumplen la condición especificada en la consulta.
codigo_emple |
2 |
4 |
7 |
Consultas a BDUOC seleccionando filas
Veamos un ejemplo en el que pedimos “los códigos de los empleados que trabajan en el proyecto número 4”:
SELECT codigo_empl
FROM empleados
WHERE num_proyec = 4;
La respuesta a esta consulta sería la que podéis ver en el margen.
Para definir las condiciones en la cláusula WHERE, podemos utilizar alguno de los operadores de los que dispone el SQL, que son los siguientes:
= | Igual |
< | Menor |
> | Mayor |
<= | Menor o igual |
>= | Mayor o igual |
<> | Diferente |
NOT | Para la negación de condiciones |
AND | Para la conjunción de conciciones |
OR | Para la disyunción de condiciones |
Si queremos que en una consulta nos aparezcan las filas resultantes sin repeticiones, es preciso poner la palabra clave DISTINCT inmediatamente después de SELECT. También podríamos explicitar que lo queremos todo, incluso con repeticiones, poniendo ALL (opción por defecto) en lugar de DISTINCT. El formato de DISTINCT es:
SELECT DISTINCT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
[WHERE condiciones];
30.000 |
40.000 |
70.000 |
90.000 |
100.000 |
Consulta a BDUOC seleccionando filas sin repeticiones
Por ejemplo, si quisiéramos ver qué sueldos se están pagando en nuestra empresa, podríamos hacer:
SELECT DISTINCT sueldo
FROM empleados;
La respuesta a esta consulta, sin repeticiones, sería la que aparece en el margen.
2.5.1. Funciones de agregacion
2.5.1. Funciones de agregacion Carlos 17 Septiembre, 2009 - 11:52El SQL nos ofrece las siguientes funciones de agregación para efectuar varias operaciones sobre los datos de una base de datos:
Función | Descripción |
COUNT | Nos da el número total de filas seleccionadas |
SUM | Suma los valores de una columna |
MIN | Nos da el valor mínimo de una columna |
MAX | Nos da el valor máximo de una columna |
AVG | Calcula el valor medio de una columna |
En general, las funciones de agregación se aplican a una columna, excepto la función de agregación COUNT, que normalmente se aplica a todas las columnas de la tabla o tablas seleccionadas. Por lo tanto,COUNT (*) contará todas las filas de la tabla o las tablas que cumplan las condiciones. Si se utilizase COUNT(distinct columna), sólo contaría los valores que no fuesen nulos ni repetidos, y si se utilizase COUNT(columna), sólo contaría los valores que no fuesen nulos.
Ejemplo de utilización de la función COUNT (*)
Veamos un ejemplo de uso de la función COUNT, que aparece en la cláusula SELECT, para hacer la consulta “¿Cuántos departamentos están ubicados en la ciudad de Lleida?”:
SELECT COUNT(*) AS numero_dep
FROM departamentos
WHERE ciudad_dep = ‘Lleida’;
numero_dep |
1 |
La respuesta a esta consulta sería la que aparece reflejada en la tabla que encontraréis en el margen.
Veremos ejemplos de las demás funciones de agregación en los siguientes apartados.
2.5.2. Subconsultas
2.5.2. Subconsultas Dataprix 18 Septiembre, 2009 - 11:30Una subconsulta es una consulta incluida dentro de una cláusula WHERE o HAVING de otra consulta. En ocasiones, para expresar ciertas condiciones no hay más remedio que obtener el valor que buscamos como resultado de una consulta.
codigo_proyec | nombre_proyec |
4 | TINELL |
Subconsulta en BDUOC
Si quisiéramos saber los códigos y los nombres de los proyectos de precio más elevado, en primer lugar tendríamos que encontrar los proyectos que tienen el precio más elevado. Lo haríamos de la forma siguiente:
Los proyectos de precio más bajo |
Si en lugar de los códigos y los nombres de los proyectos de precio más alto hubiésemos querido saber los de precio más bajo, habríamos aplicado la función de agregación MIN. |
SELECT codigo_proyec, nombre_proyec
FROM proyectos
WHERE precio = (SELECT MAX(precio)
FROM proyectos);
El resultado de la consulta anterior sería lo que puede verse al margen.
2.5.3. Otros predicados
2.5.3. Otros predicados Dataprix 21 Septiembre, 2009 - 09:571) Predicado BETWEEN
Para expresar una condición que quiere encontrar un valor entre unos límites concretos, podemos utilizar Roman;">BETWEEN</span>:</p>
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE columna BETWEEN límite1 AND límite2;
Ejemplo de uso del predicado BETWEEN
Un ejemplo en el que se pide “Los códigos de los empleados que ganan entre 20.000 y 50.000 euros anuales” sería:
codio_empl |
---|
5 |
6 |
7 |
8 |
La respuesta a esta consulta sería la que se ve en el margen.
2) Predicado IN
Para comprobar si un valor coincide con los elementos de una lista utilizaremos IN, y para ver si no coincide, NOT IN:
Ejemplo de uso del predicado IN
“Queremos saber el nombre de todos los departamentos que se encuentran en las ciudades de Lleida o Tarragona”:
nombre_dep |
ciudad_dep |
---|---|
DIS | Lleida |
PROG | Tarragona |
La respuesta sería la que aparece en el margen.
3) Predicado LIKE
Para comprobar si una columna de tipo carácter cumple alguna propiedad determinada, podemos usar LIKE:
Los patrones del SQL92 para expresar características son los siguientes:
Otros patrones |
Aunque_y % son los caracteres elegidos por el estandar, cada sistema relacional comercial ofrece diversas variantes. |
a) Pondremos un carácter _ para cada carácter individual que queramos considerar.
b) Pondremos un carácter % para expresar una secuencia de caracteres, que puede no estar formada por ninguno.
Ejemplo de uso del predicado LIKE
Atributos añadidos |
Aunque la consulta pide sólo los nombres de empleados añadimos los códigos para poder diferenciar dos empleados con el mismo nombre. |
A continuación presentamos un ejemplo en el que buscaremos los nombres de los empleados que empiezan por J, y otro ejemplo en el que obtendremos los proyectos que comienzan por S y tienen cinco letras:
a) Nombres de empleados que empiezan por la letra J:
codigo_empl |
nombre_empl |
---|---|
4 | Jorge |
La respuesta a esta consulta seria la que se muestra den el margen.
b) Proyectos que empiezan por S y tienen cinco letras:
codigo_progec |
---|
3 |
Y la respuesta a esta otra consulta sería la que aparece en el margen.
4) Predicado IS NULL
Para comprobar si un valor es nulo utilizaremos IS NULL, y para averiguar si no lo es, IS NOT NULL. El formato es:
Ejemplo de uso del predicado IS NULL
Un ejemplo de uso de este predicado sería “Queremos saber el código y el nombre de todos los empleados que no están asignados a ningún proyecto”:
codigo_emple |
nombre_emple |
---|---|
8 | Sergio |
Obtendríamos la respuesta que tenemos al margen.
5) Predicados ANY/SOME y ALL
Los predicados ANY/SOME |
Podemos elegir cualquiera de los predicados para pedir que alguna fila satisfaga una conducción. |
Para ver si una columna cumple que todas sus filas (ALL) o algunas de sus filas (ANY/SOME) satisfagan una condición, podemos hacer:
Ejemplo de uso de los predicados ALL y ANY/SOME
a) Veamos un ejemplo de aplicación de ALL para encontrar los códigos y los nombres de los proyectos en los que los sueldos de todos los empleados asignados son menores que el precio del proyecto:
codigo_proyec | nombre_proyec |
---|---|
1 | GESCOM |
2 | PESCI |
3 | SALSA |
4 | TINELL |
Fijémonos en la condición de WHERE de la subconsulta, que nos asegura que los sueldos que observamos son los de los empleados asignados al proyecto de la consulta. La respuesta a esta consulta sería la que aparece en el margen.
b) A continuación, presentamos un ejemplo de ANY/SOME para buscar los códigos y los nombres de los proyectos que tienen algún empleado que gana un sueldo más elevado que el precio del proyecto en el que trabaja.
codigo_proyec | nombre_proyec |
---|---|
La respuesta a esta consulta está vacía, como se ve en el margen.
6) Predicado EXISTS
Para comprobar si una subconsulta produce alguna fila de resultados, podemos utilizar la sentencia denominada test de existencia: EXISTS. Para comprobar si una subconsulta no produce ninguna fila de resultados, podemos utilizar NOT EXISTS.
Ejemplo de uso del predicado EXISTS
codigo_empl | nombre_empl |
---|---|
1 |
María |
2 | Pedro |
3 | Ana |
4 | Jorge |
5 | Clara |
6 | Laura |
7 | Rogelio |
Un ejemplo en el que se buscan los códigos y los nombres de los empleados que están asignados a algún proyecto sería:
La respuesta a esta consulta sería la que se muestra en el margen.