Monitor con código SQL en pantalla

SQL para principiantes: Consultas básicas para Bases de Datos

Qué es SQL y para qué se usa

SQL (Structured Query Language, o Lenguaje de Consulta Estructurado) es el lenguaje estándar para interactuar con bases de datos relacionales. Si estás cursando Ingeniería en Informática, Ingeniería Civil Industrial, Administración o cualquier carrera que tenga un ramo de bases de datos, SQL es una de las herramientas más importantes que vas a aprender.

Con SQL puedes hacer cuatro operaciones fundamentales sobre los datos, conocidas como CRUD:

  • Create (Crear): insertar nuevos registros en una tabla.
  • Read (Leer): consultar y extraer datos de una o más tablas.
  • Update (Actualizar): modificar registros existentes.
  • Delete (Eliminar): borrar registros de una tabla.

SQL se usa en prácticamente todas las aplicaciones que manejan datos: sistemas bancarios, tiendas online, redes sociales, sistemas de salud, ERP empresariales, y por supuesto, en los trabajos y proyectos de la universidad. Saber SQL te abre puertas tanto en el mundo académico como profesional.

Dato importante SQL es un lenguaje declarativo: tu le dices a la base de datos que quieres obtener, no como obtenerlo. Esto lo hace diferente a lenguajes como Python o Java, donde escribes instrucciones paso a paso. Por eso SQL es relativamente fácil de aprender.

Configurar tu entorno (MySQL, PostgreSQL o SQLite)

Para practicar SQL necesitas un motor de base de datos. Estas son las tres opciones más populares para estudiantes:

  • MySQL: el más usado en el mundo. Descarga MySQL Community Server y MySQL Workbench (interfaz gráfica). Es gratuito y es lo que la mayoría de profesores piden.
  • PostgreSQL: más robusto y con mejor soporte para funciones avanzadas. Descargalo con pgAdmin como interfaz gráfica. También gratuito.
  • SQLite: el más simple. No necesita instalación de servidor; funciona como un archivo. Ideal para practicar rápido. Puedes usar DB Browser for SQLite como interfaz.

Opción rápida: SQL online

Si no quieres instalar nada, puedes practicar en SQLiteOnline.com o db-fiddle.com. Solo abre el navegador y empieza a escribir consultas. Perfecto para empezar.

Crear una base de datos de práctica

Vamos a crear una base de datos sencilla para los ejemplos de esta guía. Copia y ejecuta el siguiente código:

-- Crear la base de datos
CREATE DATABASE universidad;
USE universidad;

-- Crear tabla de estudiantes
CREATE TABLE estudiantes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(100) NOT NULL,
    apellido VARCHAR(100) NOT NULL,
    carrera VARCHAR(100),
    semestre INT,
    promedio DECIMAL(3,1),
    fecha_ingreso DATE
);

-- Crear tabla de cursos
CREATE TABLE cursos (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(150) NOT NULL,
    creditos INT,
    profesor VARCHAR(100)
);

-- Crear tabla de inscripciones
CREATE TABLE inscripciones (
    id INT PRIMARY KEY AUTO_INCREMENT,
    estudiante_id INT,
    curso_id INT,
    nota DECIMAL(3,1),
    semestre VARCHAR(10),
    FOREIGN KEY (estudiante_id) REFERENCES estudiantes(id),
    FOREIGN KEY (curso_id) REFERENCES cursos(id)
);

-- Insertar datos de ejemplo
INSERT INTO estudiantes (nombre, apellido, carrera, semestre, promedio, fecha_ingreso) VALUES
('Maria', 'Gonzalez', 'Ingenieria Comercial', 5, 5.8, '2024-03-01'),
('Juan', 'Rodriguez', 'Ingenieria Civil', 3, 6.2, '2025-03-01'),
('Camila', 'Lopez', 'Psicologia', 7, 6.5, '2023-03-01'),
('Diego', 'Martinez', 'Ingenieria Comercial', 4, 4.9, '2024-08-01'),
('Valentina', 'Silva', 'Derecho', 6, 5.5, '2023-08-01'),
('Sebastian', 'Torres', 'Ingenieria Civil', 2, 6.0, '2025-08-01'),
('Francisca', 'Muñoz', 'Psicologia', 4, 5.3, '2024-08-01'),
('Matias', 'Diaz', 'Administracion', 8, 6.1, '2022-03-01');

INSERT INTO cursos (nombre, creditos, profesor) VALUES
('Bases de Datos', 5, 'Prof. Soto'),
('Estadistica I', 4, 'Prof. Reyes'),
('Calculo II', 5, 'Prof. Fernandez'),
('Marketing Digital', 3, 'Prof. Vera');

INSERT INTO inscripciones (estudiante_id, curso_id, nota, semestre) VALUES
(1, 1, 5.5, '2026-1'), (1, 2, 6.0, '2026-1'),
(2, 1, 6.8, '2026-1'), (2, 3, 5.9, '2026-1'),
(3, 2, 6.3, '2026-1'), (4, 1, 4.2, '2026-1'),
(4, 4, 5.1, '2026-1'), (5, 2, 5.7, '2026-1'),
(6, 3, 6.4, '2026-1'), (7, 2, 4.8, '2026-1'),
(8, 4, 6.0, '2026-1'), (8, 1, 5.9, '2026-1');

SELECT: tu primera consulta

La sentencia SELECT es la base de todo en SQL. Con ella puedes obtener datos de una tabla. La sintaxis básica es:

SELECT columna1, columna2, columna3
FROM nombre_tabla;

Veamos ejemplos con nuestra base de datos de práctica:

-- Obtener todos los datos de todos los estudiantes
SELECT * FROM estudiantes;

-- Obtener solo nombre y carrera
SELECT nombre, apellido, carrera
FROM estudiantes;

-- Usar alias para renombrar columnas en el resultado
SELECT nombre AS "Nombre del Estudiante",
       carrera AS "Carrera Universitaria",
       promedio AS "Promedio Acumulado"
FROM estudiantes;

El asterisco * significa "todas las columnas". Es útil para explorar datos, pero en consultas de producción es mejor especificar las columnas que necesitas para mejorar el rendimiento.

WHERE: filtrar resultados

La cláusula WHERE te permite filtrar las filas que cumplan una condición. Es como decir "dame solo los registros que cumplan con esto".

-- Estudiantes de Ingenieria Comercial
SELECT nombre, apellido, promedio
FROM estudiantes
WHERE carrera = 'Ingenieria Comercial';

-- Estudiantes con promedio mayor a 6.0
SELECT nombre, apellido, promedio
FROM estudiantes
WHERE promedio > 6.0;

-- Combinar condiciones con AND y OR
SELECT nombre, apellido, carrera, promedio
FROM estudiantes
WHERE carrera = 'Ingenieria Civil'
  AND promedio >= 6.0;

-- Estudiantes que NO son de Psicologia
SELECT nombre, apellido, carrera
FROM estudiantes
WHERE carrera != 'Psicologia';

-- Buscar con patrones usando LIKE
SELECT nombre, apellido
FROM estudiantes
WHERE apellido LIKE 'M%';    -- Apellidos que empiezan con M

-- Buscar en una lista de valores con IN
SELECT nombre, apellido, carrera
FROM estudiantes
WHERE carrera IN ('Derecho', 'Psicologia', 'Administracion');

-- Buscar en un rango con BETWEEN
SELECT nombre, apellido, promedio
FROM estudiantes
WHERE promedio BETWEEN 5.0 AND 6.0;
Cuidado con NULL En SQL, NULL no es igual a nada, ni siquiera a si mismo. No puedes usar WHERE columna = NULL. Debes usar WHERE columna IS NULL o WHERE columna IS NOT NULL. Este es uno de los errores más comunes en pruebas de bases de datos.

ORDER BY y LIMIT

ORDER BY ordena los resultados y LIMIT restringe cuántas filas se devuelven. Son muy útiles para rankings y top-N:

-- Ordenar por promedio de mayor a menor
SELECT nombre, apellido, promedio
FROM estudiantes
ORDER BY promedio DESC;

-- Ordenar por carrera (A-Z) y luego por promedio (mayor a menor)
SELECT nombre, apellido, carrera, promedio
FROM estudiantes
ORDER BY carrera ASC, promedio DESC;

-- Top 3 estudiantes con mejor promedio
SELECT nombre, apellido, promedio
FROM estudiantes
ORDER BY promedio DESC
LIMIT 3;

-- Estudiantes del semestre 4 en adelante, ordenados por nombre
SELECT nombre, apellido, semestre
FROM estudiantes
WHERE semestre >= 4
ORDER BY nombre ASC;
Nota sobre LIMIT LIMIT es la sintaxis de MySQL y PostgreSQL. En SQL Server se usa TOP: SELECT TOP 3 * FROM estudiantes. En Oracle se usa FETCH FIRST 3 ROWS ONLY. Consulta cuál usa tu profesor.

Funciones de agregación (COUNT, SUM, AVG)

Las funciones de agregación calculan un único valor a partir de un conjunto de filas. Son fundamentales para reportes y análisis:

-- Contar cuantos estudiantes hay
SELECT COUNT(*) AS total_estudiantes
FROM estudiantes;

-- Promedio general de todos los estudiantes
SELECT AVG(promedio) AS promedio_general
FROM estudiantes;

-- Promedio mas alto y mas bajo
SELECT MAX(promedio) AS mejor_promedio,
       MIN(promedio) AS peor_promedio
FROM estudiantes;

-- Contar estudiantes por carrera (GROUP BY)
SELECT carrera,
       COUNT(*) AS cantidad,
       AVG(promedio) AS promedio_carrera
FROM estudiantes
GROUP BY carrera
ORDER BY promedio_carrera DESC;

-- Filtrar grupos con HAVING
-- (carreras con promedio superior a 5.5)
SELECT carrera,
       COUNT(*) AS cantidad,
       AVG(promedio) AS promedio_carrera
FROM estudiantes
GROUP BY carrera
HAVING AVG(promedio) > 5.5
ORDER BY promedio_carrera DESC;
WHERE vs HAVING WHERE filtra filas individuales ANTES de agrupar. HAVING filtra grupos DESPUÉS de agrupar. Si quieres filtrar por una columna normal, usa WHERE. Si quieres filtrar por el resultado de una función de agregación (COUNT, AVG, SUM), usa HAVING.

JOIN: combinar tablas

En una base de datos relacional, los datos están distribuidos en múltiples tablas. JOIN te permite combinar filas de dos o más tablas basándose en una columna común (generalmente una clave foránea).

-- INNER JOIN: obtener estudiantes con sus cursos e inscripciones
SELECT e.nombre,
       e.apellido,
       c.nombre AS curso,
       i.nota
FROM estudiantes e
INNER JOIN inscripciones i ON e.id = i.estudiante_id
INNER JOIN cursos c ON c.id = i.curso_id
ORDER BY e.apellido, c.nombre;

-- LEFT JOIN: TODOS los estudiantes, incluso los sin inscripciones
SELECT e.nombre,
       e.apellido,
       c.nombre AS curso,
       i.nota
FROM estudiantes e
LEFT JOIN inscripciones i ON e.id = i.estudiante_id
LEFT JOIN cursos c ON c.id = i.curso_id
ORDER BY e.apellido;

-- Promedio de notas por curso
SELECT c.nombre AS curso,
       c.profesor,
       COUNT(i.id) AS inscritos,
       AVG(i.nota) AS promedio_notas
FROM cursos c
LEFT JOIN inscripciones i ON c.id = i.curso_id
GROUP BY c.id, c.nombre, c.profesor
ORDER BY promedio_notas DESC;

Los tipos de JOIN que debes conocer son:

  • INNER JOIN: solo devuelve filas que tienen coincidencia en AMBAS tablas.
  • LEFT JOIN: devuelve TODAS las filas de la tabla izquierda, y las coincidencias de la derecha (NULL si no hay).
  • RIGHT JOIN: lo opuesto al LEFT JOIN. Devuelve todas las filas de la tabla derecha.
  • FULL OUTER JOIN: devuelve todas las filas de ambas tablas (no disponible en MySQL).

INSERT, UPDATE y DELETE

Además de leer datos, necesitas saber cómo modificarlos:

-- INSERT: agregar un nuevo estudiante
INSERT INTO estudiantes (nombre, apellido, carrera, semestre, promedio, fecha_ingreso)
VALUES ('Antonia', 'Rojas', 'Ingenieria Comercial', 1, 0.0, '2026-03-01');

-- INSERT multiple: agregar varios registros a la vez
INSERT INTO estudiantes (nombre, apellido, carrera, semestre, promedio, fecha_ingreso)
VALUES
    ('Felipe', 'Castro', 'Derecho', 2, 5.4, '2025-08-01'),
    ('Isidora', 'Vargas', 'Psicologia', 1, 0.0, '2026-03-01');

-- UPDATE: modificar el promedio de un estudiante
UPDATE estudiantes
SET promedio = 5.2, semestre = 2
WHERE id = 9;

-- DELETE: eliminar un estudiante
DELETE FROM estudiantes
WHERE id = 10;
NUNCA hagas UPDATE o DELETE sin WHERE Si ejecutas DELETE FROM estudiantes; sin cláusula WHERE, borrarás TODOS los registros de la tabla. Lo mismo con UPDATE: si no especificas WHERE, actualizarás todas las filas. Siempre verifica tu WHERE con un SELECT antes de ejecutar UPDATE o DELETE.

Subconsultas básicas

Una subconsulta es un SELECT dentro de otro SELECT. Son muy útiles para consultas complejas:

-- Estudiantes con promedio superior al promedio general
SELECT nombre, apellido, promedio
FROM estudiantes
WHERE promedio > (SELECT AVG(promedio) FROM estudiantes);

-- Cursos en los que esta inscrita Maria Gonzalez
SELECT nombre AS curso
FROM cursos
WHERE id IN (
    SELECT curso_id
    FROM inscripciones
    WHERE estudiante_id = (
        SELECT id FROM estudiantes
        WHERE nombre = 'Maria' AND apellido = 'Gonzalez'
    )
);

-- Estudiante con la nota mas alta en Bases de Datos
SELECT e.nombre, e.apellido, i.nota
FROM estudiantes e
JOIN inscripciones i ON e.id = i.estudiante_id
WHERE i.curso_id = (SELECT id FROM cursos WHERE nombre = 'Bases de Datos')
ORDER BY i.nota DESC
LIMIT 1;

Ejercicios prácticos

Practica con estos ejercicios usando la base de datos que creamos al principio. Intenta resolverlos antes de ver las respuestas:

  1. Fácil: Lista todos los estudiantes de Psicología ordenados por promedio de mayor a menor.
  2. Fácil: Cuenta cuántos cursos tiene cada profesor.
  3. Medio: Muestra el nombre de cada estudiante junto con la cantidad de cursos en los que está inscrito.
  4. Medio: Encuentra los estudiantes que tienen al menos una nota inferior a 5.0.
  5. Avanzado: Para cada carrera, muestra el estudiante con mejor promedio.
-- Respuesta 1:
SELECT nombre, apellido, promedio
FROM estudiantes
WHERE carrera = 'Psicologia'
ORDER BY promedio DESC;

-- Respuesta 2:
SELECT profesor, COUNT(*) AS cantidad_cursos
FROM cursos
GROUP BY profesor;

-- Respuesta 3:
SELECT e.nombre, e.apellido,
       COUNT(i.id) AS cursos_inscritos
FROM estudiantes e
LEFT JOIN inscripciones i ON e.id = i.estudiante_id
GROUP BY e.id, e.nombre, e.apellido
ORDER BY cursos_inscritos DESC;

-- Respuesta 4:
SELECT DISTINCT e.nombre, e.apellido
FROM estudiantes e
JOIN inscripciones i ON e.id = i.estudiante_id
WHERE i.nota < 5.0;

-- Respuesta 5:
SELECT e.nombre, e.apellido, e.carrera, e.promedio
FROM estudiantes e
WHERE e.promedio = (
    SELECT MAX(e2.promedio)
    FROM estudiantes e2
    WHERE e2.carrera = e.carrera
)
ORDER BY e.carrera;

Si pudiste resolver la mayoría de estos ejercicios, ya tienes una base sólida de SQL. Para seguir avanzando, te recomiendo practicar en plataformas como HackerRank, LeetCode o SQLZoo, que tienen cientos de ejercicios ordenados por dificultad.

Si necesitas ayuda con un trabajo de bases de datos, ya sea crear un modelo entidad-relacion, escribir consultas SQL complejas o desarrollar un sistema completo, en Tareapp tenemos experiencia con MySQL, PostgreSQL, SQL Server y Oracle. Escríbenos y te ayudamos.

Compartir:

Artículos relacionados

¿Necesitas que hagamos tu trabajo?

Escríbenos con los requisitos y te cotizamos al instante.