[anterior]
[home]
[siguiente]
2.4. SQL - Lenguaje de consulta en BD relacionales
SQL ("Structured Query Language") es un lenguaje para realizar consultas en BD relacionales. Fue desarrollado por IBM, y después de algunas modificaciones fue estandarizado en 1986.
SQL usa los términos tabla, fila y columna para relación, tupla y atributo, respectivamente.
Un schema SQL es identificado por un nombre de schema, e incluye un identificador de autorización que indica el usuario dueño del schema, así como los descriptores para cada elemento en el schema. Los elementos del schema incluyen las tablas, vistas, dominios y otros constructores que describen el schema. La instrucción CREATE SCHEMA es usada para crear un nuevo schema. Por ejemplo, la siguiente instrucción crea un schema llamado COMPAÑIA, cuyo dueño es JPérez:
CREATE SCHEMA COMPAÑIA AUTHORIZATION JPérez;
La instrucción CREATE TABLE es usada para especificar una nueva relación, dándole un nombre y especificando sus atributos y restricciones. A cada atributo se le da un nombre, un tipo de datos (para especificar su dominio de valores) y opcionalmente algunas restricciones. De este modo se especifican las restricciones de integridad RI definidas en la sección anterior.
El siguiente ejemplo muestra las instrucciones de creación de datos en SQL para el ejemplo mostrado en la sección anterior.
CREATE TABLE EMPLEADO
( NPILA | VARCHAR(15) |
NOT NULL, |
APPAT | VARCHAR(15) | NOT NULL, |
APMAT | VARCHAR(15) | NOT NULL, |
RUT | VARCHAR(10) | NOT NULL, |
FNAC | DATE, | |
DIRECCION | VARCHAR(30), | |
SEXO | CHAR, | |
SUELDO | DECIMAL(5,2), | |
RUTSUPERV | VARCHAR(10), | |
NDEPTO | INT | NOT NULL, |
PRIMARY KEY (RUT),
FOREIGN KEY (RUTSUPERV) REFERENCES EMPLEADO(RUT),
FOREIGN KEY (NDEPTO) REFERENCES DEPARTAMENTO(DNUMERO));
CREATE TABLE DEPARTAMENTO
( DNOMBRE | VARCHAR(15) |
NOT NULL, |
DNUMERO | INT | NOT NULL, |
RUTGERENTE | VARCHAR(10) | NOT NULL, |
GERFECHAINIC | DATE, | |
PRIMARY KEY (DNUMERO),
UNIQUE (DNOMBRE),
FOREIGN KEY (RUTGERENTE) REFERENCES EMPLEADO(RUT));
CREATE TABLE UBICACIONES_DEPTO
( DNUMERO | INT |
NOT NULL, |
DUBICACION | VARCHAR(15) | NOT NULL, |
PRIMARY KEY (DNUMERO, DUBICACION),
FOREIGN KEY (DNUMERO) REFERENCES DEPARTAMENTO(DNUMERO));
CREATE TABLE PROYECTO
( PNOMBRE | VARCHAR(15) |
NOT NULL, |
PNUMERO | INT | NOT NULL, |
PUBICACION | VARCHAR(15), | |
DNUM | INT | NOT NULL, |
PRIMARY KEY (PNUMERO),
UNIQUE (PNOMBRE),
FOREIGN KEY (DNUM) REFERENCES DEPARTAMENTO(DNUMERO));
CREATE TABLE TRABAJA_EN
( ERUT | VARCHAR(10) |
NOT NULL, |
PNO | INT | NOT NULL, |
HORAS | DECIMAL(3,1) | NOT NULL, |
PRIMARY KEY (ERUT, PNO),
FOREIGN KEY (ERUT) REFERENCES EMPLEADO(RUT),
FOREIGN KEY (PNO) REFERENCES PROYECTO(PNUMERO));
CREATE TABLE CARGA
( ERUT | VARCHAR(10) |
NOT NULL, |
NOMBRE_CARGA | VARCHAR(15) | NOT NULL, |
SEXO | CHAR, | |
FNAC | DATE, | |
PARENTESCO | VARCHAR(8), | |
PRIMARY KEY (ERUT, NOMBRE_CARGA),
FOREIGN KEY (ERUT) REFERENCES EMPLEADO(RUT));
También se puede agregar explícitamente el nombre del schema a cada tabla, separado por un punto. Por ejemplo:
CREATE TABLE COMPAÑIA.EMPLEADO ...
Esto hace que la tabla EMPLEADO sea parte del schema COMPAÑIA.
Los tipos de datos disponibles para los atributos incluyen: numérico, tira de caracteres, caracter, fecha y hora. Los tipos numéricos pueden incluir números enteros de varios tamaños (INT y SMALLINT), números reales de varias precisiones (FLOAT, REAL, DOUBLE PRECISION). Además se pueden declarar números con formato, usando DECIMAL(i,j). Las tiras de caracteres pueden ser de largo fijo (CHAR(n)) o de largo variable (VARCHAR(n), donde n es el máximo número de caracteres). La fecha tiene 10 posiciones, típicamente AAAA-MM-DD. La hora tiene al menos 8 posiciones, típicamente HH:MM:SS. Solamente fechas y horas válidas son permitidas en las implementaciones de SQL.
En SQL es posible especificar directamente el tipo de dato para cada atributo, como se mostró en el ejemplo anterior. Pero también sepueden declarar dominios, y usar el nombre de éstos. Esto facilita hacer cambios enlos tipos de datos (cambiando sólo el dominio y no cada dato declarado). Por ejemplo, podemos crear el dominio TIPO_RUT con la siguiente instrucción:
CREATE DOMAIN TIPO_RUT AS VARCHAR(10);
A partir de ahora, podemos usar TIPO_RUT en lugar de VARCHAR(10), por ejemplo en los atributos RUT, RUTSUPERV, RUTGERENTE y ERUT del ejemplo anterior.
Debido a que SQL permite el "NULL" (nulo) como valor de sus atributos, es necesario especificar la restricción "NOT NULL" para los atributos que no permiten este valor (por violaciones de integridad). Esta restricción siempre debe ser especificada para los atributos que son llaves primarias en cada relación.
Es posible definir un valor por defecto para un atributo agregando la cláusula DEFAULT "valor" en la definición del atributo.
La cláusula PRIMARY KEY especifica uno o más atributos que forman la llave primaria de la relación. La cláusula UNIQUE especifica llaves alternas. La integridad de referencia es especificada a través de la cláusula FOREIGN KEY.
Como se discutió en secciones anteriores, las restricciones de integridad referencial pueden ser violadas cuando las tuplas son insertadas o borradas, o cuando se cambia el valor de un atributo que es llave foránea. Al crear el schema es posible especificar las acciones a ser tomadas cuando una restricción de integridad referencial es violada, ya sea por borrado de una tupla referenciada en otra tabla, o por modificación del valor de una llave primaria referenciada en otra tabla. Estas acciones son: ON DELETE (cuando la tupla se borra) y ON UPDATE (cuando la tupla se modifica), que pueden tener las opciones: SET NULL (ponga en nulo), CASCADE (actualice todas las referencias "en cascada"), y SET DEFAULT (ponga el valor por defecto). Por ejemplo:
CREATE TABLE EMPLEADO
( ...,
NDEPTO INT NOT NULL DEFAULT 1,
CONSTRAINT EMPLP
PRIMARY KEY RUT,
CONSTRAINT RUTSUPLF
FOREIGN KEY (RUTSUPERV) REFERENCES EMPLEADO(RUT)
ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT NDEPTOLF
FOREIGN KEY (NDEPTO) REFERENCES DEPARTAMENTO(DNUMERO)
ON DELETE SET DEFAULT ON UPDATE CASCADE );
En el ejemplo anterior, si la tupla de un empleado supervisor es borrada, el valor de RUTSUPERV es puesto en nulo (NULL) para todas las tuplas de empleados que referencian al empleado de la tupla borrada. Además, si el valor de RUT es modificado para un empleado supervisor (por ejemplo porque fue ingresado incorrectamente), el nuevo valor es actualizado "en cascada" en RUTSUPERV para todos los empleados que referencian la tupla modificada de este supervisor.
En el caso de NDEPTO, éste es puesto en 1 (el valor declarado por defecto) si la tupla correspondiente a ese número de departamento es borrada de la tabla de DEPARTAMENTO, y es actualizado en cascada (en toda la tabla) cuando la tupla correspondiente en DEPARTAMENTO es actualizada.
A las restricciones se les puede dar nombre usando la palabra CONSTRAINT.
Para borrar un schema completo se usa la instrucción DROP SCHEMA, con dos opciones: CASCADE o RESTRICT. Por ejemplo, para borrar el schema de base de datos COMPAÑIA y todas sus tablas, dominios y otros elementos, se usa la opción CASCADE:
DROP SCHEMA COMPAÑIA CASCADE;
Si en la instrucción anterior se reemplaza la opción CASCADE por RESTRICT, el schema es borrado solamente si no tiene elementos. En caso de que el schema tenga algún elemento, el borrado no es ejecutado.
Una relación o tabla puede ser borrada del schema de BD usando la instrucción DROP TABLE. Por ejemplo, si la relación CARGA con información de los dependientes de los empleados no va a ser utilizada más en la BD COMPAÑIA, se puede borrar de la siguiente manera:
DROP TABLE CARGA CASCADE;
Si la opción RESTRICT es usada en lugar de CASCADE, la tabla es borrada solamente si ésta no es referenciada en ninguna restricción (por ejemplo como llave foránea en otra tabla). Con la opción CASCADE todas las restricciones que referencian esta tabla, son borradas automáticamente del schema, junto con la tabla.
La definición de una tabla puede ser modificada usando la instrucción ALTER TABLE. Con esta instrucción es posible agregar o borrar atributos (columnas), cambiar la definición de una columna, y agregar o borrar restricciones. Por ejemplo, para agregar un atributo con el puesto de los empleados de la tabla EMPLEADO, se usa:
ALTER TABLE COMPAÑIA.EMPLEADO ADD PUESTO VARCHAR(12);
Para borrar una columna se puede usar CASCADE o RESTRICT. Con CASCADE todas las restricciones son borradas automáticamente del schema, junto con la columna. Por ejemplo:
ALTER TABLE COMPAÑIA.EMPLEADO DROP DIRECCION CASCADE,
Si en la instrucción anterior se usa la opción RESTRICT en lugar de CASCADE, el atributo DIRECCION es borrado solamente si ninguna restricción lo referencia.
También es posible borrar una cláusula por defecto así como definir una nueva. Por ejemplo:
ALTER TABLE COMPAÑIA.EMPLEADO ALTER NDEPTO DROP DEFAULT;
ALTER TABLE COMPAÑIA.EMPLEADO ALTER NDEPTO SET DEFAULT "5";
Finalmente, se pueden borrar o agregar restricciones en una tabla. Para borrar una restricción ésta debe tener un nombre (dado con CONSTRAINT). Por ejemplo, para borrar la restricción NDEPTOLF de la tabla EMPLEADO:
ALTER TABLE COMPAÑIA.EMPLEADO DROP CONSTRAINT NDEPTOLF CASCADE;
[anterior]
[home]
[siguiente]