Comandos básicos de MySQL
Tags: mysql, database, sql, terminal
Published: 2023-04-13 19:47:06

## ¿Qué es una base de datos?
Una base de datos es un conjunto perteneciente al mismo contexto y almacenados sistemáticamente. Se compone por tablas, columnas, filas y campos.
- Una tabla es una estructura que organiza datos en una matriz.
- Una columna es un conjunto de datos organizados verticalmente.
- Una fila o registro es un conjunto de datos organizados horizontalmente.
- Un campo es un dato individual.

Las bases de datos tienen ciertas restricciones, por ejemplo, la clave primaria, clave foránea, restricción de nulos, entre otros.
- Clave primaria: Campo que se utiliza para identificar de forma única cada fila de la tabla, no puede tener valores duplicados ni nulos, y sirve para establecer relaciones.
- Clave foránea o externa: Es un campo o conjunto de campos en una tabla que hace referencia a la clave primaria de otra tabla.

Se necesitan querys para ejecutar los comandos en la base de datos.
Para crear archivos que ejecuten comandos SQL, el archivo debe llevar la extensión '.sql'.

Nota: Las mayúsculas no son necesarias para ejecutar los comandos, pero nos ayudan a entender mejor la sintaxis.

## Comandos básicos
`help` Mostrar la ayuda
`status` Muestra información sobre MySQL
`create database miBD` Crea la base de datos 'miBD'
`create database info exists miBD` Crea la base de datos 'miBD' solo en caso de que no exista
`show databases;` Muestra las bases de datos existentes
`use miBD;` Usar la base de datos 'miBD' para ejecutar comandos
`drop database miBD;` Elimina la base de datos 'miBD'
`show tables;` Muestra las tablas de la base de datos elegida
`create table miTabla(campo1 int(3), campo2 varchar(10));` Crea una tabla con los campos 'campo1' y 'campo2', de tipo Integer y Varchar
`desc miTabla;` Muestra información de cómo está conformada la tabla 'miTabla'
`drop table miTabla;` Elimina la tabla 'miTabla'

### Modificar tablas
`ALTER TABLE miTabla RENAME TO nuevoNombre` Cambia el nombre de la tabla 'miTabla' a 'nuevoNombre'
`ALTER TABLE miTabla CHANGE columna1 apellidos varchar (10) null;` Cambia el nombre de la columna 'columna1' a 'apellidos' y cambia las restricciones 
`ALTER TABLE miTabla MODIFY apellidos char(10) not null;` Cambia las restricciones de una columna (apellidos) sin cambiar el nombre
`ALTER TABLE miTabla ADD columna3 varchar(9) null;` Agrega la columna 'columna3' a la tabla 'miTabla'
`ALTER TABLE miTabla ADD CONSTRAINT uq_email UNIQUE(email);` Añade la condición de que el campo 'email' sea único
`ALTER TABLE miTabla DROP columna3;` Elimina la columna 'columna3' sin importar que tenga datos

### Lenguaje de manipulación de datos
**SELECT**
`SELECT * FROM miTabla;` Devuelve todos los registros de la tabla 'miTabla'
`SELECT * FROM miTabla \G` Devuelve todos los registros de la tabla, con otro formato
`SELECT col1, col2 FROM miTabla` Devuelve todos los registros de las columnas seleccionadas (col1, col2)
`SELECT email, (1+1) FROM miTabla` Devuelve los campos de la columna 'email' y agrega una columna con el resultado de la operación '1+1'
`SELECT email, (1+1) AS suma FROM miTabla` Se le agrega un alias a la columna con la operación, para que su nombre aparezca como 'suma', en vez de '1+1'
`SELECT id, name FROM miTabla ORDER BY id DESC;` Devuelve los 'id' y 'name' de 'miTabla' ordenándolos de forma descendente por 'id'
`SELECT id, name FROM miTabla ORDER BY id ASC;` Devuelve los 'id' y 'name' de 'miTabla' ordenándolos de forma ascendente por 'id'
`SELECT * FROM miTabla WHERE email="email@email.com";` Devuelve solo los registros que cumplan con la condición que se encuentra después del 'WHERE'
`SELECT * FROM miTabla WHERE YEAR(fecha)=2019;` Devuelve los registros que tengan el año '2019' en la columna 'fecha'
`SELECT * FROM usuarios WHERE YEAR(fecha)!=2019;` Devuelve los registros que no tengan el año '2019' en la columna 'fecha'
`SELECT * FROM miTabla WHERE YEAR(fecha)=2019 OR ISNULL(fecha);` Devuelve los registros que no tengan el año '2019' en la columna 'fecha' o que su valor sea nulo
`SELECT * FROM miTabla WHERE apellido LIKE '%a%';` Devuelve todos los registros que tengan una 'a' en cualquier lugar del campo en la columna 'apellido'
`SELECT * FROM miTabla WHERE apellido LIKE '%a%' AND pass='123';` Devuelve todos los registros que tengan una 'a' en cualquier lugar del campo en la columna 'apellido' y que el valor de 'pass' sea '123'
`SELECT * FROM miTabla WHERE (YEAR(fecha)%2 = 0);` Devuelve los registros que tengan un año par en la columna 'fecha'
`SELECT * FROM miTabla LIMIT 2;` Limita la cantidad de registros obtenidos a 2
`SELECT * FROM miTabla LIMIT 2,4;` Muestra solo los registros que estén entre el rango 2 a 4
`SELECT UPPER(nombre) FROM miTabla;` Devuelve los registros con la columna 'nombre' en mayúsculas
`SELECT LOWER(nombre) FROM miTabla;` Devuelve los registros con la columna 'nombre' en minúsculas
`SELECT nombre FROM miTabla WHERE LENGTH(nombre)>5;` Devuelve los registros cuyo valor en la columna 'nombre' supere los 5 caracteres
`SELECT (id+1) FROM miTabla;` Devuelve los ID de la tabla, sumandos 1
`SELECT ABS(numero) FROM miTabla;` Devuelve el valor absoluto de cada valor en la columna 'numero'
`SELECT CEIL(decimal) from miTabla;` Devuelve el valor de la columna 'decimal' redondeado al número siguiente
`SELECT FLOOR(decimal) from miTabla;` Devuelve el valor de la columna 'decimal' redondeando al número anterior
`SELECT ROUND(decimal, 2) from miTabla;` Redondea el valer de la columna 'decimal' y muestra 2 decimales después del punto
`SELECT PI() from miTabla;` Imprime el valor de PI
`SELECT SQRT(numero) from miTabla;` Devuelve la raíz cuadrada de la columna 'numero'
`SELECT RAND() FROM miTabla;` Devuelve números aleatorios
`SELECT TRUNCATE(decimal, 2) FROM miTabla;` Solo muestra 2 decimales después del punto en la columna 'decimal'
`SELECT CONCAT(col1, ':)') FROM miTabla;` Concatena el valor de la columna 'col1' agregándole ':)'
`SELECT LENGHT(col1) FROM miTabla;` Devuelve la cantidad de caracteres que contiene cada campo en la columna 'col1'
`SELECT TRIM(col1) FROM miTabla;` Elimina los espacios de antes y después de los campos en la columna 'col1'
`SELECT CURDATE() FROM miTabla;` Imprime la fecha actual
`SELECT CURTIME() FROM miTabla;` Imprime la hora actual
`SELECT DATEDIFF(fecha, fecha2) FROM miTabla;` Imprime la diferencia en días entre las columnas 'fecha' y 'fecha2'
`SELECT DAYNAME(fecha) FROM miTabla;` Devuelve el día de la semana a la que corresponde la fecha 
`SELECT DAYOFMONTH(fecha) FROM miTabla;` Devuelve el número del día de la fecha en la columna 'fecha'}
`SELECT SYSTEMDATE() FROM miTabla;` Devuelve la fecha y hora actual del sistema operativo donde se está ejecutando la consulta
`SELECT DAYOFWEEK(fecha) FROM miTabla;` Devuelve el número del día respecto a la semana
`SELECT DAYOFYEAR(fecha) FROM miTabla;` Devuelve qué número del día del año tiene la fecha de la columna 'fecha'
`SELECT MONTH(fecha) FROM miTabla;` Devuelve el mes que tiene la fecha
`SELECT YEAR(fecha) FROM miTabla;` Devuelve el año que tiene la fecha
`SELECT DAY(fecha) FROM miTabla;` Devuelve el día que tiene la fecha
`SELECT HOUR(fecha) FROM miTabla;` Devuelve la hora que tiene la fecha
`SELECT MINUTE(fecha) FROM miTabla;` Devuelve el minuto que tiene la fecha
`SELECT DATE_FORMAT(fecha, '%d-%m-%Y') FROM miTabla;` Muestra las fechas de la columna 'fecha' con el formato indicado en el segundo parámetro
`SELECT ISNULL(name) FROM miTabla;` verifica si el campo es nulo, si lo es, devuelve 0, sino, 1
`SELECT STRCMP(name, apellido) FROM miTabla;` Compara los valores de las columnas 'name' y 'apellido' y devuelve 0 si son iguales o 1 si son diferentes
`SELECT VERSION FROM miTabla;` Devuelve la versión SQL que se está usando
`SELECT USER() FROM miTabla;` Devuelve el usuario actual
`SELECT USER() DISTINCT FROM miTabla;` Devuelve solo valores sin repetirse
`SELECT DISTINCT DATABASE() FROM miTabla;` Devuelve el nombre de la base de datos
`SELECT IFNULL(name, '---') FROM miTabla;` Verifica si los campos de la columna 'name' son nulos, si lo son, pone '---' como valor
`SELECT col1 FROM miTabla GROUP BY col2;` Agrupa los resultados de 'col1', agrupándolos por el valor en 'col2'
`SELECT COUNT(col1) FROM miTabla GROUP BY col2;` Agrupa los resultados y muestra cuántos resultados hay
`SELECT COUNT(col1) FROM miTabla GROUP BY col2 HAVING COUNT(col1) > 4;` Agrupa y cuenta los resultados y solo muestra los que cumplan co la condición de ser mayores a 4
`SELECT AVG(numero) FROM miTabla;` Devuelve el promedio de los valores de la columna 'numero'
`SELECT MAX(numero) FROM miTabla;` Devuelve el registro con el mayor valor en la columna 'numero'
`SELECT MIN(numero) FROM miTabla;` Devuelve el registro con el menor valor en la columna 'numero'
`SELECT SUM(col1) FROM miTabla;` Devuelve la suma de todos los valores en la columna 'col1'
`SELECT * FROM tabla1 WHERE id IN (SELECT tabla1_id FROM tabla2);` Devuelve los registros de 'tabla1' cuyo ID se encuentre en la columna 'tabla1_id' de 'tabla2'
`SELECT * FROM tabla1 WHERE id NOT IN (SELECT tabla1_id FROM tabla2);` Devuelve los registros de 'tabla1' cuyo ID no se encuentre en la columna 'tabla1_id' de 'tabla2'
`SELECT users.name, data.title FROM users, data;` Devuelve las columnas especificadas desde dos tablas
`SELECT u.name, d.title FROM users u, data d;` Le da un alias a los nombres de las tablas
`SELECT u.name, d.title FROM users u, data d WHERE u.data_id = d.id AND d.user_id = u.id;` Devuelve los registros cuando los ID's coincidan para evitar tener muchos campos
`SELECT u.id FROM users u INNER JOIN data d ON u.data_id = d.id GROUP BY u.name;` Muestra los registros donde se relacionen los usuarios y datos, agrupándolos, si no hay relación, no se muestran
`SELECT d.id FROM data d LEFT JOIN users u ON d.user_id = u.id GROUP BY d.title;` Muestra todos los registros de la primer tabla  (data)que no tengan relación con la segunda tabla (users)
`SELECT d.id FROM data d RIGHT JOIN users u ON d.user_id = u.id GROUP BY d.title;` Muestra los registros de la segunda tabla (users) que no tengan relación con la primer tabla (data)

**INSERT**
`INSERT INTO miTabla VALUES(null, 'test', 19, '2019-10-29');` Guarda un nuevo registro en la tabla 'miTabla', no se pueden omitir campos
`INSERT INTO miTabla(email, pass) VALUES('test@test.com', '123');` Guardar un nuevo registro con solo las columnas seleccionadas (email, pass)

**UPDATE**
`UPDATE miTabla SET fecha=CURDATE();` Actualiza la columna 'fecha' y le agrega el valor de la fecha actual
`UPDATE miTabla SET fecha=CURDATE() WHERE id=3;` Actualiza la columna 'fecha' con el valor de la fecha actual del registro con ID '3'

**DELETE**
`DELETE FROM miTabla WHERE id='1';` Elimina un registro de la tabla 'miTabla' que tenga ID '1'

### Vistas
Guardar un query para verlo más rápido y usar menos recursos. La información siempre esta actualizada. Para ver las vistas existentes, se ejecuta `show tables;`
`CREATE VIEW miVista AS SELECT * FROM miTabla;` Crea una vista, dandole un alias al query 'select' para no tener que escribir todo
`SELECT * FROM miVista;` Muestra el contenido de la vista
`DROP VIEW miVista;` Elimina la vista creada

### Restricciones al crear una tabla
`CREATE TABLE miTabla(`
> `id int(10) auto_increment not null,`
> `edad int(2) not null,`
> `nombre varchar(20) default "usuario",`
> `apellido varchar(15) null,`
> `CONSTRAINT pk_miTabla PRIMARY KEY(id),`
> `CONSTRAINT fk_miTabla_tabla2 FOREIGN KEY (usuario_id) REFERENCES usuario(id),`
> `CONSTRAINT fk_miTabla_tabla2 FOREIGN KEY (usuario_id) REFERENCES usuario(id) ON DELETE CASCADE,`
> `CONSTRAINT fk_miTabla_tabla2 FOREIGN KEY (usuario_id) REFERENCES usuario(id) ON DELETE SET NULL,`
> `CONSTRAINT fk_miTabla_tabla2 FOREIGN KEY (usuario_id) REFERENCES usuario(id) ON DELETE SET DEFAULT,`
> `CONSTRAINT fk_miTabla_tabla2 FOREIGN KEY (usuario_id) REFERENCES usuario(id) ON DELETE NO ACTION,`
> `CONSTRAINT fk_miTabla_tabla2 FOREIGN KEY (usuario_id) REFERENCES usuario(id) ON UPDATE CASCADE,`
> `CONSTRAINT fk_miTabla_jefe FOREIGN KEY(jefe) REFERENCES miTabla(id);`

`)ENGINE=InnoDb;`

auto_increment: Auto-incrementa el valor automáticamente
null: Permite nulos
not null: No permite nulos
default 'valor': Da un valor por defecto por si el usuario no lo pone
pk_miTabla PRIMARY KEY(col): Define 'col' como llave primaria con nombre 'pk_miTabla'
fk_miTabla_tabla2 FOREIGN KEY(col) REFERENCES usuario(id): Define 'col' como llave foránea con referencia a la columna 'id' de la tabla 'usuario'
ON DELETE CASCADE: Cuando se borre el registro, también sus datos relacionados se borran
ON DELETE SET NULL: Cuando se borre el registro, ponerlo como nulo
ON DELETE SET DEFAULT: Cuando se borre el registro, poner el valor default
ON DELETE NO ACTION: Cuando se borre el registro, no hacer nada
ON UPDATE CASCADE: Cuando se actualice un registro, el registro relacionado también se actualiza
fk_miTabla_jefe FOREIGN KEY(jefe) REFERENCES miTabla(id): Hace referencia a la misma tabla pero a otro registro
ENGINE=InnoDb: Indica el motor/forma de almacenar los datos, para mantener la integridad, aumentar rendimiento, etc. Otro: MyISAM permite tener mas velocidad pero no mantiene la integridad

## Notas

### Operadores de comparación para WHERE
Igual: =
Diferente: !=
Menor: <
Mayor: >
Menor o igual: <=
Mayor o igual: >=
Entre: BETWEEN a AND b
En: IN
Nulo: IS NULL
No nulo: IS NOT NULL
Es como: LIKE
No es como: NOT LIKE

### Operadores lógicos
O: OR
Y: AND
No: NOT

### Tipos de datos en SQL
int(10) - Entero de 10 caracteres máximos
float(10,3) - Decimal de 10 caracteres máximos y con máximo 3 decimales
varchar(90) - String (puede contener hasta 255 caracteres)
char(1) - String de un solo carácter
mediumtext - String de 65000 caracteres
longtext - String de 4 millones de caracteres
date - Fecha
time - Hora
timestamp - Hora en formato UTF