Conceptos SQL

(Structured Query Language o Lenguaje de Consulta Estructurado) es un lenguaje de programación diseñado para gestionar y manipular bases de datos relacionales. Se usa para consultar, insertar, actualizar y eliminar datos, así como para definir la estructura de las bases de datos y gestionar permisos de acceso.

SENTECIAS BASICAS

DDL (Lenguaje de definición de datos) – Lenguaje de Definición de Datos
Sirve para crear y modificar la estructura de la base de datos (tablas, índices, vistas, etc.).

CREATE: Crea bases de datos, tablas, vistas, etc.

ALTER: Modifica la estructura de una tabla.

DROP: Elimina bases de datos, tablas o vistas.

TRUNCATE: Borra todos los datos de una tabla sin eliminar su estructura.

CREATE TABLE usuarios (
id INT PRIMARY KEY,
nombre VARCHAR(50),
correo VARCHAR(100)
);

DML (Lenguaje de manipulación de datos) – Lenguaje de Manipulación de Datos
Permite gestionar y manipular los datos que están dentro de las tablas.

SELECT: Consulta datos en una tabla.

INSERT: Inserta datos en una tabla.

UPDATE: Modifica datos en una tabla.

DELETE: Elimina datos de una tabla.

INSERT INTO usuarios (id, nombre, correo) VALUES (1, 'Carlos', 'carlos@mail.com');

DCL (Lenguaje de Control de Datos) – Lenguaje de Control de Datos
Controla los permisos y seguridad de la base de datos.

GRANT: Concede permisos a usuarios.

REVOKE: Revoca permisos previamente concedidos.

GRANT SELECT, INSERT ON usuarios TO juan;

TCL (Lenguaje de Control de Transacciones) – Lenguaje de Control de Transacciones
Gestiona las transacciones que permiten confirmar o deshacer cambios en los datos.

COMMIT: Guarda los cambios realizados.

ROLLBACK: Revierte los cambios si ocurre un error.

SAVEPOINT: Define puntos intermedios en una transacción.

BEGIN;
UPDATE usuarios SET nombre = 'Ana' WHERE id = 1;
ROLLBACK;

FUNCIONES

Las funciones en SQL son instrucciones predefinidas que realizan operaciones sobre los datos y devuelven un resultado . Se usan comúnmente para hacer cálculos , modificar cadenas deen SQL son instrucciones predefinidas que realizan operaciones sobre los datos y devuelven un resultado. Se usan comúnmente para hacer cálculos, modificar cadenas de texto, trabajar con fechas o contar registros.

1. Funciones de Agregación
Estas funciones trabajan sobre varios registros. y devuelven un único valor . Se usan normalmente.y devuelven un único valor. Se usan normalmente con GROUP BY.

Función Descripción Ejemplo
COUNT() Cuenta la cantidad de registros. SELECT COUNT(*) FROM empleados;
SUM() Suma SELECT SUM(salario) FROM empleados;
AVG() Calcula SELECT AVG(salario) FROM empleados;
MAX() Devuelve el valor máximo. SELECT MAX(salario) FROM empleados;
MIN() Devuelve SELECT MIN(salario) FROM empleados;
2. Funciones Escalares
Trabajan sobre un solo valor y devuelven un resultado.

a) Funciones de Texto (Funciones de Cadena)
Función Descripción Ejemplo
UPPER() Convertir texto a mayúsculas. SELECT UPPER(nombre) FROM empleados;
LOWER() Convertir texto a minúsculas. SELECT LOWER(nombre) FROM empleados;
LENGTH()/LEN() Devuelve la longitud de una cadena. SELECT LENGTH(nombre) FROM empleados;
SUBSTRING() Extraer parte de un texto. SELECT SUBSTRING(nombre, 1, 3) FROM empleados;
CONCAT() Unas varias cadenas de texto. SELECT CONCAT(nombre, ' ', apellido) FROM empleados;
b) Funciones numéricas
Función Descripción Ejemplo
ROUND() Redondea un número SELECT ROUND(salario, 2) FROM empleados;
ABS() Devuelve el valor SELECT ABS(-150);
CEIL()/CEILING() Redondea hacia SELECT CEIL(4.3);
FLOOR() Redondea hacia abajo. SELECT FLOOR(4.7);
c) Funciones de Fecha y Hora
Función Descripción Ejemplo
NOW() Devuelve la fecha y hora actual. SELECT NOW();
CURDATE() Devuelve la fecha actual. SELECT CURDATE();
YEAR() Extrae el año de una fecha. SELECT YEAR(fecha_contrato) FROM empleados;
MONTH() Extrae el mes de una fecha. SELECT MONTH(fecha_contrato) FROM empleados;
DATEDIFF() Calcula la diferencia de días entre dos fechas. SELECT DATEDIFF(NOW(), fecha_contrato) FROM empleados;

OPERADORES

Los operadores en SQL son símbolos o palabras clave que permiten realizar comparaciones ,son símbolos o palabras clave que permiten realizar comparaciones , operaciones aritméticas , evaluaciones lógicas o manipular datos en las consultas.

1. Operadores aritméticos
Se utilizan para realizar operaciones matemáticas.

Operador Descripción Ejemplo
+ Suma SELECT 10 + 5;→ 15
- Resto SELECT 10 - 5;→ 5
* Multiplicación SELECT 10 * 5;→ 50
/ División SELECT 10 / 5;→ 2
% Módulo (resto de división) SELECT 10 % 3;→ 1

2. Operadores de comparación
Sirven para comparar dos valores y devuelven un valor booleano ( TRUE o FALSE ).

Operador Descripción Ejemplo
= Igual a SELECT * FROM empleados WHERE salario = 3000;
<>o!= Distinto de SELECT * FROM empleados WHERE salario <> 3000;
> Alcalde que SELECT * FROM empleados WHERE salario > 3000;
< Menor que SELECT * FROM empleados WHERE salario < 3000;
>= Mayor o igual SELECT * FROM empleados WHERE salario >= 3000;
<= Menor o igual SELECT * FROM empleados WHERE salario <= 3000;
BETWEEN Dentro de un rango SELECT * FROM empleados WHERE salario BETWEEN 2000 AND 4000;
IN Busca un valor dentro de una lista SELECT * FROM empleados WHERE departamento IN ('Ventas', 'IT');
LIKE Búsqueda por patrón SELECT * FROM empleados WHERE nombre LIKE 'A%';
IS NULL Verifica si el valor es nulo SELECT * FROM empleados WHERE correo IS NULL;

3. Operadores lógicos
Permiten combinar varias condiciones.

Operador Descripción Ejemplo
AND Todas las condiciones deben ser verdaderas. SELECT * FROM empleados WHERE salario > 3000 AND departamento = 'IT';
OR Al menos una condición debe ser verdadera. SELECT * FROM empleados WHERE salario > 3000 OR departamento = 'IT';
NOT Niega una condición SELECT * FROM empleados WHERE NOT departamento = 'Ventas';

4. Operadores de Asignación (en algunos motores como SQL Server o PL/SQL)
Permiten asignar un valor a una variable.

Operador Descripción Ejemplo
= Asigna un valor SET @salario = 3000;

Subconsultas

En SQL son consultas anidadas dentro de otra consulta principal. Se usan cuando una consulta necesita un resultado intermedio antes de ejecutar la consulta final.
Se colocan dentro de (), generalmente en WHERE, FROM o SELECT.

1. Subconsulta en WHERE (Buscar el salario más alto)

SELECT nombre, salario
FROM empleados
WHERE salario = (SELECT MAX(salario) FROM empleados);
🔹 Muestra los empleados con el salario más alto.

2. Subconsulta en SELECT (Mostrar el salario promedio junto con cada empleado)

SELECT nombre, salario,
(SELECT AVG(salario) FROM empleados) AS salario_promedio
FROM empleados;
🔹 Agrega el salario promedio de la empresa en cada fila.

3. Subconsulta en FROM (Tabla temporal con promedios de salario por departamento)

SELECT depto, promedio
FROM (SELECT departamento AS depto, AVG(salario) AS promedio FROM empleados GROUP BY departamento) AS tabla_temporal;
🔹 Muestra el salario promedio por departamento.

4. Subconsulta con IN (Empleados de los departamentos con más de 5 empleados)
SELECT nombre FROM empleados
WHERE departamento IN (SELECT departamento FROM empleados GROUP BY departamento HAVING COUNT(*) > 5);
🔹 Filtra empleados de departamentos con más de 5 trabajadores.

5. Subconsulta con EXISTS (Empleados que tienen proyectos asignados)

SELECT nombre FROM empleados e
WHERE EXISTS (SELECT 1 FROM proyectos p WHERE p.id_empleado = e.id);
🔹 Devuelve solo los empleados que tienen al menos un proyecto asignado.
6. Subconsulta en HAVING (Departamentos con un salario promedio mayor a 4000)

SELECT departamento
FROM empleados
GROUP BY departamento
HAVING AVG(salario) > (SELECT AVG(salario) FROM empleados);
🔹 Muestra departamentos donde el salario promedio es mayor al salario promedio de toda la empresa.

7. Subconsulta con NOT IN (Empleados sin proyectos asignados)

SELECT nombre
FROM empleados
WHERE id NOT IN (SELECT id_empleado FROM proyectos);
🔹 Filtra empleados que no están asignados a ningún proyecto.

8. Subconsulta con UPDATE (Aumentar salario de empleados que ganan menos que el promedio)

UPDATE empleados
SET salario = salario * 1.10
WHERE salario < (SELECT AVG(salario) FROM empleados);
🔹 Aumenta el salario en un 10% a quienes ganan menos que el promedio.

9. Subconsulta con DELETE (Eliminar empleados sin proyectos asignados)

DELETE FROM empleados
WHERE id NOT IN (SELECT id_empleado FROM proyectos);
🔹 Borra empleados que no tienen proyectos asignados.

10. Subconsulta con JOIN (Obtener el nombre del jefe de cada empleado)
SELECT e.nombre AS Empleado,
(SELECT j.nombre FROM empleados j WHERE j.id = e.id_jefe) AS Jefe
FROM empleados e;
🔹 Devuelve el nombre del empleado junto con su jefe.


CONSULTAS A MULTIPLES TABLAS

Son utilizadas para poder combinar tablas que estan relacionadas en una consulta

1. Usando JOIN (Unión de Tablas)
Los JOINs permiten combinar datos de diferentes tablas en función de una columna en común.

Ejemplo de INNER JOIN (Unir empleados con sus departamentos)
SELECT empleados.nombre, empleados.salario, departamentos.nombre AS departamento
FROM empleados
INNER JOIN departamentos ON empleados.id_departamento = departamentos.id;
Devuelve solo los empleados que tienen un departamento asociado.

2. JOIN en SQL

1. LEFT JOIN (Mostrar empleados y sus departamentos, incluso si no tienen uno)
SELECT empleados.nombre, empleados.salario, departamentos.nombre AS departamento
FROM empleados
LEFT JOIN departamentos ON empleados.id_departamento = departamentos.id;
Devuelve todos los empleados, incluso aquellos que no tienen un departamento asignado.

2. RIGHT JOIN (Mostrar todos los departamentos, aunque no tengan empleados)

SELECT empleados.nombre, departamentos.nombre AS departamento
FROM empleados
RIGHT JOIN departamentos ON empleados.id_departamento = departamentos.id;
Muestra todos los departamentos, aunque no tengan empleados asignados.

3. FULL JOIN (Unir todos los datos de ambas tablas, incluso sin coincidencias)

SELECT empleados.nombre, departamentos.nombre AS departamento
FROM empleados
FULL JOIN departamentos ON empleados.id_departamento = departamentos.id;
Muestra todos los empleados y departamentos, aunque no tengan relación entre sí.


3. Usando Subconsultas para Combinar Tablas
Otra manera de combinar datos es con subconsultas dentro de SELECT, WHERE o FROM.

Ejemplo: Obtener empleados con un salario mayor al promedio de su departamento
SELECT nombre, salario
FROM empleados e
WHERE salario > (SELECT AVG(salario) FROM empleados WHERE id_departamento = e.id_departamento);
Filtra empleados que ganan más que el promedio de su departamento.

4. Usando UNION para Unir Resultados de Consultas
El operador UNION une los resultados de dos consultas con la misma estructura.

Ejemplo: Combinar empleados activos e inactivos en un solo resultado

SELECT nombre, salario, 'Activo' AS estado FROM empleados_activos
UNION
SELECT nombre, salario, 'Inactivo' AS estado FROM empleados_inactivos;
Une los datos de empleados activos e inactivos en una sola tabla.

5. Usando CROSS JOIN para Producto Cartesiano
Este JOIN combina todas las filas de ambas tablas.

Ejemplo: Crear combinaciones de empleados y proyectos

SELECT empleados.nombre, proyectos.nombre AS proyecto
FROM empleados
CROSS JOIN proyectos;
Genera una combinación de cada empleado con cada proyecto.

Subconsultas correlacionadas

Son un tipo especial de subconsulta en la que la consulta interna depende de cada fila de la consulta externa. Se ejecutan repetidamente para cada fila evaluada en la consulta principal.

Ejemplo: SELECT columna1, columna2
FROM tabla_externa AS alias
WHERE columnaX OP (SELECT columnaY FROM tabla_interna WHERE tabla_externa.columnaZ = tabla_interna.columnaW);
La subconsulta usa una columna de la consulta externa (tabla_externa.columnaZ).

Ejemplo 1: Obtener empleados con un salario superior al promedio de su departamento

SELECT e.nombre, e.salario, e.departamento
FROM empleados e
WHERE e.salario > (
SELECT AVG(salario)
FROM empleados
WHERE departamento = e.departamento
);
¿Qué hace?
• Para cada empleado (e), la subconsulta calcula el salario promedio de su departamento.
• Luego, compara el salario del empleado con ese promedio.
• Solo se devuelven los empleados con un salario superior al promedio de su departamento.

Ejemplo 2: Obtener productos con un precio mayor al precio promedio de su categoría

SELECT p.nombre, p.precio, p.categoria
FROM productos p
WHERE p.precio > (
SELECT AVG(precio)
FROM productos
WHERE categoria = p.categoria
);
¿Qué hace?
• Para cada producto (p), la subconsulta calcula el precio promedio de su categoría.
• Devuelve los productos que tienen un precio superior a dicho promedio.

Ejemplo 3: Encontrar clientes que hayan realizado más pedidos que el promedio de pedidos de todos los clientes

SELECT c.nombre,
(SELECT COUNT(*) FROM pedidos p WHERE p.id_cliente = c.id) AS total_pedidos
FROM clientes c
WHERE (SELECT COUNT(*) FROM pedidos p WHERE p.id_cliente = c.id) > (
SELECT AVG(total_pedidos)
FROM (SELECT id_cliente, COUNT(*) AS total_pedidos FROM pedidos GROUP BY id_cliente) AS tabla_temporal
);
¿Qué hace?
• Para cada cliente, la subconsulta cuenta cuántos pedidos ha realizado.
• Luego, se compara con el número promedio de pedidos de todos los clientes.
• Devuelve solo los clientes con más pedidos que el promedio.

Ejemplo 4: Listar empleados que ganan más que el salario promedio de su equipo

SELECT e.nombre, e.salario, e.id_equipo
FROM empleados e
WHERE e.salario > (
SELECT AVG(salario)
FROM empleados
WHERE id_equipo = e.id_equipo
);
¿Qué hace?
• Para cada empleado (e), calcula el salario promedio de su equipo (id_equipo).
• Devuelve los empleados que ganan más que ese promedio.

Ejemplo 5: Obtener clientes que han gastado más que el promedio de todos los clientes

SELECT c.nombre,
(SELECT SUM(total) FROM pedidos p WHERE p.id_cliente = c.id) AS gasto_total
FROM clientes c
WHERE (SELECT SUM(total) FROM pedidos p WHERE p.id_cliente = c.id) > (
SELECT AVG(gasto_total)
FROM (SELECT id_cliente, SUM(total) AS gasto_total FROM pedidos GROUP BY id_cliente) AS temp
);
¿Qué hace?
• Calcula cuánto ha gastado cada cliente (SUM(total)).
• Compara ese total con el promedio gastado por todos los clientes.
• Devuelve los clientes que han gastado más que el promedio.