Aprende SQL Server desde Cero

Guía completa para dominar el sistema de gestión de bases de datos más popular de Microsoft

¿Qué es SQL Server?

🖥️

Sistema de Gestión de Bases de Datos

SQL Server es un Sistema de Gestión de Bases de Datos Relacional (RDBMS) desarrollado por Microsoft. Almacena y recupera datos solicitados por otras aplicaciones de software.

🔗

Basado en SQL

Utiliza T-SQL (Transact-SQL), la implementación de Microsoft del lenguaje SQL estándar, para consultar y manipular datos.

🏢

Enterprise Ready

Ofrece características avanzadas para empresas: alta disponibilidad, seguridad, business intelligence y análisis de datos.

💡 ¿Sabías qué?

SQL Server fue lanzado por primera vez en 1989 y ha evolucionado hasta convertirse en una plataforma completa que incluye servicios de integración, análisis y reportes.

Arquitectura de SQL Server

SQL Server tiene una arquitectura en capas que separa los componentes lógicos de los físicos.

Capa de Aplicación

Aplicaciones cliente, SSMS, aplicaciones web

⬇️

Capa de Conexión

Protocolos de red (TCP/IP, Named Pipes)

⬇️

Relacional Engine

Query Parser, Optimizer, Executor

⬇️

Storage Engine

Gestión de datos en disco y memoria

📋 Base de Datos

  • Archivos de datos (.mdf, .ndf)
  • Archivos de log (.ldf)
  • Filegroups

🔧 Motor de Base de Datos

  • Procesamiento de consultas
  • Gestión de transacciones
  • Control de concurrencia

🛡️ Servicios Adicionales

  • SQL Server Integration Services (SSIS)
  • SQL Server Analysis Services (SSAS)
  • SQL Server Reporting Services (SSRS)

📖 Temas del Curso

Haz clic en cualquier tema para ver el contenido detallado

📊 Introducción a SQL Server

SQL Server es un Sistema de Gestión de Bases de Datos Relacional (RDBMS) desarrollado por Microsoft. Utiliza T-SQL (Transact-SQL) para consultar y manipular datos.

Historia:

SQL Server fue lanzado por primera vez en 1989 y ha evolucionado hasta convertirse en una plataforma completa que incluye servicios de integración, análisis y reportes.

Características Principales:

  • T-SQL: Extensión de Microsoft del SQL estándar
  • SSMS: SQL Server Management Studio
  • Integration Services: SSIS para ETL
  • Reporting Services: SSRS para reportes
💡 ¿Sabías qué?

SQL Server es usado por miles de empresas Fortune 500 para manejar datos críticos de negocio.

← Volver a temas

🔧 Instalación de SQL Server

En Windows:

  1. Descarga SQL Server Express desde microsoft.com
  2. Descarga SSMS (SQL Server Management Studio)
  3. Ejecuta el instalador
  4. Selecciona "Basic" installation

Verificar instalación:

-- Conectar desde SSMS
-- Server: localhost\SQLEXPRESS
-- Authentication: Windows Authentication

Linux (Docker):

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=TuPassword123" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2022-latest
← Volver a temas

📦 Conceptos Básicos

Crear Base de Datos:

CREATE DATABASE MiEmpresa;
GO
USE MiEmpresa;
GO

Crear Tabla:

CREATE TABLE Empleados (
    EmpleadoID INT PRIMARY KEY IDENTITY(1,1),
    Nombre NVARCHAR(100) NOT NULL,
    Email NVARCHAR(255) UNIQUE,
    Salario DECIMAL(10,2),
    FechaContratacion DATE DEFAULT GETDATE()
);

Tipos de Datos:

  • INT: Números enteros
  • NVARCHAR(n): Texto Unicode
  • DECIMAL(m,n): Números decimales
  • DATETIME: Fecha y hora
← Volver a temas

💻 Consultas T-SQL

SELECT Básico:

SELECT * FROM Empleados;
SELECT Nombre, Salario FROM Empleados WHERE Salario > 50000;
SELECT COUNT(*) as Total FROM Empleados;

JOINs:

-- INNER JOIN
SELECT e.Nombre, d.NombreDepartamento
FROM Empleados e
INNER JOIN Departamentos d ON e.DepartamentoID = d.DepartamentoID;

-- LEFT JOIN
SELECT e.Nombre, d.NombreDepartamento
FROM Empleados e
LEFT JOIN Departamentos d ON e.DepartamentoID = d.DepartamentoID;

Agregaciones:

SELECT DepartamentoID, AVG(Salario) as Promedio
FROM Empleados
GROUP BY DepartamentoID
HAVING AVG(Salario) > 50000;
← Volver a temas

✅ Buenas Prácticas

Índices:

-- Crear índice
CREATE INDEX IX_Empleados_Email ON Empleados(Email);

-- Índice único
CREATE UNIQUE INDEX IX_Empleados_Email_Unique ON Empleados(Email);

Vistas:

CREATE VIEW VistaEmpleados AS
SELECT e.Nombre, d.NombreDepartamento
FROM Empleados e
JOIN Departamentos d ON e.DepartamentoID = d.DepartamentoID;

Execution Plan:

SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT * FROM Empleados WHERE Email = 'test@email.com';
← Volver a temas

🚀 Stored Procedures y Triggers

Stored Procedure:

CREATE PROCEDURE ObtenerEmpleados
AS
BEGIN
    SELECT * FROM Empleados;
END;

-- Ejecutar
EXEC ObtenerEmpleados;

Trigger:

CREATE TRIGGER trg_ActualizarFecha
ON Empleados
AFTER UPDATE
AS
BEGIN
    PRINT 'Empleado actualizado';
END;

Transacciones:

BEGIN TRANSACTION;
BEGIN TRY
    UPDATE Cuenta SET Saldo = Saldo - 100 WHERE Id = 1;
    UPDATE Cuenta SET Saldo = Saldo + 100 WHERE Id = 2;
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
END CATCH;
← Volver a temas

📋 Proyecto Final

Desarrolla una base de datos empresarial completa:

  1. Diseñar modelo entidad-relación
  2. Crear tablas con restricciones
  3. Implementar stored procedures
  4. Crear triggers para auditoría
  5. Configurar índices estratégicos
  6. Implementar backup automático
💡 Proyecto sugerido:

Crea una base de datos para sistema de ventas con clientes, productos, pedidos y facturas.

← Volver a temas

💾 Backup, Restore y SQL Server Management Studio

Backup con T-SQL:

-- Backup completo
BACKUP DATABASE MiEmpresa
TO DISK = 'C:\Backups\MiEmpresa_Full.bak'
WITH COMPRESSION, CHECKSUM;

-- Backup de transaction log
BACKUP LOG MiEmpresa
TO DISK = 'C:\Backups\MiEmpresa_Log.bak';

Restore:

-- Restore completo
RESTORE DATABASE MiEmpresa
FROM DISK = 'C:\Backups\MiEmpresa_Full.bak'
WITH REPLACE;

-- Restore con move
RESTORE DATABASE MiEmpresa
FROM DISK = 'C:\Backups\MiEmpresa_Full.bak'
WITH MOVE 'MiEmpresa_Data' TO 'D:\Data\MiEmpresa.mdf',
     MOVE 'MiEmpresa_Log' TO 'E:\Logs\MiEmpresa_log.ldf';

SSMS (SQL Server Management Studio):

  • Diseño visual de bases de datos
  • Editor de queries con IntelliSense
  • Plan de ejecución visual
  • Gestión de jobs del SQL Agent
  • Import/Export de datos
← Volver a temas

🔐 Transacciones y Control de Concurrencia

Transacciones:

BEGIN TRANSACTION;

UPDATE Cuenta SET Saldo = Saldo - 1000 WHERE Id = 1;
UPDATE Cuenta SET Saldo = Saldo + 1000 WHERE Id = 2;

-- Verificar
SELECT * FROM Cuenta WHERE Id IN (1, 2);

-- Confirmar o revertir
COMMIT TRANSACTION;
-- o ROLLBACK TRANSACTION;

TRY...CATCH:

BEGIN TRY
    BEGIN TRANSACTION;
    
    UPDATE Inventario SET Cantidad = Cantidad - 5 WHERE ProductoId = 101;
    INSERT INTO Pedidos (ProductoId, Cantidad) VALUES (101, 5);
    
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
    PRINT 'Error: ' + ERROR_MESSAGE();
END CATCH;

Isolation Levels:

-- Ver nivel actual
DBCC USEROPTIONS;

-- Cambiar nivel
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- Niveles: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SNAPSHOT, SERIALIZABLE

Locking Hints:

SELECT * FROM Empleados WITH (NOLOCK);
SELECT * FROM Inventario WITH (TABLOCK);
← Volver a temas

📊 Subconsultas y CTEs

Subconsultas:

-- Escalar
SELECT Nombre, Salario,
    (SELECT AVG(Salario) FROM Empleados) AS Promedio
FROM Empleados;

-- En WHERE
SELECT Nombre FROM Empleados
WHERE Salario > (SELECT AVG(Salario) FROM Empleados);

CTE (Common Table Expression):

;WITH DeptStats AS (
    SELECT DepartamentoID, AVG(Salario) AS Promedio
    FROM Empleados
    GROUP BY DepartamentoID
)
SELECT e.Nombre, e.Salario, d.Promedio
FROM Empleados e
JOIN DeptStats d ON e.DepartamentoID = d.DepartamentoID
WHERE e.Salario > d.Promedio;

CTE Recursivo:

;WITH Organigrama AS (
    SELECT Id, Nombre, ManagerId, 1 AS Nivel
    FROM Empleados WHERE ManagerId IS NULL
    
    UNION ALL
    
    SELECT e.Id, e.Nombre, e.ManagerId, o.Nivel + 1
    FROM Empleados e
    JOIN Organigrama o ON e.ManagerId = o.Id
)
SELECT * FROM Organigrama ORDER BY Nivel;

UNION y UNION ALL:

SELECT Nombre FROM Empleados2023
UNION
SELECT Nombre FROM Empleados2024;
← Volver a temas

🧩 Functions y Functions Avanzadas

Scalar Functions:

CREATE FUNCTION dbo.CalcularIVA(@Precio DECIMAL(10,2))
RETURNS DECIMAL(10,2)
AS
BEGIN
    RETURN @Precio * 0.16;
END;

-- Uso
SELECT Nombre, Precio, dbo.CalcularIVA(Precio) AS IVA FROM Productos;

Table-Valued Functions:

CREATE FUNCTION dbo.ObtenerEmpleadosDept(@DeptID INT)
RETURNS TABLE
AS
RETURN
(
    SELECT * FROM Empleados WHERE DepartamentoID = @DeptID
);

-- Uso
SELECT * FROM dbo.ObtenerEmpleadosDept(5);

Functions del Sistema:

GETDATE()          -- Fecha actual
DATEADD(day, 5, GETDATE())  -- Agregar días
DATEDIFF(day, fecha1, fecha2)  -- Diferencia en días
STRING_AGG(nombre, ', ')  -- Concatenar
IIF(condicion, valor1, valor2)  -- Condicional
← Volver a temas

🚀 SQL Server Agent y Automatización

Jobs:

-- Crear job
EXEC msdb.dbo.sp_add_job
    @job_name = 'BackupDiario',
    @description = 'Backup diario de la base';

-- Agregar step
EXEC msdb.dbo.sp_add_jobstep
    @job_name = 'BackupDiario',
    @step_name = 'Ejecutar Backup',
    @command = 'BACKUP DATABASE MiEmpresa TO DISK = ''...'';';

-- Schedule
EXEC msdb.dbo.sp_add_jobschedule
    @job_name = 'BackupDiario',
    @name = 'DiarioAMedianoche',
    @freq_type = 4,
    @freq_interval = 1,
    @active_start_time = 0;

Alerts:

-- Crear alert para errores
EXEC msdb.dbo.sp_add_alert
    @name = 'ErrorAlert',
    @message_id = 50001,
    @severity = 16,
    @enabled = 1;

Database Mail:

-- Configurar email
EXEC sp_configure 'show advanced', 1;
RECONFIGURE;
EXEC sp_MSsetalertinfo;

-- Enviar email desde procedure
EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'AdminProfile',
    @recipients = 'admin@empresa.com',
    @subject = 'Reporte Diario',
    @body = 'El backup se completó exitosamente.';
← Volver a temas

Ejemplos de Código

Crear Base de Datos

CREATE DATABASE MiBaseDeDatos;
GO

USE MiBaseDeDatos;
GO

Crear Tabla

CREATE TABLE Empleados (
    EmpleadoID INT PRIMARY KEY IDENTITY,
    Nombre NVARCHAR(100) NOT NULL,
    Email NVARCHAR(255) UNIQUE,
    Salario DECIMAL(10,2),
    FechaContratacion DATE DEFAULT GETDATE()
);

Consulta SELECT

SELECT Nombre, Email, Salario
FROM Empleados
WHERE Salario > 50000
ORDER BY Salario DESC;

INNER JOIN

SELECT e.Nombre, d.NombreDepartamento
FROM Empleados e
INNER JOIN Departamentos d ON e.DepartamentoID = d.DepartamentoID;

👨‍💻 Desarrollado por Isaac Esteban Haro Torres

Ingeniero en Sistemas · Full Stack · Automatización · Data

📧 Email: zackharo1@gmail.com

📱 WhatsApp: 098805517

💻 GitHub: github.com/ieharo1

🌐 Portafolio: ieharo1.github.io/portafolio-isaac.haro/