Monitor con codigo SQL en pantalla

SQL para principiantes: Consultas basicas para Bases de Datos

Que es SQL y para que se usa

SQL (Structured Query Language, o Lenguaje de Consulta Estructurado) es el lenguaje estandar para interactuar con bases de datos relacionales. Si estas cursando Ingenieria en Informatica, Ingenieria Civil Industrial, Administracion o cualquier carrera que tenga un ramo de bases de datos, SQL es una de las herramientas mas 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 mas tablas.
  • Update (Actualizar): modificar registros existentes.
  • Delete (Eliminar): borrar registros de una tabla.

SQL se usa en practicamente 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 academico 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 facil de aprender.

Configurar tu entorno (MySQL, PostgreSQL o SQLite)

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

  • MySQL: el mas usado en el mundo. Descarga MySQL Community Server y MySQL Workbench (interfaz grafica). Es gratuito y es lo que la mayoria de profesores piden.
  • PostgreSQL: mas robusto y con mejor soporte para funciones avanzadas. Descargalo con pgAdmin como interfaz grafica. Tambien gratuito.
  • SQLite: el mas simple. No necesita instalacion de servidor; funciona como un archivo. Ideal para practicar rapido. Puedes usar DB Browser for SQLite como interfaz.

Opcion rapida: 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 practica

Vamos a crear una base de datos sencilla para los ejemplos de esta guia. Copia y ejecuta el siguiente codigo:

-- 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 basica es:

SELECT columna1, columna2, columna3
FROM nombre_tabla;

Veamos ejemplos con nuestra base de datos de practica:

-- 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 util para explorar datos, pero en consultas de produccion es mejor especificar las columnas que necesitas para mejorar el rendimiento.

Ejemplo de consulta SQL mostrando resultados
Resultado de una consulta SELECT mostrando datos de la tabla de estudiantes

WHERE: filtrar resultados

La clausula WHERE te permite filtrar las filas que cumplan una condicion. 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 mas comunes en pruebas de bases de datos.

ORDER BY y LIMIT

ORDER BY ordena los resultados y LIMIT restringe cuantas filas se devuelven. Son muy utiles 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 cual usa tu profesor.

Funciones de agregacion (COUNT, SUM, AVG)

Las funciones de agregacion calculan un unico valor a partir de un conjunto de filas. Son fundamentales para reportes y analisis:

-- 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 DESPUES de agrupar. Si quieres filtrar por una columna normal, usa WHERE. Si quieres filtrar por el resultado de una funcion de agregacion (COUNT, AVG, SUM), usa HAVING.

JOIN: combinar tablas

En una base de datos relacional, los datos estan distribuidos en multiples tablas. JOIN te permite combinar filas de dos o mas tablas basandose en una columna comun (generalmente una clave foranea).

-- 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

Ademas de leer datos, necesitas saber como 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 clausula WHERE, borraras TODOS los registros de la tabla. Lo mismo con UPDATE: si no especificas WHERE, actualizaras todas las filas. Siempre verifica tu WHERE con un SELECT antes de ejecutar UPDATE o DELETE.

Subconsultas basicas

Una subconsulta es un SELECT dentro de otro SELECT. Son muy utiles 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 practicos

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

  1. Facil: Lista todos los estudiantes de Psicologia ordenados por promedio de mayor a menor.
  2. Facil: Cuenta cuantos cursos tiene cada profesor.
  3. Medio: Muestra el nombre de cada estudiante junto con la cantidad de cursos en los que esta 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 mayoria de estos ejercicios, ya tienes una base solida 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. Escribenos y te ayudamos.

Compartir:

Articulos relacionados

¿Necesitas que hagamos tu trabajo?

Escribenos con los requisitos y te cotizamos al instante.