Skip to content

2. Fundamentos de SQL (DDL)

Fundamentos de SQL (DDL – Data Definition Language)

Section titled “Fundamentos de SQL (DDL – Data Definition Language)”

El Lenguaje de Definición de Datos (DDL) es un subconjunto de SQL que permite definir y gestionar las estructuras de bases de datos como tablas, índices, vistas y esquemas. En esta sección, exploraremos los comandos fundamentales de DDL y cómo se utilizan para crear y administrar objetos de base de datos.

SQL (Structured Query Language) sigue una sintaxis que se asemeja al lenguaje natural en inglés, lo que facilita su aprendizaje y uso. Antes de profundizar en los comandos específicos, es importante entender algunas reglas básicas de sintaxis:

  • Palabras clave: Las palabras clave de SQL como SELECT, INSERT, CREATE, etc., no distinguen entre mayúsculas y minúsculas, aunque por convención se suelen escribir en mayúsculas para distinguirlas del resto del código.
  • Identificadores: Los nombres de tablas, columnas y otros objetos pueden estar en mayúsculas o minúsculas según la configuración del servidor.
  • Terminación de sentencias: Cada instrucción SQL termina con punto y coma (;).
  • Espacios en blanco: SQL ignora los espacios en blanco adicionales entre palabras y líneas.
  • Comentarios: Se pueden incluir comentarios de una línea con -- o comentarios de varias líneas con /* */.
SELECT columna1, columna2
FROM tabla
WHERE condición;

SQL se divide en varias categorías de comandos:

Data Definition Language: Comandos para definir y modificar estructuras de datos.

  • CREATE: Crear objetos como tablas, vistas, índices
  • ALTER: Modificar objetos existentes
  • DROP: Eliminar objetos
  • TRUNCATE: Vaciar el contenido de una tabla

Los tipos de datos definen qué tipo de información puede almacenarse en una columna específica. MySQL y Oracle tienen diferentes conjuntos de tipos de datos, aunque comparten muchas similitudes.

TipoDescripciónRango
INTEntero de tamaño estándar-2,147,483,648 a 2,147,483,647
TINYINTEntero muy pequeño-128 a 127
SMALLINTEntero pequeño-32,768 a 32,767
MEDIUMINTEntero de tamaño medio-8,388,608 a 8,388,607
BIGINTEntero grande-9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
FLOATNúmero de punto flotante de precisión simple
DOUBLENúmero de punto flotante de doble precisión
DECIMAL(M,D)Número decimal exacto
TipoDescripciónTamaño máximo
CHAR(N)Cadena de longitud fija255 caracteres
VARCHAR(N)Cadena de longitud variable65,535 caracteres
TINYTEXTTexto muy pequeño255 caracteres
TEXTTexto de tamaño estándar65,535 caracteres
MEDIUMTEXTTexto de tamaño medio16,777,215 caracteres
LONGTEXTTexto largo4,294,967,295 caracteres
TipoDescripciónFormato
DATEFecha’YYYY-MM-DD’
TIMEHora’HH:MM:SS’
DATETIMEFecha y hora’YYYY-MM-DD HH:MM:SS’
TIMESTAMPMarca temporal’YYYY-MM-DD HH:MM:SS’
YEARAñoYYYY
TipoDescripción
BLOBDatos binarios
ENUMEnumeración (lista de valores posibles)
SETConjunto (múltiples valores de una lista)
JSONDatos en formato JSON (MySQL 5.7+)

2.3. Crear y eliminar bases de datos (CREATE DATABASE, DROP DATABASE) (MySQL)

Section titled “2.3. Crear y eliminar bases de datos (CREATE DATABASE, DROP DATABASE) (MySQL)”

En MySQL, una base de datos es un contenedor que almacena tablas, vistas, procedimientos almacenados y otros objetos. Crear y eliminar bases de datos son operaciones fundamentales en la administración de MySQL.

La sintaxis básica para crear una base de datos en MySQL es:

CREATE DATABASE [IF NOT EXISTS] nombre_base_datos
[CHARACTER SET charset_name]
[COLLATE collation_name];
  • IF NOT EXISTS: Opcional. Evita que se produzca un error si la base de datos ya existe.
  • CHARACTER SET: Opcional. Especifica el conjunto de caracteres predeterminado para la base de datos.
  • COLLATE: Opcional. Especifica la colación predeterminada para la base de datos.
--- Crear una base de datos simple
CREATE DATABASE empresa;
--- Crear una base de datos si no existe
CREATE DATABASE IF NOT EXISTS tienda;
--- Crear una base de datos con conjunto de caracteres y colación específicos
CREATE DATABASE biblioteca
CHARACTER SET utf8mb4
COLLATE utf8mb4_spanish_ci;

La sintaxis para eliminar una base de datos en MySQL es:

DROP DATABASE [IF EXISTS] nombre_base_datos;
  • IF EXISTS: Opcional. Evita que se produzca un error si la base de datos no existe.
--- Eliminar una base de datos
DROP DATABASE empresa;
--- Eliminar una base de datos si existe
DROP DATABASE IF EXISTS tienda;

Para ver todas las bases de datos disponibles en el servidor MySQL:

SHOW DATABASES;

Seleccionar una base de datos para trabajar

Section titled “Seleccionar una base de datos para trabajar”

Antes de trabajar con tablas y otros objetos, debes seleccionar la base de datos activa:

USE nombre_base_datos;
  1. Crear la base de datos

    CREATE DATABASE empresa CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci;
  2. Seleccionar la base de datos

    USE empresa;
  3. Verificar la base de datos seleccionada

    SELECT DATABASE();

En Oracle, un esquema está asociado a un usuario de la base de datos y contiene los objetos de la base de datos que pertenecen a ese usuario. A diferencia de MySQL, en Oracle no se crea un esquema directamente, sino que se crea al crear un usuario.

CREATE USER nombre_usuario IDENTIFIED BY contraseña
[DEFAULT TABLESPACE nombre_tablespace]
[TEMPORARY TABLESPACE nombre_tablespace_temp]
[QUOTA {tamaño | UNLIMITED} ON nombre_tablespace]
[PROFILE nombre_perfil];
  • IDENTIFIED BY: Especifica la contraseña del usuario.
  • DEFAULT TABLESPACE: Opcional. Especifica el tablespace predeterminado para los objetos creados por el usuario.
  • TEMPORARY TABLESPACE: Opcional. Especifica el tablespace temporal para operaciones de ordenación y agrupación.
  • QUOTA: Opcional. Establece la cantidad máxima de espacio que el usuario puede utilizar en el tablespace.
  • PROFILE: Opcional. Asigna un perfil de recursos al usuario.
--- Crear un usuario/esquema básico
CREATE USER empresa IDENTIFIED BY "password123";
--- Crear un usuario con tablespace específico y cuota
CREATE USER ventas IDENTIFIED BY "secure456"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 100M ON users;

Después de crear un usuario/esquema, es necesario otorgarle privilegios para que pueda conectarse y crear objetos:

--- Privilegio para conectarse a la base de datos
GRANT CONNECT TO nombre_usuario;
--- Privilegio para crear objetos en su propio esquema
GRANT RESOURCE TO nombre_usuario;
--- Privilegios específicos
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO nombre_usuario;
--- Para administradores (con precaución)
GRANT DBA TO nombre_usuario;
--- Cambiar la contraseña
ALTER USER nombre_usuario IDENTIFIED BY nueva_contraseña;
--- Cambiar el tablespace predeterminado
ALTER USER nombre_usuario DEFAULT TABLESPACE nuevo_tablespace;
--- Modificar la cuota
ALTER USER nombre_usuario QUOTA 200M ON users;
--- Bloquear una cuenta
ALTER USER nombre_usuario ACCOUNT LOCK;
--- Desbloquear una cuenta
ALTER USER nombre_usuario ACCOUNT UNLOCK;
--- Eliminar un usuario y todos sus objetos
DROP USER nombre_usuario CASCADE;
--- Eliminar solo el usuario (debe estar vacío)
DROP USER nombre_usuario;

Ejemplo práctico: Crear una base de datos MATRICULA en Oracle

Section titled “Ejemplo práctico: Crear una base de datos MATRICULA en Oracle”

A continuación se muestra un ejemplo paso a paso para crear un esquema (usuario) llamado MATRICULA en Oracle:

---CREAR UNA BASE DE DATOS MATRICULA EN ORACLE
---Nombre:DEGUIDEV--PASO 01
ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;
---PASO 02
CREATE USER MATRICULA IDENTIFIED BY "matricula"
DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP";
---PASO 03
ALTER USER MATRICULA QUOTA UNLIMITED ON USERS;
---PASO 04
GRANT CREATE SESSION TO MATRICULA;
---PASO 05
GRANT "RESOURCE" TO MATRICULA;
---PASO 06
ALTER USER MATRICULA DEFAULT ROLE "RESOURCE";
--- Ver todos los usuarios/esquemas
SELECT username FROM dba_users;
--- Ver objetos en un esquema específico
SELECT object_name, object_type FROM dba_objects WHERE owner = 'NOMBRE_ESQUEMA';
ConceptoMySQLOracle
Contenedor principalBase de datosInstancia
Agrupación de objetosBase de datosEsquema (Usuario)
Creación de contenedorCREATE DATABASECREATE USER
Eliminación de contenedorDROP DATABASEDROP USER
Selección de contextoUSE database_nameALTER SESSION SET CURRENT_SCHEMA = schema_name

2.5. Crear y modificar tablas (CREATE TABLE, ALTER TABLE)

Section titled “2.5. Crear y modificar tablas (CREATE TABLE, ALTER TABLE)”

Las tablas son los objetos fundamentales para almacenar datos en una base de datos relacional. El comando CREATE TABLE se utiliza para crear nuevas tablas, mientras que ALTER TABLE permite modificar la estructura de tablas existentes.

La sintaxis básica para crear una tabla es:

CREATE TABLE [IF NOT EXISTS] nombre_tabla (
columna1 tipo_dato [restricciones],
columna2 tipo_dato [restricciones],
...
[restricciones_tabla]
) [opciones_tabla];
-- Tabla simple
CREATE TABLE clientes (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
apellido VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
fecha_registro DATE DEFAULT CURRENT_DATE
);
-- Tabla con clave foránea
CREATE TABLE pedidos (
id INT AUTO_INCREMENT PRIMARY KEY,
cliente_id INT NOT NULL,
fecha_pedido DATETIME DEFAULT CURRENT_TIMESTAMP,
total DECIMAL(10,2) NOT NULL,
FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);
-- Tabla con opciones específicas
CREATE TABLE productos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
precio DECIMAL(10,2) NOT NULL,
stock INT DEFAULT 0,
categoria ENUM('Electrónica', 'Ropa', 'Hogar', 'Alimentos') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

El comando ALTER TABLE permite realizar diversos cambios en la estructura de una tabla existente:

-- Añadir una columna
ALTER TABLE clientes ADD telefono VARCHAR(15);
-- Añadir una columna con posición específica
ALTER TABLE clientes ADD direccion VARCHAR(200) AFTER apellido;
-- Modificar una columna
ALTER TABLE clientes MODIFY email VARCHAR(150) NOT NULL;
-- Renombrar una columna
ALTER TABLE clientes CHANGE apellido apellidos VARCHAR(50) NOT NULL;
-- Eliminar una columna
ALTER TABLE clientes DROP COLUMN telefono;
-- Añadir una restricción
ALTER TABLE clientes ADD CONSTRAINT uk_email UNIQUE (email);
-- Eliminar una restricción
ALTER TABLE clientes DROP CONSTRAINT uk_email;
-- Renombrar una tabla
ALTER TABLE clientes RENAME TO clientes_activos;

El comando DROP TABLE elimina una tabla y todos sus datos de la base de datos.

-- Eliminar una tabla
DROP TABLE nombre_tabla;
-- Eliminar una tabla si existe
DROP TABLE IF EXISTS nombre_tabla;
-- Eliminar múltiples tablas
DROP TABLE tabla1, tabla2, tabla3;

Restricciones de clave foránea y eliminación de tablas

Section titled “Restricciones de clave foránea y eliminación de tablas”

Cuando una tabla tiene restricciones de clave foránea que la referencian desde otras tablas, puede ser necesario eliminar primero esas restricciones o utilizar opciones especiales:

-- Desactivar temporalmente la verificación de claves foráneas
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE clientes;
SET FOREIGN_KEY_CHECKS = 1;

El comando TRUNCATE TABLE elimina todos los datos de una tabla pero mantiene su estructura intacta. Es más rápido que DELETE porque no registra cada eliminación de fila individualmente.

-- Vaciar una tabla
TRUNCATE TABLE nombre_tabla;
CaracterísticaTRUNCATEDELETE
VelocidadMás rápidoMás lento
Registro en logMínimoCada fila
TransaccionesNo se puede deshacerSe puede deshacer con ROLLBACK
WHERENo permite condicionesPermite filtrar con WHERE
Disparadores (triggers)No activa disparadoresActiva disparadores
Reinicio de contadoresReinicia AUTO_INCREMENT/secuenciasNo reinicia contadores
RestriccionesProblemas con claves foráneasRespeta claves foráneas

2.8. Restricciones (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK)

Section titled “2.8. Restricciones (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK)”

Las restricciones son reglas que se aplican a las columnas de una tabla para mantener la integridad de los datos.

-- PRIMARY KEY: Identifica de forma única cada registro
CREATE TABLE empleados (
id INT AUTO_INCREMENT PRIMARY KEY,
nif VARCHAR(9) UNIQUE,
nombre VARCHAR(50) NOT NULL
);
-- También se puede definir como restricción de tabla
CREATE TABLE productos (
id INT,
codigo VARCHAR(10),
nombre VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
-- FOREIGN KEY: Establece relación con otra tabla
CREATE TABLE pedidos (
id INT AUTO_INCREMENT PRIMARY KEY,
empleado_id INT,
FOREIGN KEY (empleado_id) REFERENCES empleados(id)
);
-- Con opciones de actualización y eliminación
CREATE TABLE detalles_pedido (
pedido_id INT,
producto_id INT,
cantidad INT NOT NULL,
PRIMARY KEY (pedido_id, producto_id),
FOREIGN KEY (pedido_id) REFERENCES pedidos(id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (producto_id) REFERENCES productos(id) ON DELETE RESTRICT
);
-- UNIQUE: Garantiza valores únicos
CREATE TABLE departamentos (
id INT AUTO_INCREMENT PRIMARY KEY,
codigo VARCHAR(5) UNIQUE,
nombre VARCHAR(50) UNIQUE
);
-- NOT NULL: Prohíbe valores nulos
CREATE TABLE clientes (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
apellido VARCHAR(50) NOT NULL,
email VARCHAR(100)
);
-- CHECK: Valida condiciones
CREATE TABLE productos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
precio DECIMAL(10,2) CHECK (precio > 0),
stock INT CHECK (stock >= 0)
);
-- DEFAULT: Establece valor predeterminado
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
activo BOOLEAN DEFAULT TRUE,
fecha_registro DATE DEFAULT CURRENT_DATE
);

Las claves foráneas pueden incluir acciones que se ejecutan cuando se actualiza o elimina un registro referenciado:

  • ON DELETE CASCADE: Cuando se elimina un registro en la tabla principal, se eliminan automáticamente los registros relacionados en la tabla secundaria.
  • ON DELETE SET NULL: Cuando se elimina un registro en la tabla principal, se establecen como NULL los valores de la clave foránea en la tabla secundaria.
  • ON DELETE RESTRICT/NO ACTION: Impide la eliminación de un registro en la tabla principal si existen registros relacionados en la tabla secundaria.
  • ON UPDATE CASCADE: Cuando se actualiza la clave primaria en la tabla principal, se actualizan automáticamente los valores correspondientes en la tabla secundaria.

Añadir y eliminar restricciones en tablas existentes

Section titled “Añadir y eliminar restricciones en tablas existentes”
-- Añadir clave primaria
ALTER TABLE productos ADD PRIMARY KEY (id);
-- Añadir clave foránea
ALTER TABLE pedidos ADD CONSTRAINT fk_cliente
FOREIGN KEY (cliente_id) REFERENCES clientes(id);
-- Añadir restricción única
ALTER TABLE empleados ADD CONSTRAINT uk_email UNIQUE (email);
-- Añadir restricción CHECK
ALTER TABLE productos ADD CONSTRAINT chk_precio CHECK (precio > 0);
-- Eliminar restricción
ALTER TABLE pedidos DROP FOREIGN KEY fk_cliente;
ALTER TABLE empleados DROP INDEX uk_email;

El Lenguaje de Definición de Datos (DDL) proporciona las herramientas necesarias para crear y gestionar la estructura de una base de datos. Aunque MySQL y Oracle comparten muchos conceptos fundamentales, presentan diferencias significativas en su sintaxis y características específicas. Comprender estos comandos DDL es esencial para diseñar bases de datos eficientes y mantener la integridad de los datos.

En las siguientes secciones, exploraremos cómo manipular los datos almacenados en estas estructuras utilizando el Lenguaje de Manipulación de Datos (DML).

🐝