Skip to content

Commit e98abfd

Browse files
committed
Clase 6
Conceptos avanzados
1 parent 3618685 commit e98abfd

7 files changed

+151
-2
lines changed

06_Advanced/01_index.sql

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
INDEX
3+
Clase 6: https://twitch.tv/videos/1997815022
4+
*/
5+
6+
-- Crea un índice llamado "idx_name" en la tabla "users" asociado al campo "name"
7+
CREATE INDEX idx_name ON users(name);
8+
9+
-- Crea un índice único llamado "idx_name" en la tabla "users" asociado al campo "name"
10+
CREATE UNIQUE INDEX idx_name ON users(name);
11+
12+
-- Crea un índice llamado "idx_name_surname" en la tabla "users" asociado a los campos "name" y "surname"
13+
CREATE UNIQUE INDEX idx_name_surname ON users(name, surname);
14+
15+
-- Elimina el índice llamado "idx_name"
16+
DROP INDEX idx_name ON users;

06_Advanced/02_triggers.sql

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
TRIGGERS
3+
Clase 6: https://twitch.tv/videos/1997815022
4+
*/
5+
6+
-- Crea una tabla de historial para usar en el ejemplo
7+
CREATE TABLE `hello_mysql`.`email_history` (
8+
`email_history_id` INT NOT NULL AUTO_INCREMENT,
9+
`user_id` INT NOT NULL,
10+
`email` VARCHAR(100) NULL,
11+
PRIMARY KEY (`email_history_id`),
12+
UNIQUE INDEX `email_history_id_UNIQUE` (`email_history_id` ASC) VISIBLE);
13+
14+
-- Crea un trigger llamado "tg_email" que guarda el email previo en la tabla "email_history" siempre
15+
-- que se actualiza el campo "email" en la tabla "users"
16+
17+
-- DELIMITER es una directiva que sirve para cambiar el delimitador de instrucciones SQL, que por defecto es ;
18+
-- Se utiliza cuando se define un bloque de código como un procedimiento donde se requieren múltiples
19+
-- instrucciones SQL terminadas con punto y coma dentro de un mismo bloque.
20+
DELIMITER //
21+
CREATE TRIGGER tg_email
22+
AFTER UPDATE ON users
23+
FOR EACH ROW
24+
BEGIN
25+
IF OLD.email <> NEW.email THEN
26+
INSERT INTO email_history (user_id, email)
27+
VALUES (OLD.user_id, OLD.email);
28+
END IF;
29+
END//
30+
31+
-- Actualiza el campo "email" del usuario 1 la tabla "users" para probar el trigger
32+
UPDATE users SET email = '[email protected]' WHERE user_id = 1
33+
34+
-- Elimina el trigger llamado "tg_email"
35+
DROP TRIGGER tg_email;

06_Advanced/03_views.sql

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
VIEWS
3+
Clase 6: https://twitch.tv/videos/1997815022
4+
*/
5+
6+
-- Crea unaa vista llamada "v_adult_users" con los nombres y edades de usuarios de la table "users"
7+
-- que tienen una edad igual o mayor a 18 años.
8+
CREATE VIEW v_adult_users AS
9+
SELECT name, age
10+
FROM users
11+
WHERE age >= 18;
12+
13+
SELECT * FROM v_adult_users;
14+
15+
-- Elimina la vista llamada "v_adult_users"
16+
DROP VIEW v_adult_users;

06_Advanced/04_stored_procedures.sql

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
STORED PROCEDURES
3+
Clase 6: https://twitch.tv/videos/1997815022
4+
*/
5+
6+
-- Crea un procedimiento almacenado llamado "p_all_users" que obtiene todos los datos de "users"
7+
DELIMITER //
8+
CREATE PROCEDURE p_all_users()
9+
BEGIN
10+
SELECT * FROM users;
11+
END//
12+
13+
-- Invoca al procedimiento almacenado llamado "p_all_users"
14+
CALL p_all_users;
15+
16+
-- Crea un procedimiento almacenado llamado "p_age_users" parametrizado para
17+
-- obtener usuarios con edad variable
18+
DELIMITER //
19+
CREATE PROCEDURE p_age_users(IN age_param int)
20+
BEGIN
21+
SELECT * FROM users WHERE age = age_param;
22+
END//
23+
24+
-- Invoca al procedimiento almacenado llamado "p_age_users" con un parámetro de valor 30
25+
CALL p_age_users(30);
26+
27+
-- Elimina el procedimiento almacenado llamado "p_age_users"
28+
DROP PROCEDURE p_age_users;

06_Advanced/05_transactions.sql

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
TRANSACTIONS
3+
Clase 6: https://twitch.tv/videos/1997815022
4+
*/
5+
6+
-- Inicia una nueva transacción. Desde este punto, todas las modificaciones realizadas en la
7+
-- base de datos son temporales y solo son visibles dentro de esta transacción
8+
START TRANSACTION
9+
10+
-- Finaliza una transacción con éxito. Cuando se ejecuta, todos los cambios realizados en la
11+
-- base de datos durante la transacción actual se hacen permanentes y visibles
12+
COMMIT
13+
14+
-- Deshace las operaciones realizadas en una transacción, revirtiendo la base de datos
15+
-- al estado en que se encontraba antes de iniciar la transacción
16+
ROLLBACK

06_Advanced/06_connectors.py

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# CONNECTORS
2+
# Clase 6: https://twitch.tv/videos/1997815022
3+
4+
# Ejemplo de conexión desde Python a una base de datos local
5+
# Se ejemplifica cómo evitar SQL INJECTION
6+
import mysql.connector
7+
8+
9+
def print_user(user):
10+
11+
config = {
12+
"host": "127.0.0.1",
13+
"port": "3306",
14+
"database": "hello_mysql",
15+
"user": "root",
16+
"password": "root1234"
17+
}
18+
19+
connection = mysql.connector.connect(**config)
20+
cursor = connection.cursor()
21+
22+
query = "SELECT * FROM users WHERE name=%s;"
23+
print(query)
24+
cursor.execute(query, (user,))
25+
result = cursor.fetchall()
26+
27+
for row in result:
28+
print(row)
29+
30+
cursor.close()
31+
connection.close()
32+
33+
34+
print_user("Brais")
35+
# print_user("'; UPDATE users SET age = '15' WHERE user_id = 1; --")

README.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
### Proyecto realizado durante emisiones en directo desde [Twitch](https://twitch.tv/mouredev)
1111
> ##### Si consideras útil el curso, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias!
1212
13-
## Próxima Clase: Muy pronto
14-
### Avisaré en redes sociales y actualizaré este repositorio con la siguiente fecha.
13+
## Próxima Clase: 14/12/2023 (20:00 hora España) en [Twitch](https://twitch.tv/mouredev)
14+
### Consulta el horario por país y crea un recordatorio desde [Discord](https://discord.gg/5YJfNwar?event=1183742869731823708).
1515

1616
## Clases anteriores
1717

@@ -30,6 +30,9 @@
3030
### Clase 5 (31/10/2023): Comandos JOIN
3131
#### ▶️ [Ver clase en vídeo](https://www.twitch.tv/videos/1965141039?t=00h23m19s)
3232

33+
### Clase 6 (07/12/2023): Conceptos avanzados
34+
#### ▶️ [Ver clase en vídeo](https://www.twitch.tv/videos/1997815022?t=00h25m05s)
35+
3336
Durante el curso aprenderemos los fundamentos del lenguaje SQL y las bases de datos relacionales con ejemplos prácticos.
3437
Nos centraremos en MySQL para llevar a cabo las clases, ya que es uno de los más usados en enseñanza y a nivel profesional. También utilizaremos PostgreSQL ya que es una de las bases de datos más populares de la actualidad. De todas formas, no debe preocuparte el motor de bases de datos utilizado, ya que SQL es un lenguaje estándar, por lo que se utilizará prácticamente igual en todas ellas. Una vez lo conozcas no tendrá dificultad alguna llevar esos conocimientos a otros sistemas.
3538
Todo el código estará disponible para que cualquiera pueda usarlo.

0 commit comments

Comments
 (0)