Páginas

viernes, 7 de enero de 2011

Introducción a MySQL: CREATE,ALTER,DROP (DDL)


Buenas Para este segundo artículo de introducción al trabajo con MySQL, hablaremos del lenguaje de definición de datos, mostraremos su aplicación en MySQL, también  veremos las consultas que componen este lenguaje.
El Lenguaje de Definición de Datos (DDL):
Este lenguaje nos permite manejar comandos para definir los objetos de nuestras bases de datos.

Sentencias que Maneja el  DDL

El lenguaje de definición de datos, maneja todas las sentencias que usamos para indicar los datos que vamos a manejar dentro de nuestra base de datos, estos datos serán almacenados en las tablas de nuestra base de datos, las sentencias que utiliza este lenguaje son:
a) CREATE TABLE: Esta sentencia la usamos para como su nombre lo indica la creación de nuestras tablas. La sintaxis de esta sentencia es sencilla  simplemente se coloca la palabra CREATE TABLE seguido del nombre de la tabla luego entre paréntesis los nombres de los campos separados por coma, al lado de cada campo se indica el tipo de dato que este va a contener. Un ejemplo:

CREATE TABLE nombre_tabla(campo1 INT(10),campo2 VARCHAR(20));
Fácil verdad?? Con esta sentencia podemos ir creando nuestras tablas, pero en la definición de la sintaxis indicábamos que se debía de establecer los tipos de datos de cada campo pero cuáles son??
Tipos de Datos
1.- Datos Numéricos: Como su nombre lo indica representan a los campos que contendrán valores numéricos como por ejemplo la edad, precios, etc. y están compuestos por:

1.1.-Enteros:
- TINYINT: es un entero con o sin signo, los valores aceptados son desde 0 a 255 cuando no tiene signo y -127 a 255 cuando se le indica un signo.
-BIT :  Como su nombre lo indica almacena valores que contienen un bit.
- BOOL: En este tipo de campo solo se permiten cero (0) ó uno (1). En algunas versiones se toma como TINYINT(1).
-SMALLINT: En este tipo de datos se representa a un entero corto o pequeño, la capacidad de almacenamiento es de 65535.
- MEDIUMINT: En este tipo de datos se representa a un entero, la diferencia con el SMALLIN es la capacidad ya que este tipo de campo abarca una mayor cantidad de caracteres para guardar, la cual en este caso es de 8388607.
- INTEGER o INT: Representa a un número entero, es más utilizado normalmente para hacer referencia a este tipo de datos, su capacidad de almacenamiento es de 4294967295.
-BIGINT: Es utilizado cuando la capacidad del INT es poca para representar a un entero, su capacidad de almacenamiento es de 18446744073709551615.
1.2 Decimales o Punto Flotante:
-DECIMAL: Como su nombre lo indica permite números decimales dentro de sus valores, la sintaxis del decimal es DECIMAL(M,D), donde M tiene un rango de 1 a 64 y D tiene un rango de 0 a 30, aunque en la declaración se utiliza la coma(,) para separar el entero del decimal cuando se trabaja con los números el punto es el separador del entero y decimal ejemplo: 100.50.
-FLOAT: Es el que se utiliza normalmente para el trabajo con números decimales, ya que este permite una especificación opcional de la precisión, la escala de este tipo de datos va desde 0 a 23, que resulta en una precisión de 4 Bytes.
-DOUBLE: Al igual que el FLOAT trabaja con decimales, el alcance de este es el doble del FLOAT, este tipo de datos tiene una precisión de 8 Bytes, el doble de float y va desde el 24 a 53.
-REAL: Al igual que DOUBLE es tomado con dato de doble precisión es decir de 8 Bytes.
2.- Datos de Fecha y Hora: Como su nombre lo indica son para almacenar datos de tipo temporales (fecha y hora), como por ejemplo la fecha de nacimiento, el horario de una clase, y está compuesto por:
-DATE: En este tipo de datos almacenamos las fechas, el formato que tiene MySQL para guardar este tipo de datos es año-mes-dia (0000-00-00).
-TIME: En este tipo de dato almacenamos las horas que necesitemos en nuestra base de datos el formato es hora:minutos:segundos (00:00:00), normalmente guardado en hora militar, si se desea convertir para mostrarse en AM y PM se puede hacer uso de la función DATE_FORMAT.
-DATETIME: Como su nombre lo indica es una combinación de los dos tipo de datos anteriores, el formato es el siguiente año-mes-dia hora:minuto:segundo (0000-00-00 00:00:00).
-TIMESTAMP: Se muestra en el mismo formato que los campos de tipo DATETIME.
-YEAR: Como su nombre lo indica se utiliza para almacenar años, por defecto la cantidad de dígitos es de 4 aunque puede establecerse que se utilicen dos si se desea almacenar los años en este formato.
3.-Datos de Tipo String o Cadenas de Texto: Este tipo lo de datos lo utilizamos para almacenar las cadenas de texto que necesitemos dentro de nuestra base de datos, como por ejemplo un nombre, apellido etc., dentro de de este tipo de datos tenemos:
-CHAR: Almacena una cadena de caracteres indicando al lado la cantidad que contendrá (CHAR(10) indicaría una cadena de 10 carácteres), la cantidad de carácteres que se puede almacenar en un campo de este tipo va desde 0 hasta 255. 
-VARCHAR: Al igual que CHAR almacenamos cadenas de caracteres, la cantidad se especifica al lado (VARCHAR(10)  indicaría una cadena de 10 carácteres), y se puede almacenar una cantidad de caracteres de 0 a 255.
Pero entonces cual es la diferencia entre CHAR y VARCHAR??
 La diferencia radica en que las cadenas de tipo CHAR cuando guardas un dato rellena con espacios en blanco a la derecha hasta completar la capacidad de la columna y cuando se traen en una consulta se borran, en cambio las cadenas de tipo VARCHAR guardan solo la cantidad de caracteres que se indica en nuestra cadena, acá una tabla comparativa en el tamaño de almacenamiento tomada del manual de MySQL:


Valor
CHAR(4) Almacenamiento necesario VARCHAR(4) Almacenamiento necesario
'' ' ' 4 bytes '' 1 byte
'ab' 'ab ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes


-BLOB:  En este tipo de dato se guarda información binaria, normalmente se utiliza para guardar imágenes, sonidos, entre otros, dentro de este campo existen los TINYBLOB,MEDIUMBLOB,LONGBLOB, la diferencia es la capacidad de almacenamiento entre ellos.

Existen otros tipos de datos dentro de MySQL, solo se hablo de los más conocidos y utilizados, para más información el manual de MySQL es nuestro amigo.

Campos Claves en MySQL

Los campos claves son campos que indicamos para hacer más fáciles nuestras búsquedas ya que se crea una indexación de nuestros datos, dentro de este tipo de campo tenemos:

1.-PRIMARY KEY: Como su nombre lo indica son claves primarias, en palabras sencillas lo que quiere decir esto es que en la indexación de nuestros datos MySQL le da prioridad a este tipo de clave seguido de las claves únicas. Las claves primarias no permiten que haya datos duplicados dentro de este tipo de campo.

2.-UNIQUE: Este tipo de clave como su nombre lo indica no permite que exista duplicidad de datos.

3.-FOREING KEY: Las claves foráneas son aquellas que hacen referencia a la clave primaria de otra tabla, se utilizan para crear relaciones entre ellas, este tipo de clave solo se implementan en MySQL para el motor de almacenamiento InnoDB, se habla de que MyISAM posteriormente soportara este tipo de claves.

Ya conocemos las claves ahora como las implementamos en la creación de nuestras tablas??. La sintaxis es la siguiente:

CREATE TABLE personas (id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, nombre VARCHAR(40) NOT NULL,cedula varchar(20) UNIQUE NOT NULL);

La sentencia que acabamos de colocar crea una tabla llamada personas que contendrá el nombre y la cedula además de un campo auto-incremental que es la clave primaria de esta tabla y una clave única que es la cedula, de manera que no haya repetición de esta, sencillo no??.

Motores de Almacenamiento de MySQL

Cuando creamos las tablas de nuestra base de datos MySQL tiene diferentes tipos de almacenamiento donde podemos los cuales nos permiten realizar acciones dependiendo de cuál sea nuestra necesidad, por defecto las tablas de MySQL tienen el motor de almacenamiento en MyISAM.

A continuación veremos un resumen de los motores de almacenamiento de MySQL:

1.- ISAM: Era el motor por defecto de MySQL en versiones anteriores, maneja tablas no transaccionales.

Características:
a) El máximo tamaño de una tabla es 4GB.
b) Sólo pueden ser definidos 16 índices por tabla.
c) Claves con longitud máxima de 256 bytes.
d) No puede usarse sentencias de respaldo de tablas y restauración de tablas.

Este motor de almacenamiento se considera obsoleto y es poco recomendable su uso, fue reemplazado por el motor MyISAM.

2.- MyISAM: Es el formato por defecto de MySQL, está basado en el código de ISAM, pero tiene otras características que llevaron a  ser su reemplazo.

Características:
a) Todos los datos son almacenados en formato complemento a
dos y el formato de la IEEE de punto flotante.
b) Manejo de tablas no-transaccionales.
c) El máximo número de índice por tablas son 64. El máximo
número de columnas por índices es 16.
d) MyISAM automáticamente actualiza las columnas definidas
como AUTO_INCREMENTO en operaciones NSERT/UPDATE,
incrementado la velocidad en al menos 10%.

3.-INNODB: Este motor de almacenamiento permite a MySQL realizar transacciones (propiedades ACID).

Características:
a) Soporta la definición de claves foráneas (FOREIGN KEY).
b) En una sentencia SELECT puedan mezclarse diferentes tipos de
tablas.
c) Integrada completamente con el servidor MySQL, InnoDB mantiene
su propio buffer pool para mantener datos e índices en memoria
principal
d)Manejo de usuarios concurrentes.
e)Si una actualización falla todos los cambios son revertidos (en un
ambiente no transaccional todos los cambios hechos son
permanentes).
f)Los motores transaccionales proporcionan un mejor desempeño
sobre tablas que tienen muchas actualizaciones concurrentes.
Existen otros motores de almacenamiento en MySQL se nombraron los más utilizados, en lo personal utilizo el motor de almacenamiento InnoDB ya que soporta transacciones y por las características ya expuestas.

Ya conocemos los motores de almacenamiento de MySQL, entonces como hacemos una tabla indicando el motor de nuestra preferencia??.

Como se indico por defecto el motor de almacenamiento de MySQL es MyISAM, si no especificamos el motor a utilizar este tomara este motor automáticamente, pero si deseamos crear una tabla de tipo InnoDB como lo haríamos??

Tomando el ejemplo anterior de personas tendríamos la siguiente sentencia:

CREATE TABLE personas (id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, nombre VARCHAR(40) NOT NULL,cedula varchar(20) UNIQUE NOT NULL) ENGINE = InnoDB;

Como podemos observar para indicar el motor de almacenamiento utilizamos la palabra ENGINE, también podemos indicarlo mediante la palabra TYPE¸ al igual que ENGINE solo debemos de indicar el motor de la base de datos a utilizar.

Creación de Claves Foráneas en MySQL

Como se indico en los motores de almacenamiento el motor InnoDB es el que soporta claves foráneas, aunque se pueden crear en todos los motores solo tiene sentido para este tipo de almacenamiento, por lo que en la creación de tablas que utilicen este tipo de clave debemos crearlas InnoDB, veamos un ejemplo de la creación de una clave foránea:

Tabla persona:
CREATE TABLE personas (id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, nombre VARCHAR(40) NOT NULL,cedula varchar(20) UNIQUE NOT NULL) ENGINE = INNODB;

Tabla factures:
CREATE TABLE facturas( id INT(11) AUTO_INCREMENT NOT NULL,precio FLOAT NOT NULL,descripcion VARCHAR(40) NOT NULL,persona_id INT(11) NOT NULL,PRIMARY KEY(id), CONSTRAINT claveforanea FOREIGN KEY(clave_foranea) REFERENCES personas(id)) ENGINE = INNODB;       
                                                                               
Como podemos notar la primera tabla es la misma que habíamos trabajado, creamos una tabla profesión que va a estar relacionada con otra llamada factura, la relación la establece el id de personas, entonces que hicimos creamos la clave foránea la cual le colocamos el nombre claveforanea (ahí puede ser cualquier nombre) en el campo de la tabla facturas llamado persona_id y dijimos a cual tabla hace referencia es decir al campo id de personas sencillo no?? Además le indicamos que borrara en cascada es decir si se borra un dato de personas se borra todo lo que haya en factura que pertenezca a esa persona, veamos un ejemplo:

Llenamos la tabla personas:
INSERT INTO personas (nombre,cedula) VALUES ('carlos',’123456’);
INSERT INTO personas (nombre,cedula) VALUES (‘juan','987456');
INSERT INTO personas (nombre,cedula) VALUES (‘pedro','456789');

Llenemos la tabla factura:
INSERT INTO facturas (precio,descripcion,persona_id) VALUES ('100','articulos de oficina',1);
INSERT INTO facturas (precio,descripcion,persona_id) VALUES ('200','juguetes',2);
INSERT INTO facturas (precio,descripcion,persona_id) VALUES ('100','papeleria,3);

Con estas consultas llenamos las tablas, al momento de borrar un dato de persona se borrara automáticamente en factura ejemplo

DELETE FROM personas WHERE id = 1;

Automáticamente se borraran todas las facturas que tenía esta persona.
Las sentencias de inserción, actualización y borrado que se tocaron en este tema se explicaran cuando se hable del lenguaje de manipulación de datos (DML). La creación de otros objetos como las vistas e índices se verá más adelante cuando se haya trabajado con el lenguaje DML.

Con el comando CREATE también podemos crear bases de datos, asi como vistas e índices que se nombraron anteriormente, para crear una base de datos sencillamente se utiliza la siguiente sentencia:

CREATE DATABASE nombre_base_de_datos;

Fácil no?? Y para indicar la base de datos a utilizar sencillamente usamos el comando USE seguido del nombre de la base de datos ejemplo:

CREATE DATABASE test;
USE TEST;

Luego procedemos a crear nuestras tablas.

b) ALTER TABLE: Esta sentencia se utiliza para modificar la estructura de una tabla ya existente, mediante de esta podemos añadir, borrar y modificar los campos de nuestra tabla. Veamos cómo podemos hacerlo:

-Renombrar Tabla: Se utiliza para cambiar el nombre a una tabla la sintaxis es:

ALTER TABLE nombre_actual RENAME TO nuevo_nombre;

-Añadir un campo (ADD COLUMN): Como su nombre lo indica nos permite añadir un campo a una tabla que ya habíamos creado, veamos un ejemplo de su uso:

ALTER TABLE personas ADD COLUMN edad INT(3) NOT NULL;

Como podemos observar lo que se hizo fue indicar la tabla a modificar se indico el comando ADD COLUMN el nombre del campo y el tipo de dato tal y cual como se hace en CREATE TABLE, fácil no?? Si deseamos darle una ubicación especifica antes de otro campo de nuestra tabla sencillamente indicaríamos 

ALTER TABLE tabla ADD COLUMN campo VARCHAR( 20 ) NOT NULL FIRST;

Con esta sentencia sencillamente indicaríamos que el campo nuevo estará al comienzo de una tabla.

ALTER TABLE tabla ADD COLUMN campo INT(20) NOT NULL AFTER `campo_anterior_al_nuevo`;

Con esta sentencia indicaríamos que el campo nuevo estará después del campo que se especifique en campo_anterior_al_nuevo.
Fácil no??

-Eliminar un Campo (DROP): Con esta sentencia sencillamente eliminamos un campo de una tabla, veamos un ejemplo:

ALTER TABLE tabla DROP campo_a_borrar;

-Modificar un Campo (CHANGE):Con esta sentencia modificamos un campo de una tabla la sintaxis es la siguiente 

ALTER TABLE tabla CHANGE campo_actual campo_nuevo INT(2) NOT NULL;

Si nos fijamos la sentencia nos pide un campo actual que es el nombre del campo, campo nuevo acá se coloca el nombre nuevo del campo, si no se desea cambiar el nombre se coloca el mismo que en campo actual, luego sencillamente se indica el tipo de dato como se indico en la sentencia CREATE TABLE.

-Agregar KEY: Con esta sentencia se añade una clave a una tabla. Su sintaxis es sencilla:

PRIMARY KEY:
ALTER TABLE tabla ADD PRIMARY KEY(campo_que_sera_clave_primaria);

UNIQUE:
ALTER TABLE tabla ADD UNIQUE (
campo_que_sera_clave_unica)

FOREIGN KEY
ALTER TABLE profesion ADD CONSTRAINT nombre_clave_foranea FOREIGN KEY (campo_clave_foranea) REFERENCES table_referencia(campo_referencia);

-Borrar Key: Con este tipo de sentencia sencillamente lo que hacemos es borrar claves que contengan las tablas.

ALTER TABLE tabla DROP PRIMARY KEY;

ALTER TABLE tabla DROP INDEX campo_indice;

ALTER TABLE nombretabla DROP FOREIGN KEY nombre_clave_foranea;  

Estas son algunas de las acciones que se pueden hacer al momento de modificar una tabla para más información tenemos el manual de MySQL.

c) DROP TABLE: Se utiliza para borrar una tabla de una base de datos su sintaxis es la siguiente:

DROP TABLE nombre_tabla;

Al igual que con la sentencia CREATE la sentencia DROP también nos permite borrar base de datos, vistas e índices la sintaxis es igual a la de las tablas pero indicando lo que se desea borrar, con las vistas lo veremos cuando hablemos de estas en un próximo articulo.
Bueno eso es todo por este artículo espero sea de agrado y sirva a las personas que leen este blog dedicado a el desarrollo web, cualquier crítica o sugerencia es aceptada, hasta una próxima entrada saludos

No hay comentarios:

Publicar un comentario