Operaciones SQL comunes

Esta guía resume las instrucciones SQL mas utilizadas al trabajar con bases de datos MySQL.

1. Crear una tabla nueva: CREATE TABLE

Se usa cuando la tabla todavía no existe.

Ejemplo:

CREATE TABLE clientes (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   nombre VARCHAR(150) NOT NULL,
   email VARCHAR(255) NOT NULL,
   created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Para evitar un error si la tabla ya existe:

CREATE TABLE IF NOT EXISTS clientes (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   nombre VARCHAR(150) NOT NULL,
   PRIMARY KEY (id)
);

2. Modificar una tabla: ALTER TABLE

Se usa para cambiar una tabla que ya existe.

Agregar una columna:

ALTER TABLE mensajes_contacto
ADD COLUMN ip VARCHAR(45) NULL AFTER email;

Agregar un indice:

ALTER TABLE mensajes_contacto
ADD INDEX idx_mensajes_contacto_ip (ip);

Cambiar el tipo o las reglas de una columna:

ALTER TABLE mensajes_contacto
MODIFY COLUMN asunto VARCHAR(250) NOT NULL;

Renombrar una columna:

ALTER TABLE mensajes_contacto
RENAME COLUMN asunto TO titulo;

Eliminar una columna:

ALTER TABLE mensajes_contacto
DROP COLUMN ip;

3. Insertar registros: INSERT INTO

Agrega datos nuevos.

Ejemplo:

INSERT INTO mensajes_contacto
   (nombre, email, asunto, mensaje, ip)
VALUES
   ('Ana Perez', 'ana@example.com', 'Consulta', 'Necesito informacion.', '192.168.1.20');

Es recomendable indicar siempre las columnas para evitar depender del orden de la tabla.

4. Consultar registros: SELECT

Obtiene datos sin modificarlos.

Ejemplo:

SELECT id, nombre, email, asunto, estado, created_at
FROM mensajes_contacto
ORDER BY created_at DESC;

Con filtros y limite:

SELECT *
FROM mensajes_contacto
WHERE estado = 'nuevo'
ORDER BY created_at DESC
LIMIT 50;

5. Actualizar registros: UPDATE

Modifica registros existentes. Usa siempre un WHERE cuando no quieras modificar toda la tabla.

Ejemplo:

UPDATE mensajes_contacto
SET estado = 'leido'
WHERE id = 10;

Sin WHERE, todos los registros se actualizan:

UPDATE mensajes_contacto
SET estado = 'archivado';

6. Eliminar registros: DELETE

Elimina filas especificas.

Ejemplo:

DELETE FROM mensajes_contacto
WHERE id = 10;

Sin WHERE, elimina todas las filas de la tabla:

DELETE FROM mensajes_contacto;

7. Vaciar una tabla: TRUNCATE TABLE

Elimina todos los registros y normalmente reinicia el contador AUTO_INCREMENT.

TRUNCATE TABLE mensajes_contacto;

TRUNCATE es mas drastico que DELETE y no permite usar WHERE.

8. Eliminar una tabla: DROP TABLE

Elimina la tabla completa, incluyendo su estructura y sus datos.

DROP TABLE mensajes_contacto;

Para evitar un error si no existe:

DROP TABLE IF EXISTS mensajes_contacto;

9. Crear y eliminar indices

Los indices aceleran consultas sobre columnas que se filtran u ordenan con frecuencia.

Crear un indice:

CREATE INDEX idx_contacto_estado
ON mensajes_contacto (estado);

Para eliminar un indice:

ALTER TABLE mensajes_contacto
DROP INDEX idx_contacto_estado;

Un indice unico impide valores duplicados:

CREATE UNIQUE INDEX idx_contacto_email
ON mensajes_contacto (email);

10. Restricciones y claves foraneas

Una clave foranea relaciona una columna con otra tabla.

ALTER TABLE pedidos
ADD CONSTRAINT fk_pedidos_usuario
FOREIGN KEY (usuario_id) REFERENCES usuarios(id);

Para eliminarla:

ALTER TABLE pedidos
DROP FOREIGN KEY fk_pedidos_usuario;

11. Ver la estructura de una tabla

DESCRIBE mensajes_contacto;

Tambien puedes ver la instruccion completa con la que fue creada:

SHOW CREATE TABLE mensajes_contacto;

12. Transacciones

Las transacciones permiten confirmar o deshacer varias operaciones como una unidad.

START TRANSACTION;

UPDATE mensajes_contacto
SET estado = 'leido'
WHERE id = 10;

COMMIT;

Si algo sale mal:

ROLLBACK;

Resumen rapido

Necesidad: Instruccion

- Crear una tabla: CREATE TABLE
- Modificar una tabla: ALTER TABLE
- Agregar datos: INSERT INTO
- Consultar datos: SELECT
- Modificar datos: UPDATE
- Eliminar filas: DELETE
- Vaciar una tabla: TRUNCATE TABLE
- Eliminar una tabla: DROP TABLE
- Crear un indice: CREATE INDEX
- Confirmar cambios: COMMIT
- Deshacer cambios: ROLLBACK

Recomendaciones

- Haz una copia de seguridad antes de usar DROP, TRUNCATE o DELETE sin WHERE.
- Prueba primero un SELECT con el mismo WHERE antes de ejecutar un UPDATE o DELETE.
- Usa consultas parametrizadas desde PHP para evitar inyecciones SQL.
- Usa ALTER TABLE para modificar una tabla existente y CREATE TABLE para crear una nueva.