Vous êtes sur la page 1sur 24

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 Ncasas
uno 2
dos 3
tres 3
cuatro 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 DNI Ncasas
GROUP BY tblTienePisoEN.DNI; 11111 2
Donde sólo se agrupa por el campo DNI 22222 3
33333 3
Y hacemos un inner join de lo obtenido, con la tabla tblNombres 44444 1
ConHoja4_2a
SELECT tblNombres.nombre, Ncasas
FROM tblNombres INNER JOIN subconsulta3_4 ON tblNombres.DNI=subconsulta3_4.DNI;

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 TOTAL
dos 3
tres 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 NombreCiuda
dos d
Salamanca
dos Zamora
dos Zamora
tres Salamanca
tres Salamanca
tres Salamanca
Ejercicio 6º - Obtener el (los) nombre(s) de ciudade(s) donde más casas hay, y el número
de ellas.

NombreCiudad PisosEnCiudad
Salamanca 4
Zamora 4

Ejercicio 7º - Nombre (s) de ciudad(es) donde más casas hay, y el nombre de sus
propietarios.
NombreCiudad nombre
Salamanca dos
Salamanca tres
Salamanca tres
Salamanca tres
Zamora dos
Zamora dos
Zamora uno
Zamora 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 Cliente Título Cantidad
Pedido1 7 Running Microsoft® PowerPoint® 11
1 7 for Windows®
Microsoft® 95 97 Step by Step
Excel 9
1 7 Understanding Groupware in the 8
1 7 Enterprise
Field Guide to Microsoft® Access 2
2 1 2 for Windows®
Running Microsoft® Windows® 4
98

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 DTO COSTE
Pedi1 ent
7 Running Microsoft® PowerPoint® idad 11 25 275 27,5 247,5
for Windows®
1 7 Microsoft® 95 97 Step by Step
Excel 9 30 270 13,5 256,5
1 7 Understanding Groupware in the 8 20 160 8 152
Enterprise
1 7 Field Guide to Microsoft® Access 2 10 20 0 20
2 for Windows®
2 1 Running Microsoft® Windows® 4 40 160 0 160
98

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 TOTAL
Pedido1 01/01/99 7 London 676
2 01/01/99 1 Seattle 656
3 01/01/99 8 Bellevue 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 ciudades con el promedio de


ventas.

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 ON tblPedidos.IDPedido =


cEjempImportesporPedido.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

Vous aimerez peut-être aussi