SQL
SQL
INDICE
I. FUNDAMENTOS
IV. DESARROLLOS
V. PROGRAMACION WEB
V. DESARROLLOS II
VII. FINAL
29. DESPEDIDA [00:05:00] [01]
30. BONUS EXTRA [00:05:00] [01]
01. INTRODUCCIÓN
01. RECOMENDACIONES
--
02. INSTALACION MySQL
Necesario para poder ejecutar lenguaje SQL y lenguaje MySQL en nuestro SO. Instalamos
MySQL e instalamos su Workbench (Banco de Trabajo).
Gestor MySQL donde podemos ejecutar código y crear bases de datos. Como alternativa al
anterior Workbench si nos da problemas. Tendremos que estar utilizando XAMPP, iniciando el
Servicio MySQL dentro del mismo.
Necesitamos emular un Servidor Local en nuestra propia máquina. Podremos ejecutar código
PHP junto con las Bases de Datos pertinentes. Xampp es el Servidor Local recomendado. Es un
Servidor Linux (Apache). Cuando damos Start nuestra máquina trabajará como Servidor del caso
particular que hayamos activado.
VS es el Editor de Código que utilizaremos. Tendremos gran cantidad de Plug-Ins que facilitan
enormemente nuestra tarea.
Buscamos, mediante Ctrl + Shif + P, el plugin Install Package. Instalamos ahora el plugin Emmet,
que sirve para autocompletar código. Instalamos ahora el plugin Emmet CSS, que sirve para
autocompletar código.
--
03. FUNDAMENTOS DE BASES DE DATOS
Sistema que permite almacenar, organizar y acceder a datos de manera eficiente, facilitando el
trabajar con grandes volúmenes de información de manera estructurada. Una Lista en Excel es
una Base de Datos. Fundamentalmente encontramos:
Encargado de mantener y gestionar las bases de datos dentro de una organización, en los
apartados de Seguridad y de Optimización. Tiene cuatro funciones principales:
CHAR. Almacena Texto de Longitud Fija. Para datos con longitud constante.
Tabla. Espacio de la BBDD donde se organiza la información. Una Tabla se compone por Filas y
Columnas. Literalmente tendremos Filas y Columnas conformando Tablas donde se almacena la
información. Sobre esa Base de Datos podremos hacer operaciones:
La base de datos World contiene una Tabla dedica a City que contiene diferentes datos
organizados por Columnas, con Filas destinadas a cada elemento. Una Tabla se estructura en
Columnas. Las Filas son los distintos elementos que vamos añadiendo a la Tabla, a la Base de
Datos.
--
04. LENGUAJE DE BASES DE DATOS: SQL
13. SQL
Creado en 1970 en IBM. SQL permite gestionar Bases de Datos. SQL trabaja con conjuntos de
datos y las relaciones entre ellos. La información tendrá sentido en conjunto, de ahí que
trabajemos sus relaciones. La sintaxis SQL se basa en el idioma inglés, muy parecido además a
Visual Basic. Los Comandos SQL se ejecutarán en el Gestor de Bases de Datos a través de una
Línea de Comandos (CLI). Sus elementos constituyentes son:
Cláusula. Sentencia que nos devuelve Estados de cada Componente de la Base de Datos,
y de cada Query efectuada.
Predicado. Limitan los efectos de las Consultas y de los Comandos. También sirven para
cambiar el Flujo del programa. Funcionan como Condicionales que determinan el Alcance
de un Comando.
14. CLAUSULAS
Son Sentencias. Cada Clausula realiza una función específica dentro de una Instrucción SQL.
Son las que utilizamos para comunicarnos con las Bases de Datos. Una Instrucción se compone
de Clausulas (Sentencias). Como ejemplos:
SELECT. Selecciona Datos de una Tabla. Especificamos los Nombres de los Campos que
contienen los Datos que queremos Consultar.
FROM. Muestra las Tablas que contienen los Campos de la Clausula SELECT.
WHERE. Agrega un Condicional. Especificamos Criterios que tienen que cumplir los
Valores de Campos para que sus Registros sean incluidos en los Resultados de la
Consulta.
ORDER BY. Ordena Datos para Resultados de una Consulta, de manera Ascendente o de
manera Descendente.
GROUP BY. Funciones de Agregado, mostrando los Campos no resumidos por SELECT.
Permite segmentar los Datos.
No son sensibles a M/m (Mayúsculas / Minúsculas), pero se recomienda escribir las palabras
clave en Mayúsculas, y el resto en Minúsculas. Ser sensible a M/m se denomina Case Sensitive.
15. COMANDOS
Existen Dos Tipos de Comandos:
DDL. Data Definition Language. Comandos que permiten definir nuevas Bases de Datos,
Índices y Campos. Un Campo es un espacio que contiene un Dato. Un Indice es un
espacio que agrupa un Dato.
DML. Data Manipulation Language. Comandos que permiten manipular Datos. Nos
permiten Insertar, Eliminar y Actualizar Datos, además de generar Consultas para Ordenar,
Filtrar y Extraer dichos Datos.
Con SQL podemos programar BBDD. Podemos usarlo en el Gestor BBDD que sea: MySQL,
Oracle, SQL Server, etc. Estudiemos ahora todas las Sentencias SQL que usaremos en
Workbench como Interfaz Gráfica para trabajar con MySQL.
Creamos una Instancia en Workbench que nos permite Conectarnos a una Base de Datos.
Hemos de hacer un Test Connection para asegurarnos de que funciona, al momento de crear
dicha Instancia. En Schemas tenemos todas las Bases de Datos que por defecto MySQL trae,
como ejemplos que nos ofrece MySQL:
SYS. Vistas y Utilidades para supervisar y diagnosticar el estado del sistema de MySQL.
Ejecutamos con el Botón Rayo en la zona superior. En Mayúsculas disponemos aquello que es
SQL, en Minúsculas disponemos todo lo demás.
18. CREAR TABLAS
Para rellenar las Bases de Datos que hemos de creado hemos de crear Tablas. Seleccionamos la
Base de Datos que queremos mediante USE.
USE Base_01;
CREATE TABLE <Nombre_Tabla> (<Columnas>);
Creamos la Tabla mediante CREATE. Hemos de especificar el Tipo de Dato que contiene cada
Columna dentro de la Tabla. Mediante VARCHAR nos adaptamos en memoria a la cantidad del
dato que sea, aunque potencialmente quepa más.
Llave Primaria. Primary Key. Identifica a una Tabla. Es un dato dentro de la Tabla que
jamás cambiará. La Columna que cumple este criterio en este caso es ID.
Ya tenemos una Sentencia SQL para la creación de una Tabla. En este momento la Tabla se
presenta vacía.
Aprendamos a usar adecuadamente el USE. Lo usamos para movilizarnos a una Base de Datos.
Creamos una Tabla en Base_02. Para rellenar una Tabla hemos de usar una Sentencia SQL
desde Palabras Reservadas.
USE Base_01;
INSERT INTO <Nombre_Tabla> VALUES (<Valores>);
Los Valores son los Datos que van a estar en cada Columna. Basta con especificar en orden los
Datos que queramos introducir. Recordemos que no podemos duplicar datos de la columna que
sea Llave Primaria.
Estaremos usando World para aprender los Comandos Básicos para manejarnos en SQL.
SELECT sirve para mostrarnos información de una BBDD o información de una Tabla, en
específico. Para mostrar Todos los Campos usamos *.
USER world;
SELECT * FROM world.city;
Con esto devolverá toda la información de la Tabla denominada City. Conociendo las Columnas
que forman parte de la Tabla es que podemos Segmentar la información al momento de realizar
la Consulta. Usamos el Nombre de la Columna en cuestión.
USE Base_01;
SELECT Nombre as Name FROM Base_01.Usuarios;
Usemos ahora una Columna con valores Numéricos. Filtremos todos los Países con menos de
150 como valor en Capital.
Permite encontrar aquellos datos que se repiten. Para probarlo necesitamos una Tabla con Datos
repetidos. Es una Palabra Reservada particularmente complementada con SELECT.
De entre todos los datos mostrará uno solo de tal manera que no se repita para la Columna de
que se trata. Únicamente podemos filtrar una Columna a la vez.
Permite ordenar de manera ascendente (ASC) o descendente (DESC) Campos de una Tabla.
Veremos ahora Tres Operadores que permiten aumentar la precisión de los filtros que podemos
hacer mediante SELECT, mediante WHERE, y otros.
AND. Operador ‘Y’. Ambas Condiciones deben cumplirse para que se muestren los resultados.
25. SENTENCIA IN
Similar a OR. Permite ahorrar espacio en Memoria con una Sentencia más corta. Para hacer:
Podemos hacer:
Es una sintaxis más elegante con un menor uso de memoria, que en aplicaciones de gran entidad
puede marcar una diferencia importante. Todo lo anterior se puede combinar:
Permite filtrar dentro de un Segmento definido por nosotros. De aplicación únicamente a números.
Filtramos desde 1 a 1.000.000 de Habitantes. Estas operativas generalmente se combinan con
una ordenación de los datos:
La Palabra Reservada % indica a SQL que nos resulta indiferente los caracteres presentes en
ese espacio, en este caso posterior a una letra inicial S. Para los que terminan por la letra O
tenemos:
No son estrictamente específicas de SQL, pero las estaremos utilizando. Funcionarán únicamente
con números. Estaremos sumando dos Columnas.
La Consulta mostrará una Columna combinada, en este caso con las dos especificadas, donde en
una única Columna hemos fusionado las dos anteriores, presentando por tanto el doble de
longitud de cada una por separado. Sumamos ahora todas las cantidades de una columna en
específico:
29. SENTENCIA COUNT & SENTENCIA MIN & SENTENCIA MAX & SENTENCIA AVG
Con nuestro * es que estamos Contando todos los Datos en cuestión, la Cantidad de Registros
que tenemos, en este caso en toda la Tabla. Sacamos ahora el Valor Mínimo de la Columna
Población:
SELECT MIN(Poblacion) FROM world.city;
Generamos una Columna Nueva con la conversión de la Columna de que se trate a Mayúsculas:
Generamos una Columna Nueva con la conversión de la Columna de que se trate a Minúsculas:
Concatenamos mediante una Función específica. Se unirá en una nueva Columna con la unión
de las Columnas que concatenemos.
Indicamos inicialmente que me muestre cada columna por separado, y luego mediante CONCAT
que muestre ambas Columnas concatenadas. Para agregar un espacio:
Para conseguir lo mismo con otra sintaxis usamos CONCAT_WS, donde agregamos un espacio
por cada Campo agregado. WS significa With Separator:
SELECT Nombre, Distrito, CONCAT_WS(“ “, Nombre, Distrito) FROM world.city;
Operamos ahora sobre Datos Decimales para eliminar precisamente su parte decimal, es decir,
redondear dicha cifra. Utilizamos ROUND para esto.
Vemos un nuevo condicional, junto con WHERE. Cuando tenemos Múltiples Condiciones,
usamos un CASE, como espacio que presenta todas esas Condiciones. Dependiendo de la
Condición que se cumpla ejecutará un extracto de código u otro. Conviene incluir un ELSE a
ejecutar en caso de que no se cumpla ninguna de las Condiciones.
SELECT Porcentaje,
CASE
WHEN Porcentaje < 10 THEN “Es menor a 10”
WHEN Porcentaje > 10 THEN “Es mayor a 10”
END
AS Condiciones FROM world.countrylanguaje;
SELECT Porcentaje,
CASE
WHEN Porcentaje < 10 THEN “Es menor a 10”
WHEN Porcentaje > 10 THEN “Es mayor a 10”
ELSE “Es 10”
END
AS Condiciones FROM world.countrylanguaje;
Veamos cómo Actualizar un Registro que ya existe. Es una operación sumamente fundamental.
Es modificar los Datos de un Campo de una Tabla de una Base de Datos. Al Actualizar es
importante que estemos posicionados sobre la Base de Datos de que se trate.
USE <Base_Datos>;
UPDATE <Tabla> SET <Columna> = <Dato_Actualizado>
WHERE <Tabla> = “ID_Dato_Por_Actualizar”;
USE world;
UPDATE country SET nombre = “El Salvador” WHERE id = “ABW”;
Para Actualizar múltiples Datos de manera simultanea, es decir, Por Lotes. Modificamos ahora
todos los países presentes cuyo Continente sea Asia. Recuerda que toda Tabla debe tener una
Primary Key que permita identificar unívocamente el Dato de que se trate en cada caso.
Hacemos:
USE world;
UPDATE country SET nombre = “El Salvador” WHERE continente = “Asia”;
El “identificador” en este caso es una condición que cumplen múltiples países, concretamente
aquellos cuyo continente es Asia, y por tanto la actualización será de aplicación a todos ellos.
Para modificar elementos sin pasar a través de la Primary Key tenemos que modificar:
Edit > Preferences > SQL Editor > Safe Update > Desmarcar
Cuidado con esto porque podemos modificar fuertemente elementos de la base de datos que
quizá no queramos estar modificando. Reconectamos al servidor para aplicar los cambios:
Queremos Agregar un Nuevo Campo que implica una Nueva Columna. Recordemos que para
Crear una Tabla usamos CREATE, especificando los Campos que tiene, junto con los Tipos de
Datos para dichos Campos. Seguiremos una lógica similar.
USE world;
ALTER TABLE city ADD COLUMN country VARCHAR(50);
Ya podemos comenzar a agregar nuestros datos. Con un Gestor de Bases de Datos esto
podemos hacerlo de manera automática. Para agregar de manera manual usamos INSERT.
Vemos el último proceso fundamental en una Base de Datos que es Eliminar. Hemos visto Crear,
Actualizar, Leer, y faltaba Eliminar. Eliminemos ahora la Columna que hemos creado en la clase
anterior:
USE WORLD;
ALTER TABLE city DROP COLUMN country;
USE Base1;
DELETE FROM usuarios WHERE id = 1;
Si no especificamos una Condición WHERE, se eliminarían todos los datos de la Tabla. Recuerda
que aquí no tenemos Control + Z. Este sería el caso:
USE Base1;
DELETE FROM usuarios;
USE world;
DROP DATABASE Base1;
--
05. PRACTIQUEMOS LO APRENDIDO
36. EJERCICIO 1
Creación de una Tabla para un Sistema de Bibliotecas. Crearemos una Tabla denominada Libros
que contenga: ID (Entero, Clave Primaria), Titulo (Texto, Hasta 255 Caracteres, No Nulo), Autor
(Texto, Hasta 100 Caracteres, No Nulo), Fecha Publicación (Fecha), Genero (Texto, Hasta 50
Caracteres). Para resolverlo escribimos código SQL.
CREATE TABLE Libros (libro_id INT PRIMARY KEY, titulo VARCHAR(255) NOT NULL,
autor VARCHAR(100) NOT NULL, fecha_publicacion DATE, genero VARCHAR(50));
37. EJERCICIO 2
Creación de una Tabla para un Registro de Ventas. Crearemos una Tabla denominada Ventas
que contenga: ID (Entero, Clave Primaria), Fecha Venta (Fecha), Monto Total (Decimal, Dos
Decimales), Método Pago (Texto, Hasta 20 Caracteres), ID Cliente (Entero). Escribimos SQL.
38. EJERCICIO 3
Filtrado de Estudiantes por Nota. Tenemos una Tabla denominada Estudiantes con: Estudiante
ID, Nombre, Edad, Nota Final. Queremos una Consulta SQL que seleccione Nombre y Nota Final
de los estudiantes con nota mayor o igual a 80.
39. EJERCICIO 4
Consultar Productos en Stock. Tenemos una Tabla denominada Productos con: Producto ID,
Nombre, Precio (Decimal), Stock (Entero). Queremos una Consulta SQL que seleccione Nombre
y Precio de los productos con más de 0 unidades con precio menor a 500.
40. EJERCICIO 5
Ordenar Productos por Precio. Tenemos una Tabla denominada Productos con: Producto ID,
Nombre, Precio (Decimal), Stock (Entero). Queremos una Consulta SQL que seleccione Todos
los Productos, y los Ordene de manera Descendente por Precio.
41. EJERCICIO 6
Agrupar Ventas por Cliente. Tenemos una Tabla denominada Ventas con: Venta ID, Cliente ID,
Monto. Queremos una Consulta SQL que calcule el Monto de las Ventas por Cliente, ordenados
de Mayor a Menor.
--
--
06. NORMALIZACION
Se realizará dividiendo una Base de Datos en Tablas más pequeñas, que se relacionarán de
forma lógica. La Normalización facilitará la Actualización y el Mantenimiento de la Base de Datos.
Cargar todos los Datos de que dispongamos en un proyecto en una única Tabla puede ser
peligroso, puede generar sobrecargas en la misma.
Formas Normales. Permiten mantener una Base de Datos en óptimas condiciones. Existen Tres
Formas Normales que implementamos a las Tablas en una Base de Datos al aplicar
Normalización.
Primera Forma Normal. 1NF. Garantiza que Cada Columna presente Un Único Valor y
que Todo Valor en una columna sea Del Mismo Tipo. El objetivo es que cada Columna
presente Valores Atómicos, que no puedan ser divididos en partes. No debemos almacenar
por tanto Conjuntos de Datos (Listas) en una única Celda. Como ejemplo, el Nombre de
una persona debe dividirse en Columnas donde Nombre, Apellido_1, Apellido_2 se
presenten separados.
Segunda Forma Normal. 2NF. Requiere que Todos los Atributos No-Clave dependan
completamente de la Clave Principal, eliminando Dependencias Parciales. Como ejemplo,
una Dirección de una persona debe ser dividida en Valores Atómicos (1NF) primeramente,
y luego establecida en una Tabla Independiente, referenciada a la Tabla Principal.
Tercera Forma Normal. 3NF. Asegura que los Datos no dependan de Columnas No-
Clave, eliminando las Dependencias Transitivas que pudieran quedar. Se puede entender
como aplicar la Segunda Forma Normal por segunda vez. En este punto habremos
alcanzado la Normalización Completa.
Una Entidad es un elemento (objeto) del mundo real del que queremos almacenar
información. Una Entidad generalmente se modela como una Tabla. Una Entidad presentará al
menos las siguientes Características.
Nombre. Nombre único que describe el tipo de objeto que representa o abstrae.
Relaciones. Las Entidades presentan Relaciones entre sí, abstraídas mediante una Clave
Foránea o Foreign Key.
Estudiamos ahora una Tabla en particular, para entender qué Atributos (Columnas) generan una
redundancia en el seno de dicha Tabla.
Los que generan redundancia por contravenir el principio de los Valores Atómicos son: Nombre,
Dirección, Ciudad, País. Para 1NF el que presenta redundancia de datos es Nombre.
Desdoblamos este Atributo en Nombres + Apellidos. Hacemos:
Convendría igualmente dividir Género en Masculino y Femenino. En 1NF buscamos siempre los
Valores Atómicos que componen nuestra Entidad. De esta manera:
44. PRACTICA DE NORMALIZACION 2NF
Una vez alcanzada la Primera Forma Normal (1NF) hemos de eliminar las Dependencia
Parciales. Aquellas Columnas que no forman parte de la Clave Primaria (Primary Key), deben
depender completamente de la Clave Primaria. Para conseguir esto de manera adecuada, hemos
de segmentar en diferentes Tablas aquellos Atributos que presenten relaciones claras entre sí,
abstrayendo sobre una Clave Primaria que será la que presente relación con la Tabla original.
Las Tablas no deben presentar Dependencia Parciales, cada Columna debe depender de
su Clave Primaria.
Estas Relaciones las estudiaremos más adelante en los Modelos Entidad Relación. Con esto
entenderemos de qué manera las Tablas se van relacionando entre sí, conformando en global
una Base de Datos con, precisamente, los Datos adecuadamente estructurados. Esta es una de
las esencias de las Bases de Datos.
En 1NF encontramos Datos Atómicos. En 2NF separamos Columnas que deben presentar su
propia Tabla, que dependan únicamente de la Primary Key. En 3NF aplicamos 2NF a las Tablas
anteriormente separadas. Para Datos que generen redundancia, los separo en su propia Tabla,
cosa que hacemos con Turno en este ejemplo.
Con esto ya estamos capacitados para Normalizar nuestras propias Bases de Datos para
nuestros proyectos.
--
07. MySQL WORKBENCH
Para crear una Nueva BBDD contamos con un Botón Superior denominado Create A New
Schema. Desde este momento vamos rellenando aquellos datos que nos solicita, tales como
Nombre, y otros, y pulsamos Apply. El Código SQL asociado a esta creación de BBDD es el
siguiente:
Crear Tablas en Workbench es una tarea muy sencilla. Sobre la BBDD de que se trate, hacemos
Botón Derecho > Create Table. Rellenamos adecuadamente los datos que se nos solicita. Para
añadir Columnas desde la Interfaz hacemos Column Name > Doble Click. Marcamos las Casillas
pertinentes en base a las siglas que contienen:
PK. Primary Key. Clave Primaria. Valor único en cualquier momento dado.
NN. Not Null. No Nulo. Impide la presencia de un valor nulo en esta columna.
UQ. Unique. Único. Debe presentar valores únicos en cada fila de la columna.
B. Binary. Binario. Debe presentar valores únicamente binarios.
UN. Unsigned. Sin Signo. Debe presentar valores únicamente positivos.
ZF. Zero Fill. Rellenar Ceros. Rellena con ceros hasta completar el tamaño especificado.
AI. Auto Increment. Incremento Automático. Incrementa en +1 cada ingreso de un dato.
G. Generated Columns. Columnas Generadas. El valor de la Columna se genera de
forma automática en base a una expresión o fórmula.
DE. Default Expression. Expresión Por Defecto. Lo marcamos para una Columna dada.
Por cada Doble Click agregamos una Nueva Columna. Hemos de efectuar las pertinentes
Normalizaciones a nuestras Tablas, para no acabar con Tablas muy grandes, difíciles de manejar.
Pulsamos Apply para su generación.
Para Editar una Tabla desde la Interfaz pulsando en el Botón Herramienta, que aparece al
situarnos sobre la misma. Podemos consultar su Información asociada en el Botón i. Podemos
consultar el contenido de la Tabla desde el Botón Rayo. Al Editar nos aparece el mismo Menú
que obtuvimos al momento de Crearla. En la zona inferior contamos con un Menú Contextual con:
--
08. MODELO ENTIDAD RELACION
Sigamos avanzando para ser profesionales operando sobre SQL, sobre MySQL.
El Modelo Entidad-Relación (ER) es una Metodología Gráfica para Diseñar y Estructurar Bases
de Datos, representando cómo se relacionan los Datos entre sí en un Sistema. Permite Diseñar
Bases de Datos de manera Estructurada. Permite Visualizar de manera clara las Entidades que
van a representar los Objetos que componen la Realidad Abstraída en la Base de Datos.
Relaciones. Describen cómo las Entidades interactúan entre sí. Permiten definir de qué
manera se vinculas los Datos entre dichas Entidades. En una Biblioteca, las Relaciones
pueden ser Préstamo, etc. Cubriendo todas las opciones, pueden ser:
Veamos de qué manera podemos conformar un Modelo Entidad-Relación (ER). Vamos a modelar
las Entidades presentes en una Biblioteca existente, para abstraer y digitalizar sus procesos.
ID_Libro
Titulo
Autor
Año_Publicacion
ID_Lector
Nombre
Correo
ID_Prestamo
F_Prestamo
F_Devolucion
Lanzando una Flecha desde una Tabla a otra Tabla es que especificamos las Relaciones
existentes entre las mismas. Es la manera Gráfica de visualizar una Relación entre dos Tablas.
Esta aproximación gráfica nos permite clarificar la manera en la que vamos a implementar en el
Gestor de BBDD nuestro Modelo. Es una guía.
Entender qué Relación exacta presentan dos Tablas entre sí depende de la Cardinalidad.
Para modelar de manera completa una Biblioteca contamos en este caso, por tanto, con tres
Tablas. Esta representación gráfica es suficiente para un desarrollo completo, y bastaría con
ceñirnos a este modelado que acabamos de hacer, y que se representa de la siguiente manera:
Nos vamos a nuestro Gestor de BBDD, vamos, y creamos las Tablas y sus Relaciones.
Es la Relación Numérica existente entre Dos Entidades, es decir, la cantidad de veces que una
Entidad puede asociarse con otra Entidad. De la Cardinalidad emerge la cantidad de Procesos
que existen en un negocio dado, en el negocio asociado a nuestra BBDD. Sus posibilidades son:
Uno A Uno. 1:1. Un Registro de una Entidad se asocia con Un Único Registro de otra
Entidad, y viceversa. Cada Persona puede tener Un Único Pasaporte, cada Pasaporte
puede pertenecer a Una Única Persona. Presenta el siguiente Símbolo:
Uno A Muchos. 1:N. Un Registro de una Entidad se asocia con Múltiples Registros de otra
Entidad. Cada Autor puede escribir Múltiples Libros, cada Libro es escrito por Un Único
Autor. Presenta el siguiente Símbolo:
Muchos A Muchos. N:M. Múltiples Registros de una Entidad se asocian con Múltiples
Registros de otra Entidad. Cada Estudiante puede inscribirse en Múltiples Cursos, cada
Curso puede tener inscritos Múltiples Estudiantes. Presenta el siguiente Símbolo:
¿Cuál es el Mínimo?
¿Cuál es el Máximo?
De Cero A Muchos
De Uno a Muchos
De Uno A Muchos
Llave Primaria (Primary Key) es un Identificador Único de una Tabla. Permite conocer cómo
está establecido el Índice de dicha Tabla. Llave Secundaria (Foreign Key) sirve para
Referenciar Datos entre Tablas, de una Tabla a otra Tabla.
Una Llave Secundaria es una Llave Primaria en una Tabla, referenciada a otra Tabla.
Para Relacionar ambas Tablas conforme al Modelo Entidad-Relación nos dirigimos a la Tabla
Principal en la sección ForeingKeys. Hacemos:
Column = id_categorias
Referenced Column = idCategoria
Para cuando los datos se Actualizan o se Eliminan dentro de la Tabla tenemos Foreing Key
Options:
On Update = NO ACTION
On Delete = NO ACTION
-
09. PRACTICANDO LO APRENDIDO
…
10. SIGAMOS PRACTICANDO
…
11. STORE PROCEDURES (PROCEDIMIENTOS ALMACENADOS)
Queriendo llamar a todos los Registros de la Categoría 0, tendríamos que hacerlo uno por uno
para cada uno de los Productos. Para crear un Procedimiento Almacenado usamos DELIMITER,
que implica que podremos ejecutar los caracteres que contenga el apartado de código. En este
caso lo utilizaremos dado que nuestro Cliente espera ‘;’. Hacemos:
DELIMITER //
//
DELIMITER ;
Mediante BEGIN indicamos el Inicio del Procedimiento Almacenado. END marca el Final del
Bloque de Código. Para Llamar al Procedimiento Almacenado usamos el Método CALL, en
MySQL. Al realizar una Llamada, este Procedimiento nos traerá aquellas Categorías que sean 0,
en su forma específica en la que lo hemos implementado:
CALL seleccionar_categorias_0();
Nos servirá para simplificar nuestro trabajo, al momento de necesitar realizar Tareas Complejas
que se pueden automatizar de esta manera. Redundan también en la Seguridad, estando bien
implementadas, dado que nos exponemos a menos errores acumulados.
Realizaremos un Procedimiento Almacenado para Filtrar Productos por Precio. Tenemos una
BBDD que funciona como Inventario, con una Tabla denominada Productos. El Procedimiento
Almacenado debe recibir un Parámetro De Entrada denominado Precio_Minimo, seleccionando y
mostrando todos los Productos cuyo precio sea mayor o igual.
CALL ObtenerProductosPrecio(2);
En este caso con un Precio Mínimo de 2, devolviendo todos los registros que sean iguales o
mayores a este Precio Mínimo de 2.
Los Procedimientos Almacenados pueden trabajar junto con Triggers y junto con Vistas.
-
12. TRIGGERS (DISPARADORES)
65. TRIGGERS
BEFORE. Se ejecuta Antes de que ocurra la acción. Perfecto para validar datos.
AFTER. Se ejecuta Después de que ocurra la acción. Perfecto para auditar datos. Perfecto
para calcular datos.
Para Trigger:
DELIMITER //
DELIMITER ;
BEGIN siempre lo usamos tanto en Procedimientos Almacenados como en Triggers, donde
hacemos la Consulta (Petición) SQL a la Tabla que corresponda. Especificamos en este caso a
qué Campos vamos a afectar durante dicha Consulta.
La Tabla denominada Usuarios se habrá actualizado con un nuevo Campo con estos Valores. A
su vez, la Tabla denominada Auditoria_Usuarios se habrá actualizado con un nuevo Campo que
registra el momento en el que se han insertados esos Datos en ese nuevo Campo.
Para el Trigger:
DELIMITER //
DELIMITER ;
SQLSTATE es un Estado SQL, es decir, un Error SQL, que eventualmente puede ser manejado
por el usuario. Para probar el Trigger hacemos lo siguiente:
-
13. VISTAS
68. VISTAS
Permiten simplificar Consultas Complejas. Permiten presentar Datos Específicos, sin exponer
toda la información contenida en la Base de Datos. Una Vista es una Tabla Virtual generada
mediante una Consulta SQL. No estamos almacenando datos, sino únicamente mostrándolos en
esa configuración determinada que podemos necesitar particularmente en ese momento.
Podemos presentar una Perspectiva específica de los Datos sin generar duplicidades.
Únicamente estamos representando datos ya existentes, sin generar nada, y sin exponer los
datos existentes a posibles manipulaciones indeseadas, erróneas. Cuando conformamos una
Vista estamos creando una Tabla Virtual, sin conectar directamente con la Tabla en sí.
Usamos la Tabla denominada Productos, conformada anteriormente. Igual para Ventas, con una
Clave Foránea para la Tabla Productos. Conformamos una Vista denominada VentasTotales,
con: Nombre, Cantidad, Ingresos. Para crear una Vista:
DELIMITER //
DELIMITER ;
Ejecutamos el código anterior mediante el Botón de Crear Vista. Estamos Representando los
Datos en la manera en que queremos presentarlos. No estamos creando ninguna Tabla efectiva
nueva.
DELIMITER //
DELIMETER ;
Aún dentro de las Vistas podemos personalizar la Consulta. Estamos actuando de tal manera que
la Tabla Virtual actúa como una Tabla normal.
-
14. TRANSACCIONES
71. TRANSACCIONES
Conjunto de Instrucciones que deben cumplirse en su totalidad para ser ejecutadas, y que
despliega un determinado funcionamiento. Funcionan en base a ACID:
Las Transacciones forman parte del funcionamiento interno de SQL. Cuando realizamos una
Consulta, estamos realizando una Transacción. Estudiaremos ahora dos maneras de realizar una
Transacción de manera manual. Hemos de aprendernos Dos Comandos:
Comenzamos:
BEGIN;
-- Hacer Transacción
-- Confirmar Transacción
COMMIT;
ROLLBACK;
BEGIN informa a SQL que conformamos una sección de código que puede ser una Transacción.
Restamos a una cuenta de Juan 200 $, sumamos a una cuenta de María esos 200 $. ROLLBACK
sólo se estará ejecutando si se produce algún error por el camino, no siendo este el caso. Para
que concurra añadimos lo siguiente antes de hacer la Transacción:
INSERT INTO cuentas (cuenta_id, titular, saldo) VALUES (1, ‘Error en la transacción’, 100);
Estudiamos aquí la segunda manera de realizar una Transacción, usando el siguiente Comando:
Comenzamos:
-- Iniciar Transacción
START TRANSACTION;
-- Transacción
UPDATE cuentas SET saldo = saldo – 100.00 WHERE cuenta_id = 1;
UPDATE cuentas SET saldo = saldo + 100.00 WHERE cuenta_id = 2;
-- Cerrar Transacción
COMMIT;
ROLLBACK se verifica mediante la Lógica de nuestra Programación, del Lenguaje que estemos
utilizando. Si queremos Validarlo mediante SQL hemos de implementarlo de una manera muy
específica que estudiaremos en el siguiente apartado.
74. ROLLBACKS
DELIMITER //
START TRANSACTION;
-- Efectuamos Transacción
ELSE
COMMIT;
SELECT “Transacción Completada” AS Resultado;
DELIMITER ;
-
15. TRIPLE EJERCICIO
75. INTRODUCCION
76. EJERCICIO I
77. EJERCICIO II
-
16. FUNCIONES AVANZADAS
79. ENCRIPTACIÓN
AES (Avanced Encrypt Standard). Con lo anterior será suficiente para encriptar el dato en
cuestión. Para Desencriptar hacemos:
Implementamos ahora otro Método de Encriptación, siendo este menos seguro que el anterior.
Conviene investigar los Protocolos de Encriptación para conocer cuando aplicar cada caso. Este
caso nos servirá para una BBDD Local, en entornos controlados. Hacemos:
COMPRESS nos solicita únicamente como Parámetro la Variable que vamos a Encriptar. Esto
será suficiente para Encriptar el Dato en cuestión. Para el paso contrario, la sintaxis se mantiene
coherente, y tenemos:
Esto es suficiente para mostrar la Cantidad de Caracteres que contiene un Campo en específico.
81. CONCATENACION
Concatenamos datos de diferentes Columnas en una única Columna. Usaremos la BBDD llamada
Empresa. Comenzamos:
USE Empresa;
Hacemos PHPMyAdmin > Cuentas De Usuarios > Usuarios. Aquí vemos los Usuarios que tienen
acceso a nuestra BBDD. Hemos de vigilar muy de cerca la Gestión de Usuarios, el Control de
Usuarios. Para crear un Nuevo Usuario habremos de rellenar un Formulario muy pormenorizado,
estableciendo de manera específica el Rol, constreñido mediante los Privilegios. Contar con
Todos los Privilegios en este caso implica:
Podríamos establecer, como vemos, Límites de Recursos, siendo pertinente. Ahora, para
conectar esto en Workbench hacemos: MySQL Connections > Setup New Connection. Volvemos
a rellenar el Formulario pertinente. Con esto ya tendremos el Perfil de Usuario creado.
83. FECHAS
USE Avanzada;
SELECT * FROM Productos;
INSERT INTO Productos (Nombre_Producto, Precio_Producto, Fecha_Garantia)
VALUES (“Martillo”, 12.99, “2020-02-02”);
INSERT INTO Productos (Nombre_Producto, Precio_Producto, Fecha_Garantia)
VALUES (“Destornillador”, 10.99, “2020-02-02”);
A la Fecha_Garantia le hemos sumado 90 días usando el Método ADDDATE. Esta es una forma
que tenemos de sumar fechas de manera avanzada.
Método para unificar información de diferentes Tablas que presentan Parámetros en común. Se
unirá la Información cuando cumpla una determinada Condición. Se puede desplegar de manera
Implícita o de manera Explícita. Partimos de las Tablas Clientes y Ventas. De la primera
requerimos los Campos Nombre y Ciudad. De la segunda el Campo Monto_Venta. Hemos de
tener un Campo en común entre las Tablas, que en este caso será ID_Cliente. De manera
Explícita:
SELECT
clientes.nombre,
clientes.ciudad,
ventas.monto_venta
FROM
clientes
INNER JOIN
ventas
ON
clientes.cliente_id = ventas.cliente_id;
Esto nos permite presentar Vistas personalizadas de manera eficiente. Ahora, de manera
Implícita:
SELECT
clientes.nombre,
clientes.ciudad,
ventas.monto_venta
FROM
clientes, ventas
WHERE
clientes.cliente_id = ventas.cliente_id;
Estamos haciendo un Inner Join, pero sin realizarlo mediante su método específico. Lo
recomendado es utilizar la Manera Explícita, siendo más elegante y estando implementada
precisamente para ser utilizada.
-
17. CREACION BASE DE DATOS (PRÁCTICA)
85. INTRODUCCION
-
18. CREANDO BASE DE DATOS DESDE CERO (MYSQL)
89. INTRODUCCION
Crearemos una BBDD desde cero, aplicando todos los conocimientos adquiridos en MySQL. Una
ficticia Institución González nos solicita realizar una BBDD que guarde la Información del Personal
que trabaja en dicha Institución, así como de los Estudiantes que se matriculen. La naturaleza
propia del problema nos presenta de manera muy evidente las Entidades que se presentan:
Maestros
Estudiantes
Terceros
Un Maestro puede enseñar a Varios Estudiantes. Varios Estudiantes pueden tener a Un Maestro
por cada Clase. La Institución puede tener Varios Maestros. Varios Maestros pueden estar
vinculados a Una Única Institución.
Una situación profesional real requerirá que nosotros identifiquemos, usando nuestra lógica,
cuales son las Entidades, cuales son los Atributos, cuales son las Relaciones. Cuando mejor
estilicemos esta parte del proceso que requiere de un análisis pormenorizado, mejor modelada
estará nuestra BBDD. Y cuanto mejor modelada esté, mejor funcionamiento presentará nuestro
código, nuestro programa. Recordemos que la digitalización se trata de abstraer, de virtualizar el
mundo real.
El conocimiento que vamos a aplicar aquí es un subconjunto de todo lo que hemos aprendido. Es
decir, el conocimiento necesario dentro de ese conocimiento global, que necesitamos para
desarrollar esta base de datos en específico.
97. ADVERTENCIA
99. FINALIZACION
-
24. CREANDO UN LOGIN
137. INTRODUCCION
Conformar todo lo anterior mediante Menú Contextual nos genera el siguiente Código:
Tenemos en este momento, claro está, una Base de Datos que se presenta vacía, con una Tabla
que se presenta vacía. Insertamos Datos:
USE Login;
Iniciamos Auto-Incrementable:
Estos Usuarios los utilizaremos al momento de realizar el Login pertinente. Haremos ahora HMTL,
CSS y Documentación.
Realizaremos el HTML de nuestro Login. Ya tenemos una BBDD con cinco Registros de
Usuarios. Desde Visual Studio hacemos Abrir Carpeta > Xampp > HTDocs > Nueva Carpeta, a la
que denominaremos Login. Creamos ahora un db.php, que contendrá las Credenciales de
nuestra BBDD, que consultamos desde el LocalHost. Hacemos Servidor > Cuentas Usuarios >
LocalHost (Todos Los Privilegios).
140. ESTILO DE LOGIN
…
25. VISTA DATOS WEB
143. INTRODUCCION
…
26. REGISTRO CON MYSQL
148. INTRODUCCION
…
27. LOGIN Y REGISTRO CON MYSQL
154. INTRODUCCION
155. PROYECTO
162. BONUS
…
28. DISEÑO ALMACEN EN WEB
163. INTRODUCCION
…
29. DESPEDIDA
178. DESPEDIDA
…
30. BONUS
179. BONUS
…
GLOSARIO
Dato. Columna. Tabla. Sentencia. Clausula. Instrucción. Campo. Registro. Consulta. Indice.
Comando. Formulario. Segmentar. Función. Normalizar. Normalización. Formas Normales.
Primera Forma Normal. 1NF. Segunda Forma Normal. 2NF. Tercera Forma Normal. 3NF. Valor
Atómico. Dato Atómico. Atributo. Tabla Principal. Tabla Independiente. Dependencia.
Dependencia Parcial. Dependencia Transitiva. Optimización. Integridad. Entidad. Entidad
(Objeto). Atributo. Atributo (Columna). Relación. Clave Primaria. Primary Key. Clave Foránea.
Foreign Key. Modelo Entidad Relación. Cardinalidad. Registro. Store Procedure. Procedimiento
Almacenado. Trigger. Vista. Transacción. Encriptación. Rol. Roles. Privilegio. Privilegios.
CREATE. DATABASE. USE. TABLE. SELECT. FROM. INSERT. INTO. VALUES. WHERE.
DISTINCT. ORDER BY. ASC. DESC. AND. OR. NOT. IN. BETWEEN. LIKE. SUM. COUNT. MIN.
MAX. AVG. GROUP BY. UCASE. LCASE. CONCAT. ROUND. CHAR_LENGTH. CASE. ELSE.
WHEN. THEN. END. UPDATE. SET. ALTER TABLE. ADD. ADD COLUMN. DROP. DROP
COLUMN. NOT NULL. DATE. DATETIME. SCHEMA. NULL. AUTO_INCREMENT. ENGINE.
COMMENT. CHANGE. TRIGGER. BEFORE INSERT. AFTER INSERT. BEFORE UPDATE.
AFTER UPDATE. BEFORE DELETE. AFTER DELETE. ON UPDATE. ON DELETE. RESTRICT.
CASCADE. SET NULL. NO ACTION. DELIMITER. PROCEDURE. BEGIN. END. CALL. BEFORE.
AFTER. TRIGGER. FOR. FOR EACH. ROW. SIGNAL. MESSAGE_TEXT. SQLSTATE. VIEW.
AS. JOIN. ON. COMMIT. ROLLBACK. START TRANSACTION. IF. ROW_COUNT.
AES_ENCRYPT. AES_DECRYPT. COMPRESS. UNCOMPRESS. LENGTH. CONCAT.
CONCAT_WS. ADDDATE. INNER JOIN. ON.
--
HERRAMIENTAS
LUCIDCHART (Diagramas).
--
NOTAS