Está en la página 1de 20

Electiva Profundización Bases de Datos

Actividad 2
Práctica SQL: bases de datos relacionales
Objetivo

Fundamentar los principios de la administración y gestión de bases de datos


relacionales.

Realizar una nivelación conceptual del uso y manejo de sentencias SQL.

Creación de la base de datos

Selección de la Herramienta de Gestión de BD

Seleccione una herramienta de gestión de base de datos relacional la cual


pueda acceder, administrar y gestionar. De manera preferente use una
aplicación que pueda usar en la web, o en su defecto, instálela en su estación
de trabajo personal

Creación de perfil de usuario

Usando el correo electrónico institucional de la USCO, cree un perfil de usuario


en el portal remotemysql.com. Ingrese al portal con el perfil creado. De
manera opcional, puede instalar el gestor de base de dados MariaDB (MySql) y
la herramienta de administración phpMyAdmin, en su computador personal.

Creación de la base de datos

Cree una base de datos, con el nombre: u_europea

Consultas básicas en bases de datos relacionales

Carga de datos en la base de datos

En este ejercicio se trabajará con una base de datos sobre países de la Unión
Europea. En la base de datos creada, cargue los archivos  tablas.sql (Script
para creación de tablas) y datos.sql (Script de cargue de datos). Para ello,
utilice la herramienta de gestión de la base de datos, phpMyAdmin, por medio
de la opción Importar.
Pregunta:

- Cuáles deberían ser comandos equivalentes, desde la línea de comandos


interactivo (consola) de MySQL para importar estos dos archivos de scripts:

>use u_europea;

>source ../tablas.sql;

>source ../datos.sql;

Una vez cargados los datos, ingrese en la interfaz de la línea de comandos de


comandos interactivo mysql y examine los datos contenidos en cada tabla (los
comandos pueden variar dependiendo del SGBD):

> SHOW TABLES;


+-------------------+
| Tables_in_compweb |
+-------------------+
| Capitales |
| Idiomas |
| IdiomasPais |
| Paises |
| Poblaciones |
+-------------------+
5 rows in set (0.05 sec)

> DESCRIBE Paises;


+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| nombre | varchar(64) | NO | | | |
| capital | int(11) | NO | MUL | | |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

> SELECT * FROM Paises;


+----+------------------+---------+
| id | nombre | capital |
+----+------------------+---------+
| 1 | Alemania | 3 |
| 2 | Austria | 26 |
| 3 | Bélgica | 5 |
| 4 | Bulgaria | 23 |
| 5 | Chipre | 18 |
| 6 | Croacia | 28 |
| 7 | Dinamarca | 8 |
| 8 | Eslovaquia | 4 |
| 9 | Eslovenia | 14 |
| 10 | España | 17 |
| 11 | Estonia | 24 |
| 12 | Finlandia | 11 |
| 13 | Francia | 19 |
| 14 | Grecia | 2 |
| 15 | Hungría | 7 |
| 16 | Irlanda | 9 |
| 17 | Italia | 22 |
| 18 | Letonia | 21 |
| 19 | Lituania | 27 |
| 20 | Luxemburgo | 16 |
| 21 | Malta | 12 |
| 22 | Países Bajos | 1 |
| 23 | Polonia | 25 |
| 24 | Portugal | 13 |
| 25 | Reino Unido | 15 |
| 26 | República Checa | 20 |
| 27 | Rumanía | 6 |
| 28 | Suecia | 10 |
+----+------------------+---------+
28 rows in set (0.00 sec)

- Realice un diagrama relacional que muestre la estructura de la base de


datos creada. Inserte el diagrama creado.
Usuarios, permisos y roles
La siguiente tabla muestra el esquema de usuarios y permisos diseñado para la base de datos
creada. Para la gestión de la base de datos, se determina que deben existir los siguientes
usuarios:

Usuario Permiso
SELECT INSERT UPDATE DELETE CREATE DROP
admon X X X X X X
consultas X
auditoria X
destructor X X X
comprobado X X
r

Sentencias SQL para crear los usuarios anteriores con los permisos descritos

>create user 'admon'@'localhost' identified by 'password';

>grant all privileges on u_europea . * to 'admon'@'localhost';

>create user 'consultas'@'localhost' identified by 'password';

>grant select on u_europea . * to 'consultas'@'localhost';

>create user 'auditoria'@'localhost' identified by 'password';

>grant select on u_europea . * to 'auditoria'@'localhost';

>create user 'destructor'@'localhost' identified by 'password';

>grant select, create, delete on u_europea . * to 'destructor'@'localhost';

>create user 'comprobador'@'localhost' identified by 'password';

>grant select, update on u_europea . * to 'comprobador'@'localhost';

>flush privileges;

Sentencias SQL para revocar los permisos al usuario admon

>revoke all privileges on u_europea . * from 'admon'@'localhost';


Crear los usuarios con los siguientes permisos

Usuario: user1

Permisos: Permite crear tablas en la base de datos u_europea (la cual debe crear, con la tabla
personas cuyos campos serán idpersona, nombre, id_pais y domicilio y la tabla estados con los
campos id_estado, id_pais y nombre, permite solo realizar consultas a la tabla personas.

>create user 'user1'@'localhost' identified by 'password';

>grant create, insert on u_europea . * to 'user1'@'localhost';

DROP TABLE IF EXISTS Personas;

DROP TABLE IF EXISTS Estados;

CREATE TABLE Personas (

idPersona INT NOT NULL auto_increment,

nombre VARCHAR(64) NOT NULL,

idpais INT NOT NULL,

domicilio VARCHAR(64) NOT NULL,

PRIMARY KEY(idPersona)

);

CREATE TABLE Estados (

idEstado INT NOT NULL auto_increment,

idpais INT NOT NULL,

nombre VARCHAR(64) NOT NULL,

domicilio VARCHAR(64) NOT NULL,

PRIMARY KEY(idEstado)

);
grant select on u_europea . Personas to 'user1'@'localhost';

Usuario: user2

Permisos: Permite borrar tablas en la base de datos u_europea, permite solo realizar
actualizaciones a la tabla ciudades e insertar datos en la tabla ciudades

> create user 'user2'@'localhost' identified by 'password';

>grant delete on u_europea . * to 'user2'@'localhost';

> grant insert, update on u_europea .capitales to 'user2'@'localhost';

Usuario: user3

Permisos: tiene todos los privilegios sobre la tabla ciudades de la BD u_europea


> create user 'user3'@'localhost' identified by 'password';

> grant all privileges on u_europea . capitales to ' user3'@'localhost';

Consultas sobre una única tabla

Ejecute consultas SQL para obtener los siguientes datos (escriba en el


recuadro, la sentencia sql usada):

En la tabla de países, la fila con los datos del país 10.

>SELECT * FROM u_europea . paises where id=10;

En la tabla de poblaciones, las filas con los datos de 2016.


> SELECT * FROM u_europea . poblaciones where anyo = 2016;

En la tabla de poblaciones, las filas con los datos de 2010 a 2012, ambos
inclusive.

> SELECT * FROM u_europea . poblaciones where anyo between '2010' and '2012'
order by anyo;

En la tabla de poblaciones, las filas con población superior a 50 millones.

> SELECT * FROM u_europea . poblaciones where poblacion > 50000000;

En la tabla de poblaciones, las filas con identificador de país 10 anteriores a


2010.

> SELECT * FROM u_europea . poblaciones where pais=10 and anyo<2010;

En la tabla de poblaciones, las filas de 2007 o 2008 con menos de un millón de


población.
> SELECT * FROM u_europea . poblaciones where (anyo=2007 or
anyo=2008) and poblacion<1000000;

En la tabla de poblaciones, la población del país 10 año a año, de más reciente


a más antiguo.

> SELECT * FROM u_europea.poblaciones where pais = 10 order by anyo


desc;

Consultas agregadas

Ejecute consultas SQL para obtener los siguientes datos (escriba en el


recuadro, la sentencia sql usada):

La población total de la Unión Europea en 2016.

> SELECT SUM(poblacion) FROM u_europea.poblaciones where anyo=2016;


La población media en los países de la Unión Europea en 2016.

> SELECT AVG(poblacion) FROM u_europea.poblaciones where anyo=2016;

La población máxima, media y mínima de cada país de la Unión Europea en el


período del cual hay datos, con el siguiente formato:

+------+----------------+----------------+----------------+
| pais | MAX(poblacion) | AVG(poblacion) | MIN(poblacion) |
+------+----------------+----------------+----------------+
| 1 | 82500849 | 81540882.9167 | 80222065 |
| 2 | 8690076 | 8395137.2500 | 8201359 |
| 3 | 11311117 | 10898998.3333 | 10445852 |
| 4 | 7688573 | 7406697.5000 | 7153784 |
| 5 | 865878 | 812363.8333 | 733067 |
| 6 | 4313530 | 4279355.2500 | 4190669 |
(...)

> SELECT pais, MAX(poblacion), AVG(poblacion), MIN(poblacion) FROM


u_europea.poblaciones group by pais;

14. Los identificadores de los idiomas recogidos en la tabla IdiomasPais,


filtrando aquellos que sean duplicados, en orden descendente de identificador.

> SELECT distinct idioma FROM u_europea1.idiomaspais order by pais desc;


Consultas con INNER JOIN

Ejecuta consultas SQL para obtener los siguientes datos:

Un listado con el nombre de cada país y su capital, con el siguiente formato:

1. +------------------+------------+
2. | nombre | nombre |
3. +------------------+------------+
4. | Alemania | Berlín |
5. | Austria | Viena |
6. | Bélgica | Bruselas |
7. | Bulgaria | Sofía |
8. | Chipre | Nicosia |
9. (...)

> SELECT * from paises inner join capitales on paises.capital = capitales.id;

Repitae el apartado anterior, pero nombrando las columnas como


"País" y "Capital":

1. +------------------+------------+
2. | País | Capital |
3. +------------------+------------+
4. | Alemania | Berlín |
5. | Austria | Viena |
6. | Bélgica | Bruselas |
7. | Bulgaria | Sofía |
8. | Chipre | Nicosia |
9. (...)
> SELECT * from paises as País inner join capitales on paises.capital =
capitales.id as Capital;

Los países en que se hable alemán:

1. +------------+
2. | nombre |
3. +------------+
4. | Alemania |
5. | Austria |
6. | Bélgica |
7. | Luxemburgo |
8. +------------+
>

Los países en que se hable alemán y sus poblaciones en 2016:

1. +------------+-----------+
2. | nombre | poblacion |
3. +------------+-----------+
4. | Alemania | 82175684 |
5. | Austria | 8690076 |
6. | Bélgica | 11311117 |
7. | Luxemburgo | 576249 |
8. +------------+-----------+
9. 4 rows in set (0.00 sec)

>

Inserciones de datos y LEFT JOIN

La base de datos sólo contiene datos de los países de la Unión Europea.


Amplíela con los datos de Islandia, Noruega, Suiza y Turquía. Incluya los datos
de poblaciones y capitales, pero no idiomas. Puede tomar las poblaciones
de Eurostat (toma sólo los datos de 2015 y 2016). Comprueba que los datos se
hayan insertado correctamente.

Cual es la secuencia de sentencias SQL, que debe dar para ingresar la


información anterior:

>
Realice 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 |
| Bulgaria | Búlgaro |
(...)
| Islandia | NULL |
| Noruega | NULL |
| Turquía | NULL |
| Suiza | NULL |
+------------------+---------------+

>

Consultas con self join

En este ejercicio se continúa trabajando con la base de datos de la práctica


anterior. Ejecuta consultas SQL para obtener los siguientes datos (toma nota
de las consultas en una hoja o en un fichero):

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 | 2005 | 82500849 | 2006 | 82437995 |
| 1 | 2006 | 82437995 | 2007 | 82314906 |
| 1 | 2007 | 82314906 | 2008 | 82217837 |
| 1 | 2008 | 82217837 | 2009 | 82002356 |
| 1 | 2009 | 82002356 | 2010 | 81802257 |
| 1 | 2010 | 81802257 | 2011 | 80222065 |
| 4 | 2005 | 7688573 | 2006 | 7629371 |
| 4 | 2006 | 7629371 | 2007 | 7572673 |
(...)

>
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 | 2005 | 82500849 | 2006 | 82437995 |
| Alemania | 2006 | 82437995 | 2007 | 82314906 |
| Alemania | 2007 | 82314906 | 2008 | 82217837 |
| Alemania | 2008 | 82217837 | 2009 | 82002356 |
| Alemania | 2009 | 82002356 | 2010 | 81802257 |
| Alemania | 2010 | 81802257 | 2011 | 80222065 |
| Bulgaria | 2005 | 7688573 | 2006 | 7629371 |
| Bulgaria | 2006 | 7629371 | 2007 | 7572673 |
(...)

>

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 |
| Austria | 2015 | 8576261 | 2016 | 8690076 |
| Bélgica | 2010 | 10839905 | 2011 | 11000638 |
| Chipre | 2005 | 733067 | 2006 | 744013 |
| Chipre | 2006 | 744013 | 2007 | 757916 |
| Chipre | 2007 | 757916 | 2008 | 776333 |
| Chipre | 2008 | 776333 | 2009 | 796930 |
| Chipre | 2009 | 796930 | 2010 | 819140 |
| Chipre | 2010 | 819140 | 2011 | 839751 |
| Chipre | 2011 | 839751 | 2012 | 862011 |
| Eslovenia | 2008 | 2010269 | 2009 | 2032362 |
| España | 2005 | 43296338 | 2006 | 44009971 |
| España | 2006 | 44009971 | 2007 | 44784666 |
| España | 2007 | 44784666 | 2008 | 45668939 |
| España | 2008 | 45668939 | 2009 | 46239273 |
| Irlanda | 2005 | 4111672 | 2006 | 4208156 |
| Irlanda | 2006 | 4208156 | 2007 | 4340118 |
(...)

>
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 cambiando el valor del parámetro "-D".

En esta base de datos, crea las tablas que necesites para representar los libros
en el catálogo de una librería. Crea las tablas como InnoDB. Para cada libro,
almacena el título, ISBN, editorial, año, precio en euros y autores (un libro
puede tener uno o más autores, por lo que es recomendable usar una tabla
aparte con autores y otra con relaciones autor-libro). 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.

Vistas
Las vistas son como tablas virtuales que contienen los resultados de una
consulta, pero solo se guarda la consulta no los datos.

Para crear una vista utilizamos la sentencia CREATE VIEW, para modificarla
ALTER VIEW, para eliminarla DROP VIEW y para seleccionarla o mostrar los
datos se utiliza SELECT FROM como a una tabla.

Ingrese la sentencia SQL adecuada para crear las siguientes vistas:

1. CapitalPais: con el nombre de cada país y su capital:

>
2. CapitalPaisIdioma: con el nombre de cada país, su capital y su idioma:

>

3. PaisIdiomaPoblación: con el nombre de cada país, su idioma y la población


para todos los años registrados en la base:

>
Stored procedures – Procedimientos almacenados
Los procedimientos almacenados son un conjunto de instrucciones que se
guardan en el servidor para un posterior uso, ya que se ejecutarán
frecuentemente.

Ingrese las sentencias adecuadas para crear los siguientes procedimientos


almacenados

CrearPaisCapital: debe permitir crear un país, con si respectiva capital.

>

AgregarPoblacion: Para agregar población para un país en un año


específico

>

EstimarPoblación: para generar una tabla con los datos de una


población estimada, que se calcula tomando la población de un país,
incrementada en un porcentaje que se da como parámetro.

>
Triggers - Disparadores
Un Trigger es un programa almacenado creado para ejecutarse
automáticamente cuando ocurra un evento en la base de datos como INSERT,
UPDATE y/o DELETE.

Ingrese las sentencias adecuadas para crear los siguientes triggers

ActualizarPoblación: antes de actualizar una población, para una año o


un país especifico, debe guarda en la tabla PoblacionHistorica, los
datos originales. La tabla PoblacionHistorica, tiene los mismos campos
que Población y se le agrega un campo de fecha, que registra el
momento del cambio de datos.

>

MaximaActualizacion: Debe controlar que cuando se haga una


actualización de población, no pueda ser superior al 3% del año
anterior.

>

EliminarPais: Cuando se elimine un País, deberá dejar el registro d ela


acción, en una tabla denominada Auditoria que almacena los datos
borrados y si incluía datos de idioma y población.

>
Referencias

 The Language of SQL, Larry Rockoff. Course Technology PTR (2010)


 MariaDB – Sentencias SQL

También podría gustarte