Mejora la velocidad de las operaciones de consulta de una tabla.
Similar al índice de un libro, permite encontrar los datos más rápido sin tener que escanear todas las filas de la tabla.
Para SQL Server se utiliza el comando INDEX.
Ejemplo
Supongamos que tienes una tabla ‘Clientes’ con millones de registros.
Consultar frecuentemente por el ‘Cliente_ID’ escanea todos los registros hasta encontrar el deseado.
Crear un índice en ese atributo puede mejorar el rendimiento.
CREATEINDEX ix_Cliente_IDON Clientes(Cliente_ID);
el prefijo ix_ es una convención para indicar que se trata de un índice.
3 Vistas
Permite almacenar una consulta como si fuese una tabla más de la base de datos.
Para SQL Server se utiliza el comando VIEW.
Ideal cuando se hace una consulta avanzada, con muchos JOIN o condiciones, ya que al almacenarlo con VIEW no es necesario volver a realizar la misma consulta una y otra vez.
Ejemplo
Creo una vista VistaInformacionEmpleados que contiene información de ambas tablas Empleados y Departamentos.
CREATEVIEW VistaInformacionEmpleados ASSELECT e.ID, e.Nombre, e.Apellido, d.Nombre AS NombreDepartamentoFROM Empleados eJOIN Departamento d ON e.Departamento_ID = d.ID;
Si quiero conocer los empleados del departamento Ventas, puedo consultar la “vista” en vez de realizar nuevamente una consulta avanzada.
queries.append(text('''CREATE VIEW VistaEstudiantes AS SELECT Nombre, Edad FROM Estudiantes WHERE Edad > 18;'''))query_select = (text('''SELECT *FROM VistaEstudiantes;'''))with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
Nombre
Edad
Juan Pérez
20
Ana López
22
Carmen Ríos
19
Carlos Sánchez
23
Lucía Fernández
21
Isabel Mora
25
4.3 Ejercicio 03
Creación de Índices
Crea un índice para la columna Edad en la tabla Estudiantes para mejorar la velocidad de las consultas que filtren por edad.
Solución
CREATEINDEX ix_EdadON Estudiantes(Edad);-- consulta opcional: verifica índiceSELECT name AS IndexName, type_desc ASIndexTypeFROM sys.indexesWHERE object_id = OBJECT_ID('Estudiantes');
python code
queries.append(text('''CREATE INDEX ix_EdadON Estudiantes(Edad);'''))query_select = text('''SELECT name AS IndexName, type_desc AS IndexTypeFROM sys.indexesWHERE object_id = OBJECT_ID('Estudiantes');''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
IndexName
IndexType
PK__Estudian__3214EC277A1E47A8
CLUSTERED
ix_Edad
NONCLUSTERED
Se observa que existe un índice ix_Edad.
5 Ejercicios (2da parte)
Crear la base de datos Clase01_Parte_Dos, utilizando el siguiente script:
script_clase01.sql
IFNOTEXISTS (SELECT*FROM sys.databases WHERE name = N'Clase01_Parte_Dos')BEGINCREATEDATABASE Clase01_Parte_Dos;END;USE Clase01_Parte_Dos;SET DATEFORMAT 'YMD';CREATETABLE Autores (IDINTPRIMARYKEY, Nombre VARCHAR(100), Nacionalidad VARCHAR(100));CREATETABLE Libros (IDINTPRIMARYKEY, Titulo VARCHAR(100), Autor_ID INT,FOREIGNKEY (Autor_ID) REFERENCES Autores(ID));INSERTINTO Autores (ID, Nombre, Nacionalidad) VALUES(1, 'Gabriel García Márquez', 'Colombiano'),(2, 'Mario Vargas Llosa', 'Peruano'),(3, 'Julio Cortázar', 'Argentino');INSERTINTO Libros (ID, Titulo, Autor_ID) VALUES(1, 'Cien años de soledad', 1),(2, 'La ciudad y los perros', 2),(3, 'Rayuela', 3);
python code
# queriesqueries = []queries.append(text('''IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'Clase01_Parte_Dos')BEGIN CREATE DATABASE Clase01_Parte_Dos;END;'''))queries.append(text('''USE Clase01_Parte_Dos;'''))queries.append(text('''SET DATEFORMAT 'YMD';'''))queries.append(text('''CREATE TABLE Autores ( ID INT PRIMARY KEY, Nombre VARCHAR(100), Nacionalidad VARCHAR(100));'''))queries.append(text('''CREATE TABLE Libros ( ID INT PRIMARY KEY, Titulo VARCHAR(100), Autor_ID INT, FOREIGN KEY (Autor_ID) REFERENCES Autores(ID));'''))queries.append(text('''INSERT INTO Autores (ID, Nombre, Nacionalidad) VALUES(1, 'Gabriel García Márquez', 'Colombiano'),(2, 'Mario Vargas Llosa', 'Peruano'),(3, 'Julio Cortázar', 'Argentino');'''))queries.append(text('''INSERT INTO Libros (ID, Titulo, Autor_ID) VALUES(1, 'Cien años de soledad', 1),(2, 'La ciudad y los perros', 2),(3, 'Rayuela', 3);'''))# execute querieswith engine.connect() as conn:for query in queries: conn.execute(query)
5.1 Ejercicio 01
Consulta Básica: Mostrar todos los libros de la tabla “Libros”.
Solución
SELECT*FROM Libros;
python code
query_select = text('''SELECT *FROM Libros;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
ID
Titulo
Autor_ID
1
Cien años de soledad
1
2
La ciudad y los perros
2
3
Rayuela
3
5.2 Ejercicio 02
Consulta con Filtro: Mostrar el nombre y nacionalidad del autor del libro con ID 2.
Solución
SELECT a.Nombre, a.NacionalidadFROM Autores aJOIN Libros l ON l.Autor_ID = a.IDWHERE l.ID=2;
python code
query_select = text('''SELECT a.Nombre, a.NacionalidadFROM Autores aJOIN Libros l ON l.Autor_ID = a.IDWHERE l.ID = 2;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
Nombre
Nacionalidad
Mario Vargas Llosa
Peruano
5.3 Ejercicio 03
Consulta con JOIN: Mostrar el título del libro y el nombre del autor de todos los libros.
Solución
SELECT l.Titulo, a.NombreFROM Libros lJOIN Autores a ON l.Autores_ID = a.ID;
python code
query_select = text('''SELECT l.Titulo, a.NombreFROM Libros lJOIN Autores a ON l.Autor_ID = a.ID;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
Titulo
Nombre
Cien años de soledad
Gabriel García Márquez
La ciudad y los perros
Mario Vargas Llosa
Rayuela
Julio Cortázar
5.4 Ejercicio 04
Actualización de Datos: Cambiar la nacionalidad del autor con ID 3 a “Argentino-Francés”.
queries.append(text('''INSERT INTO Autores(ID,Nombre,Nacionalidad) VALUES(4,'Isabel Allende','Chilena');'''))query_select = text('''SELECT *FROM AutoresWHERE ID = 4;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
ID
Nombre
Nacionalidad
4
Isabel Allende
Chilena
5.6 Ejercicio 06
Eliminación de Datos: Eliminar el libro con ID 1 de la tabla “Libros”.
Solución
DELETEFROM LibrosWHEREID=1;SELECT*FROM Libros;
python code
queries.append(text('''DELETE FROM LibrosWHERE ID = 1;'''))query_select = text('''SELECT *FROM Libros;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
ID
Titulo
Autor_ID
2
La ciudad y los perros
2
3
Rayuela
3
5.7 Ejercicio 07
Crear un nuevo libro: Inserta un nuevo registro en la tabla “Libros” con los siguientes datos:
ID: 4
Título: El amor en los tiempos del cólera
Autor_ID: 1
Solución
INSERTINTO Libros(ID,Titulo,Autor_ID) VALUES (4,'El amor en los tiempos del cólera',1);SELECT*FROM LibrosWHEREID=4;
python code
queries.append(text('''INSERT INTO Libros(ID,Titulo,Autor_ID)VALUES (4,'El amor en los tiempos del cólera',1);'''))query_select = text('''SELECT *FROM LibrosWHERE ID = 4;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
ID
Titulo
Autor_ID
4
El amor en los tiempos del cólera
1
5.8 Ejercicio 08
Actualizar un libro: Actualiza el título del libro con ID 2 a “Conversación en la catedral”.
Solución
UPDATE LibrosSET Titulo ='Conversación en la catedral'WHEREID=2;SELECT*FROM LibrosWHEREID=2;
python code
queries.append(text('''UPDATE LibrosSET Titulo = 'Conversación en la catedral'WHERE ID = 2;'''))query_select = text('''SELECT *FROM LibrosWHERE ID = 2;''')with engine.connect() as conn:for query in queries: conn.execute(query) result = conn.execute(query_select) columns = result.keys() data = result.fetchall()df = pd.DataFrame(data,columns=columns)html_output = df.to_html(index=False)html_output
ID
Titulo
Autor_ID
2
Conversación en la catedral
2
5.9 Ejercicio 09
Eliminar un autor: Elimina el autor con ID 3 de la tabla “Autores” y todos los libros asociados a este autor.