Professional Documents
Culture Documents
FUNCIÓN COUNT
Creamos la tabla:
select count(*)
from libros;
Note que incluye todos los libros aunque tengan valor nulo en algún campo.
select count(*)
from libros
where editorial='Planeta';
Contamos los registros que tienen precio (sin tener en cuenta los que tienen valor nulo), usando
la función "count(precio)":
select count(precio)
from libros;
FUNCIÓN GROUP BY
Creamos la tabla:
Queremos saber la cantidad de libros de cada editorial, utilizando la cláusula "group by":
select editorial, count(*)
from libros
group by editorial;
El resultado muestra los nombres de las editoriales y la cantidad de registros para cada valor del
campo. Note que los valores nulos se procesan como otro grupo.
La salida muestra los nombres de las editoriales y la cantidad de registros de cada una, sin contar
los que tienen precio nulo.
Para conocer el total en dinero de los libros agrupados por editorial, tipeamos:
Obtenemos el máximo y mínimo valor de los libros agrupados por editorial, en una sola sentencia:
select editorial,
max(precio) as mayor,
min(precio) as menor
from libros
group by editorial;
Es posible limitar la consulta con "where". Vamos a contar y agrupar por editorial considerando
solamente los libros cuyo precio es menor a 30 pesos:
Note que las editoriales que no tienen libros que cumplan la condición, no aparecen en la salida.
Para que aparezcan todos los valores de editorial, incluso los que devuelven cero o "null" en la
columna de agregado, debemos emplear la palabra clave "all" al lado de "group by":
Creamos la tabla:
Queremos saber la cantidad de libros agrupados por editorial pero considerando sólo algunos
grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instrucción:
Queremos el promedio de los precios de los libros agrupados por editorial, pero solamente de
aquellos grupos cuyo promedio supere los 25 pesos:
Queremos la cantidad de libros, sin considerar los que tienen precio nulo (where), agrupados por
editorial (group by), sin considerar la editorial "Planeta" (having):
Necesitamos el promedio de los precios agrupados por editorial, de aquellas editoriales que
tienen más de 2 libros:
Buscamos el mayor valor de los libros agrupados y ordenados por editorial y seleccionamos las
filas que tienen un valor menor a 100 y mayor a 30:
SELECT DISTINCT
Creamos la tabla:
Note que aparece "null" como un valor para "autor"· Para obtener la lista de autores conocidos, es
decir, no incluyendo "null" en la lista:
La combinamos con "where" para obtener los distintos autores de la editorial "Planeta":
Contamos los distintos autores que tiene cada editorial empleando "group by":
Mostramos los títulos y editoriales de los libros sin repetir títulos ni editoriales:
Note que los registros no están duplicados, aparecen títulos iguales pero con editorial diferente,
cada registro es diferente.
CLAUSULA TOP
Creamos la tabla:
Mostramos los títulos y autores de los 3 primeros libros ordenados por autor:
Realizamos la misma consulta anterior pero empleamos la cláusula "with ties", con lo cual
incluiremos en la selección, todos los registros que tengan el mismo autor que el último registro
retornado, aunque pasemos de 3:
Note que retorna los 5 primeros registros porque incluye los dos siguientes que tienen el mismo
valor que el último en el campo "autor" (por el cual se ordena).
select titulo,precio,
precio-(select max(precio) from libros) as diferencia
from libros
where titulo='Uno';
SUBCONSULTAS CON IN
Queremos conocer el nombre de las editoriales que han publicado libros del autor "Richard Bach":
select nombre
from editoriales
where codigo in
(select codigoeditorial
from libros
where autor='Richard Bach');
Probamos la subconsulta separada de la consulta exterior para verificar que retorna una lista de
valores de un solo campo:
select codigoeditorial
from libros
where autor='Richard Bach';
También podemos buscar las editoriales que no han publicado libros de "Richard Bach":
select nombre
from editoriales
where codigo not in
(select codigoeditorial
from libros
where autor='Richard Bach');
SUBCONSULTAS ANY-SOME-ALL
Mostramos los títulos de los libros de "Borges" de editoriales que han publicado también libros de
"Richard Bach":
select titulo
from libros
where autor like '%Borges%' and
codigoeditorial = any
(select e.codigo
from editoriales as e
join libros as l
on codigoeditorial=e.codigo
where l.autor like '%Bach%');
select titulo
from libros
where autor like '%Borges%' and
codigoeditorial = all
(select e.codigo
from editoriales as e
join libros as l
on codigoeditorial=e.codigo
where l.autor like '%Bach%');
Mostramos los títulos y precios de los libros "Borges" cuyo precio supera a ALGUN precio de los
libros de "Richard Bach":
select titulo,precio
from libros
where autor like '%Borges%' and
precio > any
(select precio
from libros
where autor like '%Bach%');
select titulo,precio
from libros
where autor like '%Borges%' and
precio > all
(select precio
from libros
where autor like '%Bach%');
EXIST Y NO EXIST
Un comercio que vende artículos de librería y papelería almacena la información de sus ventas en
una tabla llamada "facturas" y otra "detalles".
Eliminamos las tablas si existen:
Empleamos una subconsulta correlacionada con un operador "exists" en la cláusula "where" para
devolver la lista de clientes que compraron el artículo "lapiz":
select cliente,numero
from facturas as f
where exists
(select *from detalles as d
where f.numero=d.numerofactura
and d.articulo='lapiz');
Un comercio que vende artículos de librería y papelería almacena la información de sus ventas en
una tabla llamada "facturas", otra "detalles" y otra "clientes".
Eliminamos las tablas si existen:
Vamos a realizar un "select" para recuperar el número de factura, el código de cliente, la fecha y
la suma total de todas las facturas:
select f.*,
(select sum(d.precio*cantidad)
from detalles as d
where f.numero=d.numerofactura) as total
from facturas as f;
Ahora utilizaremos el resultado de la consulta anterior como una tabla derivada que emplearemos
en lugar de una tabla para realizar un "join" y recuperar el número de factura, el nombre del
cliente y el monto total por factura:
select td.numero,c.nombre,td.total
from clientes as c
join (select f.*,
(select sum(d.precio*cantidad)
from detalles as d
where f.numero=d.numerofactura) as total
from facturas as f) as td
on td.codigocliente=c.codigo;
Note que para referenciar la tabla derivada debimos colocar un alias a la consulta.
SUBCONSULTA UPDATE-DELETE
Eliminamos todos los libros de las editoriales que tiene publicados libros de "Juan Perez":
SUBCONSULTA INSERT
Problema:
Un profesor almacena las notas de sus alumnos en una tabla llamada "alumnos" (documento,
nombre, nota). Tiene otra tabla llamada "aprobados" (documento,nota) en la que guarda los
alumnos que han aprobado el ciclo.
Eliminamos las tablas si existen:
Note que no se listan los campos en los cuales se cargan los datos porque tienen el mismo nombre
que los de la tabla de la cual extraemos la información.