Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Select
La sentencia SELECT consta de varias cláusulas (ver transparencias), iremos comentando con
ejemplos cada una de ellas. Todas y cada una de las consultas sobre una BDD es una sentencia
SELECT, más o menos compleja, por lo que su compresión es fundamental.
SELECT : se indica las columnas a mostrar, para mostrar todas las columnas se utiliza *.
Ejemplos ya utilizados:
GuiónIII (Select) 1 de 21
BasesdeDatos Curso 2012-2013
Expresiones en Select:
Se pueden incluir además de las columnas, expresiones que contengan columnas y constantes, dichas
expresiones pueden ser renombradas al mostrarlas en el resultado.
Queremos obtener de facturas su NF, y el precio total, dicho precio lo obtendríamos multiplicando la
columna precio, por la columna CTD, si CTD expresa la cantidad de artículos de dicha factura. Y
queremos además mostrar los resultado para las 10 primeras facturas:
GuiónIII (Select) 2 de 21
BasesdeDatos Curso 2012-2013
facturas en negrita no es la tabla, es el nombre que le hemos dado al campo nf, y precio_total, es como
hemos renombrado a la expresión precio*ctd. Comprobar el resultado.
Para renombrar una columna o expresión basta con poner el nuevo nombre a continuación de la
columna o expresión separado por un blanco.
Nulos
Cuando no se ha colocado un valor en una columna de una fila se dice que ésta es nula. Un nulo no es
un valor: un nulo quiere decir que no hay valor. Para saber si una columna es nula o no se utiliza el
operador
IS NULL, o IS NOT NULL.
funciones y operadores
Cada SGBD proporciona una serie de funciones y operadores para cada tipo de datos, cuyo uso se
explica en los manuales, por lo que no vamos a realizar una descripción detallada, son los habituales. Ya
hemos visto algunos, AND, <= ,IS NULL, IS NOT NULL, betwen x AND Y, etc.,
GuiónIII (Select) 3 de 21
BasesdeDatos Curso 2012-2013
Funciones de columna:
Vamos a ver cómo se pueden realizar operaciones a nivel de columna teniendo en cuenta todas las filas
de una tabla ( sin cláusula WHERE) o bien sólo algunas de ellas (con cláusula WHERE).
SQL proporciona una serie de funciones que se pueden utilizar en la cláusula SELECT y que actúan
sobre los valores de las columnas para realizar diversas operaciones: sumar, obtener el máximo,
mínimo, el valor medio.
Funciones habituales:
GuiónIII (Select) 4 de 21
BasesdeDatos Curso 2012-2013
esto nos devuelve 77, ¿cómo obtener el nombre de la persona cuya edad es la máxima?
Subconsultas
select nombre
from datos
where edad=(select max(edad) from datos);
Más cláusulas:
Cláusula GROUP BY
GROUP BY forma grupos con las filas que tienen en común los valores de una o varias columnas.
Sobre cada grupo se pueden aplicar las funciones de columna vistas anteriormente, llamandose ahora
funciones de grupo. Veamos el funcionamiento con algunos ejemplos:
Queremos obtener el número de facturas que tiene cada cliente. Dicha información podemos obtenerla
de la tabla facturas:
La anterior sentencia lo que realiza es lo siguiente: de la tabla facturas, separa las filas en grupos, en
cada grupo sólo hay facturas de un cliente (group by codc), formandose tantos grupos como clientes hay
con facturas. Para finalizar de cada grupo se muestra el código de cliente codc y el número de facturas
que hay en cada grupo (son las facturas de ese cliente, COUNT(*))
GuiónIII (Select) 5 de 21
BasesdeDatos Curso 2012-2013
Cláusula HAVING
En la cláusula HAVING, se utilizan las funciones de grupo para hacer restricciones sobre los grupos
formados.
Cuando se utiliza GROUP BY se obtiene una fila por cada uno de los grupos producidos. GROUP BY
parte de las filas de la tabla (o de aquellas que cumplen el predicado WHERE) y se agrupan en función
de los valores comunes en la columna o columnas especificadas en GROUP BY. Mediante la cláusula
HAVING se realiza una restricción sobre los grupos obtenidos por GROUP BY, seleccionándose
aquellos que cumplen el predicado establecido en la condición.
Es importante destacar que en la condición de la cláusula HAVING sólo pueden aparecer columnas por
las que se ha agrupado y funciones de grupo sobre cualquier otra columna de la tabla. Lo mismo ocurre
en la cláusula SELECT: sólo pueden mostrar columnas que aparecen en la cláusula GROUP BY y
funciones de grupo sobre cualquier otra columna. Cuando en las cláusulas SELECT o HAVING
aparecen columnas que no se han especificado en la cláusula GROUP BY y que tampoco están
afectadas por una función de grupo se produce un error.
no tiene sentido, ya que el * hace referencia a todos los atributos. Al poner groub by nombre, se
forman grupos clasificados por nombre, y es el nombre y funciones de grupo lo que podemos consultar.
GuiónIII (Select) 6 de 21
BasesdeDatos Curso 2012-2013
GuiónIII (Select) 7 de 21
BasesdeDatos Curso 2012-2013
Observa como anteriormente para maria la función count(*) valía 3 y ahora se produce un desdoble por
calles, teniendo para maria calle1 un valor de count(*) de 2 y para maria calle4 valor de 1, en total 3.
La edad media y máximo ahora se refieren además a las calles.
GuiónIII (Select) 8 de 21
BasesdeDatos Curso 2012-2013
Si queremos obtener únicamente aquellos cuya edad media sea superior a 30: utilizamos la cláusula
HAVING
Si no queremos que se consideren aquellas personas que su nombre es NULL, y calle es NULL
Proceso:
GuiónIII (Select) 9 de 21
BasesdeDatos Curso 2012-2013
Subconsultas
Podemos utilizar subconsultas (select...) en la cláusula WHERE para hacer restricciones sobre
filas. En la cláusula HAVING para hacer restricciones sobre grupos (de filas). En la cláusula FROM
para obtener una tabla a partir de la cual hacer otra consulta.
Veremos cómo utilizar los operadores IN, NOT IN, ANY, ALL con las subconsultas en los predicados
de las restricciones.
Las subconsultas se pueden anidar (poner unas dentro de otras) tanto como sea necesario, cada SGBD
tiene un cierto nivel máximo de anidamiento.
WHERE nos permite realizar restricciones sombre filas, WHERE <condición>, condición es un
predicado booleano que se evalúa, formado for comparaciones unidas por los operadores AND/OR.
Cada comparación involucra dos operandos que pueden ser los siguientes:
Donde la subconsulta debe devolver un único valor (una fila con una columna), si devuelve más de un
valor, se produce un error.
Subconsulta: debe devolver una fila, con tantas columnas como expresiones antes del operador.
GuiónIII (Select) 10 de 21
BasesdeDatos Curso 2012-2013
expresión IN (subconsulta)
Select nombre
from clientes
where codc IN (select codc from facturas)
La anterior consulta nos devuelve el nombre de los clientes que tienen alguna factura.
Subconsulta: debe devolver tantas columnas como las indicadas entre paréntesis antes de IN.
Las expresiones se evalúan y la fila que forma se compara con las filas devueltas por la subconsulta.
Entre la línea 4 y la 9 se tiene un ejemplo de este tipo de consulta. Se obtiene el código de clientes que
tienen facturas el mismo mes y año que el código de cliente ‘C1'.
Esto lo hemos combinado con una consulta del tipo anterior y hemos obtenido los nombre de los
clientes que cumplían la anterior condición.
GuiónIII (Select) 11 de 21
BasesdeDatos Curso 2012-2013
Cuando IN va negado, el predicado se evalúa a cierto si la expresión es distinta de todos los valores de
la columna devuelta por la subconsulta.
select count(*)
from clientes
where codc not in (select codc from facturas)
El predicado se evalúa a cierto si la comparación establecida por el operador es verdadera para alguno
de los valores de la columna devuelta por la subconsulta.
Select nombre
from clientes
where codc =ANY (select codc from facturas)
Subconsulta: debe devolver tantas columnas como las indicadas entre paréntesis
operador puede ser
{=,<>}
Línea 9 hemos
cambiado in por =ANY
GuiónIII (Select) 12 de 21
BasesdeDatos Curso 2012-2013
Subconsulta: debe devolver tantas columnas como las indicadas entre paréntesis
operador puede ser {=,<>}
Otro operador que se puede utilizar para hacer restricciones con subconsultas es el operador EXISTS,
EXISTS(subconsulta)
La subconsulta se evalúa para determinar si devuelve o no alguna fila. Si devuelve al menos una fila
EXISTS se evalúa a cierto. Si no devuelve ninguna fila EXISTS se evalúa a falso. En la ejecución de la
subconsulta, en cuanto se devuelve la primera fila, se devuelve verdadero, sin terminar de obtener el
resto de filas, el resultado de la consulta carece de interés (sólo importa si devuelve o no alguna fila).
NOT EXIST (subconsulta) la subconsulta se evalúa para determinar si devuelve o no alguna fila. Si
devuelve al menos un fila, NO EXIST se evalúa a falso. Si no devuelve ninguna fila, NOT EXISTS se
evalúa a cierto.
Obtener los nombre de los proveedores, si hay alguno que viva en Albacete.
Muestra todos los proveedores ya que al menos hay uno en Albacete. La siguiente sentencia daría el
mismo resultado:
GuiónIII (Select) 13 de 21
BasesdeDatos Curso 2012-2013
Muestra los códigos de artículos suministrados por más de un proveedor y que corresponden con
artículos de color ‘VERDE’
Las subconsultas se utilizan para realizar una consulta sobre los resultados obtenidos de dicha
subconsulta.
Una subconsulta puede aparecer además de dentro de otra consulta, en las sentencias: CREATE
TABLE, INSERT, UPDATE, DELETE)
GuiónIII (Select) 14 de 21
BasesdeDatos Curso 2012-2013
Select....reuniones
SELECT ....
FROM tabla [,tabla]
[WHERE condición].....
Hasta ahora para realizar las consultas hemos utilizado una única tabla.. Select permite utilizar en su
cláusula FROM más de una tabla. Si aparece más de una, aparecen separadas por ,.
Select *
from proveedores,monedas;
Una reunión es una orden SELECT que combina filas de dos o más tablas (vistas). La cláusula
WHERE determinará como se combinan las filas de las tablas.
Producto cartesiano
realiza el producto cartesiano de clientes con monedas, y muestra todos los atributos de clientes y
monedas, ya que no hay ninguna condición WHERE. Esto puede ser interesante, pero lo que realmente
va ha obtener información relevante es mediante la utilización de la cláusula WHERE.
La tabla proveedores tiene el campo país, que es clave foránea de monedas, sabiendo el país podemos
obtener el nombre de la moneda consultando el campo nombre de la tabla monedas.
obtendría todas las posibles combinaciones de nombre de proveedor con nombres de monedas, para
encontrar la solución debemos restringir las filas a aquellas que cumplan que el país de proveedores
coincida con el país de monedas, esto lo hacemos mediante la cláusula WHERE.
GuiónIII (Select) 15 de 21
BasesdeDatos Curso 2012-2013
Devuelve filas de dos o más tablas|vistas de acuerdo a una condición de igualdad, en nuestro ejemplo
que coincidan proveedor.pais=monedas.pais.
Reunión externa
Cuando realizamos una reunión simple se emparejan las filas de las tablas en función de la condición
impuesta en la cláusula WHERE. En nuestro caso anterior obtenemos nombre de proveedor y el nombre
de la moneda con la que trabaja dicho proveedor. Podemos preguntarnos si existe alguna moneda que
no esté relacionada con ningún proveedor (no utilizada). Las monedas que no han sido utilizadas
podemos obtenerlas con la siguiente consulta:
El resultado es : Dólar.
Partiendo de la reunión simple que nos daba nombre de proveedor y nombre de moneda, podemos
obtener además que filas de la relación de monedas no está relacionada con ninguna fila de la relación
proveedores, estas filas serían las monedas sin utilizar:
GuiónIII (Select) 16 de 21
BasesdeDatos Curso 2012-2013
Sintaxis:
SELECT columnas
FROM tabla1, tabla2
where {tabla1.columna=tabla2.columna(+) | tabla1.columna(+)=tabla2.columna}
GuiónIII (Select) 17 de 21
BasesdeDatos Curso 2012-2013
Un poco de sintaxis:
A la hora de utilizar las tablas en un select podemos definir un alias para la tabla. Un alias permite
asignar un nombre alternativo a una tabla, vista o expresión dentro de una consulta (para expresión ya
lo vimos)
Ejemplo:
select p.nombre,m.nombre
from proveedores p, monedas m
where p.pais=m.pais
En la cláusula FROM , definimos el alias de las tablas de la forma: tabla alias, de esta forma donde
antes debíamos poner el nombre de la tabla, ahora es suficiente con escribir el alias.
Una consulta dentro de otra orden SQL (no necesariamente un SELECT) es lo que hemos llamado
subconsulta, hay dos tipos de subconsulta:
select pais from proveedores se evalúa una vez, y la tabla resultado que contiene todos los países de
proveedores es utilizada para el select más externo.
Obtener los artículos, cuyo iva sea superior a la media del iva, de los artículos de su mismo color
Se obtiene el iva medio de los articulos del mismo color, que el articulo fijado por la consulta padre,
esto lo establece la condición color=a.color. Observa que dicha subconsulta depende de la fila que se
esté tratando en ese momento en la consulta padre.
GuiónIII (Select) 18 de 21
BasesdeDatos Curso 2012-2013
Combinan las filas de dos ordenes SELECT usando una operación de cojuntos. El número y tipo de
datos de las columnas seleccionadas por cada consulta debe ser el mismo.
UNION: retorna todas las filas únicas seleccionadas por las consultas.
UNION ALL: retorna todas las filas incluidas las duplicadas, seleccionadas por la consulta.
INTERSECT: retorna las filas seleccionadas por ambas consultas.
MINUS: son las filas que están en la primera consulta y no están en la segunda.
GuiónIII (Select) 19 de 21
BasesdeDatos Curso 2012-2013
Al hacer la intersección ha desaparecido el artículo veinte, ya que no cumple la condición de iva
menor que la media.
GuiónIII (Select) 20 de 21
BasesdeDatos Curso 2012-2013
Update
Se utiliza para modificar los valores de las columnas de una tabla.
Sintaxis:
UPDATE <tabla>
SET columna= expresión [,columna=expresion]...
[WHERE condión]
O bien
UPDATE <tabla>
SET (columna [,columna]...)= (subconsulta)
[WHERE condión]
Ejemplos:
update departamento
set nombre=upper(nombre) /* pone los nombres a mayúsculas */
update profesor p
set (nss)=(select to_char(creditos) from profesor where dni=p.dni)
GuiónIII (Select) 21 de 21