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.
2.1. Sintaxis básica de SQL
Section titled “2.1. Sintaxis básica de SQL”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:
Reglas generales de sintaxis
Section titled “Reglas generales 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/* */.
Estructura básica de una consulta SQL
Section titled “Estructura básica de una consulta SQL”SELECT columna1, columna2FROM tablaWHERE condición;Categorías principales de comandos SQL
Section titled “Categorías principales de comandos SQL”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
Data Manipulation Language: Comandos para manipular los datos.
- SELECT: Consultar datos
- INSERT: Insertar nuevos registros
- UPDATE: Actualizar registros existentes
- DELETE: Eliminar registros
Data Control Language: Comandos para controlar el acceso a los datos.
- GRANT: Otorgar permisos
- REVOKE: Revocar permisos
Transaction Control Language: Comandos para gestionar transacciones.
- COMMIT: Confirmar cambios
- ROLLBACK: Deshacer cambios
- SAVEPOINT: Establecer puntos de guardado
2.2. Tipos de datos en MySQL y Oracle
Section titled “2.2. Tipos de datos en MySQL y Oracle”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.
Tipos de datos numéricos
Section titled “Tipos de datos numéricos”| Tipo | Descripción | Rango |
|---|---|---|
INT | Entero de tamaño estándar | -2,147,483,648 a 2,147,483,647 |
TINYINT | Entero muy pequeño | -128 a 127 |
SMALLINT | Entero pequeño | -32,768 a 32,767 |
MEDIUMINT | Entero de tamaño medio | -8,388,608 a 8,388,607 |
BIGINT | Entero grande | -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 |
FLOAT | Número de punto flotante de precisión simple | |
DOUBLE | Número de punto flotante de doble precisión | |
DECIMAL(M,D) | Número decimal exacto |
Tipos de datos de cadena
Section titled “Tipos de datos de cadena”| Tipo | Descripción | Tamaño máximo |
|---|---|---|
CHAR(N) | Cadena de longitud fija | 255 caracteres |
VARCHAR(N) | Cadena de longitud variable | 65,535 caracteres |
TINYTEXT | Texto muy pequeño | 255 caracteres |
TEXT | Texto de tamaño estándar | 65,535 caracteres |
MEDIUMTEXT | Texto de tamaño medio | 16,777,215 caracteres |
LONGTEXT | Texto largo | 4,294,967,295 caracteres |
Tipos de datos de fecha y hora
Section titled “Tipos de datos de fecha y hora”| Tipo | Descripción | Formato |
|---|---|---|
DATE | Fecha | ’YYYY-MM-DD’ |
TIME | Hora | ’HH:MM:SS’ |
DATETIME | Fecha y hora | ’YYYY-MM-DD HH:MM:SS’ |
TIMESTAMP | Marca temporal | ’YYYY-MM-DD HH:MM:SS’ |
YEAR | Año | YYYY |
Otros tipos de datos
Section titled “Otros tipos de datos”| Tipo | Descripción |
|---|---|
BLOB | Datos binarios |
ENUM | Enumeración (lista de valores posibles) |
SET | Conjunto (múltiples valores de una lista) |
JSON | Datos en formato JSON (MySQL 5.7+) |
Tipos de datos numéricos
Section titled “Tipos de datos numéricos”| Tipo | Descripción | Rango |
|---|---|---|
NUMBER(p,s) | Número con precisión p y escala s | Hasta 38 dígitos de precisión |
FLOAT | Número de punto flotante | |
BINARY_FLOAT | Punto flotante de precisión simple | |
BINARY_DOUBLE | Punto flotante de doble precisión |
Tipos de datos de cadena
Section titled “Tipos de datos de cadena”| Tipo | Descripción | Tamaño máximo |
|---|---|---|
CHAR(n) | Cadena de longitud fija | 2000 bytes |
VARCHAR2(n) | Cadena de longitud variable | 4000 bytes |
NCHAR(n) | Cadena Unicode de longitud fija | 2000 bytes |
NVARCHAR2(n) | Cadena Unicode de longitud variable | 4000 bytes |
CLOB | Character Large Object | Hasta 4GB |
NCLOB | National Character Large Object | Hasta 4GB |
Tipos de datos de fecha y hora
Section titled “Tipos de datos de fecha y hora”| Tipo | Descripción | Formato |
|---|---|---|
DATE | Fecha y hora | ’DD-MON-YY HH:MI:SS’ |
TIMESTAMP | Fecha y hora con fracción de segundo | ’DD-MON-YY HH:MI:SS.FF’ |
TIMESTAMP WITH TIME ZONE | Timestamp con zona horaria | |
TIMESTAMP WITH LOCAL TIME ZONE | Timestamp con zona horaria local | |
INTERVAL YEAR TO MONTH | Intervalo de años y meses | |
INTERVAL DAY TO SECOND | Intervalo de días a segundos |
Otros tipos de datos
Section titled “Otros tipos de datos”| Tipo | Descripción |
|---|---|
BLOB | Binary Large Object |
RAW | Datos binarios de longitud variable |
LONG RAW | Datos binarios de longitud variable (obsoleto) |
ROWID | Identificador único de fila |
XMLTYPE | Datos XML |
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.
Crear una base de datos
Section titled “Crear una base de datos”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];Parámetros:
Section titled “Parámetros:”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.
Ejemplos:
Section titled “Ejemplos:”--- Crear una base de datos simpleCREATE DATABASE empresa;
--- Crear una base de datos si no existeCREATE DATABASE IF NOT EXISTS tienda;
--- Crear una base de datos con conjunto de caracteres y colación específicosCREATE DATABASE bibliotecaCHARACTER SET utf8mb4COLLATE utf8mb4_spanish_ci;Eliminar una base de datos
Section titled “Eliminar una base de datos”La sintaxis para eliminar una base de datos en MySQL es:
DROP DATABASE [IF EXISTS] nombre_base_datos;Parámetros:
Section titled “Parámetros:”IF EXISTS: Opcional. Evita que se produzca un error si la base de datos no existe.
Ejemplos:
Section titled “Ejemplos:”--- Eliminar una base de datosDROP DATABASE empresa;
--- Eliminar una base de datos si existeDROP DATABASE IF EXISTS tienda;Ver bases de datos existentes
Section titled “Ver bases de datos existentes”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;Crear la base de datos
CREATE DATABASE empresa CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci;Seleccionar la base de datos
USE empresa;Verificar la base de datos seleccionada
SELECT DATABASE();
2.4. Crear y modificar esquemas (Oracle)
Section titled “2.4. Crear y modificar esquemas (Oracle)”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.
Crear un esquema (usuario) en Oracle
Section titled “Crear un esquema (usuario) en Oracle”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];Parámetros:
Section titled “Parámetros:”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.
Ejemplos:
Section titled “Ejemplos:”--- Crear un usuario/esquema básicoCREATE USER empresa IDENTIFIED BY "password123";
--- Crear un usuario con tablespace específico y cuotaCREATE USER ventas IDENTIFIED BY "secure456"DEFAULT TABLESPACE usersTEMPORARY TABLESPACE tempQUOTA 100M ON users;Otorgar privilegios al esquema
Section titled “Otorgar privilegios al esquema”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 datosGRANT CONNECT TO nombre_usuario;
--- Privilegio para crear objetos en su propio esquemaGRANT RESOURCE TO nombre_usuario;
--- Privilegios específicosGRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO nombre_usuario;
--- Para administradores (con precaución)GRANT DBA TO nombre_usuario;Modificar un esquema (usuario) en Oracle
Section titled “Modificar un esquema (usuario) en Oracle”--- Cambiar la contraseñaALTER USER nombre_usuario IDENTIFIED BY nueva_contraseña;
--- Cambiar el tablespace predeterminadoALTER USER nombre_usuario DEFAULT TABLESPACE nuevo_tablespace;
--- Modificar la cuotaALTER USER nombre_usuario QUOTA 200M ON users;
--- Bloquear una cuentaALTER USER nombre_usuario ACCOUNT LOCK;
--- Desbloquear una cuentaALTER USER nombre_usuario ACCOUNT UNLOCK;Eliminar un esquema (usuario) en Oracle
Section titled “Eliminar un esquema (usuario) en Oracle”--- Eliminar un usuario y todos sus objetosDROP 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 01ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;---PASO 02CREATE USER MATRICULA IDENTIFIED BY "matricula"DEFAULT TABLESPACE "USERS"TEMPORARY TABLESPACE "TEMP";---PASO 03ALTER USER MATRICULA QUOTA UNLIMITED ON USERS;---PASO 04GRANT CREATE SESSION TO MATRICULA;---PASO 05GRANT "RESOURCE" TO MATRICULA;---PASO 06ALTER USER MATRICULA DEFAULT ROLE "RESOURCE";Ver esquemas existentes en Oracle
Section titled “Ver esquemas existentes en Oracle”--- Ver todos los usuarios/esquemasSELECT username FROM dba_users;
--- Ver objetos en un esquema específicoSELECT object_name, object_type FROM dba_objects WHERE owner = 'NOMBRE_ESQUEMA';| Concepto | MySQL | Oracle |
|---|---|---|
| Contenedor principal | Base de datos | Instancia |
| Agrupación de objetos | Base de datos | Esquema (Usuario) |
| Creación de contenedor | CREATE DATABASE | CREATE USER |
| Eliminación de contenedor | DROP DATABASE | DROP USER |
| Selección de contexto | USE database_name | ALTER 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.
Crear tablas
Section titled “Crear tablas”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];CREATE TABLE [esquema.]nombre_tabla ( columna1 tipo_dato [restricciones], columna2 tipo_dato [restricciones], ... [restricciones_tabla]) [opciones_tabla];Ejemplos:
Section titled “Ejemplos:”-- Tabla simpleCREATE 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áneaCREATE 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íficasCREATE 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;-- Tabla simpleCREATE TABLE clientes ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, nombre VARCHAR2(50) NOT NULL, apellido VARCHAR2(50) NOT NULL, email VARCHAR2(100) UNIQUE, fecha_registro DATE DEFAULT SYSDATE);
-- Tabla con clave foráneaCREATE TABLE pedidos ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, cliente_id NUMBER NOT NULL, fecha_pedido TIMESTAMP DEFAULT SYSTIMESTAMP, total NUMBER(10,2) NOT NULL, CONSTRAINT fk_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id));
-- Tabla con opciones específicasCREATE TABLE productos ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, nombre VARCHAR2(100) NOT NULL, precio NUMBER(10,2) NOT NULL, stock NUMBER DEFAULT 0, categoria VARCHAR2(20) NOT NULL, CONSTRAINT chk_categoria CHECK (categoria IN ('Electrónica', 'Ropa', 'Hogar', 'Alimentos'))) TABLESPACE users;Modificar tablas
Section titled “Modificar tablas”El comando ALTER TABLE permite realizar diversos cambios en la estructura de una tabla existente:
-- Añadir una columnaALTER TABLE clientes ADD telefono VARCHAR(15);
-- Añadir una columna con posición específicaALTER TABLE clientes ADD direccion VARCHAR(200) AFTER apellido;
-- Modificar una columnaALTER TABLE clientes MODIFY email VARCHAR(150) NOT NULL;
-- Renombrar una columnaALTER TABLE clientes CHANGE apellido apellidos VARCHAR(50) NOT NULL;
-- Eliminar una columnaALTER TABLE clientes DROP COLUMN telefono;
-- Añadir una restricciónALTER TABLE clientes ADD CONSTRAINT uk_email UNIQUE (email);
-- Eliminar una restricciónALTER TABLE clientes DROP CONSTRAINT uk_email;
-- Renombrar una tablaALTER TABLE clientes RENAME TO clientes_activos;-- Añadir una columnaALTER TABLE clientes ADD telefono VARCHAR2(15);
-- Modificar una columnaALTER TABLE clientes MODIFY email VARCHAR2(150) NOT NULL;
-- Renombrar una columnaALTER TABLE clientes RENAME COLUMN apellido TO apellidos;
-- Eliminar una columnaALTER TABLE clientes DROP COLUMN telefono;
-- Añadir una restricciónALTER TABLE clientes ADD CONSTRAINT uk_email UNIQUE (email);
-- Eliminar una restricciónALTER TABLE clientes DROP CONSTRAINT uk_email;
-- Renombrar una tablaALTER TABLE clientes RENAME TO clientes_activos;2.6. Eliminar tablas (DROP TABLE)
Section titled “2.6. Eliminar tablas (DROP TABLE)”El comando DROP TABLE elimina una tabla y todos sus datos de la base de datos.
-- Eliminar una tablaDROP TABLE nombre_tabla;
-- Eliminar una tabla si existeDROP TABLE IF EXISTS nombre_tabla;
-- Eliminar múltiples tablasDROP TABLE tabla1, tabla2, tabla3;-- Eliminar una tablaDROP TABLE nombre_tabla;
-- Eliminar una tabla si existeDROP TABLE nombre_tabla PURGE;
-- Eliminar una tabla y moverla a la papelera de reciclajeDROP TABLE nombre_tabla;
-- Eliminar una tabla y omitir la papelera de reciclajeDROP TABLE nombre_tabla PURGE;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áneasSET FOREIGN_KEY_CHECKS = 0;DROP TABLE clientes;SET FOREIGN_KEY_CHECKS = 1;-- Eliminar una tabla y todas las restricciones que la referencianDROP TABLE clientes CASCADE CONSTRAINTS;2.7. Vaciar tablas (TRUNCATE TABLE)
Section titled “2.7. Vaciar tablas (TRUNCATE TABLE)”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 tablaTRUNCATE TABLE nombre_tabla;-- Vaciar una tablaTRUNCATE TABLE nombre_tabla;
-- Vaciar una tabla y liberar espacioTRUNCATE TABLE nombre_tabla DROP STORAGE;
-- Vaciar una tabla y mantener el espacio asignadoTRUNCATE TABLE nombre_tabla REUSE STORAGE;Diferencias entre TRUNCATE y DELETE
Section titled “Diferencias entre TRUNCATE y DELETE”| Característica | TRUNCATE | DELETE |
|---|---|---|
| Velocidad | Más rápido | Más lento |
| Registro en log | Mínimo | Cada fila |
| Transacciones | No se puede deshacer | Se puede deshacer con ROLLBACK |
| WHERE | No permite condiciones | Permite filtrar con WHERE |
| Disparadores (triggers) | No activa disparadores | Activa disparadores |
| Reinicio de contadores | Reinicia AUTO_INCREMENT/secuencias | No reinicia contadores |
| Restricciones | Problemas con claves foráneas | Respeta 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.
Tipos de restricciones
Section titled “Tipos de restricciones”-- PRIMARY KEY: Identifica de forma única cada registroCREATE 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 tablaCREATE TABLE productos ( id INT, codigo VARCHAR(10), nombre VARCHAR(100) NOT NULL, PRIMARY KEY (id));
-- FOREIGN KEY: Establece relación con otra tablaCREATE 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ónCREATE 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 únicosCREATE TABLE departamentos ( id INT AUTO_INCREMENT PRIMARY KEY, codigo VARCHAR(5) UNIQUE, nombre VARCHAR(50) UNIQUE);
-- NOT NULL: Prohíbe valores nulosCREATE TABLE clientes ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(50) NOT NULL, apellido VARCHAR(50) NOT NULL, email VARCHAR(100));
-- CHECK: Valida condicionesCREATE 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 predeterminadoCREATE TABLE usuarios ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(50) NOT NULL, activo BOOLEAN DEFAULT TRUE, fecha_registro DATE DEFAULT CURRENT_DATE);-- PRIMARY KEY: Identifica de forma única cada registroCREATE TABLE empleados ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, nif VARCHAR2(9) CONSTRAINT uk_nif UNIQUE, nombre VARCHAR2(50) CONSTRAINT nn_nombre NOT NULL);
-- También se puede definir como restricción de tablaCREATE TABLE productos ( id NUMBER, codigo VARCHAR2(10), nombre VARCHAR2(100) NOT NULL, CONSTRAINT pk_productos PRIMARY KEY (id));
-- FOREIGN KEY: Establece relación con otra tablaCREATE TABLE pedidos ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, empleado_id NUMBER, CONSTRAINT fk_empleado FOREIGN KEY (empleado_id) REFERENCES empleados(id));
-- Con opciones de actualización y eliminaciónCREATE TABLE detalles_pedido ( pedido_id NUMBER, producto_id NUMBER, cantidad NUMBER NOT NULL, CONSTRAINT pk_detalles PRIMARY KEY (pedido_id, producto_id), CONSTRAINT fk_pedido FOREIGN KEY (pedido_id) REFERENCES pedidos(id) ON DELETE CASCADE, CONSTRAINT fk_producto FOREIGN KEY (producto_id) REFERENCES productos(id) ON DELETE RESTRICT);
-- UNIQUE: Garantiza valores únicosCREATE TABLE departamentos ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, codigo VARCHAR2(5) CONSTRAINT uk_codigo UNIQUE, nombre VARCHAR2(50) CONSTRAINT uk_nombre UNIQUE);
-- NOT NULL: Prohíbe valores nulosCREATE TABLE clientes ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, nombre VARCHAR2(50) CONSTRAINT nn_nombre NOT NULL, apellido VARCHAR2(50) CONSTRAINT nn_apellido NOT NULL, email VARCHAR2(100));
-- CHECK: Valida condicionesCREATE TABLE productos ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, nombre VARCHAR2(100) NOT NULL, precio NUMBER(10,2) CONSTRAINT chk_precio CHECK (precio > 0), stock NUMBER CONSTRAINT chk_stock CHECK (stock >= 0));
-- DEFAULT: Establece valor predeterminadoCREATE TABLE usuarios ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, nombre VARCHAR2(50) NOT NULL, activo NUMBER(1) DEFAULT 1, fecha_registro DATE DEFAULT SYSDATE);Opciones para claves foráneas
Section titled “Opciones para claves foráneas”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 primariaALTER TABLE productos ADD PRIMARY KEY (id);
-- Añadir clave foráneaALTER TABLE pedidos ADD CONSTRAINT fk_clienteFOREIGN KEY (cliente_id) REFERENCES clientes(id);
-- Añadir restricción únicaALTER TABLE empleados ADD CONSTRAINT uk_email UNIQUE (email);
-- Añadir restricción CHECKALTER TABLE productos ADD CONSTRAINT chk_precio CHECK (precio > 0);
-- Eliminar restricciónALTER TABLE pedidos DROP FOREIGN KEY fk_cliente;ALTER TABLE empleados DROP INDEX uk_email;-- Añadir clave primariaALTER TABLE productos ADD CONSTRAINT pk_productos PRIMARY KEY (id);
-- Añadir clave foráneaALTER TABLE pedidos ADD CONSTRAINT fk_clienteFOREIGN KEY (cliente_id) REFERENCES clientes(id);
-- Añadir restricción únicaALTER TABLE empleados ADD CONSTRAINT uk_email UNIQUE (email);
-- Añadir restricción CHECKALTER TABLE productos ADD CONSTRAINT chk_precio CHECK (precio > 0);
-- Eliminar restricciónALTER TABLE pedidos DROP CONSTRAINT fk_cliente;ALTER TABLE empleados DROP CONSTRAINT uk_email;Conclusión
Section titled “Conclusión”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).