Bienvenido al Curso de SQL Server

SQL Server es un sistema de gestión de bases de datos relacional (RDBMS) desarrollado por Microsoft. Se utiliza para almacenar, administrar y recuperar datos en una variedad de aplicaciones. Proporciona un entorno robusto y seguro para gestionar grandes volúmenes de datos, con herramientas avanzadas para realizar consultas, garantizar la integridad de los datos y manejar transacciones empresariales críticas.

Principales Comandos de SQL Server

Comando Descripción
CREATE DATABASECrea una nueva base de datos.
ALTER DATABASEModifica las propiedades de una base de datos existente.
DROP DATABASEElimina una base de datos.
BACKUP DATABASERealiza una copia de seguridad de la base de datos.
RESTORE DATABASERestaura una base de datos desde un backup.
USESelecciona la base de datos activa en la sesión.
CREATE TABLECrea una nueva tabla en la base de datos.
ALTER TABLEModifica la estructura de una tabla existente.
DROP TABLEElimina una tabla de la base de datos.
TRUNCATE TABLEElimina todos los registros de una tabla sin afectar su estructura.
INSERT INTOInserta nuevos registros en una tabla.
UPDATEActualiza registros existentes en una tabla.
DELETEElimina registros de una tabla.
MERGECombina datos de dos tablas (insertar, actualizar o eliminar).
SELECTConsulta datos almacenados en una tabla.
WHEREFiltra registros en una consulta según condiciones específicas.
GROUP BYAgrupa registros en base a uno o más campos.
ORDER BYOrdena los resultados de una consulta.
HAVINGFiltra los resultados agrupados por condiciones.
JOINUne datos de dos o más tablas basándose en relaciones entre ellas.
UNIONCombina los resultados de dos consultas SELECT.
EXCEPTDevuelve las filas de una consulta que no están presentes en otra.
INTERSECTDevuelve las filas comunes a dos consultas.
CREATE PROCEDURECrea un procedimiento almacenado.
EXECEjecuta un procedimiento almacenado.
CREATE FUNCTIONCrea una función definida por el usuario.
DROP PROCEDUREElimina un procedimiento almacenado.
DROP FUNCTIONElimina una función definida por el usuario.
GRANTAsigna permisos a un usuario o rol.
REVOKERevoca permisos previamente otorgados.
DENYNiega permisos a un usuario o rol.
CREATE LOGINCrea un inicio de sesión para SQL Server.
CREATE USERCrea un usuario dentro de una base de datos.
DROP LOGINElimina un inicio de sesión de SQL Server.
DROP USERElimina un usuario de una base de datos.
BEGIN TRANSACTIONInicia una nueva transacción.
COMMITConfirma los cambios realizados en una transacción.
ROLLBACKRevierte los cambios realizados en una transacción.
CREATE INDEXCrea un índice para mejorar el rendimiento de las consultas.
DROP INDEXElimina un índice de una tabla.
CREATE UNIQUE INDEXCrea un índice único para garantizar valores distintos en una columna.
CREATE VIEWCrea una vista basada en una consulta SELECT.
ALTER VIEWModifica la definición de una vista existente.
DROP VIEWElimina una vista.
CHECKPOINTGuarda todas las páginas sucias en disco para minimizar pérdida de datos.
DBCCEjecuta comandos de verificación y mantenimiento de la base de datos.
SETConfigura opciones o variables en SQL Server.
SP_HELPProporciona información sobre objetos en la base de datos.
SP_WHOMuestra información sobre los procesos que se ejecutan en el servidor.

Descargar e Instalar SQL Server

1. Enlaces de descarga

2. Instalación de SQL Server

  1. Descarga el instalador desde el enlace oficial.
  2. Ejecuta el instalador y selecciona la edición (Express o Developer).
  3. Configura las opciones deseadas, como tipo de instancia (predeterminada o personalizada).
  4. Completa la instalación y verifica la conexión a través de SSMS.

3. Instalación de SQL Server Express

SQL Server Express es una versión gratuita, ideal para desarrolladores y entornos de aprendizaje. Aquí tienes un tutorial completo: Guía oficial.

Ejercicio 1: Crear una Base de Datos

Crea una base de datos llamada Biblioteca:

CREATE DATABASE Biblioteca;
USE Biblioteca;
        

Ejercicio 2: Crear una Tabla

Crea una tabla llamada Libros con las siguientes columnas:

CREATE TABLE Libros (
    Id INT PRIMARY KEY,
    Titulo NVARCHAR(150),
    Autor NVARCHAR(100),
    Genero NVARCHAR(50),
    FechaPublicacion DATE
);
        

Ejercicio 3: Insertar Datos

Inserta tres libros en la tabla Libros:

INSERT INTO Libros (Id, Titulo, Autor, Genero, FechaPublicacion)
VALUES
(1, 'Cien Años de Soledad', 'Gabriel García Márquez', 'Ficción', '1967-05-30'),
(2, 'Don Quijote de la Mancha', 'Miguel de Cervantes', 'Clásico', '1605-01-16'),
(3, 'El Principito', 'Antoine de Saint-Exupéry', 'Infantil', '1943-04-06');
        

Ejercicio 4: Consultar Datos

Consulta todos los libros almacenados en la tabla Libros:

SELECT * FROM Libros;
        

Ejercicio 5: Consultar con Filtro

Encuentra los libros publicados después del año 1950:

SELECT * FROM Libros
WHERE FechaPublicacion > '1950-01-01';
        

Ejercicio 6: Actualizar Datos

Actualiza el género del libro "El Principito" a Filosofía:

UPDATE Libros
SET Genero = 'Filosofía'
WHERE Titulo = 'El Principito';
        

Ejercicio 7: Eliminar Datos

Elimina el libro "Don Quijote de la Mancha" de la tabla:

DELETE FROM Libros
WHERE Titulo = 'Don Quijote de la Mancha';
        

Ejercicio 8: Ordenar Resultados

Ordena los libros por fecha de publicación de manera ascendente:

SELECT * FROM Libros
ORDER BY FechaPublicacion ASC;
        

Ejercicio 9: Usar Funciones Agregadas

Encuentra el libro más reciente en la tabla:

SELECT TOP 1 Titulo, FechaPublicacion
FROM Libros
ORDER BY FechaPublicacion DESC;
        

Ejercicio 10: Crear una Vista

Crea una vista para mostrar solo los libros de género Filosofía:

CREATE VIEW LibrosFilosofia AS
SELECT Titulo, Autor, Genero
FROM Libros
WHERE Genero = 'Filosofía';

-- Consultar la vista
SELECT * FROM LibrosFilosofia;
        

Ejercicio 11: Subconsulta

Encuentra el libro más antiguo usando una subconsulta:

SELECT Titulo, FechaPublicacion
FROM Libros
WHERE FechaPublicacion = (
    SELECT MIN(FechaPublicacion) FROM Libros
);
        

Ejercicio 12: Crear Índice

Crea un índice en la columna Autor para mejorar el rendimiento de consultas:

CREATE INDEX IX_Libros_Autor
ON Libros (Autor);
        

Ejercicio 13: Usar GROUP BY

Cuenta cuántos libros hay por género:

SELECT Genero, COUNT(*) AS Total
FROM Libros
GROUP BY Genero;
        

Ejercicio 14: Crear Procedimiento Almacenado

Crea un procedimiento para insertar un nuevo libro:

CREATE PROCEDURE InsertarLibro
    @Id INT,
    @Titulo NVARCHAR(150),
    @Autor NVARCHAR(100),
    @Genero NVARCHAR(50),
    @FechaPublicacion DATE
AS
BEGIN
    INSERT INTO Libros (Id, Titulo, Autor, Genero, FechaPublicacion)
    VALUES (@Id, @Titulo, @Autor, @Genero, @FechaPublicacion);
END;

-- Usar el procedimiento
EXEC InsertarLibro 4, 'El Hobbit', 'J.R.R. Tolkien', 'Fantasía', '1937-09-21';
        

Ejercicio 15: Agregar Restricciones

Asegura que la columna Genero no permita valores nulos:

ALTER TABLE Libros
ALTER COLUMN Genero NVARCHAR(50) NOT NULL;
        

Ejercicio 16: Crear un Trigger

Crea un trigger para registrar cambios en la tabla Libros:

CREATE TRIGGER Trg_RegistroCambios
ON Libros
AFTER UPDATE
AS
BEGIN
    PRINT 'Registro actualizado';
END;
        

Ejercicio 17: Trabajar con Transacciones

Realiza una inserción con una transacción:

BEGIN TRANSACTION;

INSERT INTO Libros (Id, Titulo, Autor, Genero, FechaPublicacion)
VALUES (5, '1984', 'George Orwell', 'Distopía', '1949-06-08');

COMMIT;
        

Ejercicio 18: Crear Función Escalar

Crea una función que devuelva el título de un libro dado su Id:

CREATE FUNCTION ObtenerTitulo (@Id INT)
RETURNS NVARCHAR(150)
AS
BEGIN
    DECLARE @Titulo NVARCHAR(150);
    SELECT @Titulo = Titulo FROM Libros WHERE Id = @Id;
    RETURN @Titulo;
END;

-- Usar la función
SELECT dbo.ObtenerTitulo(1);
        

Ejercicio 19: Usar DISTINCT

Obtén una lista única de géneros:

SELECT DISTINCT Genero
FROM Libros;
        

Ejercicio 20: UNION entre Tablas

Combina datos de dos tablas diferentes:

-- Crear una tabla de libros antiguos
CREATE TABLE LibrosAntiguos (
    Id INT,
    Titulo NVARCHAR(150),
    Autor NVARCHAR(100)
);

-- Hacer la unión
SELECT Titulo, Autor FROM Libros
UNION
SELECT Titulo, Autor FROM LibrosAntiguos;
        

Ejercicio 21: Crear una Base de Datos

CREATE DATABASE Escuela;
USE Escuela;
        

Ejercicio 22: Crear una Tabla de Estudiantes

CREATE TABLE Estudiantes (
    Id INT PRIMARY KEY,
    Nombre NVARCHAR(100),
    Edad INT,
    Curso NVARCHAR(50),
    FechaIngreso DATE
);
        

Ejercicio 23: Insertar Datos en la Tabla

INSERT INTO Estudiantes (Id, Nombre, Edad, Curso, FechaIngreso)
VALUES
(1, 'Juan Pérez', 20, 'Matemáticas', '2022-09-01'),
(2, 'Ana Gómez', 22, 'Física', '2023-01-15'),
(3, 'Luis Martínez', 19, 'Biología', '2023-03-10');
        

Ejercicio 24: Consultar Todos los Registros

SELECT * FROM Estudiantes;
        

Ejercicio 25: Consultar con Condición

SELECT Nombre, Edad FROM Estudiantes
WHERE Curso = 'Física';
        

Ejercicio 26: Modificar un Registro

UPDATE Estudiantes
SET Edad = 21
WHERE Nombre = 'Juan Pérez';
        

Ejercicio 27: Eliminar un Registro

DELETE FROM Estudiantes
WHERE Nombre = 'Luis Martínez';
        

Ejercicio 28: Ordenar Resultados

SELECT * FROM Estudiantes
ORDER BY Edad DESC;
        

Ejercicio 29: Filtrar con LIKE

SELECT * FROM Estudiantes
WHERE Nombre LIKE 'Juan%';
        

Ejercicio 30: Usar BETWEEN

SELECT * FROM Estudiantes
WHERE Edad BETWEEN 18 AND 21;
        

Ejercicio 31: Usar IN

SELECT * FROM Estudiantes
WHERE Curso IN ('Matemáticas', 'Física');
        

Ejercicio 32: Subconsulta en WHERE

SELECT * FROM Estudiantes
WHERE Edad > (SELECT AVG(Edad) FROM Estudiantes);
        

Ejercicio 33: Agregar una Columna

ALTER TABLE Estudiantes
ADD Promedio DECIMAL(5,2);
        

Ejercicio 34: Modificar una Columna

ALTER TABLE Estudiantes
ALTER COLUMN Curso NVARCHAR(100);
        

Ejercicio 35: Eliminar una Columna

ALTER TABLE Estudiantes
DROP COLUMN Promedio;
        

Ejercicio 36: Crear una Vista

CREATE VIEW VistaEstudiantes AS
SELECT Nombre, Edad, Curso
FROM Estudiantes
WHERE Edad > 18;
        

Ejercicio 37: Consultar con la Vista

SELECT * FROM VistaEstudiantes;
        

Ejercicio 38: Crear un Índice

CREATE INDEX IDX_Estudiante_Curso
ON Estudiantes (Curso);
        

Ejercicio 39: Crear una Función Escalar

CREATE FUNCTION ObtenerPromedioEdad ()
RETURNS DECIMAL(5,2)
AS
BEGIN
    DECLARE @Promedio DECIMAL(5,2);
    SELECT @Promedio = AVG(Edad) FROM Estudiantes;
    RETURN @Promedio;
END;
        

Ejercicio 40: Crear un Procedimiento Almacenado

CREATE PROCEDURE InsertarEstudiante
    @Id INT,
    @Nombre NVARCHAR(100),
    @Edad INT,
    @Curso NVARCHAR(50),
    @FechaIngreso DATE
AS
BEGIN
    INSERT INTO Estudiantes (Id, Nombre, Edad, Curso, FechaIngreso)
    VALUES (@Id, @Nombre, @Edad, @Curso, @FechaIngreso);
END;
        

Ejercicio 41: Usar JOIN entre Tablas

-- Crear tabla de Cursos
CREATE TABLE Cursos (
    Id INT PRIMARY KEY,
    Nombre NVARCHAR(100),
    Profesor NVARCHAR(100)
);

-- Insertar datos en Cursos
INSERT INTO Cursos (Id, Nombre, Profesor)
VALUES
(1, 'Matemáticas', 'Dr. Pérez'),
(2, 'Física', 'Dr. Gómez');

-- Usar JOIN
SELECT e.Nombre, c.Nombre AS Curso, c.Profesor
FROM Estudiantes e
JOIN Cursos c ON e.Curso = c.Nombre;
        

Ejercicio 42: Crear una Tabla Relacionada

-- Crear tabla de Calificaciones
CREATE TABLE Calificaciones (
    EstudianteId INT,
    Nota DECIMAL(5,2),
    CONSTRAINT FK_Estudiante FOREIGN KEY (EstudianteId) REFERENCES Estudiantes(Id)
);
        

Ejercicio 43: Consultar con LEFT JOIN

SELECT e.Nombre, c.Nota
FROM Estudiantes e
LEFT JOIN Calificaciones c ON e.Id = c.EstudianteId;
        

Ejercicio 44: Crear Trigger de Inserción

CREATE TRIGGER Trigger_IngresoEstudiante
ON Estudiantes
AFTER INSERT
AS
BEGIN
    PRINT 'Nuevo estudiante agregado';
END;
        

Ejercicio 45: Usar GROUP BY con COUNT

SELECT Curso, COUNT(*) AS TotalEstudiantes
FROM Estudiantes
GROUP BY Curso;
        

Ejercicio 46: Crear un Backup de la Base de Datos

BACKUP DATABASE Escuela
TO DISK = 'C:\Backups\Escuela.bak';
        

Ejercicio 47: Restaurar una Base de Datos

RESTORE DATABASE Escuela
FROM DISK = 'C:\Backups\Escuela.bak';
        

Ejercicio 48: Usar HAVING con GROUP BY

SELECT Curso, COUNT(*) AS TotalEstudiantes
FROM Estudiantes
GROUP BY Curso
HAVING COUNT(*) > 1;
        

Ejercicio 49: Crear una Tabla Temporal

CREATE TABLE #TempEstudiantes (
    Id INT,
    Nombre NVARCHAR(100)
);

INSERT INTO #TempEstudiantes (Id, Nombre)
VALUES (1, 'Juan Pérez'), (2, 'Ana Gómez');

SELECT * FROM #TempEstudiantes;
        

Ejercicio 50: Eliminar una Tabla Temporal

DROP TABLE #TempEstudiantes;
        

Ejercicio 51: Usar DISTINCT

SELECT DISTINCT Curso
FROM Estudiantes;
        

Ejercicio 52: Crear un Índice Único

CREATE UNIQUE INDEX IDX_Unique_Estudiante
ON Estudiantes (Id);
        

Ejercicio 53: Concatenar Columnas

SELECT Nombre + ' - ' + Curso AS EstudianteCurso
FROM Estudiantes;
        

Ejercicio 54: Usar SQL Server Profiler

-- Inicia SQL Server Profiler desde el SQL Server Management Studio
-- Registra las actividades de la base de datos, como consultas y cambios.
        

Ejercicio 55: Crear un Foreign Key

ALTER TABLE Calificaciones
ADD CONSTRAINT FK_Calificaciones_Estudiante
FOREIGN KEY (EstudianteId) REFERENCES Estudiantes(Id);
        

Ejercicio 56: Crear una Tabla con Restricción CHECK

CREATE TABLE Cursos (
    Id INT PRIMARY KEY,
    Nombre NVARCHAR(100),
    Duracion INT,
    CONSTRAINT CK_Cursos_Duracion CHECK (Duracion > 0)
);
        

Ejercicio 57: Realizar un CROSS JOIN

SELECT e.Nombre, c.Nombre
FROM Estudiantes e
CROSS JOIN Cursos c;
        

Ejercicio 58: Usar COALESCE

SELECT Nombre, COALESCE(Edad, 'No disponible') AS Edad
FROM Estudiantes;
        

Ejercicio 59: Crear un Trigger para DELETE

CREATE TRIGGER Trigger_EliminarEstudiante
ON Estudiantes
AFTER DELETE
AS
BEGIN
    PRINT 'Estudiante eliminado';
END;
        

Ejercicio 60: Usar ROW_NUMBER()

SELECT ROW_NUMBER() OVER (ORDER BY Edad DESC) AS Posicion, Nombre, Edad
FROM Estudiantes;
        

Proyecto Final

En este proyecto final, combinarás todos los conocimientos adquiridos para crear una aplicación de gestión de inventarios utilizando SQL Server. El proyecto constará de los siguientes pasos:

  1. Diseñar una base de datos para el inventario de productos, con tablas de Productos, Categorías, Proveedores y Ventas.
  2. Implementar procedimientos almacenados para la gestión de productos, ventas y reportes.
  3. Crear una interfaz de usuario sencilla en Python que se conecte a la base de datos SQL Server.
  4. Implementar funciones de alta disponibilidad, como Mirroring o Failover Cluster, para asegurar la continuidad del servicio.

Al finalizar el proyecto, tendrás un sistema funcional que podrá gestionar un inventario completo, realizar ventas, generar reportes y manejar la base de datos con alta disponibilidad.