Unidad 2

Gestión de Base de Datos - Consultas

Indice

INTRODUCCIÓN

Consultas con sentencias

Consulta de todos los registros

Consulta con algunos campos de la tabla

Consulta de diversos campos de la tabla

Consulta de campos con ordenamiento

Consultas con INNER JOIN

Consulta LEFT JOIN

Consulta RIGHT JOIN

Consultas CONCAT (concatenar)

Consultas con UPDATE

Consultas con DELETE

Consulta UNIONES

Consulta COUNT()

Consulta COUNT (DISTINCT)

Funciones Agregadas

Función MAX()

Función MIN()

Función AVG()

Función SUM()

Función STD()

Disparadores (trigger)




1.-    INTRODUCCIÓN

Que son las CONSULTAS

Es el proceso de enviar una sentencia (instrucción) para insertar, consultar, actualización o borrado de un(os) registro(s), realizaremos lecturas del tipo consultas con el generador de consultas de PhpMyAdmin.

CONSULTAS CON SENTENCIAS

Primero debemos tener la base de datos activa en este ejemplo tienda, y escribimos en el área de Consulta a la base de datos tienda, y usaremos la sección generar consulta, en la versiones mas recientes hay un cambio, en este menú que observaras 2 opciones de consulta: Consulta Multitabla y Consulta por ejemplo.

y esta es Consulta Multitabla, este es para combinar varias tabla:

 

y esta imagen de abajo es Consulta por Ejemplo.

Usaremos Consulta por ejemplo:

Consulta de todos los registros de la tabla

escribimos lo siguiente SELECT `clientes`.* FROM `clientes` y Ejecutamos la consulta



la sentencia es: SELECT `clientes`.* FROM `clientes` que significa que SELECCIONE clientes.* (muestre todos los registros eso significa *, es decir que lea toda la tabla sin restricciones), FROM `clientes`(de la tabla clientes) 

mostrando todos los registros de la tabla (hasta este momento 3)

Ejercicio para alumnos, inserten mas datos a la tabla y hagan la misma consulta con sus datos ingresados, tomen captura de pantalla antes de realizar la consulta y después de la consulta, y nombraran sus evidencias como: consulta_1_<nombre>.jpg, y consulta_2_<nombre>.jpg, donde nombre es su nombre, ejemplo: consulta_1_agripino_martinez.jpg y consulta_2_agripino_martinez.jpg

Consulta de algunos campos de la tabla

SELECT `clientes`.`nombre`, `clientes`.`apellido_paterno`, `clientes`.`apellido_materno` FROM `clientes`

La secuencia es la misma lógica que el anterior pero indicando que campos usare para mostrar los datos, y ejecutamos la consulta.

El resultado de la consulta:


Consulta de diversos campos de la tabla

Para este momento ya habrás observado unos campos vacíos en la parte superior de la consulta, esto ayudan a crear la consulta, de forma de interface, sin embargo esta limitado en este momento se ven 3 columnas para seleccionar campos, se pueden incluir mas columnas estos ayudan a crear la consulta apero solo están disponibles 3 en la ventana y otros 3, revisa el siguiente video con una consulta aquí.

Como se aprecia, en la consulta podemos aumentar o en su defecto diminuir los campos, para mostrar de una tabla, pero se pueden dar limitaciones cuando se presenten muchos campos, para ello tenemos la opción de escribir los campos sobre el ares de consulta, de cualquier modo cuando estemos programando debemos escribir la secuencia, esto solo nos ayuda para darnos una forma de crear las consultas.

Hagamos un ejemplo de esto con los campos que podemos agregar/quitar veamos el proceso:

Consulta de campos con ordenamiento (ascendente  y descendente)

Igual que el método anterior podemos seleccionar campos de la tabla, y en el espacio inferior del campo de la tabla tenemos, Ordenamiento, hay 2 opciones Ascenderte y Descendente en el triangulo del lado derecha al hacer clic en el nos mostrara las 2 opciones, en este caso lo establecemos en Ascendente:



se vera de esta manera:




usando 5 campos se vera así, y la consulta:

SELECT `clientes`.`nombre`, `clientes`.`apellido_paterno`, `clientes`.`apellido_materno`, `clientes`.`direccion`

FROM `clientes`

ORDER BY `clientes`.`nombre` ASC

es muy similar a las consultas anteriores con la excepción de la ultima instrucción, que realiza el ordenamiento de forma Ascendente (ASC)


y el resultado, se aprecia el ordenamiento ascendente el campo del nombre



probemos igual los campos pero en descendente:



usando 5 campos se vera así, y la consulta:

SELECT `clientes`.`nombre`, `clientes`.`apellido_paterno`, `clientes`.`apellido_materno`

FROM `clientes`

ORDER BY `clientes`.`nombre` DESC

es muy similar a las consultas anteriores con la excepción de la ultima instrucción, que realiza el ordenamiento de forma descendente (DESC), y el resultado, se aprecia el ordenamiento descendente el campo del nombre, pruebe con otros campos de la tabla ascendente y descendente antes de continuar, y envié sus comentarios al correo.



Otro ejemplo de ordenamiento por primer apellido:





SELECT `clientes`.`nombre`, `clientes`.`apellido_paterno`, `clientes`.`apellido_materno`, `clientes`.`direccion`, `clientes`.`num_exterior`

FROM `clientes`

ORDER BY `clientes`.`apellido_paterno` ASC


Ejercicio: agregue mas datos de clientes y realice los ordenamientos mostrados, en ascendente y descendente, haga capturas de pantalla y envíelos al correo que se le menciono, igual como el caso de evidencia con imágenes, nombraran sus evidencias como: consulta_3_<nombre>.jpg, y consulta_4_<nombre>.jpg, donde nombre es su nombre, ejemplo: consulta_3_agripino_martinez.jpg y consulta_4_agripino_martinez.jpg

Consultas con inner join

Este tipo de consulta sirven para combinar de dos o mas tablas basándose en un campo común devolviendo la combinación de estas tablas, su sintaxis es la siguiente:

El JOIN más común es: SQL INNER JOIN (join simple). Un SQL INNER JOIN devuelve todos los registros de varias tablas que cumplen con la condición.

SINTAXIS INNER JOIN


SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

o también

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;


Crearemos una nueva base de datos para ejemplo, que sera nuestro punto de partida:

Creamos una nueva base de datos con 2 tablas, la base de datos la llamaremos escuela_ejemplo, usemos DBDesigner, como solo tenemos permitido 2 proyectos de bases de datos por la versión libre, debo borrar algún proyecto usado anteriormente que ya tengamos muestro diseño funcionando, así que pasamos a dashborad :


y seleccionamos el proyecto que ya no necesitamos, en este caso personal, en delete proyect:



regresamos a un nuevo proyecto y creamos la base de datos (en Esquema) escuela_ejemplo y creamos tabla alumno y salón:




Y creamos nuestra tabla de los salones :

 

las tablas quedan así:



Exportamos el script:


lo podemos copiar desde el script generado por DBDesigner

CREATE TABLE `alumno` (
    `IdAlumno` int(4) NOT NULL AUTO_INCREMENT,
    `Nombre` varchar(10) NOT NULL,
    `Fecha_ingreso` DATE NOT NULL,
    `IdSalon` int(4) NOT NULL,
    PRIMARY KEY (`IdAlumno`)
);

CREATE TABLE `salon` (
    `IdSalon` int(4) NOT NULL,
    `Grupo` varchar(4) NOT NULL,
    `Grado` varchar(4) NOT NULL,
    PRIMARY KEY (`IdSalon`)
);

ALTER TABLE `alumno` ADD CONSTRAINT `alumno_fk0` FOREIGN KEY (`IdSalon`) REFERENCES `salon`(`IdSalon`);


Pasamos a PhpMyAdmin:

Creamos la base de datos escuela_ejemplo, y sus tablas en SQL





Evidencia: Captura la pantalla y envialo con el nombre tabla_salon_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema tabla salon

Insertemos algunos datos, comenzamos por salon, pregunta porque empezamos en esta tabla ?


y la de alumno, cuando comiences a ingresar la información de los alumnos deberá de observar algo interesante en el campo IdSalon, explica lo que sucede, envia tus comentarios al correo establecido, y haciendo mención del tema:


revisemos en diseñador:



En esta sección veremos un área en blanco, seleccionamos el primer icono del lado izquierdo con ello activamos el la sección del lado derecho

que contiene las tablas solo seleccione las tablas en los cuadros y la tablas se mostraran en la parte del centro mostrado la estructura de estas



por el momento lo dejaremos aquí, mas adelante veremos como manipular esto.

Evidencia: Captura la pantalla y envialo con el nombre relacion_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema relacion de tablas salon

en la pestaña SQL escribimos lo siguiente:


SELECT alumno.IdAlumno,alumno.Nombre,alumno.Fecha_ingreso,alumno.IdSalon,salon.Grupo,salon.Grado,salon.IdSalon
FROM alumno
INNER JOIN salon
ON alumno.IdSalon=salon.IdSalon;

el resultado es esto:


Podemos revisar que los datos de ambas tablas se ha unido (JOIN) internamente (INNER)

Podemos modificar la consulta INNER JOIN, retiramos el salon.IdSalon para no producir confusión:

SELECT alumno.IdAlumno,alumno.Nombre,alumno.Fecha_ingreso,alumno.IdSalon,salon.Grupo,salon.Grado
FROM alumno
INNER JOIN salon
ON alumno.IdSalon=salon.IdSalon;



Evidencia: Captura la pantalla y envialo con el nombre inner_join_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema inner join de tablas salon

comparemos con la sintaxis indicada anteriormente:


SINTAXIS INNER JOIN (1)


SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

o también

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

Entonces decimos que INNER JOIN es lo mismo que JOIN.



Como se puede apreciar podemos crear una consultas de dos tablas.

Consulta Left Join (1)

La clausula LEFT JOIN devuelve todas los registros de la tabla de la izquierda (table1), con las correspondientes de la tabla de la derecha (table2). El resultado es NULL en la parte de la derecha cuando no hay registros que correspondan con la condición.

SINTAXIS SQL LEFT JOIN

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

 en algunas bases de datos LEFT JOIN es LEFT OUTER JOIN;

SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;


Para nuestro ejemplo:

SELECT alumno.IdAlumno,alumno.Nombre,alumno.Fecha_ingreso,alumno.IdSalon,salon.Grupo,salon.Grado
FROM alumno
LEFT JOIN salon
ON alumno.IdSalon=salon.IdSalon;


Evidencia: Captura la pantalla y envialo con el nombre left_join_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema left join de tablas salon

Que puedes apreciar con el primer ejemplo de INNER JOIN... espero sus comentarios.

Consulta Right Join

La instrucción RIGHT JOIN devuelve todas los registros de la tabla de la derecha (table2), y todas los registros correspondientes de la tabla de la izquierda (table1). El resultado será NULL cuando no haya registros correspondientes de la tabla de la izquierda.

SQL RIGHT JOIN Syntax


SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;

 

ó

SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;

 

Para nuestro ejemplo:

SELECT alumno.IdAlumno,alumno.Nombre,alumno.Fecha_ingreso,alumno.IdSalon,salon.Grupo,salon.Grado
FROM alumno
RIGHT JOIN salon
ON alumno.IdSalon=salon.IdSalon;




Vemos que hay 2 registros NULL son aquellos que están en la tabla pero no hay datos en estos registros, y aun así se asignan grupo y salón, si revisamos las tablas los Grupos C y E no han sido asignados y esta consulta los incluye, así como los Grados 1 y 2.

Evidencia: Captura la pantalla y envialo con el nombre right_join_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema right join de tablas salon

En el generador de consultas podemos usar en constructor visual :



nos lleva a un área ya conocida, seleccionamos los campos de las tablas para ver la forma de consulta:




Y creamos la consulta:



podemos ver que se forma una consulta LEFT JOIN, y enviamos la consulta:





Se crea la consulta pero se repiten los campos, aunque podemos tomar de aquí, la estructura de al sentencia de SQL y adaptarla a nuestras necesidades



Ahora apliquemos INNER JOIN a nuestro ejemplo de tienda, 1) debemos relacionar la tabla de pedidos con el cliente, como solo tenemos un solo pedido del cliente 1:

SELECT pedidos.Id_cliente,pedidos.fecha_pedido,pedidos.cantidad_pedido,clientes.nombre,clientes.apellido_paterno, clientes.apellido_materno,clientes.direccion
FROM clientes
INNER JOIN tienda.pedidos ON clientes.Id_cliente = pedidos.Id_cliente;





Evidencia: Captura la pantalla y envialo con el nombre join_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema  join de tablas salon

Consultas concatenar (2)

Sintaxis

CONCAT(cadena1,cadena2,...)

Devuelve la cadena que resulta de concatenar los argumentos. Puede tener uno o más argumentos. Si todos los argumentos son cadenas no binarias, el resultado es una cadena no binaria. Si los argumentos incluyen cadenas binarias, el resultado es una cadena binaria.

CONCAT()devuelve Null si algún argumento es NULL.

Usando la base de datos tienda, ejecute los ejemplos en la sección SQL

Ejemplo de concatenar:

SELECT concat ('Ma','ri','a','DB');



Resultado:



Probemos con la base de datos tienda, y la tabla clientes:

SELECT concat (nombre,' ',apellido_paterno,' ',apellido_materno,' ',direccion) AS datos_pers FROM clientes;

AS datos_pers,  es el nombre de la consulta de la concatenación, puede ser cualquier nombre en la segunda imagen se ve el titulo de la consulta:




el resultado:



prueba esto:


SELECT concat (nombre,' ',apellido_paterno,' ',apellido_materno,' ',direccion,' ',nombre_producto) AS datos_pers FROM clientes,productos;

Evidencia: Captura la pantalla y envialo con el nombre concatenar_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema concatenar

puedes explicar porque se muestra esta combinación ? .... espero tu respuesta al correo que te hemos proporcionado

UPDATE

Esta sentencia permite actualizar/editar datos existentes en una(s) tabla(s), la sintaxis es la siguiente:

UPDATE nombre_tabla SET nombre_columna = valor WHERE x=y;

primero consultemos la tabla productos, y seleccionemos el primer registro que cuyo valor de precio_producto es 569.1, lo actualizaremos a 600 



pasamos al separador SQL,  y escribimos esta consulta:

UPDATE productos SET precio_producto = 600 WHERE Id_producto = 1;

y solicitamos simular la consulta (abajo a la derecha):




y se obtiene lo siguiente:



Aplicamos el botón Cerrar, y después continuar



revisemos el registro que ha sido actualizado:



Revisemos la sentencia:

UPDATE productos SET precio_producto = 600 WHERE Id_producto = 1;

UPDATE tabla SET campo = nuevo_valor WHERE campo_comparar= valor;



cuando en la tabla se localiza el campo con el valor buscado (WHERE Id_producto = 1), se actualiza el valor del campo indicado (SET precio_producto = 600), esto es que el valor de  569.1 fue modificado a 600.

Evidencia: Captura la pantalla y envialo con el nombre update_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema update de tablas

DELETE

Esta instrucción es muy similar a UPDATE/SELECT, el propósito es eliminar un registro, aquí hay que tener cuidado en que tabla eliminamos el registro, ya que la relación entre las tablas que existiese entre ellas podría provocar problemas, tal que debemos usarla con mucho cuidado y consideraciones, por ejemplo en esta base de datos borrar un registro de la tabla pedidos, debemos de revisar que afectaría y que tablas serian afectadas y de que forma, en algunos diseños solo se agrega un campo para indicar si fue cancelado, que eliminarlo de forma definitiva, ya que puede ser una forma de llevar un registro de cancelaciones de un cliente.

la sintaxis es :

DELETE FROM nombre_tabla WHERE campo_buscado = 'xy';

Ingresare un nuevo producto para probar esta instrucción:



El registro 5 es una captura para demostrar el efecto del la instrucción DELETE:

Ahora la eliminamos, con la instrucción DELETE:

DELETE FROM `productos` WHERE Id_producto =5;



el resultado:



Evidencia: Captura la pantalla y envialo con el nombre delete_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema delete de tablas


Como en todos los comandos SQL el verbo esta en primer lugar enseguida la palabra calve FROM seguida del nombre de la tabla, después del nombre de la tabla esta la clausula WHERE donde limita el numero de eliminaciones, donde la siguiente sentencia, borra toda la tabla de clientes:

DELETE FROM clientes;

Considere la siguiente sentencia:

DELETE FROM clientes WHERE estado='Puebla' LIMIT 100;

La sentencia refiere que debe borrar aquellos registros de la tabla clientes cuando el campo estado sea igual a Puebla, y que se limite a 100 filas de la tabla.

Después de eliminar registros se debe de realizar este sentencia:


OPTIMIZE TABLE clientes;

esto es que los registros "borrados" no se retiran del todo, como usan el proceso InnoDB, quedan en un archivo temporal, para asegurarnos que sean retirados completamente.


UNIONES

Permiten aprovechar las relaciones entre las tablas,  y es cuando dos o mas tablas se unen para recuperar datos, basándose con las relaciones entre estas tablas.

Tenemos una relación entre la tabla clientes y la de pedidos, a lo cual podemos hacer los siguiente:


SELECT nombre, apellido_paterno,apellido_materno,clientes.Id_cliente
FROM clientes, pedidos
WHERE clientes.Id_cliente = pedidos.Id_cliente;

en la linea SELECT nombre, apellido_paterno,apellido_materno,clientes.Id_cliente al final debo de especificar de que tabla estoy leyendo el dato ya que hay en estas tablas el mismo campo si solo indico Id_cliente seria ambiguo porque hay 2 campos idénticos, esto es para recuperar, los clientes que tienen pedidos, solo muestra un solo registro ya que solo tenemos un solo pedidos con este cliente.

el resultado es:



Realicemos esta sentencia:


(SELECT nombre AS Clente_Nombre FROM clientes)
UNION
(SELECT descripcion_producto AS Producto FROM productos);



Resultado:



Puedes dar una explicación de lo que dio por resultado

Evidencia: Captura la pantalla y envialo con el nombre union_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema union de tablas

COUNT() (3)

Se usa para contar el numero de ocurrencias en valores no nulos de una columna

SELECT COUNT(nombre)
FROM clientes AS C, pedidos AS P
WHERE C.Id_cliente=P.Id_cliente;

Devuelve el numero de filas con valores no nulos de  una columna, la sentencia FROM clientes AS C, pedidos AS P lo que hace es dar un alias a la tabla clientes y su alias es C, y la tabla pedidos le da el alias de P.

Y estos alias son substitutos de las tablas correspondiente cuando WHERE es ejecutado

Resultado



Evidencia: Captura la pantalla y envialo con el nombre count_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema count de tablas

COUNT (DISTINCT)

Devuelve un recuento del número de diferentes valores no NULL.

COUNT(DISTINCT) devuelve 0 si no hubo filas coincidentes.

La sintaxis

COUNT(DISTINCT expr,[expr...])

La función SQL COUNT() con cláusula DISTINCT elimina la apariencia repetitiva de los mismos datos. El DISTINCT puede venir solo una vez en una declaración de selección dada.

En nuestra base de datos tienda usemos lo siguiente:

SELECT COUNT(DISTINCT nombre) FROM clientes


el resultado, presenta 3 registros que contienen datos en la tabla:



Probemos esto:


SELECT COUNT(DISTINCT nombre)
FROM clientes
WHERE nombre='Miguel';




el resultado es 1, ya que solo hay 1 nombre Miguel en la tabla:


Agreguemos otro nombre a la tabla (otra Persona Ricardo)



apliquemos este comando y revisemos el resultado:

SELECT COUNT(DISTINCT nombre)
FROM clientes
WHERE nombre='Ricardo';



el resultado, nos marca solo 1, puedes explicar porque presenta este numero ?


Evidencia: Captura la pantalla y envialo con el nombre count_distinct_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema count distinct de tablas

y si aplicamos esta sentencia

SELECT COUNT(DISTINCT nombre)
FROM clientes;


nos regresa el numero 3; porque ?



Función MAX() (4)

Devuelve el valor mas alto (o máximo)  de una lista de datos numéricos.

SELECT MAX(precio_producto) FROM productos;


El resultado de la consulta:



puedes verificar los datos de la tabla para comprobar esto.

otra forma de revisar los valores máximos de los productos es :


SELECT nombre_producto, MAX(precio_producto) FROM productos GROUP BY nombre_producto;

Hemos agregado un nuevo elemento a la consulta y es GROUP BY  que significa que agrupe de la tabla por una columna especifica en este caso nombre_producto, tenga precaución con la coma que sigue del nombre de campo si no la coloca dará un error.

el resultado, presenta los valores de cada producto:



Revisemos esta sentencia:

SELECT descripcion_producto,precio_producto, MAX(nombre_producto) FROM productos GROUP BY nombre_producto;

el resultado es esto, y explica lo que sucede, enviá tu explicación al correo que se te indico, mencionando el tema (Función MAX):


Evidencia: Captura la pantalla y envialo con el nombre max_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema max de tablas

Función MIN() (5)

Devuelve el valor mas bajo (o mínimo)  de una lista de datos numéricos.

SELECT MIN(precio_producto) FROM productos;


probemos con esto:


SELECT nombre_producto, MIN(precio_producto) FROM productos GROUP BY nombre_producto;

el resultado, aquí también hemos agregado la instrucción GROUP BY en la sentencia:


como observas, no hay diferencia con el anterior y se debe a que solo hay un valor par cada producto si hubiere 2 artículos con el mismo nombre (lo cual es difícil, a menos que tuvieran una presentación diferente, es decir una con pasta dura, y otra con pasta suave)

Evidencia: Captura la pantalla y envialo con el nombre min_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema min de tablas

Función AVG() (6)

Esta función obtiene el promedio de una lista de datos numéricos.

SELECT AVG(precio_producto) FROM productos;

el resultado de esto, la gran cantidad de decimales es por la precisión del tipo float, pueden revisar la unidad 1, para comprobar esto:


Evidencia: Captura la pantalla y envialo con el nombre avg_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema avg de tablas

Función SUM() (7)

Suma los valores de un campo numérico.

SELECT SUM(precio_producto) FROM productos;

el resultado es:


Evidencia: Captura la pantalla y envialo con el nombre sum_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema sum de tablas

Función STD() (8)

Obtiene la desviación estándar de una columna de datos numéricos.

SELECT STD(precio_producto) FROM productos;


en aquellos casos que la tabla de la columna numérica contenga valores NULL, no son valores reales de números, así que serán tomados para el calculo de las funciones SUM(),AVG(),STD().

La clausula WHERE, puede ser usada por estas funciones restringiendo o expandiendo la selección de datos, y sus resultados. La clausula GROUP BY, es posible usarla con cualquiera de las sentencia, agrupando los datos de algún campo.

Evidencia: Captura la pantalla y envialo con el nombre std_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema std de tablas

Disparadores (Trigger)

Es una función que se "dispara" cuando hay un evento (es una acción cuando se desencadena alguna operación, qué se realiza en una base de datos / tablas) que afecta a las tablas de la base de datos, debemos de decidir cual tabla se puede comprometer para que nos avise cuando hay un cambio en esa tabla, el disparador se activa cuando se Inserte (INSERT), Actualizar (UPDATE), o Borrar (DELETE) los datos de una tabla para ello modificaremos, la tabla alumnos de la base de datos.



En estructura insertamos una fila despues de Fecha_ingreso, y el botón Continuar:


y las características del nuevo campo


Después insertamos algunos datos de calificaciones a los alumnos:




Y realizamos cambios a la tabla de alumnos, podemos realizarlo directamente en la pestaña Examinar pasando el cursor sobre el campo de calificación, con un doble clic se modifica el campo quedando así:



ya teniendo los cambios hechos, vamos a revisar mas conceptos de los disparadores, pueden ser (before) antes o (after) después del evento, se sugiere que sean (after) después del cambio, para los casos que se aplicaran, antes de ingresar datos, es decir autentificar los datos antes de insertar información sensible, también es posible que con el disparador borremos, o cambiemos algún dato de otra tabla de la base de datos, y se pueden ejemplificar con estas acciones:

1) Se crean bitácoras de los cambios en las tablas (se llaman logs o bitácoras.)

2) Actualización de fechas de los datos de los registros.

3) Crear relaciones en caso de tener alguna restricción (MyISAM)

La sintaxis:

delimiter //
CREATE TRIGGER nombre_gatillo(nombre del trigger) momento evento(BEFORE, AFTER) ON tabla_que_recibe_evento
FOR EACH ROW
BEGIN
  INSERT INTO
tabla_especifica (campo) VALUE ('Valor');
END //
delimiter;


en nuestro ejemplo ya tenemos las calificaciones de los alumnos y nos damos cuenta que algunas calificaciones han sido alteradas, pues tigger se activara y en una tabla adicional a la base de datos se registraran los eventos:

Primeramente crearemos un tabla con un nombre que represente las actividades que se activen en la tabla alumnos, en otras palabras registraremos le llamaremos registro_eventos, podemos realizarlo desde la pestaña de SQL:

CREATE TABLE registro_eventos (nombre varchar(10), ident_alumno int (4),insertado datetime)

y verificamos desde Estructura:


crearemos un TRIGGER que estara asociado a la tabla alumno, y el evento será AFTER, pasamos a la consola (pestaña) SQL:

antes de continuar definiremos un nombre del disparador, no es regla, se toma como convención poner el nombre de la tabla que estara asociada al TRIGGER, en este caso alumno, despues un guion bajo (_) y el tipo de evento asociado (a) AFTER, (b) BEFORE, y al final el tipo de acción (i) INSERT, (u) UPDATE, (d) DELETE, entonce el nombre del TRIGGER seria:}

CREATE TRIGGER alumno_au , completemos la linea:

CREATE TRIGGER alumno_au AFTER UPDATE ON alumno

analicemos el significado de la primera linea del TRIGGER

crearemos un trigger con el nombre alumno_au después que se realice una actualización en la tabla alumno

completando la secuencia:

CREATE TRIGGER alumno_au AFTER UPDATE ON alumno
FOR EACH ROW
INSERT INTO registro_eventos(ident_alumno, nombre, insertado) VALUES(new.IdAlumno,new.Nombre,now())

Expliquemos las lineas 2 y 3:

FOR EACH ROW , significa que hara escritura en el registro de la tabla registro_eventos una fila cada que se detecte un cambio en la tabla alumno

INSERT INTO registro_eventos(ident_alumno, nombre, insertado) VALUES(new.IdAlumno,new.Nombre,now()) , significa que insertara un registro en la tabla registro_eventos cada ocación que se detecte una actualización en la tabla alumnos con los datos, Ident_alumno = IdAlumno , de la tabla alumno, nombre con Nombre de la tabla alumno, e insertado que es un campo DATETIME = now(), que es la fecha actual y hora actual, que se realizo el cambio.

Ahora bien si notan con cuidado veran que hay unas instrucciones nuevas del lado de los valores y son las instrucciones new.nombre_campo_tabla_registro, esto significa que el valor nuevo que se ha modificado se asigno como new (nuevo) que almacena los nuevos valores que se modificaron en la tabla alumno, pasan a la tabla registro_eventos, estos campos son taomados de la tabla alumno, por lo tanto deberán ser tal como están en esta tabla.

VALUES(new.IdAlumno,new.Nombre,now())

Se realizo de forma correcta el TRIGGER

pasamos a la tabla alumnos de la base de datos escuela_ejemplo, y realizamos un cambio a la tabla, en el campo calificaciones, usemos el último registro con el nombre de Andres, cambiemos su calificación.

 

cambiemos el valor de la calificación a 7, solo hacemos clic en la calificación y escribimos 7, y es todo.




revisamos la tabla registro_eventos, y observamos que han sido insertados los datos de la tabla alumnos a la taba registro_eventos, con los datos de la actualización (modificación), con ello tenemos una evidencia de modificaciones a la tabla alumno y la fecha y hora de este cambio.





esto nos ayuda mucho, pero solo se registro el nombre, la identificación, y fecha hora, pero no sabemos que calificación tenia antes, así que modificare la tabla registro_eventos, para agregar unos campos nuevos, que almacene la calificación anterior, y la nueva,  modifiquemos el TRIGGER para agregar esos campos de calificación anterior, y nueva calificación. Pasamos a la estructura de la tabla y agregamos un espacio para un campos adicional que llamaremos, calificacion_anterior, y otro con el nombre calificacion_nueva:







insertando los nuevos campos en registro_eventos, el alumno deberá de agregar la otra columna llamada calificacion_nueva:




para crear de nuevo un TRIGGER debemos borrar el TRIGER ANTERIOR, cuando este usando la misma tabla, no se permiten mas de dos TIGGER en la misma tabla, con el mismo nombre, observemos que en área de la izquierda, esta la tabla alumno, y al final esta la palabra disparadores, y ahi tenemos un signo +.


y seleccionado la palabra disparadores




nos llevara a la siguiente pantalla, donde se muestra el disparador creado anteriormente, solo queda eliminarlo:



Realizamos un nuevo TIGGER con la misma secuencia pero agregando los campos calificacion_nueva y calificacion_anterior, en cuanto los datos a ingresar debemos colocar old.calificacion, new.calificacion, vea la secuncia de los campos a insertar en la linea 3 deben de coicidir en el orden, es muy importante esto, new.calificacion es el el nuevo valor de la calificacion tomado del campo calificacion de la tabla alumno como queda el nuevo valor, y old.calificacion,  queda como el valor anterior a la modificacion que tenia la tabla alumno, por eso tiene el nombre de campo calificacion, ya que proviene la tabla alumno.

CREATE TRIGGER alumno_au AFTER UPDATE ON alumno
FOR EACH ROW
INSERT INTO registro_eventos (ident_alumno, nombre, calificacion_anterior,calificacion_nueva,insertado)
VALUES(new.IdAlumno,new.Nombre,old.calificacion,new.calificacion,now());





ahora realizamos cambios en la tabla alumnos, en Tere y Andres, y se reflejaran en la tabla registro_eventos


veamos en la tabla registro_eventos, y se observan 2 registros adicionales, que son los cambios en la tabla alumnos.



se puede agregar un campo adicional a la tabla de registro_eventos, con el nombre de usuario varchar(50) y en VALUES colocamos CURRENT_USER, se registrara el usuario que realizo la modificacion.

primero borramos los datos de la tabla registro_eventos, y agregamos el campo usuario, borramos el TRIGGER anterior, y creamos otro TRIGGER:

veamos este proceso en video

borramos de nuevo el trigger anterior y creamos otro:

CREATE TRIGGER alumno_au AFTER UPDATE ON alumno
FOR EACH ROW
INSERT INTO registro_eventos (ident_alumno, nombre, calificacion_anterior,calificacion_nueva,usuario,insertado)
VALUES(new.IdAlumno,new.Nombre,old.calificacion,new.calificacion,current_user(),now());

Modificamos la tabla alumnos de nuevo, y lo que sucede con la tabla registro_eventos, veamos el video aqui.


Evidencia: Captura la pantalla y envialo con el nombre trigger_tablas_nombre_apellido_p_apellido_m.jpg, indicando en el correo tu nombre, y el tema trigger de tablas


(1) http://www.edu4java.com/es/sql/sql5.html
(2) https://mariadb.com/kb/en/concat/
(3) https://www.mariadbtutorial.com/mariadb-aggregate-functions/mariadb-count/
(4) https://mariadb.com/kb/en/max/
(5) https://mariadb.com/kb/en/min/
(6) https://mariadb.com/kb/en/avg/
(7) https://mariadb.com/kb/en/sum/
(8) https://mariadb.com/kb/en/avg/
Lista de las funciones de mariadb https://mariadb.com/kb/en/window-functions/