Está en la página 1de 21

BasesdeDatos Curso 2012-2013

Guión III (Select)

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.

Una primera aproximación: Consideramos una única tabla.

SELECT [DISTINCT] {* | columna [,columna] }


FROM tabla
[WHERE condición]
[ORDER BY columna [ASC |DESC] [,columna [ASC|DESC] ];

FROM: indica la tabla sobre la que se va a realizar la consulta

WHERE: se especifica la condición que deben cumplir las filas a mostrar.

SELECT : se indica las columnas a mostrar, para mostrar todas las columnas se utiliza *.

DISTINCT: es un modificador, se utilizan para que no aparezcan filas repetidas en el resultado.

Ejemplos ya utilizados:

select * from articulos;

select * from USER_CONS_COLUMNS


where table_name=’PROFESOR’

Queremos mostrar los CODC, CODA de facturas:

select coda,codc from facturas;

para evitar repeticiones:

select distinct coda,codc from facturas;

nota: es interesante que compruebes los ejemplos.

GuiónIII (Select) 1 de 21
BasesdeDatos Curso 2012-2013

ORDER BY : muestra ordenado el resultado de la consulta. La ordenación puede ser ascendente o


descendente [ASC|DESC] y puede basarse en una o varias columnas.

select nombre from clientes order by dni;

select coda,codc from facturas order by coda, codc;

select * from facturas


order by precio DESC, ctd;

Ejemplos con WHERE:

select * from facturas


where precio=1000;

probar con : precio<1000, precio>100 and ctd >3

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:

select nf, precio*ctd


from facturas
where nf<=10;

GuiónIII (Select) 2 de 21
BasesdeDatos Curso 2012-2013

select nf facturas, precio*ctd precio_total


from facturas
where nf<=10

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.

Comprobar los resultados :

select * from articulos


where pvp is not null

select * from articulos


where pvp is 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:

COUNT(*) :cuenta filas


COUNT(columna): cuenta valores no nulos
SUM(columna): suma los valores de la columna no nulos
MAX(columna): obtiene el máximo de la columna no nulos
MIN(columna): obtiene el mínimo de la columna no nulos
AVG(columna): obtiene la media de los valores de la columna no nulos.

Si ponemos el modificador DISTINCT, se tienen en cuenta los valores distintos y no nulos.

Para los siguientes datos:

La siguiente consulta devuelve:

GuiónIII (Select) 4 de 21
BasesdeDatos Curso 2012-2013

Obtener la edad máxima:

select max(edad) from datos;

esto nos devuelve 77, ¿cómo obtener el nombre de la persona cuya edad es la máxima?

Subconsultas

Esto es un ejemplo de las posibilidades del select.

select nombre
from datos
where edad=(select max(edad) from datos);

Más cláusulas:

Una segunda aproximación: Consideramos nuevas cláusulas.

SELECT [DISTINCT] {* | columna [,columna] }


FROM tabla
[WHERE condición]
[
GROUP BY columna[,columna]
[HAVING condición_para_el grupo]
]
[ORDER BY columna [ASC |DESC] [,columna [ASC|DESC] ];

La opción HAVING acompaña a la opción GROUP BY.

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:

select codc, count(*)


from facturas
group by codc;

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.

Buscar ejemplos aclaratorios

Consideremos la siguiente tabla:

Se trata de una serie de personas, tienen una


edad, peso y calle que pueden repetirse, incluso el
nombre.

Podemos formar grupos, por nombre, dentro de


estos por calles,

select * from datos


groub by nombre;

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

Se obtiene un listado de los distintos nombres.

si añadimos count(*), se sumarian los que hay repetidos:

Podemos preguntar por la edad media,


y edad máxima de
los juanes o de los pedros....

GuiónIII (Select) 7 de 21
BasesdeDatos Curso 2012-2013

Añadiendo AVG(edad), MAX(EDAD)

Podemos realizar un refinamiento agrupando por calles:

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:

1) si la orden tiene cláusula WHERE, se eliminan la filas que no la cumpla.


2) se forman los grupos especificados por la cláusula GROUP BY.
3) se suprimen los grupos que no satisfagan la cláusula HAVING.

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.

Subconsultas en la cláusula WHERE

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:

a) dos columnas: ... WHERE columnaA=columnaB

b) una columna y una constante ...WHERE nombre=’joaquin’;

c) una columna o una constante y una subconsulta

....WHERE edad=(select max(edad) from datos); corresponde al esquema general:

expresión operador (subconsulta)

Donde la subconsulta debe devolver un único valor (una fila con una columna), si devuelve más de un
valor, se produce un error.

operador puede ser {=,<>,>,<,>=,<=}

(expresión1, expresión2,...) operador (subconsulta)

Subconsulta: debe devolver una fila, con tantas columnas como expresiones antes del operador.

operador puede ser { =, <> }

select * from facturas


where (precio,ctd)=(select max(precio), max(ctd) from facturas)

Muestra las facturas que tienen cantidad y precio igual al máximo.

La subconsulta debe devolver una única fila.

GuiónIII (Select) 10 de 21
BasesdeDatos Curso 2012-2013

expresión IN (subconsulta)

subconsulta: devuelve una sola columna, pero varias valores

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.

(expresión1, expresión2,...) IN (subconsulta)

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.

extract(month from fecha): extrae el mes del campo fecha


extract(year from fecha) : extrae el año.

GuiónIII (Select) 11 de 21
BasesdeDatos Curso 2012-2013

expresión NOT IN (subconsulta)

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.

Número de clientes que no tienen facturas:

select count(*)
from clientes
where codc not in (select codc from facturas)

(expresión1, expresión2,...) NOT IN (subconsulta)

El predicado se evalúa a verdadero si no hay ningúna fila igual en la subconsulta.


Ejemplo: añade not al ejemplo del caso (expresión1, expresión2,...) IN (subconsulta).

expresión operador ANY (subconsulta)

subconsulta: debe devolver una sola columna.


operador {=,<>,<,>,>=,<=}

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.

El operador IN es equivalente a =ANY

Select nombre
from clientes
where codc =ANY (select codc from facturas)

(expresión1, expresión2,...) operador ANY (subconsulta)

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

expresión operador ALL (subconsulta)

subconsulta: debe devolver una sola columna


operador {=,<>,<,>,>=,<=}
El predicado se evalúa a verdadero si la comparación establecida por el operador es verdadera para
todos los valores de la columna devuelta por la subconsulta.

El operador NOT IN es equivalente a <>ALL

(expresión1, expresión2,...) operador ALL (subconsulta)

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.

select nombre from proveedores


where exists (select * from proveedores where ciudad='Albacete')

Muestra todos los proveedores ya que al menos hay uno en Albacete. La siguiente sentencia daría el
mismo resultado:

select nombre from proveedores


where exists (select ‘hola’ from proveedores where ciudad='Albacete')

GuiónIII (Select) 13 de 21
BasesdeDatos Curso 2012-2013

Subconsultas en la cláusula HAVING

Dentro de la cláusula HAVING, tambien pueden realizarse subconsultas..


Veamos algunos ejemplos:

select coda from suministros


group by coda
having count(*)>1 and (coda in (select coda from articulos where color='VERDE'))

Muestra los códigos de artículos suministrados por más de un proveedor y que corresponden con
artículos de color ‘VERDE’

Subconsultas en la cláusula FROM

Las subconsultas se utilizan para realizar una consulta sobre los resultados obtenidos de dicha
subconsulta.

select * from (select * from articulos);

select count(*),avg(ctd) from


(select nombre,ctd from articulos)

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.

Sintaxis un poco más detallada:

Select {tabla| alias_t}.columna [,{tabla| alias_t}.columna ]


from tabla1 alias_t1 [, tabla2 alias_t2]
where {tabla1|alias_t1}.columna OPERADOR {tabla1|alias_t1}.columna ....

Producto cartesiano

Select * from proveedores,monedas;

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.

Obtener el nombre del proveedor y el nombre de la moneda con la que trabaja.

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.

select proveedores.nombre, monedas.nombre from proveedores,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

Reunión simple o Equi reunión:

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:

select nombre from monedas


where pais not in (select pais from proveedores)

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}

los valores de las columnas que no se emparejan tomarán el valor NULL

El (null) de la fila 7 indica que Dólar no


ha sido utilizado por ningún proveedor.

La reunión externa muestra todas la filas de


una reunión simple así como las filas de la
tabla que no concuerdan con ninguna otra
fila de la otra tabla. El SGBD genera
NULLOS para aquellas columnas de la
tabla(+) que no pueden reunirse con las
filas de la otra tabla. En una reunión simple
estas filas no eran retornadas.

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:

a) la subconsulta es independiente de la orden en la que se encuentra, es decir, primero se realiza la


subconsulta (se ejecuta una sola vez) y dichos resultados se utilizan en la consulta padre:

select nombre from monedas


where pais not in (select pais from proveedores)

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.

b) Subconsulta correlacionada: La subconsulta depende de la orden que la incluye. La subconsulta se


evalúa para cada fila de la consulta padre:

Obtener los artículos, cuyo iva sea superior a la media del iva, de los artículos de su mismo color

select nombre from articulos a


where iva > (select avg(iva) from articulos
where color=a.color )

En la subconsulta: select avg(iva) from articulos


where color=a.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

Orden Select, operaciones de conjuntos { UNION, UNION ALL, INTERSECT, MINUS}

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.

Artículos con iva inferior a la media y artículos de color azul.

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.

Artículos por debajo de la media en el iva y que no son azules

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]

Cambiará todas las filas si no se especifica la condición WHERE.

Ejemplos:

update departamento
set nombre=upper(nombre) /* pone los nombres a mayúsculas */

update profesor /* cambiamos nombre y créditos */


set nombre=upper(nombre),creditos=creditos+2
where creditos<36

Ejemplo del segundo tipo:

update profesor p
set (nss)=(select to_char(creditos) from profesor where dni=p.dni)

GuiónIII (Select) 21 de 21

También podría gustarte