Lenguaje de Definición de Datos (DDL)

El lenguaje de definición de datos (DDL por sus siglas en inglés) es la parte de SQL para crear, modificar o destruir los elementos básicos de una base de datos relacional.

Bases de Datos

Podemos definir a una base de datos como una colección organizada de información relacionada. Es una colección autodescriptiva de registros integrados. Es autodescriptiva en el sentido en que la base de datos contiene la descripción de su propia esctructura (metadatos - metadata). Es integrada porque incluye las relaciones entre sus datos incluyendo los datos mismos. Una base de datos se puede crear con el comando CREATE DATABASE, especificando el nombre de la base de datos. Después de crear la tabla se puede empezar a crear tablas dentro de ella. En algún momento la base de datos se volverá inútil u obsoleta, por lo que se puede eliminar con el comando DROP DATABASE.

Tablas

Una tabla es un arreglo bidimensional constituído por registros (filas) y campos (columnas). Para crear una tabla se utiliza el comando CREATE TABLE , especificando el nombre de la tabla, así como el nombre y tipo de cada uno de los campos que conforman la tabla. Después de crear la tabla se puede empezar a llenar la información en la tabla. Si los requerimientos cambian, se puede modificar la estructura de la tabla con el comando ALTER TABLE . En algún momento la tabla se volverá inútil u obsoleta, por lo que se puede eliminar con el comando DROP TABLE.

Los campos de las tablas se pueden acceder con la sintaxis NOMBRE_DE_TABLA.NOMBRE_DE_CAMPO.

Ejemplos:

CREATE TABLE alumno(
    num_cuenta   INTEGER,
    nombre       VARCHAR(40),
    sexo         VARCHAR(1),
    direccion    VARCHAR(255),
    ciudad       VARCHAR(25),
    estado       VARCHAR(25),
    pais         VARCHAR(10),
    carrera      SMALLINT,
    inicio       DATE,
    semestre     VARCHAR(15);
);

ALTER TABLE alumno
    ADD COLUMN colonia VARCHAR(40);

ALTER TABLE alumno
    CHANGE num_cuenta num_cuenta VARCHAR(15);

ALTER TABLE alumno
    DROP COLUMN semestre d;

ALTER TABLE alumno
    CHANGE inicio fecha_inicio DATE;

DROP TABLE alumno

Vistas

En ocasiones se necesita obtener información específica de una tabla y no toda la información de una tabla, sino que solamente algunos campos. Ese es el propósito de las vistas. Una vista es una tabla virtual que no tiene existencia física en la base de datos. La definición de la vista solamente existe en los metadatos de la base de datos, pero los datos realmente provienen de las tablas de las cuales se deriva la viasta. Los datos que contienen las vistas no se encuentran duplicados.

Se pueden crear vistas con datos de una o más tablas.

Ejemplo:

CREATE VIEW alumno_iec AS
    SELECT num_cuenta, alumno FROM alumno WHERE alumno.carrera=2301;

Dominios

Es el conjunto de todos los valores que puede asumir un campo.

Ejemplo:

CREATE DOMAIN sexos VARCHAR(10)
    CHECK (sexo IN ('Masculino', 'Femenino'));

Restricciones

Las restricciones (constrains) son mecanismos para asegurar que el valor a guardar entre dentro del dominio de un campo. Es una regla que el SGBD se encarga de hacer cumplir. Existen tres tipos:

  • Restricciones en columnas
  • Restricciones en tablas
  • Aserciones (assertions)


Las cuales afectan a más de una tabla.

Ejemplo:

CREATE TABLE alumno(
    num_cuenta   INTEGER NOT NULL,
    nombre       VARCHAR(40),
    sexo         VARCHAR(1),
    direccion    VARCHAR(255),
    ciudad       VARCHAR(25),
    estado       VARCHAR(25),
    pais         VARCHAR(10),
    carrera      SMALLINT CHECK (carrera BETWEEN 0 AND 9999),
    inicio       DATE
);

Llaves

Como ya se ha mencionado anteriormente, una llave es un atributo o una combinación de atributos que identifican de manera única a un registro dentro de una tabla.

A veces, un sólo campo no puede garantizar unicidad, por lo que en esos casos se utiliza una llave compuesta (composite key) que es una combinación de campos que garantiza unicidad.

Ejemplo:

Existen dos tipos de llaves:

  • Llaves primarias (Primary key)
  • Llaves externas (Foreign key)

Una llave externa es uno o más campos en una tabla que corresponden o hacen referencia a una llave primaria en otra tabla. Una llave externa no necesita ser única, pero se debe identificar de manera única en la tabla a la que hace referencia.

CREATE TABLE alumno(
    num_cuenta   INTEGER NOT NULL,
    nombre       VARCHAR(40),
    sexo         VARCHAR(1),
    direccion    VARCHAR(255),
    ciudad       VARCHAR(25),
    estado       VARCHAR(25),
    pais         VARCHAR(10),
    carrera      SMALLINT CHECK (carrera BETWEEN 0 AND 9999),
    inicio       DATE,
    PRIMARY KEY(num_cuenta)
);

CREATE TABLE adeudos(
    folio       INTEGER,
    cantidad    FLOAT,
    num_cuenta  INTEGER,
    CONSTRAINT num_cuenta_fk FOREIGN KEY (num_cuenta)
    REFERENCES alumno(num_cuenta),
    PRIMARY KEY(folio)
);

Índices

La información en las tablas se encuentra en el mismo orden en el que se fue agregando dicha información, el cual puede ser muiy distinto al orden en que se quiere procesar los datos. Al hacer una consulta, la información se busca de manera secuencial, así que mientras más registros haya, mayor será el tiempo en realizar la búsqueda. El tiempo de procesamiento de una tabla sin índices es proporcional a N^2, en donde N es el número de registros.

Al agregar un índice, el tiempo de procesamiento para la misma operación es proporcional a N.

Un índice (index) es una tabla de apuntadores donde cada registro apunta a un registro correspondiente en la tabla de datos. Se pueden definir índices de cualquier forma en que se quiera acceder los datos. Si se hacen cambios en los datos, solamente es necesario actualizar los índices, que es much más rápido que ordenar la tabla completa. Afortunadamente, esta operación la realiza el SGBD automáticamente cada vez que se agregan o se actualizan los datos. Este proceso toma un tiempo un poco mayor que el que ocuparía la operación en condiciones normales.

Después de crear un índice, la creación agrega un costo en rendimiento al sistema que alenta un poco las operaciones. Se debe ponderar esta carga en el sistema con la ganancia en rapidez al acceder los registros. La efectividad de los índices también depende de la implementación.

Ejemplos:

CREATE INDEX part_of_name ON customer (name(10));

CREATE TABLE adeudos(
    folio       INTEGER,
    cantidad    FLOAT,
    num_cuenta  INTEGER,
    CONSTRAINT num_cuenta_fk FOREIGN KEY (num_cuenta)
    REFERENCES alumno(num_cuenta),
    PRIMARY KEY(folio),
    KEY index_folio (num_cuenta)
);