Ejercicios para usar SQL#

Esta es una colección de ejercicios con el lenguaje SQL para que puedas usar y reforzar lo que hayas visto en el curso de BD (BD - Bases de Datos) usando la Base de datos Hubway.

Consultas Básicas con SQL#

Con la tabla «stations»#

  1. ¿Cuánto es 25 * 8?

  2. Pero ponle el nombre al campo, que diga «Cálculo»

  3. Muestra todos los registros de la tabla stations

  4. Muestra el id y station de la tabla stations

  5. Muestra el registro con id = 3

  6. Muestra los registros con un id entre 5 y 8

  7. Muestra los registros con el id 8, 25, 60 y 130

  8. Muestra los registros cuyo id no esté entre 4 y 140

  9. ¿Y cuales serían los id, station y municipios para las station que empiezan por L?

  10. ¿Y los que empiezan por L, seguidos de cualquier caracter y luego una n?

  11. Muestra las estaciones ordenadas por municipality, de forma descendente

  12. Y que ponga «Ayuntamiento» en vez de «municipality» en el encabezado

  13. Muestra sólo 5 registros de la tabla

  14. ¿Cuales serían los 5 registros con el mayor valor de id?

  15. ¿Cual es el máximo valor de id?

  16. ¿Y el mínimo valor de lat (latitud)?

  17. ¿Cual es la station que está más al sur?

  18. ¿Cual es el valor medio de latitud?

  19. Muestra una tabla con municipality y el número de stations en cada una

  20. Muestra la tabla anterior, pero ordenada de mayor a menor cantidad de estaciones

  21. ¿Qué municipio es el que tiene mayor número de estaciones?

  22. Muestra los municipios que al menos tienen 25 estaciones

  23. Muestra los municipios, y la cantidad de estaciones. Pero sólo los municipios que su nombre empieza por B

  24. Muestra los municipios con la cantidad de estaciones que tienen. Pero sólo los municipio cuyo nombre empieza por B y las estaciones que empiezan por L

  25. Muestrame una tabla, con un solo valor que se llame «Texto» y que diga «El municipio $municipality tiene $stations estaciones de alquiler». Sustituyendo $municipality y $stations por los valores de los campos correspondientes.

Soluciones (tabla stations)
--¿Cuánto es 25 * 8?

select (25 * 8);

-- Pero ponle el nombre al campo, que diga «Cálculo»

select (25 * 8) AS "Cálculo";

-- Muestra todos los registros de la tabla stations

select * from stations;

-- Muestra el id y station de la tabla stations

select id, station from stations;

-- Muestra el registro con id = 3

select id, station from stations where id = 3;

-- Muestra los registros con un id entre 5 y 8

select id, station from stations where id between 5 and 8;

-- Muestra los registros con el id 8, 25, 60 y 130

select id, station from stations where id in (8, 25, 60, 130);

-- Muestra los registros cuyo id no esté entre 4 y 140

select id, station from stations where id not between 4 and 140;

-- ¿Y cuales serían los id, station y municipios para las station que empiezan por L?

select id, station, municipality from stations where station like 'L%';

-- ¿Y los que empiezan por L, seguidos de cualquier caracter y luego una n?

select id, station, municipality from stations where station like 'L_n%';

-- Muestra las estaciones ordenadas por municipality, de forma descendente

select station from stations order by municipality DESC;

-- Y que ponga «Ayuntamiento» en vez de «municipality» en el encabezado

select station, municipality AS "Ayuntamiento" from stations order by municipality DESC;

-- Muestra sólo 5 registros de la tabla

select station, municipality AS "Ayuntamiento" from stations order by municipality DESC limit 5;

-- ¿Cuales serían los 5 registros con el mayor valor de id?

select id, station from stations order by id ASC limit 5;

-- ¿Cual es el máximo valor de id?

select max(id) from stations;

-- ¿Y el mínimo valor de lat (latitud)?

select min(lat) from stations;

-- ¿Cual es la station que está más al sur?
--  Latitud -> menor valor

select min(lat) from stations;

-- ¿Cual es el valor medio de latitud?

select avg(lat) from stations;

-- Muestra una tabla con municipality y el número de stations en cada una

select municipality, count(station) from stations group by municipality;

-- Muestra la tabla anterior, pero ordenada de mayor a menor cantidad de estaciones

select municipality, count(station) numero_total from stations group by municipality order by numero_total DESC;

-- ¿Qué municipio es el que tiene mayor número de estaciones?

select municipality, count(station) numero_total from stations group by municipality order by numero_total DESC limit 1;

-- Muestra los municipios que al menos tienen 25 estaciones

select municipality, count(station) numero_total from stations group by municipality having numero_total > 25;

-- Muestra los municipios, y la cantidad de estaciones. Pero sólo los municipios que su nombre empieza por B

select municipality, count(station) numero_total from stations where municipality like 'B%' group by municipality;

-- Muestra los municipios con la cantidad de estaciones que tienen. Pero sólo los municipio cuyo nombre empieza por B y las estaciones que empiezan por L

select municipality, count(station) numero_total from stations where municipality like 'B%' and station like 'L%'  group by municipality;

-- Muestrame una tabla, con un solo valor que se llame «Texto» y que diga «El municipio $municipality tiene $stations estaciones de alquiler». Sustituyendo $municipality y $stations por los valores de los campos correspondientes.

select 'El municipio '     || municipality || ' tiene ' || count(station) || ' estaciones de alquiler' from stations group by municipality;

Con la tabla «trips»#

  1. ¿Cual fue el viaje más largo?

  2. ¿Y el más corto?

  3. ¿Cuantos viajes se han realizado?

  4. ¿Cual es la media de la duración de los viajes?

  5. Y si tienes en cuenta sólo los viajes reales (supongamos que son los que duran más de 1 minuto)

  6. Y la media, de los viajes reales, pero en minutos, sin decimales y con encabezado «Duración»

  7. ¿Cuantos viajes ha realizado la bicicleta B00550?

  8. ¿Cuántas bicicletas hay registradas?

  9. ¿Puedes mostrarme una tabla con las bicicletas y el número de viajes que han realizado?

  10. ¿Puedes mostrarme una tabla con las 10 bicicletas con más viajes nulos realizados (los de menos de 60 segundos?

  11. ¿Cual es la bicicleta que más se ha usado?

  12. ¿Qué bicicletas han sido usadas en más de 2.000 viajes?

  13. ¿Qué bicicletas han sido usadas en más de 2.000 viajes de al menos 3 minutos?

  14. ¿Quienes usan más el servicio, los hombres o las mujeres?

  15. ¿Cual es la media de los viajes de hombres mayores de 30 años?

Soluciones (tabla trips)
-- ¿Cual fue el viaje más largo?
-- El viaje con la duración más larga (no sería lo mismo que el id del viaje más largo)

select max(duration) from trips;

-- ¿Y el más corto?
select min(duration) from trips;

-- ¿Cuantos viajes se han realizado?
select count(id) from trips;

-- ¿Cual es la media de la duración de los viajes?

select avg(duration) from trips;

-- Y si tienes en cuenta sólo los viajes reales (supongamos que son los que duran más de 1 minuto)

select avg(duration) from trips where duration > 60;

-- Y la media, de los viajes reales, pero en minutos, sin decimales y con encabezado "Duración"

select round(avg(duration)) as "Duración" from trips where duration > 60;

-- ¿Cuantos viajes ha realizado la bicicleta B00550?

select count(id) from trips where bike_number = 'B00550';

-- ¿Cuántas bicicletas hay registradas?

select count(DISTINCT bike_number) from trips;

-- ¿Puedes mostrarme una tabla con las bicicletas y el número de viajes que han realizado?

select bike_number, count(id) from trips group by bike_number;

-- ¿Puedes mostrarme una tabla con las 10  bicicletas con más viajes nulos realizados (los de menos de 60 segundos?

select bike_number, count(id) from trips where duration < 60 group by bike_number order by count(id) DESC limit 10;

-- ¿Cual es la bicicleta que más se ha usado?

select bike_number, count(id) from trips group by bike_number order by count(id) DESC limit 1;

-- ¿Qué bicicletas han sido usadas en más de 2.000 viajes?

select bike_number, count(id) AS viajes from trips group by bike_number having viajes > 2000;

-- ¿Qué bicicletas han sido usadas en más de 2.000 viajes de al menos 3 minutos?

select bike_number, count(id) AS viajes from trips where duration > 180 group by bike_number having viajes > 2000;

-- ¿Quienes usan más el servicio, los hombres o las mujeres?

select gender, count(id) from trips group by gender;
select gender, count(id) from trips where gender <> '' group by gender;

-- ¿Cual es la media de los viajes de hombres mayores de 30 años

select avg(duration) from trips where gender = 'Male' and birth_date is not null and (2022 - birth_date) > 30;

Más consultas SQL#

  1. Selecciona los datos de la estación 114

  2. ¿Cuales son los 10 viajes que más duran que hayan salido de la estación 114?

  3. ¿Cuántos viajes se han hecho desde la estación 114?

  4. ¿Cual es el nombre de la estación de la que salió el viaje 15000?

  5. ¿Cual es el nombre de la estación a la que llegó el viaje 15000?

  6. ¿Cuales son los 10 viajes que más duran, que hayan salido de la estación que se llama «Fan Pier»?

  7. ¿Y cuantos viajes han salido y vuelto a la estación «Fan Pier»?

  8. ¿Cual serían los id y duración de viajes que han salido de la estación «Fan Pier» o «Ruggles Station / Columbus Ave.»?

  9. ¿Y cual es la duración total de los viajes, en horas, organizados por los nombres de las estaciones de origen del viaje, y de mayor a menor duración?

  10. Quisiera tener un informe que me diga, para las 5 estaciones con viajes de mayor duración «La estación N con id N fue el origen de N viajes»

Y una para pensar sería «¿Y cuántos viajes han salido de la estación Fan Pier y han llegado a la estación Ruggles Station / Columbus Ave.?»

Soluciones
select * from stations where id = 114;

select * from trips where start_station = 114 order by duration DESC limit 10;

select count(id) from trips where start_station = 114;

select S.id, S.station,T.id from trips T inner join stations S on (S.id = T.start_station)  where T.id = 15000;

select S.id, S.station,T.id from trips T inner join             stations S on (S.id = T.end_station)  where T.id = 15000;

select T.id, T.duration, S.station, T.start_station, T.end_station, S.id from trips T inner join stations S on (T.end_station = S.id)  where S.Station = 'Fan Pier' and T.start_station = T.end_station  order by duration DESC limit 10;

select count(T.id) from trips T inner join stations S on        (T.end_station = S.id)  where S.Station = 'Fan Pier' and        T.start_station = T.end_station;

select T.id, T.duration, T.start_station, S.station from trips T inner join stations S on (T.start_station = S.id)  where S.Station IN ('Fan Pier','Ruggles Station / Columbus Ave.') order by T.id;

select S.station, sum(T.duration / (60*60) ) as Total from stations S, trips T where T.start_station = S.id group by S.station order by Total DESC;

select ('La estación ' || S.station || ' con id ' || S.id || ' fue el origen de ' || count(T.id) || ' viajes que duraron, en total, ' ||  sum(T.duration / (60)) || ' horas' ) AS Informe from stations S, trips T where T.start_station = S.id group by S.station,S.id;