Capítulo 3: Trabajar con tablas
Algunos enlaces
- ¿Qué es una tabla?
- El formato de los archivos FRM.
- Documentación sobre los tipos de datos de MySQL.
Operaciones sobre tablas
¿Dónde, dentro del sistema de archivos, están las bases de datos?
SHOW VARIABLES LIKE 'datadir';
Creación de la base de datos para pruebas
DROP DATABASE IF EXISTS pruebas;
CREATE DATABASE pruebas;
Creación de una tabla
USE pruebas;
CREATE TABLE persona
(
id INT NOT NULL,
nombre VARCHAR(16) NOT NULL,
apellidos VARCHAR(64) NOT NULL DEFAULT ''
);
Modificación de una tabla
USE pruebas;
ALTER TABLE persona
MODIFY nombre VARCHAR(32) NOT NULL,
ADD edad INT NOT NULL;
Cambio de nombre de una tabla
USE pruebas;
RENAME TABLE persona TO individuo;
Borrado de una tabla
USE pruebas;
DROP TABLE IF EXISTS individuo;
Tipos de tabla
¿Qué tipos de tabla puede utilizar en el servidor actual?
SHOW ENGINES;
Utiliza la siguiente instrucción para ver el tipo de una determinada tabla:
SHOW CREATE TABLE nombre_tabla;
InnoDB
Creación de la tabla:
USE pruebas;
DROP TABLE IF EXISTS cuenta;
CREATE TABLE cuenta
(
idcliente INT NOT NULL,
saldo DOUBLE NOT NULL DEFAULT 0
)
ENGINE = InnoDB;
Inserción de valores iniciales:
USE pruebas;
INSERT INTO cuenta VALUES(212, 220.50);
INSERT INTO cuenta VALUES(555, 1200.00);
Transferencia:
USE pruebas;
UPDATE
cuenta
SET
saldo = saldo + 300
WHERE
idcliente = 212;
UPDATE
cuenta
SET
saldo = saldo - 300
WHERE
idcliente = 555;
Transferencia segura gracias a las transacciones:
USE pruebas;
START TRANSACTION;
UPDATE
cuenta
SET
saldo = saldo + 300
WHERE
idcliente = 212;
UPDATE
cuenta
SET
saldo = saldo - 300
WHERE
idcliente = 555;
COMMIT;
MERGE
Una tabla para guardar citas:
USE pruebas;
CREATE TABLE citas
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
Varias tablas, una por mes, para la misma tarea:
USE pruebas;
CREATE TABLE citas_enero
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_febrero
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_marzo
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_abril
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_mayo
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_junio
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_julio
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_agosto
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_septiembre
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_octubre
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_noviembre
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
CREATE TABLE citas_diciembre
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MyISAM;
Agrupar estas doce tablas en una sola de tipo MERGE
:
USE pruebas;
DROP TABLE IF EXISTS citas;
CREATE TABLE citas
(
id INT NOT NULL,
descripcion VARCHAR(64) NOT NULL,
fecha DATE NOT NULL,
hora TIME NOT NULL
)
ENGINE = MERGE
UNION = (
citas_enero,
citas_febrero,
citas_marzo,
citas_abril,
citas_mayo,
citas_junio,
citas_julio,
citas_agosto,
citas_septiembre,
citas_octubre,
citas_noviembre,
citas_diciembre
);
Inserción en la tabla de un mes:
USE pruebas;
INSERT INTO citas_enero VALUES
(
1,
'Una cita',
'2006-01-07',
'17:00'
);
Consulta en la tabla MERGE
:
USE pruebas;
SELECT * FROM citas;
Tipos de datos
Tipos de texto
Tabla para pruebas:
USE pruebas;
DROP TABLE IF EXISTS texto;
CREATE TABLE texto
(
cadena VARCHAR(32)
);
Inserción de valores:
USE pruebas;
INSERT INTO texto VALUES('d');
INSERT INTO texto VALUES('a');
INSERT INTO texto VALUES('A');
INSERT INTO texto VALUES('b');
Consulta de los registros, por orden alfabético:
USE pruebas;
SELECT
*
FROM
texto
ORDER BY
cadena;
Volver a crear la tabla, pero con una diferencia:
USE pruebas;
DROP TABLE IF EXISTS texto;
CREATE TABLE texto
(
cadena VARCHAR(32) BINARY
);
Volver a insertar los valores:
USE pruebas;
INSERT INTO texto VALUES('d');
INSERT INTO texto VALUES('a');
INSERT INTO texto VALUES('A');
INSERT INTO texto VALUES('b');
Consulta de los registros, por orden alfabético. Ahora el resultado será diferente:
USE PRUEBAS;
SELECT
*
FROM
texto
ORDER BY
cadena;
Un ejemplo de enumeración:
USE pruebas;
DROP TABLE IF EXISTS pelicula;
CREATE TABLE pelicula
(
titulo VARCHAR(64),
soporte ENUM
(
'VHS',
'DVD'
)
);
Inserciones:
USE pruebas;
INSERT INTO
pelicula
VALUES
(
'Alien',
'VHS'
);
INSERT INTO
pelicula
VALUES
(
'TRON',
'DVD'
);
Inserción de un valor no previsto:
USE pruebas;
INSERT INTO pelicula VALUES
(
'Blade Runner',
'VCD'
);
Ejemplo de conjuntos:
USE pruebas;
DROP TABLE IF EXISTS pelicula;
CREATE TABLE pelicula
(
titulo VARCHAR(64),
categoria SET
(
'ciencia-ficción',
'terror',
'thriller'
)
);
Inserciones:
USE pruebas;
INSERT INTO
pelicula
VALUES
(
'Alien',
'ciencia-ficción,terror'
);
INSERT INTO
pelicula
VALUES
(
'Blade Runner',
'ciencia-ficción,thriller'
);
INSERT INTO
pelicula
VALUES
(
'Contact',
'ciencia-ficción'
);
Tipos numéricos
Tabla con un campo de tipo INT
:
USE pruebas;
DROP TABLE IF EXISTS enteros;
CREATE TABLE enteros(entero INT);
Misma tabla, sólo valores sin signo:
USE pruebas;
DROP TABLE IF EXISTS enteros;
CREATE TABLE enteros(entero INT UNSIGNED);
Uso de ZEROFILL
:
USE pruebas;
DROP TABLE IF EXISTS enteros;
CREATE TABLE enteros(
entero INT(4) UNSIGNED ZEROFILL
);
Inserciones de prueba:
USE pruebas;
INSERT INTO enteros values(1);
INSERT INTO enteros values(10);
INSERT INTO enteros values(100);
INSERT INTO enteros values(1000);
Inserción de un valor de más de cuatro dígitos:
USE pruebas;
INSERT INTO enteros VALUES(10000);
Para jugar con los números en coma flotante, crea una tabla de pruebas:
USE pruebas;
DROP TABLE IF EXISTS decimales;
CREATE TABLE decimales(
precio FLOAT(6,2)
);
Inserta algunos valores de prueba:
USE pruebas;
INSERT INTO decimales VALUES(29.99);
INSERT INTO decimales VALUES(30);
INSERT INTO decimales VALUES(199.994);
INSERT INTO decimales VALUES(199.995);
Si realizas una consulta de selección podrás comprobar que el tercer valor que obtiene no es el mismo que insertó. Lo mismo ocurre con el cuarto.
Otro ejemplo, otra tabla:
USE pruebas;
DROP TABLE IF EXISTS decimales2;
CREATE TABLE decimales2
(
precio FLOAT(10,5)
);
Una inserción:
USE pruebas;
INSERT INTO
decimales2
VALUES
(
3835.38000
);
Comprobarás que el valor obtenido en una consulta de selección no coincide con el insertado.
Fechas y horas
Crear una tabla para probar:
USE pruebas;
DROP TABLE IF EXISTS pelicula;
CREATE TABLE pelicula
(
titulo VARCHAR(64),
modificado TIMESTAMP
);
Insertar un registro:
USE pruebas;
INSERT INTO
pelicula(titulo)
VALUES('Alieni');
Comprueba que el valor del campo modificado
ha cambiado, aunque no se ha indicado valor alguno de forma explícita.
Modifica el título para que sea correcto:
USE pruebas;
UPDATE
pelicula
SET
titulo = 'Alien'
WHERE
titulo = 'Alieni';
Podrás comprobar que el valor del campo modificado
es diferente al anterior.