Unidad 2
Gestión de Base de Datos - Consultas
Indice
Funciones Agregadas
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:
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/