Computación Web (2023/24)

Práctica 4: SQL (II)

Inserción de filas

La base de datos de la práctica anterior solo contiene datos de los países de la Unión Europea. Amplíala con los datos de Islandia, Noruega, Suiza y Turquía. Incluye poblaciones y capitales, pero no idiomas. Puedes tomar las poblaciones de Eurostat (toma solo los datos de 2022 y 2023 de estos países). Comprueba que los datos se hayan insertado correctamente.

Consultas con LEFT JOIN

Realiza una consulta que devuelva filas país-idioma. Para los países con varios idiomas deben aparecer varias filas. Para los países nuevos, cuyo idioma no consta en la base de datos, debe aparecer una fila con el país y un NULL en la posición del idioma. Utiliza para ello LEFT JOIN.

+------------------+-------------+
| País             | Idioma      |
+------------------+-------------+
| Alemania         | alemán      |
| Austria          | alemán      |
| Bélgica          | alemán      |
| Bélgica          | francés     |
| Bélgica          | neerlandés  |
| Bulgaria         | búlgaro     |
| Chipre           | griego      |
(...)
| Suecia           | sueco       |
| Islandia         | NULL        |
| Noruega          | NULL        |
| Suiza            | NULL        |
| Turquía          | NULL        |
+------------------+-------------+

Consultas con autocombinación

Ejecuta consultas SQL para obtener los siguientes datos:

  1. Los países en que haya caído la población de un año al siguiente, y los años en que haya ocurrido. Vuelca la salida en el formato siguiente:
    +------+------+-----------+------+-----------+
    | pais | anyo | poblacion | anyo | poblacion |
    +------+------+-----------+------+-----------+
    |    1 | 2020 |  83166711 | 2021 |  83155031 |
    |    4 | 2012 |   7327224 | 2013 |   7284552 |
    |    4 | 2013 |   7284552 | 2014 |   7245677 |
    |    4 | 2014 |   7245677 | 2015 |   7202198 |
    |    4 | 2015 |   7202198 | 2016 |   7153784 |
    |    4 | 2016 |   7153784 | 2017 |   7101859 |
    |    4 | 2017 |   7101859 | 2018 |   7050034 |
    |    4 | 2018 |   7050034 | 2019 |   7000039 |
    |    4 | 2019 |   7000039 | 2020 |   6951482 |
    |    4 | 2020 |   6951482 | 2021 |   6916548 |
    |    4 | 2021 |   6916548 | 2022 |   6838937 |
    |    4 | 2022 |   6838937 | 2023 |   6447710 |
    |    5 | 2013 |    865878 | 2014 |    858000 |
    |    5 | 2014 |    858000 | 2015 |    847008 |
    (...)
  2. Lo mismo que en el apartado anterior, pero con el nombre de cada país en vez de su identificador:
    +------------------+------+-----------+------+-----------+
    | nombre           | anyo | poblacion | anyo | poblacion |
    +------------------+------+-----------+------+-----------+
    | Alemania         | 2020 |  83166711 | 2021 |  83155031 |
    | Bulgaria         | 2012 |   7327224 | 2013 |   7284552 |
    | Bulgaria         | 2013 |   7284552 | 2014 |   7245677 |
    | Bulgaria         | 2014 |   7245677 | 2015 |   7202198 |
    | Bulgaria         | 2015 |   7202198 | 2016 |   7153784 |
    | Bulgaria         | 2016 |   7153784 | 2017 |   7101859 |
    | Bulgaria         | 2017 |   7101859 | 2018 |   7050034 |
    | Bulgaria         | 2018 |   7050034 | 2019 |   7000039 |
    | Bulgaria         | 2019 |   7000039 | 2020 |   6951482 |
    | Bulgaria         | 2020 |   6951482 | 2021 |   6916548 |
    | Bulgaria         | 2021 |   6916548 | 2022 |   6838937 |
    | Bulgaria         | 2022 |   6838937 | 2023 |   6447710 |
    | Chipre           | 2013 |    865878 | 2014 |    858000 |
    | Chipre           | 2014 |    858000 | 2015 |    847008 |
    (...)
  3. Lo mismo que en los apartados anteriores, pero en este caso mostrando las ocurrencias de subidas de más de un 1% en población de un año al siguiente:
    +------------------+------+-----------+------+-----------+
    | nombre           | anyo | poblacion | anyo | poblacion |
    +------------------+------+-----------+------+-----------+
    | Alemania         | 2015 |  81197537 | 2016 |  82175684 |
    | Alemania         | 2022 |  83237124 | 2023 |  84358845 |
    | Austria          | 2015 |   8584926 | 2016 |   8700471 |
    | Austria          | 2022 |   8978929 | 2023 |   9104772 |
    | Bélgica          | 2022 |  11617623 | 2023 |  11754004 |
    | Chipre           | 2017 |    854802 | 2018 |    864236 |
    | Chipre           | 2018 |    864236 | 2019 |    875899 |
    | Chipre           | 2019 |    875899 | 2020 |    888005 |
    | Chipre           | 2022 |    904705 | 2023 |    920701 |
    | Dinamarca        | 2022 |   5873420 | 2023 |   5932654 |
    | España           | 2022 |  47432893 | 2023 |  48059777 |
    | Estonia          | 2022 |   1331796 | 2023 |   1365884 |
    (...)

Diseño y creación de tablas

Accede a otra de las bases de datos de las que dispones. Para ello, puedes ejecutar el comando USE nombre_de_base_de_datos, o salir del terminal y acceder de nuevo cambiando el valor del parámetro -D en la invocación a mysql.

En esta base de datos, crea las tablas que necesites para representar los libros en el catálogo de una librería. Para cada libro, almacena un identificador único, el título, ISBN como cadena de texto, editorial, año, precio en euros y autores.

Dado que un libro puede tener uno o más autores, y un autor puede serlo de uno o más libros, es necesario usar una tabla aparte con autores y otra con relaciones autor-libro, al igual que en el caso de idiomas y países en ejercicios anteriores.

Crea también una tabla aparte que almacene las unidades que tiene la librería en existencias de cada libro, y otra en que se almacenen las operaciones de venta (fecha y hora, libro vendido, y número de unidades vendidas). Recuerda añadir campos de identificador autoincrementales en las tablas en que lo creas conveniente.

Inserta unos cuantos datos de ejemplo y haz unas cuantas consultas para comprobar que todo es correcto. Te resultará útil la función "NOW()" de MySQL, que devuelve la fecha y hora actual. Puedes llamar a esta función desde la posición de la consulta de inserción donde necesites establecer este dato.