Ejercicios de SQL

(hoja 4ª, ejemplos con subconsultas)

Se parte de una base de datos BD2.mdb, con las tablas, campos y relaciones de la hoja 3ª : En la intrucción SELECT los nombres de los campos que se pueden seleccionar no son únicamente los de tablas, también se pueden coger nombres de consultas ( obtenidas previamente mediante SELECT y almacenadas en la BD, o escritas directamente en la instrucción)

Ejemplo 1º
Si se creó una consulta llamada conHoja3_3 ( la consulta que tenía todos los campos de las tres tablas relacionados), se puede crear una consulta que obtenga para cada señor la ciudad donde tiene casas de las dos formas siguientes: 1ª conHoja4_0 SELECT tblNOmbres.Nombre AS NOMBRE, tblCiudad.NombreCiudad AS CIUDAD FROM conHoja3_3; 2ª(conHoja4_1 SELECT tblNOmbres.Nombre AS NOMBRE, tblCiudad.NombreCiudad AS CIUDAD FROM (SELECT * FROM (tblCiudad INNER JOIN tblTienePisoEn ON tblCiudad.CodCiudad=tblTienePisoEn.CodCiudad) INNER JOIN tblNombres ON tblNOmbres.DNI= tblTienePisoEn.DNI);

Como se aprecia en esta segunda forma, el parámetro de FROM no es una tabla exactamente, sino el resultado de una consulta obtenida mediante SELECT, a esta consulta dentro de otra consulta se le llama subconsulta.

Ejemplo 2 º
El ejercicio hoja3_4, para obtener el nombre y el número de casas habíamos agrupado por dos campos DNI, Nombre para poder obtener lo pedido, resaltando que agrupar por Nombre sólo para poder sacar el Nombre era una solución poco eficiente. La instrucción SQL escrita era: ConHoja3_4
SELECT tblNombres.Nombre, Count(*) AS Ncasas FROM tblNombres INNER JOIN tblTienePisoEn ON tblNombres.DNI=tblTienePisoEn.DNI GROUP BY tblNombres.DNI, tblNombres.Nombre;

Nombre uno

Ncasas 2

dos tres cuatro

3 3 1

Este mismo problema utilizando una subconsulta( la grabamos como subconsulta3_4), sería 1º) Si escribimos la siguiente consulta, obtendríamos: subconsulta3_4
SELECT tblTienepisoEn.DNI, Count(*) AS Ncasas FROM tblTienePisoEN GROUP BY tblTienePisoEN.DNI;

Donde sólo se agrupa por el campo DNI Y hacemos un inner join de lo obtenido, con la tabla tblNombres ConHoja4_2a
SELECT tblNombres.nombre, Ncasas FROM tblNombres INNER JOIN subconsulta3_4 ON tblNombres.DNI=subconsulta3_4.DNI;

DNI 11111 22222 33333 44444

Ncasas 2 3 3 1

Otra forma de obtener lo mismo, escribiendo directamente la consulta ConHoja4_2b
SELECT tblNombres.nombre, Ncasas FROM tblNombres INNER JOIN (SELECT tblTienepisoEn.DNI, Count(*) AS Ncasa sFROM tblTienePisoEn GROUP BY blTienePisoEn.DNI) as subAUX ON tblNombres.DNI=subAUX.DNI;

Ejemplo 3.: ( conHoja4_3) Supongamos que deseamos hacer una consulta que obtenga
los nombres de aquellos señores que no tienen ninguna casa.
(en tblTienePisoen , el señor con DNI=55555, no tiene piso )

Una forma distinta a la obtenida mediante LEFT JOIN ( ej. 7 de hoja3) utilizando subconsultas sería: 1º- Seleccionar los DNI de aquellos que tienen casa:
SELECT DISTINCT tblTienePisoEn.DNI FROM tblTienePisoEn;

2º- Seleccionar los nombres de señores que exiten en tblNombres y no están en la selección anterior.
SELECT tblNombres.DNI, tblNombres.NOMBRE FROM tblNombres WHERE tblNombres.DNI NOT IN (SELECT DISTINCT tblTienePisoEn.DNI FROM tblTienePisoEn);

Ejercicio 4º- Visualizar el (los) nombre(s) y el número de casas que tiene el (los) que más. . Los pasos podrían ser: • obtener el número de pisos que tiene cada señor.
( contar –count()- las casas agrupadas por señor)

obtener el número máximo de los obtenidos anteriormente – función

agregada MAX()-

• seleccionar el nombre de aquellos señores que el número de casas que tiene ( obtenido en el punto 1º) coincida con el máximo ( obtenido en el punto 2º).
Nombre dos tres TOTAL 3 3

Ejercicio 5º- Visualizar el(los) nombre(s) del (los) que tienen el mayor número de casas junto a las ciudades donde las poseen.
nombre dos dos dos tres tres tres NombreCiuda d Salamanca Zamora Zamora Salamanca Salamanca Salamanca

Ejercicio 6º - Obtener el (los) nombre(s) de ciudade(s) donde más casas hay, y el número de ellas.
NombreCiudad Salamanca Zamora PisosEnCiudad 4 4

Ejercicio 7º - Nombre (s) de ciudad(es) donde más casas hay, y el nombre de sus propietarios.
NombreCiudad Salamanca Salamanca Salamanca Salamanca Zamora Zamora Zamora Zamora nombre dos tres tres tres dos dos uno uno

Ejercicios de SQL

(hoja 6ª)

Partimos de la BD MSLibros, con las siguientes tablas:

Se quieren realizar las siguientes consultas:

1ª - conAutoresDelCuadroCombinado

con dos campos: IDAutor,y NombreA con el formato “apellidos,nombre,inicial” de todos los autores que haya en tblAutores, ordenados por NombreA.

SELECT IDAUTOR, APELLIDOS&"," & NOMBRE & INICIALNOMBRE AS NOMBREC FROM tblAutores;

2ª - conLibrosDelCuadroCombinado

con tres campos: NúmeroISBN, Título, NúmeroEdición de tblLibros, ordenados por títulos y número de edición.
SELECT NúmeroISBN, Título, NúmeroEdición FROM tblLibros ORDER BY Título, NúmeroEdición

3ª - cEjempAlgúnLibro Nombre de autores que hayan escrito algún libro.

SELECT DISTINCT IDAUTOR, Nombre+ Apellidos FROM tblAutores INNER JOIN tblAutorLibro ON tblAutores.IDAutor = tblAutorLibro.IDAutor WHERE IDAutor IN (SELECT DISTINCT IDAutor FROM tblAutorLibro)

4ª - cEjempAutorYNumeroDeLibros Nombres de autores y número de libros que han escrito ordenados de mayor a menor nº de libros

SELECT nombre, apellidos, nlibros FROM tblautores INNER JOIN [SELECT idautor,count(*) as nlibros FROM tblAutorlibro GROUP BY IDAUTOR]. AS aux ON tblautores.idautor=aux.idautor ORDER BY nlibros DESC;

5ª - cEjempAutorSinLibro.

Nombres de Autores que no hayan escrito ningún libro.
SELECT * FROM TBLAUTORES WHERE IDAUTOR NOT IN (SELECT DISTINCT IDAUTOR FROM TBLAUTORLIBRO);

SELECT * FROM TBLAUTORES LEFT JOIN TBLAUTORLIBRO ON TBLAUTORES.IDAUTOR=TBLAUTORLIBRO.IDAUTOR WHERE tblautorlibro.NúmeroISBN is NULL

6ª - conEjempLibrosYAutores Consulta que informe acerca de los libros y sus autores con todos los campos de tblLibros (tblLibros.*) y todos los campos de tblAutores.

SELECT * FROM tblLibros INNER JOIN (tblAutores INNER JOIN tblAutorLibro ON tblAutores.IDAutor = tblAutorLibro.IDAutor) ON tblLibros.NúmeroISBN = tblAutorLibro.NúmeroISBN;

7ª - conAutoresLibros

Consulta que obtenga el ISBN, Título,NúmSeq, Apellidos ,Nombre e Inicial, de todos los libros ordenados por ISBN, y dentro de él por número de secuencia (NúmSeq= orden de autor) 8ª - conAutoresOrdenados Consulta con todos los campos de tblAutores, ordenados por Apellidos. 9ª - conLibrosAutor Consulta con ISBN, IDAutor, NumSeq, Título del libro y Número de Edición
Ordenada por número ISBN.

10ª conLibrosOrdenados

Todos los campos de tblLibros, ordenados por Título y Número de Edición.

Ejercicios de SQL

(hoja 7ª)

Seguimos con MSLIBROS y con las tablas siguientes:

Las consultas a confeccionar son:

1º - conCategorías

Consulta que obtenga: IDCategoría, Categoría y NombreClase . SELECT IDCategoría, NombreClase, Categoría FROM tblClases INNER JOIN tblCategorías ON tblClases.IDClase = tblCategorías.IDClase;
2 º - conCategoríasDelCuadroCombinado Igual a la 1ª pero el orden de campos es el siguiente: Categoría, NombreClase e IDCategoría, ordenada por Categoría y por Nombre de Clase.

SELECT Categoría, NombreClase, IDCategoría FROM tblClases INNER JOIN tblCategorías ON tblClases.IDClase = tblCategorías.IDClase ORDER BY Categoría, NombreClase

3º - conCategoríasAutor Cada Autor tiene varios libros, cada libro puede ser de varias categorías. Se quiere una consulta que obtenga para cada autor las categorías de libros que tiene. Basta con IDAutor y IDCategoria.

SELECT tblAutores.IDAutor, tblAutores.Nombre, tblCategorías.IDCategoría FROM (tblLibros INNER JOIN (tblAutores INNER JOIN tblAutorLibro ON tblAutores.IDAutor = tblAutorLibro.IDAutor) ON tblLibros.NúmeroISBN = tblAutorLibro.NúmeroISBN) INNER JOIN (tblCategorías INNER JOIN tblCategoríasLibro ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría) ON tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN;

4º - conEjempCategoríasAutor

Igual que la 3º, pero con nombre de autor, título del libro, nombre de la categoría y de la clase de libro; ordenado por autores y por categoría. SELECT tblAutores.Nombre, tblLibros.Título, tblCategorías.Categoría, tblClases.NombreClase FROM (tblLibros INNER JOIN (tblAutores INNER JOIN tblAutorLibro ON tblAutores.IDAutor = tblAutorLibro.IDAutor) ON tblLibros.NúmeroISBN = tblAutorLibro.NúmeroISBN) INNER JOIN (tblClases INNER JOIN (tblCategorías INNER JOIN tblCategoríasLibro ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría) ON tblClases.IDClase = tblCategorías.IDClase) ON tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN ORDER BY tblAutores.Nombre, tblCategorías.Categoría

5º - conCategoríasLibro

Para cada referencia de libro que aparece en tblCategoríasLibros, consulta que contiene númeroISBN, IDCategoria, NombreClase y Categoría. SELECT tblLibros.NúmeroISBN, tblCategorías.IDCategoría, tblClases.NombreClase, tblCategorías.Categoría FROM tblLibros INNER JOIN (tblClases INNER JOIN (tblCategorías INNER JOIN tblCategoríasLibro ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría) ON tblClases.IDClase = tblCategorías.IDClase) ON tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN;
6º - cEjempCategoríasLibroMS-DOS Consulta que obtenga ISBN y Título de los libros catalogados como IDCategoría= 25 (”MS-DOS”)

SELECT tblLibros.NúmeroISBN, tblLibros.Título FROM tblLibros INNER JOIN (tblCategorías INNER JOIN tblCategoríasLibro ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría) ON tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN WHERE tblCategorías.IDCategoría=25

7º - cEjempClasesLibrosS-O Consulta que obtenga ISBN y Título de los libros catalogados con IDClase=1 (”Sistema operativo”)

SELECT tblLibros.NúmeroISBN, tblLibros.Título, tblClases.IDClase FROM tblClases INNER JOIN (tblCategorías INNER JOIN (tblLibros INNER JOIN tblCategoríasLibro ON tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN) ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría) ON tblClases.IDClase = tblCategorías.IDClase WHERE tblClases.IDClase=1

8º - cEjempCategoríasLibroACCESS Consulta que obtenga ISBN , Título y Autor (es) de los libros catalogados como IDCategoría=4 (”Microsoft Access”).

SELECT tblLibros.NúmeroISBN, tblLibros.Título, tblAutores.Nombre FROM (tblLibros INNER JOIN (tblAutores INNER JOIN tblAutorLibro ON tblAutores.IDAutor = tblAutorLibro.IDAutor) ON tblLibros.NúmeroISBN = tblAutorLibro.NúmeroISBN) INNER JOIN (tblCategorías INNER JOIN tblCategoríasLibro ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría) ON tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN WHERE tblCategorías.IDCategoría=4

9º - cEjempCategoríasLibroVisualBasic Consulta que obtenga Títulos de libros catalogados como IDCategoría= 8 (”Visual Basic”)

SELECT tblLibros.Título, tblCategorías.IDcategoría FROM tblLibros INNER JOIN (tblCategorías INNER JOIN tblCategoríasLibro ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría) ON tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN WHERE tblCategorías.IDCategoría=8

10º - CejempTodasCategoríasLibrosVisualBasic Para cada libro catalogado con categoría “Visual Basic”, visualizar las demás categorías que tiene el libro.

Ejercicios de SQL

(hoja 8ª)

Dentro de MSLibros , vamos a trabajar con las siguientes tablas:

Realizar las siguientes consultas: 1º - conClientesdelCuadroCombinado De tblClientes, IDClientes,NombreC( apellidos,”,”,nombre y segundo nombre( la incial) como en conAutoresdelCuadroCombinado) , Ciudad, ordenado por NombreC.

SELECT ciudad FROM tblClientes ORDER BY ciudad

2º - conLibreríasdelCuadroCombinado

De tblLibrerías, los campos IDLibrería, NombreLibrería, y el tercer campo la unión del texto de la Ciudad y Estado separados por coma ( ej.: “Berkeley, CA”) ordenadas por: EstadoOProvincia,Ciudad y nombre de librería
SELECT IDLibrería, NombreLibrería, CIUDAD+","+ESTADOOPROVINCIA FROM tblLibrerías ORDER BY ESTADOOPROVINCIA, CIUDAD, NOMBRELIBRERÍA

3º - conClientesOrdenados

Todos los campos de tblClientes, ordenados por Apellidos,Nombre,SegundoNombre.
4º - conLibreríasOrdenadas

Todos los campos de tblLibrerías ordenados por CódigoPostal, y dentro de él por Nombre de Librería. 5º - cEjempLibrosPedidos Por cada línea de detalle de tblDetallesPedidos, obtener una línea de consulta con el contenido como el siguiente: ( debe estar ordenado por IdPedido)
ID Pedido1 1 1 1 2 Cliente 7 7 7 7 1 Título Running Microsoft® PowerPoint® for Windows® 95 97 Step by Step Microsoft® Excel Understanding Groupware in the Enterprise to Microsoft® Access Field Guide 2 for Windows® Running Microsoft® Windows® 98 Cantidad 11 9 8 2 4

SELECT tblDetallesPedido.IDPedido, tblPedidos.IDCliente, tblLibros.título, tblDetallesPedido.cantidad FROM tblLibros INNER JOIN (tblPedidos INNER JOIN tblDetallesPedido ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido) ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN ORDER BY tblDetallesPedido.IDPedido;

6º - cEjempImporteLibrosPedidos Igual al anterior pero teniendo en cuenta que IMPORTE= cantidad*preciosug DTO=IMPORTE*descuento COSTE=IMPORTE-DTO
ID Cli Título Cant Precio IMPORTE Pedi ent Running Microsoft® PowerPoint® idad 1 7 11 25 275 1 7 for Windows® 95 97 Step by Step Microsoft® Excel 9 30 270 1 7 Understanding Groupware in the 8 20 160 1 7 Enterprise to Microsoft® Access Field Guide 2 10 20 2 1 2 for Windows® Running Microsoft® Windows® 4 40 160 98 DTO 27,5 13,5 8 0 0 COSTE 247,5 256,5 152 20 160

SELECT tblDetallesPedido.IDPedido, tblPedidos.IDCliente, tblLibros.título, tblDetallesPedido.cantidad, tblLibros.PrecioSug AS PRECIO, tblLibros.PrecioSug*tblDetallesPedido.Cantidad AS IMPORTE, IMPORTE*tblDetallesPedido.Descuento AS DTO, IMPORTE-DTO AS COSTE FROM tblLibros INNER JOIN (tblPedidos INNER JOIN tblDetallesPedido ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido) ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN ORDER BY tblDetallesPedido.IDPedido; 7 º - cEjempImportesporPedido
ID Fecha Pedido Cliente Ciudad Envío Pedido1 01/01/99 7 London 2 01/01/99 1 Seattle 3 01/01/99 8 Bellevue TOTAL 676 656 436,25

con el total del importe de cada pedido

SELECT tblPedidos.IDPedido, SUM(COSTE) AS TOTAL FROM tblPedidos INNER JOIN cEjempImporteLibrosPedidos ON tblPedidos.IDPedido = cEjempImporteLibrosPedidos.IDPedido GROUP BY tblPedidos.IDPedido

SELECT tblPedidos.IDPedido, tblPedidos.FechaPedido, tblPedidos.IDCliente, tblPedidos.CiudadEnvío, TOTAL FROM tblPedidos INNER JOIN subCejemImportesporPedido ON tblPedidos.IDPedido = subCejemImportesporPedido.IDPedido;

Ejercicios de SQL

(hoja 9ª )

1º cEjempMayorPedidoPorCódigoPostal

( código Postal de Pedidos)

Partiendo de cEjempImportesporPedido Obtener el mayor importe neto de cada código postal.

¿y si además se quisiera el IDPedido de ese importe máximo?

SELECT tblPedidos.CódigoPostalEnvío, MAX(TOTAL) AS MaxTotaldePedido FROM tblPedidos INNER JOIN cEjempImportesporPedido ON tblPedidos.IDPedido = cEjempImportesporPedido.IDPedido GROUP BY tblPedidos.CódigoPostalEnvío

2º cEjempPromedioCiudades Partiendo de cEjempImportesporPedido, nombre de ventas. ciudades con el promedio de

SELECT tblPedidos.CiudadEnvío, AVG(TOTAL) AS MediaCiudad FROM cEjempImportesporPedido INNER JOIN tblPedidos ON cEjempImportesporPedido.IDPedido = tblPedidos.IDPedido GROUP BY tblPedidos.CiudadEnvío

3º cEjempPromedioCiudadesMenosDeMedia Partiendo de cEjempImportesporPedido, localizar las ciudades en las que el promedio de compras de los clientes es inferior al promedio de compras realizadas por todos los clientes.

SELECT AVG(TOTAL) AS MEDIATOTAL FROM tblPedidos INNER JOIN cEjempImportesporPedido ON tblPedidos.IDPedido = cEjempImportesporPedido.IDPedido;

SELECT cEjempPromedioCiudades.CiudadEnvío, cEjempPromedioCiudades.MediaCiudad FROM cEjempPromedioCiudades, subcEjempPromedioCiudadesMenosDeMedi WHERE MEDIACIUDAD<MEDIATOTAL;

4º cEjempPedidosenMes=6 Para cada día del mes 6 ( las facturas están entre 1/6/99 y 1/7/99) visualizar la suma de los pedidos de esos días. ( consultar ayuda de funciones de fechas: date(), year(),month(),
day() )

SELECT DAY(tblPedidos.FechaPedido) AS DiaMes_6, SUM(TOTAL) AS TotalDia FROM tblPedidos INNER JOIN cEjempImportesporPedido ON tblPedidos.IDPedido = cEjempImportesporPedido.IDPedido WHERE MONTH(tblPedidos.FechaPedido)=6 GROUP BY DAY(tblPedidos.FechaPedido)

5º cEjempMaxPedidosWA<2200 Obtener la media y el importe del pedido con cantidad máxima de cada uno de los meses , de los clientes del estado de Washington EstadoOProvincia=”WA”, con la condición de que la cantidad máxima del pedido se encuentre por debajo de 2200. ( para obtener el mes : Month(fechaPedido) )

SELECT MONTH(tblPedidos.FechaPedido) AS MES, AVG(TOTAL) AS MediaMes, MAX(TOTAL) AS MaximoDelMes

FROM tblPedidos INNER JOIN cEjempImportesporPedido ON tblPedidos.IDPedido = cEjempImportesporPedido.IDPedido WHERE tblPedidos.EstadoOProvinciaEnvío="WA" GROUP BY MONTH(tblPedidos.FechaPedido) HAVING (MAX(TOTAL)<2200)

6º -Nombre del Cliente, ciudad del Cliente, ciudad del Destino y cantidad del pedido con máximo importe.

SELECT TOP 1 * FROM subCejemImportesporPedido;

SELECT tblClientes.Nombre, tblClientes.Ciudad, tblPedidos.CiudadEnvío, TOTAL FROM [MAYOR PEDIDO] INNER JOIN (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) ON [MAYOR PEDIDO].IDPedido = tblPedidos.IDPedido;

7º - De cada mes el nº de pedidos realizados y el importe total de los pedidos realizados en ese mes.

SELECT tblPedidos.IDPedido, tblPedidos.FechaPedido, TOTAL FROM tblPedidos INNER JOIN cEjempImportesporPedido cEjempImportesporPedido.IDPedido; ON tblPedidos.IDPedido =

SELECT MONTH(FECHAPEDIDO) AS MES, COUNT(*)AS NPEDIDOS, SUM(TOTAL) AS TOTALMES FROM SUBHOJA9_7 GROUP BY MONTH(FECHAPEDIDO)

8º - De cada mes, el nombre del cliente que más: • • • Número de libros ha comprado Nº de pedidos ha realizado Más compras ( suma de sus pedidos) ha realizado