Skip to content

Commit

Permalink
Clase 6
Browse files Browse the repository at this point in the history
Conceptos avanzados
  • Loading branch information
mouredev committed Dec 12, 2023
1 parent 3618685 commit e98abfd
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 2 deletions.
16 changes: 16 additions & 0 deletions 06_Advanced/01_index.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
INDEX
Clase 6: https://twitch.tv/videos/1997815022
*/

-- Crea un índice llamado "idx_name" en la tabla "users" asociado al campo "name"
CREATE INDEX idx_name ON users(name);

-- Crea un índice único llamado "idx_name" en la tabla "users" asociado al campo "name"
CREATE UNIQUE INDEX idx_name ON users(name);

-- Crea un índice llamado "idx_name_surname" en la tabla "users" asociado a los campos "name" y "surname"
CREATE UNIQUE INDEX idx_name_surname ON users(name, surname);

-- Elimina el índice llamado "idx_name"
DROP INDEX idx_name ON users;
35 changes: 35 additions & 0 deletions 06_Advanced/02_triggers.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
TRIGGERS
Clase 6: https://twitch.tv/videos/1997815022
*/

-- Crea una tabla de historial para usar en el ejemplo
CREATE TABLE `hello_mysql`.`email_history` (
`email_history_id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL,
`email` VARCHAR(100) NULL,
PRIMARY KEY (`email_history_id`),
UNIQUE INDEX `email_history_id_UNIQUE` (`email_history_id` ASC) VISIBLE);

-- Crea un trigger llamado "tg_email" que guarda el email previo en la tabla "email_history" siempre
-- que se actualiza el campo "email" en la tabla "users"

-- DELIMITER es una directiva que sirve para cambiar el delimitador de instrucciones SQL, que por defecto es ;
-- Se utiliza cuando se define un bloque de código como un procedimiento donde se requieren múltiples
-- instrucciones SQL terminadas con punto y coma dentro de un mismo bloque.
DELIMITER //
CREATE TRIGGER tg_email
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
IF OLD.email <> NEW.email THEN
INSERT INTO email_history (user_id, email)
VALUES (OLD.user_id, OLD.email);
END IF;
END//

-- Actualiza el campo "email" del usuario 1 la tabla "users" para probar el trigger
UPDATE users SET email = '[email protected]' WHERE user_id = 1

-- Elimina el trigger llamado "tg_email"
DROP TRIGGER tg_email;
16 changes: 16 additions & 0 deletions 06_Advanced/03_views.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
VIEWS
Clase 6: https://twitch.tv/videos/1997815022
*/

-- Crea unaa vista llamada "v_adult_users" con los nombres y edades de usuarios de la table "users"
-- que tienen una edad igual o mayor a 18 años.
CREATE VIEW v_adult_users AS
SELECT name, age
FROM users
WHERE age >= 18;

SELECT * FROM v_adult_users;

-- Elimina la vista llamada "v_adult_users"
DROP VIEW v_adult_users;
28 changes: 28 additions & 0 deletions 06_Advanced/04_stored_procedures.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
STORED PROCEDURES
Clase 6: https://twitch.tv/videos/1997815022
*/

-- Crea un procedimiento almacenado llamado "p_all_users" que obtiene todos los datos de "users"
DELIMITER //
CREATE PROCEDURE p_all_users()
BEGIN
SELECT * FROM users;
END//

-- Invoca al procedimiento almacenado llamado "p_all_users"
CALL p_all_users;

-- Crea un procedimiento almacenado llamado "p_age_users" parametrizado para
-- obtener usuarios con edad variable
DELIMITER //
CREATE PROCEDURE p_age_users(IN age_param int)
BEGIN
SELECT * FROM users WHERE age = age_param;
END//

-- Invoca al procedimiento almacenado llamado "p_age_users" con un parámetro de valor 30
CALL p_age_users(30);

-- Elimina el procedimiento almacenado llamado "p_age_users"
DROP PROCEDURE p_age_users;
16 changes: 16 additions & 0 deletions 06_Advanced/05_transactions.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
TRANSACTIONS
Clase 6: https://twitch.tv/videos/1997815022
*/

-- Inicia una nueva transacción. Desde este punto, todas las modificaciones realizadas en la
-- base de datos son temporales y solo son visibles dentro de esta transacción
START TRANSACTION

-- Finaliza una transacción con éxito. Cuando se ejecuta, todos los cambios realizados en la
-- base de datos durante la transacción actual se hacen permanentes y visibles
COMMIT

-- Deshace las operaciones realizadas en una transacción, revirtiendo la base de datos
-- al estado en que se encontraba antes de iniciar la transacción
ROLLBACK
35 changes: 35 additions & 0 deletions 06_Advanced/06_connectors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# CONNECTORS
# Clase 6: https://twitch.tv/videos/1997815022

# Ejemplo de conexión desde Python a una base de datos local
# Se ejemplifica cómo evitar SQL INJECTION
import mysql.connector


def print_user(user):

config = {
"host": "127.0.0.1",
"port": "3306",
"database": "hello_mysql",
"user": "root",
"password": "root1234"
}

connection = mysql.connector.connect(**config)
cursor = connection.cursor()

query = "SELECT * FROM users WHERE name=%s;"
print(query)
cursor.execute(query, (user,))
result = cursor.fetchall()

for row in result:
print(row)

cursor.close()
connection.close()


print_user("Brais")
# print_user("'; UPDATE users SET age = '15' WHERE user_id = 1; --")
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
### Proyecto realizado durante emisiones en directo desde [Twitch](https://twitch.tv/mouredev)
> ##### Si consideras útil el curso, apóyalo haciendo "★ Star" en el repositorio. ¡Gracias!
## Próxima Clase: Muy pronto
### Avisaré en redes sociales y actualizaré este repositorio con la siguiente fecha.
## Próxima Clase: 14/12/2023 (20:00 hora España) en [Twitch](https://twitch.tv/mouredev)
### Consulta el horario por país y crea un recordatorio desde [Discord](https://discord.gg/5YJfNwar?event=1183742869731823708).

## Clases anteriores

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

### Clase 6 (07/12/2023): Conceptos avanzados
#### ▶️ [Ver clase en vídeo](https://www.twitch.tv/videos/1997815022?t=00h25m05s)

Durante el curso aprenderemos los fundamentos del lenguaje SQL y las bases de datos relacionales con ejemplos prácticos.
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.
Todo el código estará disponible para que cualquiera pueda usarlo.
Expand Down

0 comments on commit e98abfd

Please sign in to comment.