¿Qué es SQL Server?
Es un sistema de gestión de bases de datos relacional (RDBMS) desarrollado por Microsoft.
Permite almacenar, consultar, administrar y proteger datos de manera eficiente.
Edición Descripción Casos de uso
Enterprise Completa, para grandes Alta disponibilidad,
empresas rendimiento avanzado
Funciones básicas, menos Pequeñas/medianas
costosa empresas
Standard
Express Gratuita, con Limitaciones Estudiantes, aprendizaje,
pequeñas apps
Gratuita, con limitaciones Desarrollo y pruebas (No para
producción)
Developer
Web Adaptadas a servicios web Hosting y soluciones web
económicas.
Herramientas para usar
● Instalación básica
● Requisitos mínimos
● SQL Server Enterprise
● SSMS (Herramienta gráfica para trabajar con bases de datos)
Exploración general del entorno: SQL Server Management Studio (SSMS)
Actividad en clase
Una institución educativa necesita registrar la información de sus cursos. Tu tarea es diseñar en
Excel como se vería la tabla llamada Cursos, que contendrá la siguiente información:
● Código del curso (Único por curso)
● Nombre del Curso
● Duración en horas
● Modalidad (Presencial o virtual)
● Número de estudiantes inscritos
Instalación de Microsoft SQL Server
[Link]
[Link]
Introducción a la estructura de una base de datos relacional
¿Qué es una base datos relacional?
● Sistema que almacena datos en tablas.
● Propuesta por Edgar F. Codd en 1970
● Organiza grandes volúmenes de datos evitando redundancia
Estructura de una base de datos relacional
● Formada por:
Tablas
● Columnas
● Filas
● Cada tabla representa una entidad real
Relaciones entre tablas
● Clave primaria (Primary key): Identificador único
● Clave foránea: conecta tablas
● Ejemplo: ID_Cliente “Pedidos” Referencia “Clientes”
Tipos de relaciones de Tablas
Tipo de relación Descripción Ejemplo
1a1 Un registro de A se asocia a Cada persona tiene un
uno de B pasaporte
1 a muchos (más común) Un registro de A se asocia a Un cliente tiene muchos
muchos en B pedidos
Muchos a muchos Muchos en A se asocian a Estudiantes inscritos en
muchos en B muchos cursos
Ejemplo
Actividad
-- Crear tabla de Clientes
CREATE TABLE Clientes (
ID_Cliente INT PRIMARY KEY,
Nombre VARCHAR (100),
Direccion VARCHAR (200),
Telefono VARCHAR (20)
);
-- Crear tabla de Facturas
CREATE TABLE Facturas (
ID_Factura INT PRIMARY KEY,
Fecha DATE,
ID_Cliente INT,
FOREIGN KEY (ID_Cliente) REFERENCES Clientes(ID_Cliente)
);
-- Crear tabla de Categorías
CREATE TABLE Categorias (
ID_Categoria INT PRIMARY KEY,
Descripcion VARCHAR (100)
);
-- Crear tabla de Proveedores
CREATE TABLE Proveedores (
ID_Proveedor INT PRIMARY KEY,
Nombre VARCHAR (100),
Direccion VARCHAR (200),
Telefono VARCHAR (20)
);
-- Crear tabla de Productos
CREATE TABLE Productos (
ID_Producto INT PRIMARY KEY,
Descripcion VARCHAR (100),
Precio DECIMAL (10,2),
ID_Categoria INT,
ID_Proveedor INT,
FOREIGN KEY (ID_Categoria) REFERENCES Categorias(ID_Categoria),
FOREIGN KEY (ID_Proveedor) REFERENCES Proveedores(ID_Proveedor)
);
-- Crear tabla de Ventas
CREATE TABLE Ventas (
ID_Venta INT PRIMARY KEY,
ID_Factura INT,
ID_Producto INT,
Cantidad INT,
FOREIGN KEY (ID_Factura) REFERENCES Facturas (ID_Factura),
FOREIGN KEY (ID_Producto) REFERENCES Productos(ID_Producto)
);
Actividad
Instituto
CREATE DATABASE Instituto
CREATE TABLE estudiantes (
id_estudiante INT PRIMARY KEY,
nombre VARCHAR(80),
apellido VARCHAR(80),
estrato INT,
genero VARCHAR(30),
ciudad VARCHAR(100),
fecha_nac DATE
);
CREATE TABLE profesores (
id_profesor INT PRIMARY KEY,
nombre VARCHAR(80),
apellido VARCHAR(80),
titulo VARCHAR(100),
genero VARCHAR(100),
area VARCHAR(100)
);
CREATE TABLE programas (
id_programa INT PRIMARY KEY,
programa VARCHAR(100),
facultad VARCHAR(100),
dpto VARCHAR(100)
);
CREATE TABLE asignaturas (
id_asignatura INT PRIMARY KEY,
id_profesor INT,
id_programa INT,
asignatura VARCHAR(100),
creditos INT,
int_horaria INT,
FOREIGN KEY (id_profesor) REFERENCES profesores(id_profesor),
FOREIGN KEY (id_programa) REFERENCES programas(id_programa)
);
CREATE TABLE grupos (
id_grupo INT PRIMARY KEY,
id_profesor INT,
id_asignatura INT,
grupo VARCHAR(80),
numero_estudiantes INT,
FOREIGN KEY (id_profesor) REFERENCES profesores(id_profesor),
FOREIGN KEY (id_asignatura) REFERENCES asignaturas(id_asignatura)
);
CREATE TABLE aulas (
id_aula INT PRIMARY KEY,
nombre_aula VARCHAR(100),
ubicacion VARCHAR(100),
capacidad INT,
tipo VARCHAR(100)
);
CREATE TABLE horarios (
id_horario INT PRIMARY KEY,
id_asignatura INT,
id_aula INT,
dia VARCHAR(80),
hora_inicio TIME,
hora_fin TIME,
FOREIGN KEY (id_asignatura) REFERENCES asignaturas(id_asignatura),
FOREIGN KEY (id_aula) REFERENCES aulas(id_aula)
);
CREATE TABLE matriculas (
id_matricula INT PRIMARY KEY,
id_estudiante INT,
id_asignatura INT,
nota DECIMAL(4,2),
FOREIGN KEY (id_estudiante) REFERENCES estudiantes(id_estudiante),
FOREIGN KEY (id_asignatura) REFERENCES asignaturas(id_asignatura)
);
INSERT INTO estudiantes (id_estudiante, nombre, apellido, estrato, genero, ciudad,
fecha_nac)
VALUES
(1001, 'Ana', 'Andrade', 3, 'Femenino', 'Bogota', '2002-05-10'),
(1002, 'Pepe', 'Gonzalez', 5, 'Masculino', 'Tunja', '2000-03-01'),
(1003, 'Juan', 'Cardona', 2, 'Masculino', 'Medellin', '2002-09-15'),
(1004, 'Camilo', 'Garcia', 1, 'Masculino', 'Cali', '1999-05-10'),
(1005, 'Diana', 'Samaca', 3, 'Femenino', 'Cartagena', '1970-06-10');
INSERT INTO programas (id_programa, programa, facultad, dpto) VALUES
(1, 'Ingenieria de Sistemas', 'Facultad de ingenierias', 'ingenieria'),
(2, 'Ingenieria de Software', 'Facultad de ingenierias', 'ingenieria'),
(3, 'Contaduria', 'Facultad de negocios', 'Escuela de Negocios'),
(4, 'Idiomas', 'Facultad de lenguas', 'Idiomas'),
(5, 'Culinaria', 'Facultad de Cocina', 'Escuela de reposteria');
INSERT INTO profesores (id_profesor, nombre, apellido, titulo, genero, area) VALUES
(101, 'Carlos', 'Ramirez', 'Magister', 'Masculino', 'Ingenierias'),
(102, 'Laura', 'Martinez', 'Magister', 'Femenino', 'Ingenierias'),
(103, 'Felipe', 'Rodriguez', 'Ingeniero', 'Masculino', 'Ingenierias'),
(104, 'Manuel', 'Daza', 'Magister', 'Masculino', 'Culinaria'),
(105, 'Francisco', 'Bonilla', 'Doctor', 'Masculino', 'Negocios');
INSERT INTO asignaturas (id_asignatura, id_profesor, id_programa, asignatura,
creditos, inf_horario)
VALUES
(201, 101, 1, 'Programacion I', 3, 4),
(202, 102, 2, 'Fundamentos de Administración', 4, 4),
(203, 103, 3, 'Fundamentos de Programacion', 3, 2),
(204, 104, 5, 'Fundamentos de la changua', 5, 5),
(205, 105, 4, 'Fundamentos de los idiomas', 4, 3);
INSERT INTO grupos (id_grupo, id_profesor, id_asignatura, grupo, numero_estudiantes)
VALUES
(301, 101, 201, 'A', 30),
(302, 102, 202, 'B', 25),
(303, 103, 203, 'A', 20),
(304, 104, 204, 'C', 15),
(305, 105, 205, 'A', 28);
INSERT INTO aulas (id_aula, nombre_aula, ubicacion, capacidad, tipo)
VALUES
(401, 'Aula 101', 'Bloque A', 35, 'Teorica'),
(402, 'Aula 202', 'Bloque B', 25, 'Laboratorio'),
(403, 'Cocina 1', 'Bloque C', 20, 'Practica'),
(404, 'Salon Idiomas', 'Bloque D', 30, 'Multimedia'),
(405, 'Aula Magna', 'Bloque E', 50, 'Auditorio');
INSERT INTO horarios (id_horario, id_asignatura, id_aula, dia, hora_inicio, hora_fin)
VALUES
(501, 201, 401, 'Lunes', '08:00:00', '10:00:00'),
(502, 202, 402, 'Martes', '10:00:00', '12:00:00'),
(503, 203, 401, 'Miércoles', '14:00:00', '16:00:00'),
(504, 204, 403, 'Jueves', '08:00:00', '11:00:00'),
(505, 205, 404, 'Viernes', '09:00:00', '11:00:00');
INSERT INTO matriculas (id_matricula, id_estudiante, id_asignatura, nota)
VALUES
(601, 1001, 201, 4.5),
(602, 1002, 202, 3.8),
(603, 1003, 203, 4.2),
(604, 1004, 204, 4.9),
(605, 1005, 205, 3.6);
SELECT id_asignatura,
AVG (nota)AS promedio_nota
FROM matriculas
GROUP BY id_asignatura;
SELECT genero,
COUNT (*)AS total_estudiantes
FROM estudiantes
GROUP BY genero;
SELECT tipo,
SUM (capacidad) AS capacidad_total
FROM aulas
GROUP BY tipo;
SELECT MAX (nota) as nota_maxima,
MIN (nota) AS nota_minima
FROM matriculas;
SELECT asignatura, MAX(int_horaria) AS intensidad_max
FROM asignaturas
GROUP BY asignatura
ORDER BY intensidad_max DESC;
SELECT AVG(estrato) AS promedio_estrato
FROM estudiantes;
SELECT nombre_aula, capacidad
FROM aulas
WHERE capacidad >30;
SELECT dia, hora_inicio, hora_fin
FROM horarios
ORDER BY dia, hora_inicio;
SELECT SUM (creditos) AS total_creditos
FROM asignaturas;
SELECT *
FROM estudiantes
WHERE genero = 'Femenino'
AND estrato IN (2, 3);
SELECT*
FROM asignaturas
WHERE int_horaria > 3
AND creditos >2;
SELECT*
FROM profesores
WHERE NOT area = 'Ingenierias';
SELECT*
FROM aulas
WHERE capacidad BETWEEN 20 AND 40 AND NOT tipo= 'Practicas';
SELECT *
FROM estudiantes
WHERE ciudad <> 'Bogota' OR genero = 'Masculino';
SELECT*
FROM asignaturas
WHERE asignatura LIKE '%Fundamentos%';
SELECT *
FROM asignaturas
WHERE asignatura LIKE '%Programacion%';
SELECT*
FROM estudiantes
WHERE YEAR (fecha_nac) BETWEEN 2001 AND 2003;
SELECT*
FROM matriculas
WHERE (nota) NOT BETWEEN 1.0 AND 3.0;
SELECT*
FROM asignaturas
WHERE creditos >3 OR int_horaria >4;
Eliminación de datos, si arroja algún error, que pueden ser de Primary KEY o Llaves foráneas
ALTER TABLE matriculas
DROP CONSTRAINT FK_matricula_id_es_49C3F6B7;
ALTER TABLE matriculas
ADD CONSTRAINT FK_matriculas_estudiantes
FOREIGN KEY (id_estudiante)
REFERENCES estudiantes(id_estudiante)
ON DELETE CASCADE;
Actualización de datos en las tablas
UPDATE estudiantes
SET ciudad = 'Tunja', estrato = 5
WHERE id_estudiante = 1005;
Paradigmas
Estructura condicional
● +CAST: es una función estándar que permite la conversión explícita de un tipo de datos a
otro Ejemplo de INT a VARCHAR
● ELSE: se usa dentro de estructuras condicionales IF o CASE para ejecutar un bloque de
código alternativo si la condición principal no se cumple. En esencia, ELSE proporciona
una ruta de acción predeterminada cuando una condición no es verdadera.
● BEGIN: se utiliza principalmente para dos propósitos: iniciar una transacción y agrupar
múltiples sentencias en un bloque.
● WHILE:se utiliza para ejecutar repetidamente un bloque de código mientras una condición
especificada sea verdadera.
● DECLARE: se usa para declarar variables locales dentro de un procedimiento o bloque de
código, especificando su nombre y tipo de datos.
● BREAK: se usa con frecuencia para finalizar el procesamiento de un caso concreto en una
instrucción switch.
● SET: se utiliza para asignar valores a variables, tanto variables de sesión como variables
del sistema, o para configurar ajustes de la sesión.
● CASE: Son casos que podemos ir agregando: es una expresión condicional que permite
evaluar múltiples condiciones y devolver diferentes valores o realizar distintas acciones
según el resultado de esas condiciones.
● CREATE PROCEDURE: se utiliza para definir un procedimiento almacenado. Un
procedimiento almacenado es una secuencia de instrucciones SQL que se pueden
ejecutar como una unidad.
● DROP: Elimina una tabla
● DELETE: Se usa para eliminar un registro
SELECT* FROM [Link]
------------------------------------------------------------------------------
CREATE PROCEDURE EvaluarNota
@nota DECIMAL(4,2)
AS
BEGIN
IF @nota >= 3.0
PRINT 'Aprobado'
ELSE
PRINT 'Reprobado'
END
------------------------------------------------------------------------------
EXEC EvaluarNota @nota = 2.0;
------------------------------------------------------------------------------
CREATE PROCEDURE verificarEstudiante
@id_estudiante INT
AS
BEGIN
IF EXISTS (SELECT 1 FROM estudiantes WHERE id_estudiante = @id_estudiante)
PRINT 'Estudiante encontrado/Registrado'
ELSE
PRINT 'Estudiante no existe'
END
------------------------------------------------------------------------------
EXEC verificarEstudiante @id_estudiante = 1001;
------------------------------------------------------------------------------
Para dos o más consultas
CREATE PROCEDURE verificarestudiantes
@id_estudiante1 INT,
@id_estudiante2 INT
AS
BEGIN
IF EXISTS (SELECT 1 FROM estudiantes WHERE id_estudiante= @id_estudiante1)
PRINT 'Estudiante encontrado/Registrado'
ELSE
PRINT 'Estudiante no existe'
IF EXISTS (SELECT 1 FROM estudiantes WHERE id_estudiante= @id_estudiante2)
PRINT 'Estudiante encontrado/Registrado'
ELSE
PRINT 'Estudiante no existe'
END
------------------------------------------------------------------------------
EXEC verificarEstudiantes @id_estudiante1 = 1020, @id_estudiante2 = 1003;
------------------------------------------------------------------------------
------------------------------------------------------------------------------
CREATE PROCEDURE InsertarMatriculaSiNoExiste
@id_matricula INT,
@id_estudiante INT,
@id_asignatura INT,
@nota DECIMAL(4,2)
AS
BEGIN
IF NOT EXISTS (
SELECT 1
FROM matriculas
WHERE id_estudiante = @id_estudiante AND id_asignatura = @id_asignatura
)
BEGIN
INSERT INTO matriculas (id_matricula, id_estudiante, id_asignatura, nota)
VALUES (@id_matricula, @id_estudiante, @id_asignatura, @nota);
PRINT 'Matrícula registrada exitosamente';
END
ELSE
BEGIN
PRINT 'El estudiante ya está matriculado en esta asignatura';
END
END
------------------------------------------------------------------------------
EXEC InsertarMatriculaSiNoExiste
@id_matricula =700,
@id_estudiante =1002,
@id_asignatura =201,
@nota=4.3;
------------------------------------------------------------------------------
IF EXISTS (SELECT 1 FROM matriculas WHERE id_estudiante = 1001)
PRINT 'El estudiante está matriculado';
ELSE
PRINT 'El estudiante no cuenta con matrícula';
DECLARE @contador INT = 1;
WHILE @contador <= 5
BEGIN
PRINT 'Interacion numero ' + CAST(@contador AS VARCHAR);
IF @contador = 3
BREAK;
SET @contador = @contador + 1;
END
------------------------------------------------------------------------------
SELECT nota,
CASE
WHEN nota >= 4.5 THEN 'Excelente'
WHEN nota >= 3.0 THEN 'Aprobada'
ELSE 'Reprobo'
END AS resultado
FROM matriculas;
------------------------------------------------------------------------------
CREATE PROCEDURE MostrarEstudianteSiExiste
@id INT
AS
BEGIN
IF NOT EXISTS (SELECT 1 FROM estudiantes WHERE id_estudiante = @id)
BEGIN
PRINT 'El estudiante no se encontró';
RETURN;
END
SELECT * FROM estudiantes WHERE id_estudiante = @id;
END
------------------------------------------------------------------------------
EXEC MostrarEstudianteSiExiste @id =1021;
------------------------------------------------------------------------------
------------------------------------------------------------------------------
BEGIN TRY
DECLARE @x INT = 1, @y INT = 0, @resultado INT;
SET @resultado = @x / @y;
PRINT 'Resultado: ' + CAST(@resultado AS VARCHAR);
END TRY
BEGIN CATCH
PRINT 'Ocurrió un error: ' + ERROR_MESSAGE();
END CATCH
-------------------------------------------------------------------------------
CREATE PROCEDURE EvaluarYActualizarNota
@id_estudiante INT,
@id_asignatura INT,
@nuevaNota DECIMAL(4,2)
AS
BEGIN
DECLARE @nota_Actual DECIMAL(4,2);
DECLARE @intentos INT = 1;
IF NOT EXISTS (
SELECT 1
FROM matriculas
WHERE id_estudiante = @id_estudiante AND id_asignatura = @id_asignatura
)
BEGIN
PRINT 'El estudiante no se encuentra matriculado';
RETURN;
END
BEGIN TRY
SELECT @nota_Actual = nota
FROM matriculas
WHERE id_estudiante = @id_estudiante AND id_asignatura = @id_asignatura;
PRINT 'Nota actual: ' + CAST(@nota_Actual AS VARCHAR);
WHILE @intentos <= 3
BEGIN
IF @nuevaNota > @nota_Actual
BEGIN
UPDATE matriculas
SET nota = @nuevaNota
WHERE id_estudiante = @id_estudiante AND id_asignatura = @id_asignatura;
PRINT 'Nota actualizada, su nueva nota es: ' + CAST(@nuevaNota AS VARCHAR);
DECLARE @clasificacion VARCHAR(20);
SET @clasificacion = CASE
WHEN @nuevaNota >= 4.5 THEN 'Excelente'
WHEN @nuevaNota >= 3.0 THEN 'Aprobó'
ELSE 'Reprobó'
END;
PRINT 'Clasificación: ' + @clasificacion;
BREAK;
ELSE
BEGIN
PRINT 'La nueva nota no es mayor. Intento ' + CAST(@intentos AS VARCHAR);
SET @intentos = @intentos + 1;
END
END
IF @intentos > 3
BEGIN
PRINT 'Se superó el número de intentos permitidos';
RETURN;
END
END TRY
BEGIN CATCH
PRINT 'Error detectado: ' + ERROR_MESSAGE();
END CATCH
END
------------------------------------------------------------------------------
EXEC EvaluarYActualizarNota
@id_estudiante =1001,
@id_asignatura= 201,
@nuevaNota=4.3;
------------------------------------------------------------------------------
CREATE TABLE Rectoras (
id_rectora INT PRIMARY KEY,
nombre VARCHAR(100),
fecha_inicio DATE,
correo VARCHAR(100)
);
------------------------------------------------------------------------------
INSERT INTO Rectoras (id_rectora, nombre, fecha_inicio, correo) VALUES
(1, 'Laura Martínez', '2022-01-10', 'laura.m@[Link]'),
(2, 'Camila Gómez', '2023-03-15', 'cgomez@[Link]'),
(3, 'Ana María', '2025-01-10', 'Ana.m@[Link]'),
(4, 'Francisco Samaca', '2020-03-11', 'laura.m@[Link]'),
(5, 'Víctor Aristizabal', '2021-06-20', 'victor.a@[Link]');
------------------------------------------------------------------------------
SELECT
id_rectora,
UPPER (nombre) AS nombre_mayusculas,
LEN (nombre) AS longitud_nombre,
correo
FROM Rectoras;
------------------------------------------------------------------------------
SELECT
nombre,
fecha_inicio,
GETDATE ()AS fecha_Actual,
DATEPART (YEAR, fecha_inicio) AS año_ingreso
FROM Rectoras;
------------------------------------------------------------------------------
SELECT
nombre,
fecha_inicio,
DATEDIFF (YEAR, fecha_inicio, GETDATE()) AS años_en_el_cargo,
CASE
WHEN DATEDIFF (YEAR, fecha_inicio, GETDATE()) >=2 THEN 'Antigua'
ELSE 'Reciente'
END
AS Antigüedad
FROM Rectoras;
------------------------------------------------------------------------------
SELECT
nombre,
CAST (fecha_inicio AS VARCHAR) AS fecha_texto,
CONVERT (VARCHAR, fecha_inicio, 103) AS fecha_formato
FROM Rectoras;
------------------------------------------------------------------------------
SELECT
nombre,
ISDATE ('2025-01-15') AS fecha_valida
FROM Rectoras;
------------------------------------------------------------------------------