Conceptos de Funciones
Estas son cláusulas y operadores fundamentales en SQL para filtrar y consultar datos en bases de datos:
WHERE
Se usa para filtrar registros que cumplan una condición específica.
SELECT * FROM usuarios WHERE edad > 25;
AND
Combina múltiples condiciones que deben cumplirse todas al mismo tiempo.
SELECT * FROM productos WHERE precio > 100 AND categoria = 'electrónicos';
OR
Combina condiciones alternativas donde al menos una debe cumplirse.
SELECT * FROM empleados WHERE departamento = 'ventas' OR departamento = 'marketing';
LIKE
Se usa para búsquedas con patrones usando comodines:
% representa cualquier secuencia de caracteres _ representa un solo carácter
SELECT * FROM clientes WHERE nombre LIKE 'Ana%'; -- Nombres que empiecen con "Ana"
SELECT * FROM productos WHERE codigo LIKE 'A_B'; -- Códigos como "A1B", "A2B", etc.
BETWEEN
Filtra valores dentro de un rango (inclusive en ambos extremos).
SELECT * FROM ventas WHERE fecha BETWEEN '2024-01-01' AND '2024-12-31';
SELECT * FROM productos WHERE precio BETWEEN 50 AND 200;
Estos operadores se pueden combinar para crear consultas más complejas y precisas, permitiendo extraer exactamente los datos que necesitas de tu base de datos.
ORDER BY
Es una cláusula en SQL que se utiliza para ordenar los resultados de una consulta según una o más columnas.
Por defecto, el orden es ascendente (ASC), pero también se puede especificar un orden descendente (DESC).
¿Cómo se usa?
Se coloca al final de una consulta SELECT, seguido del nombre de la columna por la cual se desea ordenar.
Sintaxis básica:
SELECT columnas
FROM tabla
ORDER BY columna [ASC | DESC];
Ejemplos de uso
Ordenar por una columna (ascendente)
SELECT * FROM productos
ORDER BY precio;
Ordenar por una columna (descendente)
SELECT * FROM productos
ORDER BY precio DESC;
Ordenar por múltiples columnas
SELECT * FROM empleados
ORDER BY departamento ASC, salario DESC;
Primero ordena por departamento en orden ascendente, y dentro de cada departamento, por salario en orden descendente.
Notas importantes
-
Puedes ordenar por columnas que no estén en el SELECT.
-
También puedes usar el número de columna como referencia:
SELECT nombre, edad, salario FROM empleados ORDER BY 3 DESC; -- Ordena por la tercera columna: salario
-
Es útil en conjunto con
LIMITpara mostrar los primeros N resultados ordenados:SELECT * FROM productos
ORDER BY fecha_agregado DESC
LIMIT 5;
Usos comunes
- Mostrar los productos más baratos o caros.
- Listar usuarios más antiguos o recientes.
- Ordenar resultados alfabéticamente.
- Priorizar datos según relevancia o puntuación.
Funciones de Agregación
1. COUNT() – Contar filas
Cuenta la cantidad de filas en una consulta, o la cantidad de valores no nulos en una columna específica.
SELECT COUNT(*) FROM empleados;
-- Devuelve el número total de filas en la tabla empleados.
SELECT COUNT(salario) FROM empleados;
-- Devuelve el número de filas donde salario NO es NULL.
2. SUM() – Sumar valores
Suma los valores numéricos de una columna.
SELECT SUM(salario) FROM empleados;
-- Devuelve la suma de todos los salarios no nulos.
3. AVG() – Promedio
Calcula el promedio de los valores numéricos en una columna, ignorando los valores NULL.
SELECT AVG(salario) FROM empleados;
-- Devuelve el promedio de los salarios.
4. MIN() – Valor mínimo
Devuelve el valor mínimo de una columna.
SELECT MIN(salario) FROM empleados;
-- Devuelve el salario más bajo.
5. MAX() – Valor máximo
Devuelve el valor máximo de una columna.
SELECT MAX(salario) FROM empleados;
-- Devuelve el salario más alto.
Uso con GROUP BY
Las funciones de agregación se pueden aplicar a subconjuntos de datos usando GROUP BY.
SELECT departamento, AVG(salario)
FROM empleados
GROUP BY departamento;
-- Devuelve el promedio de salarios por departamento.
Consideraciones
- Las funciones de agregación ignoran los valores
NULL. - Se pueden usar alias con
ASpara darle un nombre más legible a las columnas. - Al usarse con
GROUP BY, el resultado contiene una fila por grupo.
EJERCICIOS DDL
Ejercicio 1: Sistema de Biblioteca
Crear las siguientes tablas:
1. Tabla AUTORES
CREATE TABLE autores (
id_autor INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
apellido VARCHAR(100) NOT NULL,
nacionalidad VARCHAR(50),
fecha_nacimiento DATE
);
2. Tabla LIBROS
CREATE TABLE libros (
isbn VARCHAR(13) PRIMARY KEY,
titulo VARCHAR(200) NOT NULL,
id_autor INT,
editorial VARCHAR(100),
año_publicacion INT,
numero_paginas INT,
FOREIGN KEY (id_autor) REFERENCES autores(id_autor)
);
3. Tabla USUARIOS
CREATE TABLE usuarios (
id_usuario INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
telefono VARCHAR(15),
fecha_registro DATE DEFAULT CURRENT_DATE
);
4. Tabla PRESTAMOS
CREATE TABLE prestamos (
id_prestamo INT PRIMARY KEY AUTO_INCREMENT,
id_usuario INT,
isbn VARCHAR(13),
fecha_prestamo DATE NOT NULL,
fecha_devolucion_esperada DATE NOT NULL,
fecha_devolucion_real DATE,
estado ENUM('activo', 'devuelto', 'vencido') DEFAULT 'activo',
FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario),
FOREIGN KEY (isbn) REFERENCES libros(isbn)
);
Ejercicio 2: Sistema de Tienda Online
Crear base de datos y tablas:
1. Crear base de datos
CREATE DATABASE tienda_online;
USE tienda_online;
2. Tabla CATEGORIAS
CREATE TABLE categorias (
id_categoria INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL UNIQUE,
descripcion TEXT
);
3. Tabla PRODUCTOS
CREATE TABLE productos (
id_producto INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(150) NOT NULL,
descripcion TEXT,
precio DECIMAL(10,2) NOT NULL CHECK (precio > 0),
stock INT DEFAULT 0,
id_categoria INT,
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_categoria) REFERENCES categorias(id_categoria)
);
4. Tabla CLIENTES
CREATE TABLE clientes (
id_cliente INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
apellido VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
direccion VARCHAR(255),
ciudad VARCHAR(100),
codigo_postal VARCHAR(10),
telefono VARCHAR(15)
);
Ejercicio 3: Modificaciones con ALTER TABLE
Modificar la tabla PRODUCTOS:
1. Agregar nueva columna
ALTER TABLE productos
ADD COLUMN marca VARCHAR(100);
2. Modificar tipo de dato
ALTER TABLE productos
MODIFY COLUMN descripcion VARCHAR(500);
3. Agregar restricción
ALTER TABLE productos
ADD CONSTRAINT chk_stock CHECK (stock >= 0);
4. Crear índice
CREATE INDEX idx_producto_nombre ON productos(nombre);
Modificar la tabla CLIENTES:
1. Agregar columnas de auditoría
ALTER TABLE clientes
ADD COLUMN fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
2. Cambiar nombre de columna
ALTER TABLE clientes
CHANGE COLUMN password contraseña VARCHAR(255) NOT NULL;
Ejercicio 4: Sistema de Empleados
Crear estructura completa:
1. Tabla DEPARTAMENTOS
CREATE TABLE departamentos (
id_departamento INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL UNIQUE,
ubicacion VARCHAR(100),
presupuesto DECIMAL(12,2)
);
2. Tabla CARGOS
CREATE TABLE cargos (
id_cargo INT PRIMARY KEY AUTO_INCREMENT,
titulo VARCHAR(100) NOT NULL,
salario_min DECIMAL(10,2),
salario_max DECIMAL(10,2),
CONSTRAINT chk_salario CHECK (salario_max >= salario_min)
);
3. Tabla EMPLEADOS
CREATE TABLE empleados (
id_empleado INT PRIMARY KEY AUTO_INCREMENT,
numero_empleado VARCHAR(10) UNIQUE NOT NULL,
nombre VARCHAR(100) NOT NULL,
apellido VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE,
telefono VARCHAR(15),
fecha_contratacion DATE NOT NULL,
salario DECIMAL(10,2),
id_cargo INT,
id_departamento INT,
id_supervisor INT,
estado ENUM('activo', 'inactivo', 'vacaciones') DEFAULT 'activo',
FOREIGN KEY (id_cargo) REFERENCES cargos(id_cargo),
FOREIGN KEY (id_departamento) REFERENCES departamentos(id_departamento),
FOREIGN KEY (id_supervisor) REFERENCES empleados(id_empleado)
);
Ejercicio 5: Operaciones de Eliminación
Eliminar elementos de la estructura:
1. Eliminar restricción
ALTER TABLE empleados
DROP FOREIGN KEY empleados_ibfk_3;
2. Eliminar columna
ALTER TABLE empleados
DROP COLUMN telefono;
3. Eliminar índice
DROP INDEX idx_producto_nombre ON productos;
4. Eliminar tabla
DROP TABLE prestamos;
5. Eliminar base de datos
DROP DATABASE tienda_online;
Ejercicio 6: Crear Vistas y Índices
1. Crear vista de productos activos
CREATE VIEW productos_disponibles AS
SELECT p.nombre, p.precio, p.stock, c.nombre AS categoria
FROM productos p
JOIN categorias c ON p.id_categoria = c.id_categoria
WHERE p.stock > 0;
2. Crear índices compuestos
CREATE INDEX idx_empleado_depto_cargo
ON empleados(id_departamento, id_cargo);
CREATE INDEX idx_prestamo_fechas
ON prestamos(fecha_prestamo, fecha_devolucion_esperada);