Guía Urgente de MySQL


Introducción


MySQL es un sistema de gestión de bases de datos relacional, multihilo y multiusuario con millones de instalaciones en el mundo. MySQL se desarrolla como software libre en un esquema de licenciamiento dual. Por un lado se ofrece bajo licencia GNU GPL y, por otro, para aquellas empresas que deseen incorporarlo en productos privativos se puede adquirir una licencia para este uso, puediendo incluir soporte y otros servicios profesionales. 

Tanto el sistema de gestión como su herramienta visual MySQL Workbench permiten diseñar y gestionar bases de datos; y administrar conexiones, usuarios y sus permisos.

 

Características

  • Ofrece portabilidad entre sistemas.
  • Aprovecha multiprocesamiento gracias a su implementación multihilo.
  • Soporta gran cantidad de tipos de datos para los campos.
  • Dispone de APIs para muchos lenguajes (Python, C, C++, etc).
  • Permite hasta 32 índices por tabla.
  • Administra usuarios y contraseñas.
  • Licencia Open Source: uso gratuito y código fuente modificable.
  • Gestor ampliamente utilizado entre desarrolladores de aplicaciones para Internet.
  • Infinidad de herramientas y librerías.
  • Fácil instalación y configuración.

 

Instalar MySQL en Debian/Ubuntu


$ sudo apt update
$ sudo apt install mysql-server

 

Instalar MySQL Workblench


La instalación de MySQL Workblench es opcional:
$ sudo apt install mysql-workbench
Para iniciar MySQL Workblench:

$ mysql-workbench &

 

Obtener versión instalada


$ mysql -V

mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper

 

Establecer contraseña y opciones de seguridad


Establecer contraseña

El usuario root de GNU/Linux debe tener una contraseña:

$ sudo -s
$ passwd


(Escribir y repetir contraseña del root)

Configurar opciones de seguridad

Para configurar las opciones de seguridad ejecutar en la línea de comandos:

$ mysql_secure_installation

Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:

(Presionar N)

Please set the password for root here.

(Establecer contraseña)

New password: alejandro_2018
Re-enter new password: alejandro_2018

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) :

(Presionar N)

... skipping.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :

(Presionar N)

... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :

(Presionar N)

... skipping.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :

(Presionar Y)

Success.
All done!

 

Comprobar instalación de MySQL


$ systemctl status mysql.service

mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
Active: active (running) since Fri 2018-05-11 11:47:54 CEST; 14min ago
Process: 9385 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/my
Process: 9376 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exit
Main PID: 9387 (mysqld)
Tasks: 29 (limit: 4915)
CGroup: /system.slice/mysql.service
└─9387 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
may 11 11:47:53 ant-Lenovo-G500 systemd[1]: Starting MySQL Community Server...
may 11 11:47:54 ant-Lenovo-G500 systemd[1]: Started MySQL Community Server.

(Para salir presionar Q)

Otro modo de comprobar la instalación:

$ mysqladmin -p -u root version

Enter password: alejandro_2018

mysqladmin Ver 8.42 Distrib 5.7.22, for Linux on x86_64
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Server version 5.7.22-0ubuntu18.04.1
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 19 min 50 sec
Threads: 1 Questions: 9 Slow queries: 0 Opens: 113 Flush tables: 1
Open tables: 106 Queries per second avg: 0.007

Otra opción más comprobando el estado del servicio mysql:

$ service mysql status

 

Permitir acceso remoto


Con el cortafuegos IPtables habilitado para permitir conectarse desde otro equipo a MySQL por el puerto predeterminado (3306):

$ sudo ufw allow mysql

Regla añadida
Regla añadida (v6)

 

Detener, iniciar y ver el estado del servicio MySQL


$ service mysql stop
$ service mysql start
$ service mysql status

 

Ejecutar MySQL (o no) cuando reinie el sistema


$ systemctl enable mysql
$ systemctl disable mysql


Synchronizing state of mysql.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable mysql

 

Iniciar Shell de MySQL


$ mysql

 

Iniciar Shell de MySQL como root


Enter password: alejandro_2018

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.22-0ubuntu18.04.1 (Ubuntu)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

 

Cambiar password del root desde el Shell


mysql> UPDATE mysql.user SET authentication_string = PASSWORD('2018_alejandro') WHERE user='root';

Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1

mysql> FLUSH PRIVILEGES;

 

Añadir usuario a MySQL


Crear usuario

mysql> CREATE USER 'alejandro'@'localhost' IDENTIFIED BY '2018_alejandro';

Otorgar permisos al usuario

mysql> GRANT ALL PRIVILEGES ON * . * TO 'alejandro'@'localhost';
  • El primer * hace referencia a todas las bases de datos y puede ser sustituido por el nombre de una bd
  • El segundo * hace referencia a todas las tablas y puede ser sustituido por el nombre de una tabla.
Confirmar privilegios

mysql> FLUSH PRIVILEGES;

Tipos de permisos
  • ALL PRIVILEGES: permite a usuario acceder a todas las bases de datos asignadas.
  • CREATE: permite crear nuevas tablas o bases de datos.
  • DROP: permite eliminar tablas o bases de datos.
  • DELETE: permite eliminar registros de tablas.
  • INSERT: permite insertar registros en tablas.
  • SELECT: permite leer registros en las tablas.
  • UPDATE: permite actualizar registros seleccionados en tablas.
  • GRANT OPTION: permite remover privilegios de usuarios.
Quitar permisos

mysql> REVOKE ALL PRIVILEGES ON * . * FROM ‘usuario’@‘localhost’;

Borrar un usuario

mysql> DROP USER ‘usuario’@‘localhost’;

 

Salir del Shell


mysql> quit
Bye

 

Iniciar Shell con root y su nueva contraseña


$ mysql -u root -p

Enter password: 2018_alejandro

 

Ver usuarios de MySQL


mysql> SELECT User, Host, authentication_string FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| User             | Host      | authentication_string                     |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *15C73F89842C2D8615743263F00BDDC1F952EFA9 |
| mysql.session    | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | localhost | *06601677922020569390FE705AC32835D3C4429C |
| alejandro        | localhost | *15C73F89842C2D8615743263F00BDDC1F952EFA9 |
+------------------+-----------+-------------------------------------------+

Salir de la sesión del root e iniciar sesión y Shell con 'alejandro'


mysql> quit
bye

$ exit
$ mysql -u alejandro -p

Enter password: 2018_alejandro

 

Obtener ayuda


Ayuda general

mysql> HELP

Ayuda sobre la sintáxis de un comando

HELP comando

Ejemplos:

mysql> HELP SELECT
mysql> HELP CREATE TABLE

Ayuda sobre los distintos contenidos disponibles

mysql> HELP CONTENTS

Ayuda sobre administración

mysql> HELP ADMINISTRATION

 

Crear base de datos (vacía)


mysql> CREATE DATABASE personal;

 

Mostrar bases de datos


mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| personal           |
| sys                |
+--------------------+

Obtener ruta del directorio donde se almacenan las bases de datos


mysql> SHOW VARIABLES WHERE Variable_Name LIKE "datadir";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+

Seleccionar base de datos


mysql> USE personal;
Database changed

 

Crear tablas en base de datos 'personal'


Crear tablas
 
mysql> CREATE TABLE Dptos (
 id_dpto INT NOT NULL AUTO_INCREMENT,
 denom VARCHAR(50) NOT NULL UNIQUE,
 PRIMARY KEY (id_dpto)
);


mysql> CREATE TABLE Usuarios (
 id_usu INT NOT NULL AUTO_INCREMENT,
 cta_usu VARCHAR(15) UNIQUE, 
 nombre VARCHAR(50) NOT NULL, 
 id_dpto INT, 
 ecorreo VARCHAR(50) NOT NULL,
 fecha_alta DATETIME NOT NULL,
 PRIMARY KEY (id_usu),
 FOREIGN KEY (id_dpto) REFERENCES dptos(id_dpto)
);

Tipos de datos


Numéricos
  • INT (INTEGER): Ocupación 4 bytes - valores entre -2147483648 y 2147483647 o entre 0 y 4294967295.
  • SMALLINT: Ocupación de 2 bytes - valores entre -32768 y 32767 o entre 0 y 65535.
  • TINYINT: Ocupación de 1 bytes - valores entre -128 y 127 o entre 0 y 255.
  • MEDIUMINT: Ocupación de 3 bytes - valores entre -8388608 y 8388607 o entre 0 y 16777215.
  • BIGINT: Ocupación de 8 bytes - valores entre -8388608 y 8388607 o entre 0 y 16777215.
  • DECIMAL (NUMERIC): Almacena números de coma flotante como cadenas o string.
  • FLOAT (m,d): Almacena números de coma flotante.
  • DOUBLE (REAL): Almacena número de coma flotante con precisión doble.
  • BIT (BOOL, BOOLEAN): Número entero con valor 0 o 1.
Fecha/Horas
  • DATE: Fecha con año, mes y día - rango entre ‘1000-01-01′ y ‘9999-12-31′.
  • DATETIME: Fecha (aaaa-mm-dd) y hora (hh-mm-ss) - rango entre ‘1000-01-01 00:00:00′ y ‘9999-12-31 23:59:59′.
  • TIME: Hora (hh-mm-ss) - rango entre -838-59-59 y 838-59-59 con el formato ‘HH:MM:SS’.
  • TIMESTAMP: Fecha y hora UTC - rango entre ‘1970-01-01 00:00:01′ y ‘2038-01-19 03:14:07′.
  • YEAR: Año con 2/4 dígitos, por defecto 4 - rango 4d entre 1901 - 2155 y 2d entre 1970 - 2069.
Cadenas
  • CHAR: Ocupación fija. Longitud de 1 a 255 caracteres.
  • VARCHAR: Ocupación variable. Longitud de 1 a 255 caracteres.
  • TINYBLOB: Longitud máx. 255 caracteres. Para datps binarios como ficheros texto, imágenes, audio, videos.
  • BLOB: Longitud máx. 65.535 caracteres. Para datos binarios.
  • MEDIUMBLOB: Longitud máx. de 16.777.215 caracteres. Para datos binarios.
  • LONGBLOB: Longitud máx. 4.294.967.298 caracteres. Para datos binarios.
  • SET: Almacena 0, uno o varios valores de lista con máximo de 64 posibles valores.
  • ENUM: Igual que SET pero solo puede almacenar un valor.
  • TINYTEXT: Longitud máx. 255 caracteres. Para texto plano sin formato. Distingue entre min. y may.
  • TEXT: Longitud máx. 65.535 caracteres. Para texto plano sin formato. Distingue entre min. y may.
  • MEDIUMTEXT: Longitud máx. 16.777.215 car. Para texto plano sin formato. Distingue entre min. y may.
  • LONGTEXT: Longitud máx. 4.294.967.298 car. Para texto plano sin formato. Distingue entre min. y mayúsculas.

 

Mostrar tablas


mysql> SHOW TABLES;
+--------------------+
| Tables_in_personal |
+--------------------+
| Dptos              |
| Usuarios           |
+--------------------+

También,

mysql> SHOW TABLES FROM personal;

 

Listar campos de una tabla


mysql> DESCRIBE Dptos;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id_dpto | int(11)     | NO   | PRI | NULL    | auto_increment |
| denom   | varchar(50) | NO   | UNI | NULL    |                |
+---------+-------------+------+-----+---------+----------------+

mysql> DESCRIBE Usuarios;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id_usu     | int(11)     | NO   | PRI | NULL    | auto_increment |
| cta_usu    | varchar(15) | YES  | UNI | NULL    |                |
| nombre     | varchar(50) | NO   |     | NULL    |                |
| id_dpto    | int(11)     | YES  | MUL | NULL    |                |
| ecorreo    | varchar(50) | NO   |     | NULL    |                |
| fecha_alta | datetime    | NO   |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

También:

mysql> SHOW FIELDS FROM Usuarios;

y

mysql> SHOW COLUMNS FROM Usuarios;

 

Insertar registros en una tabla


mysql> INSERT INTO Dptos VALUES (1, "Comercial");
mysql> INSERT INTO Dptos VALUES (2, "Producción");
mysql> INSERT INTO Dptos VALUES (3, "Personal");
mysql> INSERT INTO Dptos VALUES (4, "Formación");

También:

mysql> INSERT INTO Dptos (id_dpto, denom) VALUES (5, "Financiero");

Los campos PRIMARY_KEY no permiten datos duplicados:

mysql> INSERT INTO Dptos VALUES (4, "Ventas");
ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY'

mysql> INSERT INTO Usuarios VALUES (1, "asualam", "Alejandro", 2, "as@mysql.es", "2018-04-01");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("asuajim", "Antonio", 2, "sj@mysql.es", "2018-04-02");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("slamost", "María", 4, "ms@mysql.es", "2018-04-12");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("carmor", "Carmen", 1, "cm@mysql.es", "2018-04-01");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("eumor", "Eugenia", 5, "em@mysql.es", "2018-04-10");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("lumor", "Luis", 3, "lm@mysql.es", "2018-04-07");

Un dato de un campo FOREIGN KEY debe existir en la tabla externa:

mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("aleal", "Alegría", 9, "aa@mysql.es", "2018-04-06");

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (personal.Usuarios, CONSTRAINT Usuarios_ibfk_1 FOREIGN KEY (id_dpto) REFERENCES Dptos (id_dpto))

 

Consultar datos de una tabla


mysql> SELECT * FROM Dptos;
+---------+-------------+
| id_dpto | denom       |
+---------+-------------+
|       1 | Comercial   |
|       5 | Financiero  |
|       4 | Formación   |
|       3 | Personal    |
|       2 | Producción  |
+---------+-------------+

mysql> SELECT * FROM Dptos WHERE id_dpto = 3;
+---------+----------+
| id_dpto | denom    |
+---------+----------+
|       3 | Personal |
+---------+----------+

mysql> SELECT * FROM Dptos WHERE id_dpto <> 3;
+---------+-------------+
| id_dpto | denom       |
+---------+-------------+
|       1 | Comercial   |
|       5 | Financiero  |
|       4 | Formación   |
|       2 | Producción  |
+---------+-------------+

mysql> SELECT denom FROM Dptos WHERE id_dpto > 1 ORDER BY denom DESC;
+-------------+
| denom       |
+-------------+
| Producción  |
| Personal    |
| Formación   |
| Financiero  |
+-------------+

mysql> SELECT * FROM Usuarios;
+--------+---------+-----------+---------+-------------+---------------------+
| id_usu | cta_usu | nombre    | id_dpto | ecorreo     | fecha_alta          |
+--------+---------+-----------+---------+-------------+---------------------+
|      1 | asualam | Alejandro |       2 | as@mysql.es | 2018-04-01 00:00:00 |
|      2 | asuajim | Antonio   |       2 | sj@mysql.es | 2018-04-02 00:00:00 |
|      3 | slamost | María     |       4 | ms@mysql.es | 2018-04-12 00:00:00 |
|      4 | carmor  | Carmen    |       1 | cm@mysql.es | 2018-04-01 00:00:00 |
|      5 | eumor   | Eugenia   |       5 | em@mysql.es | 2018-04-10 00:00:00 |
|      6 | lumor   | Luis      |       3 | lm@mysql.es | 2018-04-07 00:00:00 |
+--------+---------+-----------+---------+-------------+---------------------+

mysql> SELECT nombre, id_dpto FROM Usuarios ORDER BY id_dpto;
+-----------+---------+
| nombre    | id_dpto |
+-----------+---------+
| Carmen    |       1 |
| Alejandro |       2 |
| Antonio   |       2 |
| Luis      |       3 |
| María     |       4 |
| Eugenia   |       5 |
+-----------+---------+

Crear vistas


Una vista es una consulta que se presenta como una tabla (virtual) que se construye a partir de los datos de una o más tablas relacionadas de una base de datos.

Las vistas tienen la misma estructura que una tabla normal (filas y columnas) con la diferencia de que sólo almacenan la definición de una consulta, no los datos.

mysql> CREATE VIEW Nombres_correos AS SELECT nombre, ecorreo FROM Usuarios;

mysql> CREATE VIEW Usuarios_dptos AS SELECT Usuarios.nombre, Dptos.denom AS departamento FROM Usuarios INNER JOIN Dptos ON Dptos.id_dpto = Usuarios.id_dpto;

 

Consultar datos de una vista


mysql> SELECT * FROM Nombres_correos;
+-----------+-------------+
| nombre    | ecorreo     |
+-----------+-------------+
| Alejandro | as@mysql.es |
| Antonio   | sj@mysql.es |
| María     | ms@mysql.es |
| Carmen    | cm@mysql.es |
| Eugenia   | em@mysql.es |
| Luis      | lm@mysql.es |
+-----------+-------------+

mysql> SELECT * FROM Usuarios_dptos;
+-----------+--------------+
| nombre    | departamento |
+-----------+--------------+
| Carmen    | Comercial    |
| Eugenia   | Financiero   |
| María     | Formación    |
| Luis      | Personal     |
| Alejandro | Producción   |
| Antonio   | Producción   |
+-----------+--------------+

mysql> SELECT * FROM Usuarios_dptos WHERE departamento = "Personal";
+--------+--------------+
| nombre | departamento |
+--------+--------------+
| Luis   | Personal     |
+--------+--------------+

Consultar tablas y vistas


mysql> SHOW TABLES;
+--------------------+
| Tables_in_personal |
+--------------------+
| Dptos              |
| Nombres_correos    |
| Usuarios           |
| Usuarios_dptos     |
+--------------------+

Borrar una vista


mysql> DROP VIEW IF EXISTS Nombres_correos;

 

Actualizar datos de una tabla


mysql> UPDATE Usuarios SET nombre = "José Luis", ecorreo = "jl@mysql.es" WHERE id_usu = 6;

mysql> UPDATE Usuarios SET ecorreo = "produc@mysql.es" WHERE id_dpto = 2;

Rows matched: 2 Changed: 2 Warnings: 0

mysql> SELECT * FROM Usuarios;
+--------+---------+------------+---------+-----------------+---------------------+
| id_usu | cta_usu | nombre     | id_dpto | ecorreo         | fecha_alta          |
+--------+---------+------------+---------+-----------------+---------------------+
|      1 | asualam | Alejandro  |       2 | produc@mysql.es | 2018-04-01 00:00:00 |
|      2 | asuajim | Antonio    |       2 | produc@mysql.es | 2018-04-02 00:00:00 |
|      3 | slamost | María      |       4 | ms@mysql.es     | 2018-04-12 00:00:00 |
|      4 | carmor  | Carmen     |       1 | cm@mysql.es     | 2018-04-01 00:00:00 |
|      5 | eumor   | Eugenia    |       5 | em@mysql.es     | 2018-04-10 00:00:00 |
|      6 | lumor   | José Luis  |       3 | jl@mysql.es     | 2018-04-07 00:00:00 |
+--------+---------+------------+---------+-----------------+---------------------+

Borrar registros de una tabla


El gestor preserva la integridad referencial de la base de datos evitando que se borren registros con claves primarias vinculadas con campos de otras tablas, hasta que estos últimos sean suprimidos:

mysql> DELETE FROM Dptos WHERE id_dpto = 5;

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (personal.Usuarios, CONSTRAINT Usuarios_ibfk_1 FOREIGN KEY (id_dpto) REFERENCES Dptos (id_dpto))

Para que sea posible el borrado anterior:

mysql> DELETE FROM Usuarios WHERE id_dpto = 5;
mysql> DELETE FROM Dptos WHERE id_dpto = 5;

 

Añadir campos a una tabla


Añadir campo al final de la tabla

mysql> ALTER TABLE Dptos ADD telef VARCHAR(15) NOT NULL DEFAULT "900 100 999";

mysql> SELECT * FROM Dptos;
+---------+-------------+-------------+
| id_dpto | denom       | telef       |
+---------+-------------+-------------+
|       1 | Comercial   | 900 100 999 |
|       2 | Producción  | 900 100 999 |
|       3 | Personal    | 900 100 999 |
|       4 | Formación   | 900 100 999 |
+---------+-------------+-------------+

Añadir un campo después de otro

mysql> ALTER TABLE Dptos ADD web VARCHAR(50) AFTER denom;

mysql> SELECT * FROM Dptos;
+---------+-------------+------+-------------+
| id_dpto | denom       | web  | telef       |
+---------+-------------+------+-------------+
|       1 | Comercial   | NULL | 900 100 999 |
|       2 | Producción  | NULL | 900 100 999 |
|       3 | Personal    | NULL | 900 100 999 |
|       4 | Formación   | NULL | 900 100 999 |
+---------+-------------+------+-------------+
Para añadir un campo al principio de la tabla utilizar la claúsula FIRST

 

Borrar campos de una tabla


mysql> ALTER TABLE Dptos DROP web;

 

Cambiar el tipo de un campo


mysql> ALTER TABLE Dptos MODIFY telef CHAR(11);
mysql> DESCRIBE Dptos;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id_dpto | int(11)     | NO   | PRI | NULL    | auto_increment |
| denom   | varchar(50) | NO   | UNI | NULL    |                |
| telef   | char(11)    | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+

Renombrar un campo y cambiar su tipo


mysql> ALTER TABLE Dptos CHANGE telef telefono VARCHAR(11);

mysql> DESCRIBE Dptos;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id_dpto  | int(11)     | NO   | PRI | NULL    | auto_increment |
| denom    | varchar(50) | NO   | UNI | NULL    |                |
| telefono | varchar(11) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

Borrar una tabla


Crear nueva tabla para borrar después
 
mysql> CREATE TABLE Sede (
 id_sede INT NOT NULL AUTO_INCREMENT,
 provincia VARCHAR(20) NOT NULL,
 PRIMARY KEY (id_sede)
);

Mostrar todas las tablas de la base de datos

mysql> SHOW TABLES;
+--------------------+
| Tables_in_personal |
+--------------------+
| Dptos              |
| Sede               |
| Usuarios           |
| Usuarios_dptos     |
+--------------------+

Borrar la tabla 'Sede'

mysql> DROP TABLE IF EXISTS Sede;

 

Índices


Un índice permite consultar datos con más rapidez, acelerar la operación de ordenación y hacer cumplir las restricciones únicas.

Cada índice debe estar asociado con una tabla específica. Un índice se compone de una o más columnas pero todas las columnas de un índice deben estar en la misma tabla. Una tabla puede tener varios índices.

Crear un índice

mysql> CREATE INDEX Usuarios_nombre ON Usuarios(nombre);

Conocér campos claves que pueden se usados en un índice (Key)

mysql> DESCRIBE Usuarios;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id_usu     | int(11)     | NO   | PRI | NULL    | auto_increment |
| cta_usu    | varchar(15) | YES  | UNI | NULL    |                |
| nombre     | varchar(50) | NO   | MUL | NULL    |                |
| id_dpto    | int(11)     | YES  | MUL | NULL    |                |
| ecorreo    | varchar(50) | NO   |     | NULL    |                |
| fecha_alta | datetime    | NO   |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

Comprobar si en una consulta se utiliza un índice

mysql> EXPLAIN SELECT nombre FROM Usuarios;

+----+-------------+----------+--------+-----------------+---------+-------------+
| id | select_type | table    |  type  | key             | key_len | Extra       |
+----+-------------+----------+--------+-----------------+---------+-------------+
|  1 | SIMPLE      | Usuarios | index  | Usuarios_nombre | 52      | Using index |
+----+-------------+----------+--------+-----------------+---------+-------------+

Mostrar los índices de una tabla

mysql> SHOW INDEX FROM Usuarios;

Borrar un índice

mysql> ALTER TABLE Usuarios DROP INDEX Usuarios_nombre;

Crear un índice multicampo

mysql> CREATE INDEX Fecha_nombre ON Usuarios (fecha_alta, nombre);

Crear un índice UNIQUE (sin duplicados)

mysql> CREATE UNIQUE INDEX Cta_usuario ON Usuarios (cta_usu);

 

Exportar base de datos


$ mysqldump -u alejandro -p personal > personal.sql 



Relacionado: Bases de datos MySQL (y MariaDB) con PyMySQL