RESUMEN
Diseño y Administración de
Base de Datos
Tecnicatura superior en programación
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
INTRO
¿Qué es MySQL?
MySQL es un sistema gestor de bases de datos (SGBD, DBMS por sus
siglas en inglés).
¿Qué es MySQL Workbench?
Es una herramienta visual y un entorno integrado de desarrollo diseñado
para trabajar con bases de datos MySQL. También posee un editor
SQL completo.
¿Qué es MySQL Shell?
Es un cliente de línea de comandos avanzado y un editor de código para
MySQL . Además de SQL, MySQL Shell también ofrece capacidades de
secuencias de comandos para JavaScript y Python.
En SQL existen 5 tipos de datos
● Numérico
● fecha y marca temporal
● Cadena
● Espacial ( valores de geometría y geografía en la columna de la tabla)
● JSON (Permite almacenar un dato con formato JSON)
Comandos básicos
> \? Ayuda sobre comandos del shell
> \? Sentencia SQL Ayuda sobre sentencia SQL
> \sql Cambia a modo SQL
> \connect root@localhost Conecta con el server local
> SHOW DATABASES; Muestra las Bases De Datos
> SELECT DATABASE(); Muestra la BD activa
> CREATE DATABASE basededato; Crea la db basededato
> USE basededato; Cambia la DB activa basededato
> DROP DATABASE basededato; Elimina la DB basededato
> SHOW TABLES; muestra las tablas
> DESCRIBE nombretabla; muestra la estructura de tabla
> DROP TABLE nombretabla; Borra la tabla nombre tabla
1
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
> CREATE TABLE nombre tabla (
nombre_col tipo
[NOT NULL | NULL]
[DEFAULT valor]
[AUTO_INCREMENT]
[[PRIMARY] KEY]
[COMMENT “string”]
[definicion_referencial]);
tipo: INT, CHAR, VARCHAR, ENUM según corresponda
[NOT NULL | NULL] : Indica si el valor puede ser nulo(NULL por defecto)
[DEFAULT valor]: Valor por defecto
[AUTO_INCREMENT]: Muy utilizado en el caso de ID
[[PRIMARY] KEY]: Sólo puede existir una clave primaria en cada tabla, y el
atributo sobre el que se define una clave primaria no puede tener valores
NULL.
[COMMENT “string”]: Podemos añadir un comentario a cada columna.
[definicion_referencial]: Aclaración de Claves foráneas
nota: [PRIMARY KEY(campo1, campo2)] Para establecer que una tabla tenga
una clave compuesta, lo indicamos al final del CREATE TABLE . Lo mismo se
puede hacer para cuando la clave primaria es de un solo campo. Solo 1 de
las claves puede tener la propiedad auto incrementada.
MODIFICAR ESTRUCTURA DE
TABLAS
Con el comando SQL ALTER TABLE podemos realizar cambios en la
estructura de las tablas de Base de Datos
> ALTER TABLE ciudad granciudad;
Cambiar el nombre de una tabla
> ALTER TABLE granciudad DROP COLUMN población;
Elimina una columna (atributo) de una tabla, para eliminar más se
agregan y separan con comas (,)
> ALTER TABLE granciudad DROP PRIMARY KEY;
Elimina la clave primaria
> ALTER TABLE granciudad ADD fecha date;
Inserta una nueva columna (atributo) al final de una tabla
2
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
> ALTER TABLE granciudad ADD origen VARCHAR(50) AFTER nombre;
Inserta una nueva columna después de otra
> ALTER TABLE granciudad ADD id INT FIRST;
Inserta una nueva columna al principio
> ALTER TABLE granciudad ADD PRIMARY KEY(id);
asignar como clave primaria a una columna existente en la tabla
> ALTER TABLE granciudad MODIFY COLUMN id INT auto_increment;
Reestructura una columna de una tabla
RESTRICCIONES COMUNES
NOT NULL UNIQUE
DEFAULT CHECK
AUTO_INCREMENT FOREIGN KEY
PRIMARY KEY ENUM(tipo de dato)
RESTRICCION UNIQUE (UNIQUE Constraint
Tanto las restricciones UNIQUE como PRIMARY KEY proporcionan una
garantía de unicidad para una columna o conjunto de columnas.
Nota: Una restricción PRIMARY KEY tiene automáticamente una
restricción UNIQUE. Sin embargo, puede tener muchas restricciones UNIQUE
por tabla, pero solo una restricción PRIMARY KEY.
> CREATE TABLE tabla1 (
col1 tipo1,
col2 tipo2 UNIQUE,
col3 tipo3);
> CREATE TABLE tabla1 (
col1 tipo1,
col2 tipo2,
col3 tipo3,
UNIQUE (col2));
> CREATE TABLE tabla2 (
col1 tipo1,
col2 tipo2,
col3 tipo3,
CONSTRAINT UC_Nombre UNIQUE (col2, col3));
Nombrar una restricción UNIQUE y definirla para varias columnas.
3
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
RESTRICCION CHECK (CHECK Constraint)
CHECK especifica la condición de restricción como una expresión booleana,
que debe evaluarse como VERDADERA o DESCONOCIDA (para valores NULL) o
FALSA para cada fila de la tabla.
Nota: Si la condición se evalúa como FALSA, se produce una
violación de la restricción.
> CREATE TABLE Personas (
ID int NOT NULL,
Name varchar(45) NOT NULL,
Age int CHECK (Age>=18));
> CREATE TABLE Personas (
ID int NOT NULL,
Name varchar(45) NOT NULL,
Age int,
CONSTRAINT chk1_nocero CHECK (Age <> 0));
> CREATE TABLE tabla2 (
CHECK (col2 < col3),
col1 tipo1,
col2 tipo2,
col3 tipo3);
ENUM (tipo de dato)
Un ENUM es un objeto de cadena con un valor elegido de una lista de valores
permitidos que se enumeran explícitamente en la especificación de la columna en el
momento de la creación de la tabla.
> > CREATE TABLE remeras (
nombre VARCHAR(40),
talle ENUM('x-small', 'small', 'medium', 'large', 'x-large'));
CLAVES FORÁNEAS (FOREIGN KEY Constraint)
Las Claves foráneas se definen después de definir todas las columnas.
> CREATE TABLE tabla2 (
col1 tipo1,
col2 tipo2,
col3 tipo3,
FOREIGN KEY (col_tabla2) REFERENCES tabla1
(col_tabla1) ON DELETE CASCADE ON UPDATE
CASCADE)
FOREIGN KEY (col_tabla2): Definimos la CLAVE AJENA sobre alguna de las
columnas
REFERENCES tabla1 (col_tabla1): Indicamos con cual clave se va a relacionar
(referenciar) nuestra clave ajena, señalando su tabla y columna (tabla1 – col_tabla1)
ON DELETE CASCADE ON UPDATE CASCADE): Opcionalmente definimos las
RESTRICCIONES mediante cláusulas al Borrar o Modificar una fila en la tabla1
(RESTRICT – CASCADE – SET NULL)
4
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
NOMBRANDO CLAVES FORÁNEAS
> CREATE TABLE tabla2 (
col1 tipo1,
col2 tipo2,
col3 tipo3,
CONSTRAINT FK_Nombre FOREIGN KEY
(col_tabla2) REFERENCES tabla1 (col_tabla1) ON
DELETE CASCADE ON UPDATE CASCADE);
AGREGAR UNA CLAVE AJENA A UNA TABLA YA CREADA.
> ALTER TABLE tabla2 ADD CONSTRAINT FK_Nombre FOREIGN KEY
(col_tabla2) REFERENCES tabla1(col_tabla1);
BORRAR UNA CLAVE FORÁNEA
> ALTER TABLE tabla2 DROP FOREIGN KEY FK_Nombre;
ACCIONES REFERENCIALES ON DELETE Y ON UPDATE
> CREATE TABLE tabla2 (
col1 tipo1,
col2 tipo2,
col3 tipo3,
CONSTRAINT FK_Nombre FOREIGN KEY (col_tabla2)
REFERENCES tabla1 (col_tabla1) ON DELETE CASCADE
ON UPDATE SET NULL);
Cuando una operación de ACTUALIZACIÓN o ELIMINACIÓN afecta
a un valor clave en la tabla principal y este tiene filas coincidentes en la tabla
secundaria, el resultado depende de la acción referencial especificada por
las sub cláusulas ON UPDATE y ON DELETE:
● CASCADE: Si se elimina o actualiza una fila de la tabla principal,
se eliminará o actualizará automáticamente las filas
coincidentes en la tabla secundaria.
● SET NULL: Si se elimina o actualiza una fila de la tabla principal,
se seteará en NULL automáticamente las filas coincidentes en la
tabla secundaria.
5
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
● RESTRICT: Se rechaza la operación de eliminación o
actualización de una fila de la tabla principal, si hay un valor de
clave externa relacionado en la tabla secundaria.
● NO ACTION: Es equivalente a RESTRICT. (VALOR POR DEFECTO)
● SET DEFAULT: Es reconocida por MySQL pero rechazada. No
soportado.
INSERTAR FILAS
La forma más directa de insertar una fila en una tabla es mediante
una sentencia INSERT. Debemos indicar la tabla y los valores de cada
columna.
Nota: Las columnas de tipo cadena o fechas deben estar entre comillas, para
las columnas numéricas esto no es imprescindible.
> INSERT INTO Tabla1 VALUES (
1, 1, “barcelona”, “barcino”, “2024-01- 05”);
Introducir más de una fila a la vez
> INSERT INTO Tabla1 VALUES
(1, 1, “barcelona”, “barcino”, “2024-01-05”),
(2, 2, “celona”, “rcino”, “2024-05-15”);
Especificar la lista de columnas/atributos donde deseamos ingresar ciertos
valores. La ventaja de esta forma es que no precisamos de conocer el orden
exacto de los atributos en la tabla:
> INSERT INTO Tabla1 (id, nombre) VALUES (1, “barcelona”);
Alternativa que consiste en indicar un valor para cada columna:
> INSERT INTO granciudad SET id = 5, nombre = "Bilbao";
Mostrar los datos de una tabla:
> SELECT * FROM Tabla1;
6
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
REEMPLAZAR FILAS
> REPLACE INTO granciudad
(id, nombre, origen)
VALUES
(4,'zaragoza','caesaraugusta');
Nota: Se ha reemplazado con los valores deseados la fila con id=4. Hay que
tener presente que el comando REPLACE puede realizar una inserción de fila
del mismo modo que lo hace el comando INSERT INTO si no indicamos la PK
de la fila que queremos reemplazar.
ACTUALIZAR FILAS
Permite actualizar los valores de las filas. Los cambios se aplicarán a
las filas y columnas que especifiquemos
> UPDATE granciudad SET origen=‘nuevo_origen';
Esta sentencia modifica TODAS LAS FILAS. Pero podemos usar la
cláusula WHERE para establecer UN FILTRO DE COLUMNAS donde
queremos que se realicen los cambios:
> UPDATE granciudad SET origen=‘nuevo_origen'
WHERE nombre = ‘Madrid’;
Para indicar TODAS LAS FILAS cuyo valor de una columna SEA NULL
se utiliza “IS NULL”
> UPDATE granciudad SET origen='caesaraugusta'
WHERE nombre IS NULL;
BORRAR FILAS
Permite borrar filas. Los cambios se aplicarán a las filas que
especifiquemos. Esta sentencia elimina TODAS las filas de la tabla ‘tabla1’.
> DELETE FROM tabla1;
Si deseamos eliminar solo determinadas filas usamos la cláusula
WHERE.
> DELETE FROM tabla1 WHERE id=6;
7
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
También podemos usar las cláusulas LIMIT y ORDER BY en la
sentencia DELETE , para eliminar los últimos o primeros registros de una
tabla.
> DELETE FROM granciudad ORDER BY nombre ASC LIMIT 2;
También podemos usar TRUNCATE para eliminar toda una tabla. La
diferencia es que DELETE hace un borrado secuencial de la tabla, fila a fila.
Pero TRUNCATE borra la tabla y la vuelve a crear vacía, lo que es mucho
más eficiente.
> TRUNCATE granciudad;
CONSULTAR TABLAS (SELECT)
Podemos consultar los datos guardados en las tablas de la BD con
consultas SELECT.
Mostrar todos los registros de una tabla, * (asterisco) significa “todas
las columnas”:
> SELECT * FROM granciudad;
Mostrar solo las columnas que nos interesan. Usaremos SELECT más
las columnas que queremos separadas por coma:
> SELECT id, nombre FROM granciudad;
Además podemos ordenar las filas por alguna columna y limitar el
resultado:
> SELECT id, nombre FROM granciudad
ORDER BY nombre DESC LIMIT 2;
Podemos operar con los valores de una columna, por ejemplo si
queremos que nos devuelva la población en millones:
> SELECT id, nombre, población/1000000 FROM granciudad;
Nota: La información en la tabla no se modifica.
Lo único que hacemos es mostrar un valor calculado a partir de la
información de la tabla
También se puede cambiar el encabezado de una columna con AS:
> SELECT nombre, población/1000000
AS “Población en millones” FROM granciudad;
Mostrar solo las filas con columnas seleccionadas no repetidas:
> SELECT DISTINCT nombre, poblacion FROM granciudad;
8
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
Filtrar las filas que aparecen en la consulta con la sentencia WHERE y
una condición:
> SELECT * from granciudad WHERE poblacion >= 2000000;
Filtrar las filas que aparecen en la consulta con la sentencia WHERE y
dos o más condiciones:
> SELECT * from granciudad WHERE poblacion >= 2000000 AND id > 10;
Nota: Además de AND, podríamos usar
otros operadores booleanos como OR, XOR o NOT
OPERADORES DE COMPARACIÓN
● Igualdad =
○ SELECT * FROM lista WHERE fecha = "2010-03-03";
● Igualdad sin devolver NULL < = >
○ SELECT 1 <=> 1, NULL < = > NULL, 1 <=> NULL;
● Operador de desigualdad < > , !=
○ SELECT * FROM lista WHERE fecha <> "2010-03-03";
● Operadores de comparación de magnitudes < <= > >=
○ SELECT * FROM lista WHERE cant >= 2000;
● NULOS IS NULL o IS NOT NULL
○ SELECT * FROM lista WHERE fecha IS NULL;
● RANGO BETWEEN
○ SELECT "2018-01-01" BETWEEN "2017-01-01" AND "2019-01-01";
● SELECCIÓN DE VALORES COALESCE
○ SELECT COALESCE (NULL, 23, "hola");
● MAX y MIN DE UNA LISTA GREATEST - LEAST
○ SELECT GREATEST(1,2,5);
● DENTRO DE UNA LISTA IN – NOT IN
○ SELECT "2010-03-03" IN (select fecha from lista);
● INTERVALO INTERVAL
○ SELECT INTERVAL (55, 30, 40, 50, 60, 70);
CONSULTAS – AGRUPAR FILAS (HAVING)
A veces se desea restringir el resultado de una expresión agrupada.
Cuando hacemos consultas y usamos GROUP BY, la cláusula HAVING()
permite ejecutar condiciones (filtros) sobre las columnas calculadas con
funciones de grupo, como MAX(), MIN(),AVG(),COUNT()… Se podría entender
como un WHERE para usar junto a GROUP BY()
9
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
> SELECT ciudad, MAX(temp) FROM muestras GROUP BY ciudad
HAVING MAX(temp)>16;
> SELECT ciudad, MAX(temp) AS max_temp FROM muestras GROUP BY
ciudad HAVING max_temp>16;
FUNCIONES DE GRUPO
● COUNT: Devuelve el número de valores distintos de NULL en las filas
recuperadas por una sentencia SELECT.
○
● AVG: Devuelve el valor medio.
○ SELECT AVG(temp) FROM muestras GROUP BY fecha;
● COUNT DISTINCT: Devuelve el número de valores diferentes, distintos de
NULL.
○ SELECT COUNT(DISTINCT col) FROM tabla
● MIN: Devuelve el valor mínimo de una expresión.
○ SELECT ciudad, MIN(temp) FROM muestras GROUP BY ciudad
HAVING MIN(temp)>16;
● MAX: Devuelve el valor máximo de una expresión.
○ SELECT ciudad, MAX(temp) FROM muestras GROUP BY ciudad
HAVING MAX(temp)>16;
● STD o STDDEV: Devuelve la desviación estándar de una expresión. • SUM:
Devuelve la suma de una expresión.
○
● VARIANCE: Devuelve la varianza estándar de una expresión.
CONSULTAS – ORDEN DE EJECUCIÓN
Conviene conocer la forma de trabajar de una instrucción SELECT.
Estos son los pasos en la ejecución de una instrucción SELECT por parte del
DBMS:
> SELECT tipo, modelo, cantidad, SUM(Cantidad)
FROM existencias
WHERE tipo!=’AR’
GROUP BY tipo,modelo
HAVING SUM(Cantidad)>500
ORDER BY tipo;
1. Seleccionar las filas deseadas utilizando WHERE. Esta cláusula
eliminará filas en base a la condición indicada
2. Se establecen los grupos indicados en la cláusula GROUP BY
3. Se calculan los valores de las funciones de totales (COUNT, SUM,
AVG,...)
4. Se filtran los registros que cumplen la cláusula HAVING
5. El resultado se ordena en base al apartado ORDER BY
10
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
CONSULTAS MULTITABLA (JOINS)
Las cláusulas JOIN se utilizan para devolver las filas de dos o más
tablas que comparten una relación basada en un conjunto común de valores.
Estos valores suelen ser el mismo nombre de columna y tipo de datos que
aparecen en ambas tablas participantes que se están uniendo.
Estas columnas, o posiblemente una sola columna de cada tabla, se
denominan JOIN KEY. En la mayoría de los casos, la Join Key (clave de
unión) es la clave principal de una tabla y una clave externa en otra tabla.
INNER JOIN
> SELECT columns FROM table1
INNER JOIN table2
ON
table1.column_name = table2.column_name;
La cláusula INNER JOIN une dos tablas en función de una columna
común comparando cada fila de la primera tabla con cada fila de la segunda
tabla. Si los valores de ambas filas coinciden, la cláusula de INNER JOIN
crea una nueva fila que contiene todas las columnas de las dos filas de
ambas tablas e incluye esta nueva fila en el conjunto de resultados. La
cláusula de INNER JOIN solo incluye filas coincidentes de ambas tablas.
LEFT JOIN
> SELECT columns FROM table1
LEFT JOIN table2
ON
table1.column_name = table2.column_name;
El LEFT JOIN muestra todos los valores de la tabla de la izquierda
aunque no tenga correspondencia en la tabla de la derecha. Si el valor de las
dos filas cumple la condición del JOIN, la cláusula LEFT JOIN crea una
nueva fila de resultado que contiene todas las columnas de las dos tablas,
pero, Si el valor no coincide, el LEFT JOIN crea igualmente una fila de
resultado que contiene todos los datos de la tabla de la izquierda y la
correspondencia con la tabla de la derecha se completa con NULL.
11
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
RIGHT JOIN
> SELECT columns FROM table1
RIGHT JOIN table2
ON
table1.column_name = table2.column_name;
El RIGHT JOIN es similar al LEFT JOIN, solo que muestra todos
los valores de la tabla de la derecha, aunque no tenga correspondencia en la tabla
de la izquierda, completando estas columnas con NULL.
CROSS JOIN
> SELECT columns FROM table1
CROSS JOIN table2;
El CROSS JOIN es un tipo especial de JOIN que devuelve el
producto cartesiano entre las tablas que forman parte de la unión. Se
comporta igual que el INNER JOIN como si no tuviera la parte del “ON”:
NATURAL JOIN
> SELECT columns FROM table1
NATURAL JOIN table2;
UNA NATURAL JOIN es una unión que se realiza
automáticamente a través de todos los atributos coincidentes de ambas
tablas. Para poder realizar NATURAL JOIN, los campos a unificar han de
llamarse igual.
12
DISEÑO Y ADMINISTRACIÓN DE BASE DE DATOS – PROGRAMACIÓN – UTN FRVM
SUBCONSULTAS
Una subconsulta es una consulta dentro de otra consulta (a esta
segunda la llamamos la principal). Se suelen colocar en la cláusula WHERE de
la consulta principal, pero también pueden añadirse en el SELECT o en el
FROM.
> SELECT tipo, cant FROM table1
WHERE cant >=
(SELECT cant FROM table2 WHERE id_prod = 2));
> SELECT nombre, apellido FROM miembros
WHERE nro_socio =
(SELECT nro_socio FROM pagos
WHERE total_pagado =
(SELECT MAX(total_pagado) FROM pagos));
Si el resultado de la subconsulta devuelve más de un registro, se usan
comandos especiales:
● ANY : compara cada registro de la consulta principal con los de la
subconsulta. Se debe validar al menos para un registro de la
subconsulta para que la consulta principal devuelva resultado.
● ALL : en este caso un registro debe validarse para todos los registros
de la subconsulta.
● IN : En este caso no se usa el comparador. Se comprueba si cada
registro de la consulta principal está o no contenido en la tabla
resultante de la subconsulta.
● NOT IN : lo opuesto a IN.
> SELECT tipo, cant FROM table1
WHERE cant < ANY (SELECT cant FROM table2));
> SELECT nombre, apellido FROM miembros
WHERE nro_socio IN
(SELECT nro_socio FROM alquileres
WHERE fecha_dev IS NULL);
13