Las restricciones son reglas aplicadas a las columnas de una tabla para limitar los datos que se pueden almacenar. Su propósito es garantizar la corrección, validez e integridad de los datos en la base de datos.
Tipos de Restricciones
A continuación, se muestra un ejemplo de cómo definir restricciones al crear una tabla:
-- Creación de tabla con restricciones
CREATE TABLE IF NOT EXISTS usuarios (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Identificador único del usuario',
nombre VARCHAR(100) NOT NULL UNIQUE COMMENT 'Nombre del usuario',
edad INT CHECK (edad > 0 AND edad <= 120) COMMENT 'Edad del usuario',
estado CHAR(1) DEFAULT '1' COMMENT 'Estado del usuario (ej. activo, inactivo)',
genero CHAR(1) COMMENT 'Género del usuario'
) COMMENT 'Tabla de usuarios';
Las relaciones entre tablas se clasifican en tres tipos principales:
- Uno a Muchos (o Muchos a Uno): Una instancia en una tabla se relaciona con múltiples instancias en otra tabla, y viceversa.
- Muchos a Muchos: Múltiples instancias en una tabla se relacionan con múltiples instancias en otra tabla.
- Uno a Uno: Una instancia en una tabla se relaciona con una única instancia en otra tabla, y viceversa.
Ejemplo de Estructura de Tablas para Relaciones
Aquí se presentan dos tablas para ilustrar una relación uno a uno (o uno a muchos si se quita la restricción UNIQUE en userid en tb_user_edu):
-- Tabla de usuarios principal
CREATE TABLE IF NOT EXISTS tb_usuarios (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Identificador único del usuario',
nombre VARCHAR(100) NOT NULL UNIQUE COMMENT 'Nombre del usuario',
edad INT CHECK (edad > 0 AND edad <= 120) COMMENT 'Edad del usuario',
estado CHAR(1) DEFAULT '1' COMMENT 'Estado del usuario',
genero CHAR(1) COMMENT 'Género del usuario',
telefono VARCHAR(11) COMMENT 'Número de teléfono'
) COMMENT 'Tabla principal de usuarios';
-- Tabla de información educativa del usuario
CREATE TABLE IF NOT EXISTS tb_user_edu (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Identificador único del registro educativo',
userid INT UNIQUE COMMENT 'Clave foránea al usuario (restricción UNIQUE para uno a uno)',
grado_academico VARCHAR(20) COMMENT 'Nivel de estudios alcanzado',
especialidad VARCHAR(50) COMMENT 'Área de estudio principal',
escuela_primaria VARCHAR(50) COMMENT 'Nombre de la escuela primaria',
escuela_secundaria VARCHAR(50) COMMENT 'Nombre de la escuela secundaria',
universidad VARCHAR(50) COMMENT 'Nombre de la universidad',
CONSTRAINT fk_userid FOREIGN KEY(userid) REFERENCES tb_usuarios(id)
) COMMENT 'Tabla de información educativa del usuario';
-- Inserción de datos de ejemplo en tb_usuarios
INSERT INTO tb_usuarios (id, nombre, edad, genero, telefono)
VALUES
(NULL, 'Juan Pérez', 18, '1', '110'),
(NULL, 'Ana Gómez', 25, '1', '119'),
(NULL, 'Carlos Ruiz', 38, '2', '120'),
(NULL, 'Sofía López', 48, '1', '114');
-- Inserción de datos de ejemplo en tb_user_edu
INSERT INTO tb_user_edu (id, userid, grado_academico, especialidad, escuela_primaria, escuela_secundaria, universidad)
VALUES
(NULL, 1, 'Licenciatura', 'Informática', 'Primaria Sol', 'Secundaria Luna', 'Universidad Tec'),
(NULL, 2, 'Licenciatura', 'Idiomas', 'Primaria Estrella', 'Secundaria Cometa', 'Universidad Central'),
(NULL, 3, 'Licenciatura', 'Matemáticas', 'Primaria Planeta', 'Secundaria Galaxia', 'Universidad Politécnica'),
(NULL, 4, 'Licenciatura', 'Letras', 'Primaria Cosmos', 'Secundaria Nebulosa', 'Universidad Nacional');
Las consultas de múltiples tablas permiten combinar datos de dos o más tablas. Se dividen principalmente en:
- Consultas de Unión (JOIN): Combinan filas de dos o más tablas basándose en una condición relacionada entre ellas.
- INNER JOIN (Unión Interna): Devuelve solo las filas donde hay una coincidencia en ambas tablas (la intersecicón).
- OUTER JOIN (Unión Externa):
- LEFT OUTER JOIN (Unión Externa Izquierda): Devuelve todas las filas de la tabla izquierda y las filas coincidentes de la tabla derecha. Si no hay coincidencia, los valores de la derecha son NULL.
- RIGHT OUTER JOIN (Unión Externa Derecha): Devuelve todas las filas de la tabla derecha y las filas coincidentes de la tabla izquierda. Si no hay conicidencia, los valores de la izquierda son NULL.
- SELF JOIN (Autounión): Se utiliza para unir una tabla consigo misma, típicamente para consultar datos jerárquicos o comparar filas dentro de la misma tabla. Requiere el uso de alias de tabla.
- Subconsultas (Nested Queries): Una consulta dentro de otra consulta.
Uniones Internas (INNER JOIN)
Las uniones internas se pueden realizar de forma implícita o explícita.
- Unión Interna Implícita: Se especifican las tablas en la cláusula
FROMseparadas por comas y la condición de unión en la cláusulaWHERE. - Unión Interna Explícita: Se utiliza la palabra clave
INNER JOINseguida de la condición de unión en la cláusulaON.
-- Unión interna implícita
SELECT * FROM tb_usuarios, tb_user_edu WHERE tb_usuarios.id = tb_user_edu.userid;
-- Unión interna explícita
SELECT * FROM tb_usuarios INNER JOIN tb_user_edu ON tb_usuarios.id = tb_user_edu.userid;
-- Usando alias para simplificar (equivalente a las anteriores)
SELECT * FROM tb_usuarios a INNER JOIN tb_user_edu b ON a.id = b.userid;
Uniones Externas (OUTER JOIN)
Unión Externa Izquierda (LEFT OUTER JOIN)
Devuelve todas las filas de la tabla especificada a la izquierda del LEFT JOIN, y las filas coincidentes de la tabla de la derecha. Si no hay coincidencia, las columnas de la tabla derecha se rellenarán con NULL.
-- Insertar un usuario sin registro educativo para demostrar el LEFT JOIN
INSERT INTO tb_usuarios (id, nombre, edad, genero, telefono)
VALUES (NULL, 'Luis Torres', 30, '1', '113');
-- Ejemplo de LEFT JOIN
SELECT
u.*,
e.grado_academico,
e.especialidad,
e.escuela_primaria,
e.escuela_secundaria,
e.universidad
FROM
tb_usuarios u
LEFT JOIN
tb_user_edu e ON u.id = e.userid;
Unión Externa Derecha (RIGHT OUTER JOIN)
Devuelve todas las filas de la tabla especificada a la derecha del RIGHT JOIN, y las filas coincidentes de la tabla de la izquierda. Si no hay coincidencia, las columnas de la tabla izquierda se rellenarán con NULL.
-- Insertar un registro educativo sin usuario correspondiente para demostrar el RIGHT JOIN
INSERT INTO tb_user_edu (id, userid, grado_academico, especialidad, escuela_primaria, escuela_secundaria, universidad)
VALUES (NULL, NULL, 'Maestría', 'Ingeniería', 'Primaria Alfa', 'Secundaria Beta', 'Universidad Gamma');
-- Ejemplo de RIGHT JOIN con filtro adicional
SELECT
u.*,
e.grado_academico,
e.especialidad,
e.escuela_primaria,
e.escuela_secundaria,
e.universidad
FROM
tb_usuarios u
RIGHT JOIN
tb_user_edu e ON u.id = e.userid
WHERE e.escuela_secundaria = 'Secundaria Beta';
Las consultas combinadas se utilizan para fusionar los resultados de dos o más sentencias SELECT en un único conjunto de resultados.
- UNION: Combina los resultados y elimina los duplicados.
- UNION ALL: Combina todos los resultados, incluyendo los duplicados. Es generalmente más rápido que
UNION.
Requisitos: El número de columnas y el tipo de datos de las columnas en todas las sentencias SELECT deben ser compatibles.
-- Ejemplo conceptual de UNION (asumiendo tablas con estructura compatible)
SELECT campo1, campo2 FROM tabla_A
UNION
SELECT campo1, campo2 FROM tabla_B;
-- Ejemplo conceptual de UNION ALL
SELECT campo1, campo2 FROM tabla_A
UNION ALL
SELECT campo1, campo2 FROM tabla_B;
Una subconsulta, también conocida como consulta anidada, es una consulta SELECT que está incrustada dentro de otra sentencia SQL (SELECT, INSERT, UPDATE o DELETE).
-- Ejemplo básico de subconsulta en la cláusula WHERE
SELECT * FROM tabla_principal
WHERE columna_x = (SELECT columna_y FROM tabla_secundaria WHERE condicion);
Clasificación de Subconsultas
Las subconsultas se pueden clasificar según el tipo de resulatdo que devuelven:
- Subconsulta Escalar: Devuelve un único valor (una fila, una columna).
- Subconsulta de Columna: Devuelve una única columna con múltiples filas.
- Subconsulta de Fila: Devuelve una única fila con múltiples columnas.
- Subconsulta de Tabla: Devuelve múltiples filas y múltiples columnas.
Además, las subconsultas pueden ubicarse en diferentes partes de la sentencia SQL principal:
- Después de la cláusula
WHERE. - Después de la cláusula
FROM(subconsulta de tabla). - Después de la cláusula
SELECT(subconsulta escalar).