Operaciones de Tablas
## Objetivos de Aprendizaje
- Crear y modificar tablas
- Agregar y modificar columnas
- Usar índices efectivamente
- Eliminar tablas de forma segura
## CREATE TABLE
### Sintaxis Básica
```sql
CREATE TABLE employees (
employee_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE,
hire_date DATE,
salary DECIMAL(10, 2)
);
```
### Tipos de Datos
| Tipo | Descripción |
|------|-------------|
| INTEGER | Números enteros |
| REAL | Números decimales |
| TEXT | Cadenas de caracteres |
| DATE | Valores de fecha |
| DATETIME | Fecha y hora |
| BOOLEAN | Verdadero/falso |
| BLOB | Datos binarios |
### Tipos Específicos de Base de Datos
```sql
-- MySQL
VARCHAR(255)
INT
BIGINT
DECIMAL(10,2)
-- PostgreSQL
VARCHAR(255)
INT
BIGSERIAL
NUMERIC(10,2)
SERIAL
-- SQL Server
VARCHAR(255)
INT
DECIMAL(10,2)
```
## ALTER TABLE
### Agregar Columna
```sql
ALTER TABLE employees
ADD COLUMN phone VARCHAR(20);
```
### Agregar Múltiples Columnas
```sql
ALTER TABLE employees
ADD COLUMN phone VARCHAR(20),
ADD COLUMN address TEXT;
```
### Eliminar Columna
```sql
ALTER TABLE employees
DROP COLUMN phone;
```
### Modificar Columna
```sql
-- PostgreSQL
ALTER TABLE employees
ALTER COLUMN email TYPE VARCHAR(100);
-- MySQL
ALTER TABLE employees
MODIFY COLUMN email VARCHAR(100);
-- SQL Server
ALTER TABLE employees
ALTER COLUMN email VARCHAR(100);
```
### Renombrar Columna
```sql
-- PostgreSQL
ALTER TABLE employees
RENAME COLUMN first_name TO given_name;
-- MySQL
ALTER TABLE employees
CHANGE first_name given_name VARCHAR(50);
```
### Renombrar Tabla
```sql
ALTER TABLE employees RENAME TO staff;
```
## DROP TABLE
### Eliminación Básica
```sql
DROP TABLE employees;
```
### Eliminar Si Existe
```sql
DROP TABLE IF EXISTS employees;
```
### CASCADE
```sql
-- Eliminar y objetos dependientes
DROP TABLE employees CASCADE;
```
### Seguridad Primero
```sql
-- Siempre verificar dependencias primero
SELECT *
FROM information_schema.table_constraints
WHERE table_name = 'employees';
```
## Índices
### Crear Índice
```sql
CREATE INDEX idx_department
ON employees(department);
```
### Índice Compuesto
```sql
CREATE INDEX idx_dept_salary
ON employees(department, salary DESC);
```
### Índice UNIQUE
```sql
CREATE UNIQUE INDEX idx_email
ON employees(email);
```
### Cuándo Indexar
- Columnas usadas en cláusulas WHERE
- Columnas usadas en condiciones de JOIN
- Columnas usadas en ORDER BY
- Columnas con alta cardinalidad (muchos valores únicos)
### Eliminar Índice
```sql
DROP INDEX idx_department;
```
## CREATE TABLE ... AS
### Copiar Estructura y Datos
```sql
CREATE TABLE employees_backup AS
SELECT *
FROM employees;
```
### Copiar con Filtro
```sql
CREATE TABLE sales_employees AS
SELECT *
FROM employees
WHERE department = 'Sales';
```
### Solo Estructura (Sin Datos)
```sql
CREATE TABLE employees_archive AS
SELECT *
FROM employees
WHERE 1 = 0;
```
## TRUNCATE
### Eliminar Todas las Filas
```sql
TRUNCATE TABLE employees;
```
### Más Rápido que DELETE
- Sin registro de transacciones por fila
- No se puede deshacer
- Reinicia contadores de auto-incremento
### CASCADE con TRUNCATE
```sql
TRUNCATE TABLE employees CASCADE;
```
## Tablas Temporales
### Tabla de Sesión
```sql
CREATE TEMPORARY TABLE temp_results (
id INTEGER,
name TEXT
);
-- Se elimina automáticamente cuando termina la sesión
```
### PostgreSQL
```sql
CREATE TEMP TABLE temp_data AS
SELECT * FROM source_table WHERE condition;
```
## Restricciones de Columna
### NOT NULL
```sql
CREATE TABLE example (
name TEXT NOT NULL
);
```
### UNIQUE
```sql
CREATE TABLE example (
email TEXT UNIQUE
);
```
### PRIMARY KEY
```sql
CREATE TABLE example (
id INTEGER PRIMARY KEY,
name TEXT
);
```
### DEFAULT
```sql
CREATE TABLE example (
created_at DATE DEFAULT CURRENT_DATE,
status TEXT DEFAULT 'active'
);
```
### CHECK
```sql
CREATE TABLE example (
age INTEGER CHECK (age >= 0),
salary DECIMAL CHECK (salary > 0)
);
```
## Resumen
- **CREATE TABLE**: Definir nuevas tablas con columnas y restricciones
- **ALTER TABLE**: Modificar estructura de tabla existente
- **DROP TABLE**: Eliminar tablas (usar IF EXISTS)
- **Índices**: Acelerar consultas en tablas grandes
- **TRUNCATE**: Forma rápida de eliminar todas las filas
- **Tablas temporales**: Almacenamiento de sesión
- Usar **restricciones** para enforces integridad de datos
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →