Capítulo 3: Trabajar con tablas

6 minuto(s) de lectura

Algunos enlaces

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.

Actualizado: