Está en la página 1de 40

Bases de datos II

SQL Avanzado.

Es una herramienta para la organización, gestión, y recuperación de los datos


almacenados en base de datos informáticas. El acrónimo sql es la
abreviatura STRUCTURTED QUERY LENGUAGE (lenguaje estructurado de
consultas).Por motivos históricos sql suele pronunciar “s icuel”

SQL es un lenguaje que se utiliza para interactuar con base datos de hecho ,
sql trabaja con un tipo especifico de base de datos denominado base de datos
relacionales .

Si el sistema informático se halla en una empresa , pude que la base de


datos almacene datos de inventario , de producción , de ventas o de
nominas . En una computadora personal puede que la base de datos
almacenara datos sobre los cheques emitidos listas de personas y de sus
números de teléfono o de datos extra dos de datos se denomina data base
data base managment system cuyas siglas en ingles son DBMS, sistema
gestor de base de datos

Conceptos básicos de SQL


DEFINICION DE LOS DATOS

SQL permite que el usuario defina la estructura y la organización de los datos


almacenados y las relaciones entre los elementos de datos almacenados.

RECUPERACION DE LOS DATOS

SQL permite que el usuario o un programa de aplicación recuperen de la base


de datos los datos almacenados y los emplee.

MANIPULACION DE LOS DATOS


SQL permite que el usuario o un programa de aplicación actualicen la base de
datos añadiendo datos nuevos, eliminando datos antiguos y modificando los
datos almacenados previamente

CONTROL DE ACCESO

SQL puede utilizarse para restringirla capacidad del usuario para recuperar
añadir y modificar datos, protegiendo así los datos almacenados contra los
accesos no utilizados

COMPORTAMIENTO DE LOS DATOS

SQL se utiliza para coordinar el comportamiento de datos entre usuarios


concurrentes asegurando así que no interfieran entre si.

INTREGIDAD DE LOS DATOS

SQL define restricciones de integridad en la base de datos protegiéndola así el


deterioro debido a las actualizaciones inconsistentes por los fallos del sistema

1. SQL es un lenguaje de administración de bases de datos


2. SQL es un lenguaje cliente / servidor
3. SQL es un lenguaje de acceso a datos por internet
4. SQL es un lenguaje de bases de datos distribuidas
5. SQL es un lenguaje de pasarelas de bases de datos
6. SQL es un lenguaje interactivo de consultas
7. SQL es un lenguaje de programación d base datos

Consultas simples
SELECT

Empezaremos por estudiar la sentencia SELECT, que permite recuperar datos de una o varias
tablas. La sentencia SELECT es con mucho la más compleja y potente de las sentencias SQL.
Empezaremos por ver las consultas más simples, basadas en una sola tabla.

Esta sentencia forma parte del DML (lenguaje de manipulación de datos), en este tema veremos
cómo seleccionar columnas de una tabla, cómo seleccionar filas y cómo obtener las filas
ordenadas por el criterio que queramos.

El resultado de la consulta es una tabla lógica, porque no se guarda en el disco sino que está en
memoria y cada vez que ejecutamos la consulta se vuelve a calcular.
Cuando ejecutamos la consulta se visualiza el resultado en forma de tabla con columnas y filas,
pues en la SELECT tenemos que indicar qué columnas queremos que tenga el resultado y qué
filas queremos seleccionar de la tabla origen.

FROM

Con la cláusula FROM indicamos en qué tabla tiene que buscar la información. En este capítulo
de consultas simples el resultado se obtiene de una única tabla. La sintaxis de la cláusula es:

FROM especificación de tabla

Una especificación de tabla puede ser el nombre de una consulta guardada (las que aparecen en
la ventana de base de datos), o el nombre de una tabla que a su vez puede tener el siguiente
formato:

Alias tabla es un nombre de alias, es como un segundo nombre que asignamos a la tabla, si en
una consulta definimos un alias para la tabla, esta se deberá nombrar utilizando ese nombre y no
su nombre real, además ese nombre sólo es válido en la consulta donde se define. El alias se
suele emplear en consultas basadas en más de una tabla que veremos en el tema siguiente. La
palabra AS que se puede poner delante del nombre de alias es opcional y es el valor por defecto
por lo que no tienen ningún efecto.

Ejemplo: SELECT ......FROM oficinas ofi ; equivalente a SELECT ......FROM oficinas AS ofi esta
sentencia me indica que se van a buscar los datos en la tabla oficinas que queda renombrada en
esta consulta con ofi.

En una SELECT podemos utilizar tablas que no están definidas en la base de datos (siempre que
tengamos los permisos adecuados claro), si la tabla no está en la base de datos activa, debemos
indicar en qué base de datos se encuentra con la cláusula IN.
En la cláusula IN el nombre de la base de datos debe incluir el camino completo, la extensión
(.mdb), y estar entre comillas simples

La lista de columnas que queremos que aparezcan en el resultado es lo que


llamamos lista de selección y se especifica delante de la cláusula FROM.
Utilización del *

Se utiliza el asterisco * en la lista de selección para indicar 'todas las columnas de la tabla'.
Tiene dos ventajas:

Evitar nombrar las columnas una a una (es más corto).

Si añadimos una columna nueva en la tabla, esta nueva columna saldrá sin tener que modificar la
consulta.
Se puede combinar el * con el nombre de una tabla (ej. oficinas.*), pero esto se utiliza más cuando
el origen de la consulta son dos tablas.

Lista todos los datos de las oficinas:

SELECT * FROM oficinas


o bien
SELECT oficinas.* FROM oficinas

Columna tablas de origen

Las columnas se pueden especificar mediante su nombre simple (nbcol) o su nombre cualificado
(nbtabla.nbcol, el nombre de la columna precedido del nombre de la tabla que contiene la
columna y separados por un punto).
El nombre cualificado se puede emplear siempre que queramos y es obligatorio en algunos casos
que veremos más adelante.
Cuando el nombre de la columna o de la tabla contiene espacios en blanco, hay que poner el
nombre entre corchetes [ ] y además el número de espacios en blanco debe coincidir. Por ejemplo
[codigo de cliente] no es lo mismo que [ codigo de cliente] (el segundo lleva un espacio en blanco
delante de código)

Alias de columna

Cuando se visualiza el resultado de la consulta, normalmente las columnas toman el nombre que
tiene la columna en la tabla, si queremos cambiar ese nombre lo podemos hacer definiendo un
alias de columna mediante la cláusula AS será el nombre que aparecerá como título de la columna

SELECT idfab AS fabricante, idproducto, descripcion


Columnas calculadas

Además de las columnas que provienen directamente de la tabla origen, una consulta SQL puede
incluir columnas calculadas cuyos valores se calculan a partir de los valores de los datos
almacenados.

Para solicitar una columna calculada, se especifica en la lista de selección una expresión en vez de
un nombre de columna. La expresión puede contener sumas, restas, multiplicaciones y divisiones,
concatenación & , paréntesis y también funciones predefinidas).

Ordenación de las filas ORDER BY

Para ordenar las filas del resultado de la consulta, tenemos la cláusula ORDER BY.

Con esta cláusula se altera el orden de visualización de las filas de la tabla pero en ningún caso
se modifica el orden de las filas dentro de la tabla. La tabla no se modifica.

Podemos indicar la columna por la que queremos ordenar utilizando su nombre de columna
(nbcolumna) o utilizando su número de orden que ocupa en la lista de selección (Nºcolumna).

Ejemplo:
SELECT nombre, oficina, contrato
FROM empleados
ORDER BY oficina

es equivalente a

SELECT nombre, oficina, contrato


FROM empleados

ORDER BY 2

Por defecto el orden será ascendente (ASC) (de menor a mayor si el campo es numérico, por
orden alfabético si el campo es de tipo texto, de anterior a posterior si el campo es de tipo
fecha/hora, etc

SELECT nombre, numemp, oficinarep


FROM empleados
ORDER BY nombre
Obtiene un listado alfabético de los empleados.

Las cláusulas DISTINCT / ALL

Al incluir la cláusula DISTINCT en la SELECT, se eliminan del resultado las repeticiones de filas.
Si por el contrario queremos que aparezcan todas las filas incluidas las duplicadas, podemos
incluir la cláusula ALL o nada, ya que ALL es el valor que SQL asume por defecto.
Por ejemplo queremos saber los códigos de los directores de oficina.

SELECT dir FROM oficinas


SELECT ALL dir FROM oficinas

Lista los códigos de los directores de las oficinas. El director 108 aparece en cuatro oficinas, por lo
tanto aparecerá cuatro veces en el resultado de la consulta.

SELECT DISTINCT dir FROM oficinas

En este caso el valor 108 aparecerá una sola vez ya que le decimos que liste los distintos valores
de directores

La cláusula WHERE
La cláusula WHERE selecciona unicamente las filas que cumplan la condición de selección
especificada.

En la consulta sólo aparecerán las filas para las cuales la condición es verdadera (TRUE),

La condición de selección puede ser cualquier condición válida o combinación de condiciones


utilizando los operadores NOT (no) AND (y) y OR (ó). En ACCESS2000 una cláusula WHERE
puede contener hasta 40 expresiones vinculadas por operadores lógicos AND y OR. Si quieres ver
cómo funcionan los operadores lógicos

SELECT nombre
FROM empleados
WHERE oficina = 12 AND edad > 30

Lista el nombre de los empleados de la oficina 12 que tengan más de 30 años. (oficina igual a 12 y
edad mayor que 30)

Valor nulo (IS NULL)

Una condición de selección puede dar como resultado el valor verdadero TRUE, falso FALSE o
nulo NULL.

Cuando una columna que interviene en una condición de selección contiene el valor nulo, el
resultado de la condición no es verdadero ni falso, sino nulo, sea cual sea el test que se haya
utilizado.

Por eso si queremos listar las filas que tienen valor en una determinada columna, no podemos
utilizar el test de comparación, la condición oficina = null devuelve el valor nulo sea cual sea el
valor contenido en oficina. Si queremos preguntar si una columna contiene el valor nulo debemos
utilizar un test especial, el test de valor nulo.
Tiene la

SELECT numemp, nombre


FROM empleados
WHERE oficina IS NOT NULL

Lista los empleados asignados a alguna oficina (los que tienen un valor en la columna oficina).

Consultas multitabla

La unión de tablas

Esta operación se utiliza cuando tenemos dos tablas con las mismas columnas y queremos
obtener una nueva tabla con las filas de la primera y las filas de la segunda. En este caso la tabla
resultante tiene las mismas columnas que la primera tabla (que son las mismas que las de la
segunda tabla).

Por ejemplo tenemos una tabla de libros nuevos y una tabla de libros antiguos y queremos una
lista con todos los libros que tenemos. En este caso las dos tablas tienen las mismas columnas,
lo único que varía son las filas, además queremos obtener una lista de libros (las columnas de
una de las tablas) con las filas que están tanto en libros nuevos como las que están en libros
antiguos, en este caso utilizaremos este tipo de operación.

Cuando hablamos de tablas pueden ser tablas reales almacenadas en la base de datos o tablas
lógicas (resultados de una consulta), esto nos permite utilizar la operación con más frecuencia ya
que pocas veces tenemos en una base de datos tablas idénticas en cuanto a columnas. El
resultado es siempre una tabla lógica.

La composición de tablas
La composición de tablas consiste en concatenar filas de una tabla con filas de otra. En este caso
obtenemos una tabla con las columnas de la primera tabla unidas a las columnas de la segunda
tabla, y las filas de la tabla resultante son concatenaciones de filas de la primera tabla con filas de
la segunda tabla.

A diferencia de la unión la composición permite obtener una fila con datos de las dos tablas, esto
es muy útil cuando queremos visualizar filas cuyos datos se encuentran en dos tablas.

Por ejemplo queremos listar los pedidos con el nombre del representante que ha hecho el pedido,
pues los datos del pedido los tenemos en la tabla de pedidos pero el nombre del representante
está en la tabla de empleados y además queremos que aparezcan en la misma línea; en este
caso necesitamos componer las dos tablas (Nota: en el ejemplo expuesto a continuación, hemos
seleccionado las filas que nos interesan).

Existen distintos tipos de composición, aprenderemos a utilizarlos todos y a elegir el tipo más
apropiado a cada caso.

Los tipos de composición de tablas son:

. El producto cartesiano

. El INNER JOIN
. El LEFT / RIGHT JOIN

El operador UNION
El operador UNION sirve para obtener a partir de dos tablas con las mismas columnas, una
nueva tabla con las filas de la primera y las filas de la segunda.

La sintaxis es la siguiente:

El INNER JOIN
El INNER JOIN es otro tipo de composición de tablas, permite emparejar filas de distintas tablas
de forma más eficiente que con el producto cartesiano cuando una de las columnas de
emparejamiento está indexada. Ya que en vez de hacer el producto cartesiano completo y luego
seleccionar la filas que cumplen la condición de emparejamiento, para cada fila de una de las
tablas busca directamente en la otra tabla las filas que cumplen la condición, con lo cual se
emparejan sólo las filas que luego aparecen en el resultado.

La sintaxis es la siguiente:

Ejemplo:

SELECT *
FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie

Ejemplo:

SELECT *
FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie

tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no, nombre de
consulta guardada), de las tablas cuyos registros se van a combinar.

Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un alias de tabla.

col1, col2 son las columnas de emparejamiento.

Observar que dentro de la cláusula ON los nombres de columna deben ser nombres cualificados
(llevan delante el nombre de la tabla y un punto).

Las columnas de emparejamiento deben contener la misma clase de datos, las dos de tipo texto,
de tipo fecha etc... los campos numéricos deben ser de tipos similares. Por ejemplo, se puede
combinar campos AutoNumérico y Long puesto que son tipos similares, sin embargo, no se
puede combinar campos de tipo Simple y Doble. Además las columnas no pueden ser de tipo
Memo ni OLE.

comp representa cualquier operador de comparación ( =, <, >, <=, >=, o <> ) y se utiliza para
establecer la condición de emparejamiento.

Se pueden definir varias condiciones de emparejamiento unidas por los operadores AND y OR
poniendo cada condición entre paréntesis. Ejemplo:

SELECT * FROM pedidos INNER JOIN productos ON (pedidos.fab = productos.idfab) AND


(pedidos.producto = productos.idproducto)

Se pueden combinar más de dos tablas


En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo

El LEFT JOIN y RIGHT JOIN


El LEFT JOIN y RIGHT JOIN son otro tipo de composición de tablas, también denominada
composición externa. Son una extensión del INNER JOIN.

Las composiciones vistas hasta ahora (el producto cartesiano y el INNER JOIN) son
composiciones internas ya que todos los valores de las filas del resultado son valores que están
en las tablas que se combinan.

Con una composición interna sólo se obtienen las filas que tienen al menos una fila de la otra
tabla que cumpla la condición, veamos un ejemplo:

Queremos combinar los empleados con las oficinas para saber la ciudad de la oficina donde
trabaja cada empleado, si utilizamos un producto cartesiano tenemos:

SELECT empleados.*,ciudad
FROM empleados, oficinas
WHERE empleados.oficina = oficinas.oficina

Consultas Sumarias

Subconsultas
Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT que
llamaremos consulta principal.
Se puede encontrar en la lista de selección, en la cláusula WHERE o en la cláusula HAVING de
la consulta principal.

Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que
aparece encerrada entre paréntesis, no puede contener la cláusula ORDER BY, ni puede ser la
UNION de varias sentencias SELECT, además tiene algunas restricciones en cuanto a número
de columnas según el lugar donde aparece en la consulta principal. Estas restricciones las iremos
describiendo en cada caso.

Cuando se ejecuta una consulta que contiene una subconsulta, la subconsulta se ejecuta por
cada fila de la consulta principal.

Se aconseja no utilizar campos calculados en las subconsultas, ralentizan la consulta.

Las consultas que utilizan subconsultas suelen ser más fáciles de interpretar por el usuario.

Referencias externas
A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer referencia al valor de una
columna en la fila actual de la consulta principal, ese nombre de columna se denomina referencia
externa.
Una referencia externa es un nombre de columna que estando en la subconsulta, no se refiere a
ninguna columna de las tablas designadas en la FROM de la subconsulta sino a una columna de
las tablas designadas en la FROM de la consulta principal. Como la subconsulta se ejecuta por
cada fila de la consulta principal, el valor de la referencia externa irá cambiando.

Ejemplo:

SELECT numemp, nombre, (SELECT MIN(fechapedido) FROM pedidos WHERE rep = numemp)

FROM empleados;

En este ejemplo la consulta principal es SELECT... FROM empleados.


La subconsulta es ( SELECT MIN(fechapedido) FROM pedidos WHERE rep = numemp ).
En esta subconsulta tenemos una referencia externa ( numemp ) es un campo de la tabla
empleados (origen de la consulta principal).

Si quitamos la cláusula WHERE de la subconsulta obtenemos la fecha del primer pedido de todos
los pedidos no del empleado correspondiente.

Anidar subconsultas
Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la cláusula
WHERE (por ejemplo) de otra subconsulta que a su vez forma parte de otra consulta principal. En
la práctica, una consulta consume mucho más tiempo y memoria cuando se incrementa el
número de niveles de anidamiento. La consulta resulta también más difícil de leer , comprender y
mantener cuando contiene más de uno o dos niveles de subconsultas.

Ejemplo:

SELECT numemp, nombre


FROM empleados
WHERE numemp = (SELECT rep FROM pedidos WHERE clie = (SELECT numclie FROM
clientes WHERE nombre = 'Julia Antequera'))
En este ejemplo, por cada linea de pedido se calcula la subconsulta de clientes, y esto se repite
por cada empleado, en el caso de tener 10 filas de empleados y 200 filas de pedidos (tablas
realmente pequeñas), la subconsulta más interna se ejecutaría 2000 veces (10 x 200).

Subconsulta en la lista de selección


Cuando la subconsulta aparece en la lista de selección de la consulta principal, en este caso la
subconsulta, no puede devolver varias filas ni varias columnas, de lo contrario se da un mensaje
de error.

Muchos SQLs no permiten que una subconsulta aparezca en la lista de selección de la consulta
principal pero eso no es ningún problema ya que normalmente se puede obtener lo mismo
utilizando como origen de datos las dos tablas. El ejemplo anterior se puede obtener de la
siguiente forma:

SELECT numemp, nombre, MIN(fechapedido)


FROM empleados LEFT JOIN pedidos ON empleados.numemp = pedidos.rep
GROUP BY numemp, nombre

En la cláusula FROM
En la cláusula FROM se puede encontrar una sentencia SELECT encerrada entre paréntesis
pero más que subconsulta sería una consulta ya que no se ejecuta para cada fila de la tabla
origen sino que se ejecuta una sola vez al principio, su resultado se combina con las filas de la
otra tabla para formar las filas origen de la SELECT primera y no admite referencias externas.

En la cláusula FROM vimos que se podía poner un nombre de tabla o un nombre de consulta,
pues en vez de poner un nombre de consulta se puede poner directamente la sentencia SELECT
correspondiente a esa consulta encerrada entre paréntesis.

Subconsulta en las cláusulas WHERE y HAVING


Se suele utilizar subconsultas en las cláusulas WHERE o HAVING cuando los datos que
queremos visualizar están en una tabla pero para seleccionar las filas de esa tabla necesitamos
un dato que está en otra tabla.

Ejemplo:

SELECT numemp, nombre


FROM empleados
WHERE contrato = (SELECT MIN(fechapedido) FROM pedidos)

En este ejemplo listamos el número y nombre de los empleados cuya fecha de contrato sea igual
a la primera fecha de todos los pedidos de la empresa.

En una cláusula WHERE / HAVING tenemos siempre una condición y la subconsulta actúa de
operando dentro de esa condición.

ANY.

La subconsulta debe devolver una única columna sino se produce un error.


Se evalúa la comparación con cada valor devuelto por la subconsulta.
Si alguna de las comparaciones individuales produce el resultado verdadero, el test ANY
devuelve el resultado verdadero.
Si la subconsulta no devuelve ningún valor, el test ANY devuelve falso.
Si el test de comparación es falso para todos los valores de la columna, ANY devuelve falso.
Si el test de comparación no es verdadero para ningún valor de la columna, y es nulo para al
menos alguno de los valores, ANY devuelve nulo.

ALL.

La subconsulta debe devolver una única columna sino se produce un error.


Se evalúa la comparación con cada valor devuelto por la subconsulta.
Si todas las comparaciones individuales, producen un resultado verdadero, el test devuelve el
valor verdadero.
Si la subconsulta no devuelve ningún valor el test ALL devuelve el valor verdadero. (¡Ojo con
esto!)
Si el test de comparación es falso para algún valor de la columna, el resultado es falso.
Si el test de comparación no es falso para ningún valor de la columna, pero es nulo para alguno
de esos valores, el test ALL devuelve valor nulo.

EXISTS.

Examina si la subconsulta produce alguna fila de resultados.

Si la subconsulta contiene filas, el test adopta el valor verdadero, si la subconsulta no contiene


ninguna fila, el test toma el valor falso, nunca puede tomar el valor nulo.

Con este test la subconsulta puede tener varias columnas, no importa ya que el test se fija no en
los valores devueltos sino en si hay o no fila en la tabla resultado de la subconsulta.

Cuando se utiliza el test de existencia en la mayoría de los casos habrá que utilizar unareferencia
externa.

Si no se utiliza una referencia externa la subconsulta devuelta siempre será la misma para todas
las filas de la consulta principal y en este caso se seleccionan todas las filas de la consulta
principal (si la subconsulta genera filas) o ninguna (si la subconsulta no devuelve ninguna

Actualización de datos
La actualización de esos datos, es decir insertar nuevas filas, borrar filas o cambiar el contenido
de las filas de una tabla. Estas operaciones modifican los datos almacenados en las tablas pero
no su estructura, ni su definición.

Insertar una fila INSERT INTO...VALUES


La inserción de nuevos datos en una tabla se realiza añadiendo filas enteras a la tabla, la

La inserción de nuevos datos en una tabla se realiza añadiendo filas enteras a la tabla, la
sentencia SQL que lo permite es la orden INSERT INTO.

La inserción se puede realizar de una fila o de varias filas de golpe, veremos las dos opciones por
separado y empezaremos por la inserción de una fila.

La sintaxis es la siguiente:
Esta sintaxis se utiliza para insertar una sola fila cuyos valores indicamos después de la palabra
reservada VALUES. En castellano la sentencia se leería: INSERTA EN destino...VALORES ....

Los registros se agregan siempre al final de la tabla.

Destino es el nombre de la tabla donde vamos a insertar la fila también se puede utilizar un
nombre de consulta, consulta que tenga como origen de datos una única tabla. Al nombre de la
tabla se le puede añadir la cláusula IN si la tabla se encuentra en otra base de datos (en una
base de datos externa).

La palabra reservada VALUES se puede sustituir por la palabra SELECT ( en otros SQLs se
emplea únicamente VALUES).

A continuación de la palabra VALUES, entre paréntesis se escriben los valores que queremos
añadir. Estos valores se tienen que escribir de acuerdo al tipo de dato de la columna donde se
van a insertar (encerrados entre comillas simples ' ' para valores de tipo texto, entre # # para
valores de fecha...) la asignación de valores se realiza por posición, el primer valor lo asigna a la
primera columna, el segundo valor a la segunda columna, así sucesivamente...

Cuando la tabla tiene una columna de tipo contador (AutoNumber), lo normal es no asignar valor
a esa columna para que el sistema le asigne el valor que le toque según el contador, si por el
contrario queremos que la columna tenga un valor concreto, lo indicamos en la lista de valores.

Cuando no se indica ninguna lista de columnas después del destino, se asume por

El mismo orden que las columnas que enunciamos. Como no enunciamos las columnas oficina y
director se rellenarán con el valor nulo (porque es el valor que tienen esas columnas como valor
predeterminado).

El utilizar la opción de poner una lista de columnas podría parecer peor ya que se tiene que
escribir más pero realmente tiene ventajas sobre todo cuando la sentencia la vamos a almacenar
y reutilizar:

Integridad de datos
El primer paso de la especificación de los dominios de una tabla consiste en determinar los tipos de
datos de las columnas. Un dominio es el conjunto de todos los valores permitidos en una columna.
El dominio no sólo incluye el concepto del tipo de datos aplicables, sino también los valores
permitidos en la columna. Por ejemplo, el dominio de la columna Color de la tabla Production.
Product incluye el tipo de datos nvarchar y un límite de tamaño de 15 caracteres. El dominio
también podría especificar las cadenas de caracteres admitidas en la columna, como Red, Blue,
Green, Yellow, Brown, Black, White, Teal, Gray y Silver. Para obtener más información, vea Tipos
de datos (motor de base de datos).
Dos pasos importantes en el diseño de las tablas son la identificación de valores válidos para una
columna y la determinación de cómo forzar la integridad de los datos en la columna. La integridad
de datos pertenece a una de las siguientes categorías:
• Integridad de entidad
• Integridad de dominio
• Integridad referencial
• Integridad definida por el usuario

Integridad de entidad
La integridad de entidad define una fila como entidad única para una tabla determinada. La
integridad de entidad exige la integridad de las columnas de los identificadores o la clave principal
de una tabla, mediante índices y restricciones UNIQUE, o restricciones PRIMARY KEY.

Valores NULL
Las columnas pueden aceptar o rechazar valores NULL. NULL es un valor especial en las bases
de datos que representa el concepto de un valor desconocido. NULL es diferente de un carácter en
blanco ó 0. En realidad, el carácter en blanco es un carácter válido y 0 es un número válido. NULL
simplemente representa la idea de que este valor no se conoce. NULL tampoco es lo mismo que
una cadena de longitud cero. Si la definición de una columna contiene la cláusula NOT NULL, no
se pueden insertar filas que tengan el valor NULL en dicha columna. Si la definición de una
columna sólo tiene la palabra clave NULL, acepta valores NULL.
La aceptación de valores NULL en una columna puede aumentar la complejidad de las
comparaciones lógicas que utilicen la columna. El estándar ISO determina que las comparaciones
con valores NULL no se evalúan como TRUE o FALSE, sino como UNKNOWN.Esto introduce una
lógica de tres valores en los operadores de comparación, que puede ser difícil de controlar
correctamente.

Restricciones, reglas, valores predeterminados y


desencadenadores
Las columnas de tablas tienen otras propiedades además del tipo y el tamaño de datos. Estas
otras propiedades son importantes para la consecución de la integridad de los datos y la integridad
referencial de las tablas de una base de datos:
• La integridad de los datos significa que todas las repeticiones de una columna tienen un
valor de datos correcto. Los valores de los datos deben ser del tipo correcto y deben
encontrarse en su dominio correspondiente.
• La integridad referencial indica que las relaciones entre las tablas se mantienen
adecuadamente. Los datos de una tabla sólo deben apuntar a filas existentes de otra tabla
y no pueden apuntar a filas inexistentes.

Para mantener los dos tipos de integridad, se utilizan los objetos siguientes:
• Restricciones

• Reglas

• Valores predeterminados

• Desencadenadores DML

Restricciones
Las restricciones le permiten definir la manera en que Database Engine (Motor de base de datos)
exigirá automáticamente la integridad de una base de datos. Las restricciones definen reglas
relativas a los valores permitidos en las columnas y constituyen el mecanismo estándar para exigir
la integridad. El uso de restricciones es preferible al uso de Desencadenadores DML, reglas y
valores predeterminados.El optimizador de consultas también utiliza definiciones de restricciones
para generar planes de ejecución de consultas de alto rendimiento.

Clases de restricciones
SQL Server admite las siguientes clases de restricciones:
• NOT NULL especifica que la columna no acepta valores NULL. Para obtener más
información, vea Permitir valores NULL.

• Las restricciones CHECK exigen la integridad del dominio mediante la limitación de los
valores que se pueden asignar a una columna. Para obtener más información, vea
Restricciones CHECK.
Una restricción CHECK especifica una condición de búsqueda booleana (se evalúa como
TRUE, FALSE o desconocido) que se aplica a todos los valores que se indican en la
columna. Se rechazan todos los valores que se evalúan como FALSE. En una misma
columna se pueden especificar varias restricciones CHECK. En el siguiente ejemplo se
muestra la creación de la restricción chk_id. Esta restricción aumenta las exigencias del
dominio de la clave principal asegurándose de que se indiquen para la clave solamente los
números comprendidos en un intervalo especificado.
CREATE TABLE cust_sample
(
cust_id int PRIMARY KEY,
cust_name char(50),
cust_address char(50),
cust_credit_limit money,
CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 )
)

Las restricciones UNIQUE exigen la unicidad de los valores de un conjunto de columnas.


En una restricción UNIQUE, dos filas de la tabla no pueden tener el mismo valor en las columnas.
Las claves principales también exigen exclusividad, pero no aceptan NULL como uno de los
valores exclusivos. Para obtener más información, vea Restricciones UNIQUE.

Las restricciones PRIMARY KEY identifican la columna o el conjunto de columnas cuyos valores
identifican de forma exclusiva cada una de las filas de una tabla. Para obtener más información,
vea Restricciones PRIMARY KEY.
Dos filas de la tabla no pueden tener el mismo valor de clave principal. No se pueden asignar
valores NULL a ninguna de las columnas de una clave principal. Se recomienda utilizar una
columna pequeña de tipo entero como clave principal. Todas las tablas tienen que tener una clave
principal. Una columna o combinación de columnas certificada como valor de clave principal se
denomina clave candidata.
En el siguiente ejemplo se crea la tabla part_sample y especifica el campo part_nmbr como clave
principal.

Copiar código
CREATE TABLE part_sample
(part_nmbr int PRIMARY KEY,
part_name char(30),
part_weight decimal(6,2),
part_color char(15) );

Las restricciones FOREIGN KEY identifican y exigen las relaciones entre las tablas. Para
obtener más información, vea Restricciones FOREIGN KEY.
Una clave externa de una tabla apunta a una clave candidata de otra tabla. En el siguiente
ejemplo, la tabla order_part establece una clave externa que hace referencia a la tabla
part_sample previamente definida.

Copiar código
CREATE TABLE order_part
(order_nmbr int,
part_nmbr int
FOREIGN KEY REFERENCES part_sample(part_nmbr)
ON DELETE NO ACTION,
qty_ordered int);
GO
No se puede insertar una fila que tenga un valor de clave externa, excepto NULL, si no hay una
clave candidata con dicho valor. La cláusula ON DELETE controla las acciones que se llevarán a
cabo si intenta eliminar una fila a la que apuntan las claves externas existentes. a cláusula ON
DELETE tiene las siguientes opciones:

• NO ACTION especifica que la eliminación produce un error.


• CASCADE especifica que también se eliminan todas las filas con claves externas
que apuntan a la fila eliminada.
• SET NULL especifica que todas las filas con claves externas que apuntan a la fila
eliminada se establecen en NULL.

• SET DEFAULT especifica que todas las filas con claves externas que apuntan a la
fila eliminada se establecen en sus valores predeterminados. Para obtener más
información, vea Valores predeterminados.
La cláusula ON UPDATE define las acciones que se llevarán a cabo si intenta actualizar un valor
de clave candidata a la que apuntan las claves externas existentes. Esta cláusula también admite
las opciones NO ACTION, CASCADE, SET NULL y SET DEFAULT
.

Restricciones de tabla y de columna


Las restricciones se dividen en restricciones de columna o restricciones de tabla. La restricción de
columna se especifica como parte de una definición de columna y sólo se aplica a esa columna.
Las restricciones de los ejemplos anteriores son restricciones de columna. Las restricciones de
tabla se declaran de forma independiente de la definición de las columnas y se pueden aplicar a
varias columnas de la tabla. Las restricciones de tabla se deben utilizar cuando una restricción
tiene que incluir varias columnas.
Por ejemplo, si una tabla tiene dos o más columnas en la clave principal, tiene que utilizar una
restricción de tabla para incluir dichas columnas en la clave principal. Piense en una tabla que
registra los eventos de una máquina de una fábrica. Suponga que se pueden producir eventos de
distintos tipos al mismo tiempo, pero no se pueden producir dos eventos del mismo tipo a la vez.
Esto se puede garantizar en la tabla si se incluyen las columnas event_type y event_time en una
clave principal de dos columnas, tal como se muestra en el siguiente ejemplo.
CREATE TABLE factory_process
(event_type int,
event_time datetime,
event_site char(50),
event_desc char(1024),
CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )

Reglas de eliminacion y actualizacion


Para cada relación creada por una clave externa de una base de datos, el estándar SQL2 permite
especificar una regla de eliminación y una regla de actualización asociadas.

La regla de actializacion indica al DBMS lo que debe hacer cuando un usuario intente eliminar una
fila de la tabla padre. Se pueden especificar cuatro reglas de eliminación

Reglas de eliminación RESTRIC: la regla de eliminación RESTRIC evite que se elimine


una fila de una tabla padre si esa fila tiene hijos.Las instrucciones DELETE que intenten
eliminar una de esas filas padres se rechazaran con un mensaje de error.
Reglas de eliminación CASCADE:La reegla de eliminación CASCADE indica al DBMS
dre que cuando se elimine una fila padre , también se debe eliminar auromaticamente de la
tabla hijo todas sus filas hijos.
Reglas de eliminación SET NULL:La regla de eliminación SET NULL indica al DBMS
que cuando se elimine una fila padre debe definir automáticamente como NULL el valor de
la clave edterna de todas sus filas hijos . las eliminacinaciones en una tabla padre
provocan, por tanto una actualización definir, como DEFAULT de las columnas
correspondientes .
Reglas de eliminación SET DEFAULT: La regla de eliminación SET DEFAULT indica
DBMS que cuando se elimine una fila padre el valor de la clave extrerna de sus filas hijo
deben definirse automáticamente como el valor predetrminado de esa columna concreta
.Las eliminaciones de la tabla padre provocan por tanto una actualización “ definir como
DEFAULT “ de las columnas correspndientes.

Al igual que la regla de eliminación indica al DBMS lo que debe hacer cuando un usuario untente
eliminar una fila de la tabla padre, la regla de actualización indica al DBMS lo que debe hacer
cuando un usuario intente actualizar el valor de una de las columnas de la clave primaria de la
tabla padre , hay cuatro posibiñidade que recuerdan a las disponibles para las reglas de
eliminación:

Estructura de una base de datos

Una estrucura de datos está formada por tablas.

DEPT:

EMP:

Creación de una tabla


Antes de cualquier consulta a una base de datos debe crearse una tabla e introducir la información.
En nuestro caso creamos las dos tablas que vamos a utilizar como ejemplo:

CREATE TABLE DEPT (DEPTNO NUMBER(2),


DNAME CHAR(14),
LOC CHAR (13));
El comando crear tabla (CREATE TABLE) indica al servidor Oracle que nombre queremos poner a
la tabla, los nombres de las columnas de la tabla (n[[ordmasculine]] de departamento, nombre del
departamento y localidad) y el tipo de información que cada columna va a contener. La columna
DEPTNO tendrá información numérica (2 dígitos), DNAME tendrá 14 caracteres y LOC tendrá 13
caracteres; de este modo especificamos la longitud máxima de cualquier dato que pueda ser
almacenado en las columnas de la tabla.
Se procede de forma análoga con la tabla empleados EMP con el comando CREATE TABLE:
CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
ENAME CHAR(10),
JOB CHAR(9),
MGR NUMBER(9),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2));
En esta tabla se ha definido la columna n[[ordmasculine]] de empleado (EMPNO) como no nula,
esto significa que cada campo de esa columna debe contener un valor. Esta especificación NOT
NULL es un ejemplo de como ORACLE analiza los valores que se introducen en cada campo y
comprueba que se cumple lo especificado.
Aunque el número máximo de caracteres definido para un campo sea -por ejemplo- 14, si sólo se
ocupan 4, ORACLE solo utiliza cuatro en disco. Los valores nulos no ocupan espacio.
Introducción de la información
Tan pronto como se ha creado la tabla, puede comenzarse a introducir líneas o registros de
información mediante comando INSERT:

INSERT INTO DEPT VALUES (30,'SALES','CHICAGO);


En este comando, primero se nombra la tabla de la base de datos en la que quieren insertarse los
datos (DEPT), y a continuación la lista de valores que van a ir en cada columna (30, 'Ventas',
'Chicago')
Búsqueda de información en una tabla
La operación más común en una base de datos es pedir información, y se denomina búsqueda o
Query. El comando Select va seguido de FROM y en ocasiones de WHERE. SELECT especifica
las columnas, FROM especifica las tablas y WHERE especifica las condiciones. Si no hay
condiciones de búsqueda se presentarán las columnas completas, sin restricciones. En este
ejemplo, el comando Headers() especifica que el listado ponga los nombres de las columnas
(DNAME, DEPTNO, LOC); PrintAll, imprime los datos.

Si se quiere ver el contenido de toda la tabla EMP, puede sustituirse toda la lista de columnas por
un asterisco:
En los ejemplos, para facilitar la lectura, se escriben los comandos en diversas líneas, pero puede
hacerse en una sola línea, por ejemplo:
SELECT * FROM DEPT; Headers(); PrintAll;

SQL incorporado (SQL embebido)


SQL proporciona un lenguaje de consultas declarativo muy potente. La formulación de consultas en
SQL es normalmente mucho más sencilla que la formulación de las mismas en un lenguaje de
programación de propósito general. Sin embargo, el acceso a una base
de datos desde un lenguaje de programación de propósito general se hace necesario al menos por
dos razones:

1. No todas las consultas pueden expresarse en SQL, ya que SQL no dispone del poder
expresivo de un lenguaje de propósito general. Así, existen consultas que se pueden
expresar en lenguajes como Pascal, C, Cobol o Fortran y que no se pueden expresar en
SQL. Para formular consultas de este tipo, podemos utilizar SQL dentro de un lenguaje
más potente. SQL está diseñado de tal forma que las consultas formuladas puedan
optimizarse automáticamente y ejecutarse de manera eficiente (al proporcionar toda la
potencia de un lenguaje de programación, la optimización automática es extremadamente
difícil.

2. Las acciones no declarativas (como la impresión de un informe, la interacción con un usuario


o el envío de los resultados de una consulta a una interfaz gráfica) no se pueden llevar a
cabo desde el propio SQL. Normalmente las aplicaciones tienen varios componentes y la
consulta o actualización de datos es uno de ellos; los demás componentes se escriben en
lenguajes de programación de alto nivel. En el caso de una aplicación integrada, los
programas escritos en el lenguaje de programación deben tener la capacidad de acceder a
la base de datos.

La norma SQL define la utilización de SQL dentro de varios lenguajes de programación, tales como
C, Cobol, Pascal, Java, PL/I y Fortran. Un lenguaje en el cual se introducen consultas SQL se
denomina lenguaje anfitrión y las estructuras SQL que se admiten
en el lenguaje anfitrión constituyen SQL incorporado.
Para identificar las consultas de SQL incorporado, se utiliza la instrucción EXEC SQL, que tiene la
siguiente forma:
EXEC SQL <instrucción de SQL incorporado>
END-EXEC
La sintaxis exacta de las consultas en SQL incorporado depende del lenguaje dentro del que se
utilicen.

Creación de una base de datos


Una base de datos en un sistema relacional está compuesta por un conjunto de tablas, que
corresponden a las relaciones del modelo relacional. En la terminología usada en SQL no se alude
a las relaciones, del mismo modo que no se usa el término atributo, pero sí la palabra columna, y
no se habla de tupla, sino de línea. A continuación se usarán indistintamente ambas terminologías,
por lo que tabla estará en lugar de relación, columna en el de atributo y línea en el de tupla, y
viceversa.

Prácticamente, la creación de la base de datos consiste en la creación de las tablas que la


componen. En realidad, antes de poder proceder a la creación de las tablas, normalmente hay que
crear la base de datos, lo que a menudo significa definir un espacio de nombres separado para
cada conjunto de tablas. De esta manera, para una DBMS se pueden gestionar diferentes bases
de datos independientes al mismo tiempo sin que se den conflictos con los nombres que se usan
en cada una de ellas.

El sistema previsto por el estándar para crear los espacios separados de nombres consiste en usar
las instrucciones SQL "CREATE SCHEMA". A menudo, dicho sistema no se usa (o por lo menos
no con los fines y el significado previstos por el estándar), pero cada DBMS prevé un
procedimiento propietario para crear una base de datos. Normalmente, se amplía el lenguaje SQL
introduciendo una instrucción no prevista en el estándar: "CREATE DATABASE".
La sintaxis empleada por PostgreSQL, pero también por las DBMS más difundidas, es la siguiente:

CREATE DATABASE nombre_base de datos

Con PostgreSQL está a disposición una orden invocable por shell Unix (o por shell del sistema
usado), que ejecuta la misma operación:

createdb nombre_base de datos

Para crear nuestra base de datos bibliográfica, usaremos pues la orden:

createdb biblio

Una vez creada la base de datos, se pueden crear las tablas que la componen. La instrucción SQL
propuesta para este fin es:

CREATE TABLE nombre_tabla (


nombre_columna tipo_columna [ cláusula_defecto ] [ vínculos_de_columna ]
[ , nombre_columna tipo_columna [ cláusula_defecto ] [ vínculos_de_columna ] ... ]
[ , [ vínculo_de tabla] ... ] )

nombre_columna: es el nombre de la columna que compone la tabla. Sería mejor no exagerar con
la longitud de los identificadores de columna, puesto que SQL Entry Level prevé nombres con no
más de 18 caracteres. Consúltese, de todos modos, la documentación de la base de datos
específica. Los nombres tienen que comenzar con un carácter alfabético.

tipo_columna: es la indicación del tipo de dato que la columna podrá contener. Los principales tipos
previstos por el estándar SQL son:

• CHARACTER(n)
Una cadena de longitud fija con exactamente n caracteres. CHARACTER se puede
abreviar con CHAR

• CHARACTER VARYING(n)
Una cadena de longitud variable con un máximo de n caracteres. CHARACTER VARYING
se puede abreviar con VARCHAR o CHAR VARYING.

• INTEGER
Un número estero con signo. Se puede abreviar con INT. La precisión, es decir el tamaño
del número entero que se puede memorizar en una columna de este tipo, depende de la
implementación de la DBMS en cuestión.

• SMALLINT
Un número entero con signo y una precisión que no sea superior a INTEGER.

• FLOAT(p)
Un número con coma móvil y una precisión p. El valor máximo de p depende de la
implementación de la DBMS. Se puede usar FLOAT sin indicar la precisión, empleando,
por tanto, la precisión por defecto, también ésta dependiente de la implementación. REAL y
DOUBLE PRECISION son sinónimo para un FLOAT con precisión concreta. También en
este caso, las precisiones dependen de la implementación, siempre que la precisión del
primero no sea superior a la del segundo.

• DECIMAL(p,q)
Un número con coma fija de por lo menos p cifras y signo, con q cifras después de la
coma. DEC es la abreviatura de DECIMAL. DECIMAL(p) es una abreviatura de
DECIMAL(p,0). El valor máximo de p depende de la implementación.

• INTERVAL
Un periodo de tiempo (años, meses, días, horas, minutos, segundos y fracciones de
segundo).

• DATE, TIME y TIMESTAMP


Un instante temporal preciso. DATE permite indicar el año, el mes y el día. Con TIME se
pueden especificar la hora, los minutos y los segundos. TIMESTAMP es la combinación de
los dos anteriores. Los segundos son un número con coma, lo que permite especificar
también fracciones de segundo.

cláusula_defecto: indica el valor de defecto que tomará la columna si no se le asigna uno


explícitamente en el momento en que se crea la línea. La sintaxis que hay que usar es la siguiente:

DEFAULT { valor | NULL }

donde valor es un valor válido para el tipo con el que la columna se ha definido.

vínculos_de_columna: son vínculos de integridad que se aplican a cada atributo concreto. Son:

• NOT NULL, que indica que la columna no puede tomar el valor NULL.
• PRIMARY KEY, que indica que la columna es la llave primaria de la tabla.
• una definición de referencia con la que se indica que la columna es una llave externa hacia
la tabla y los campos indicados en la definición. La sintaxis es la siguiente:

REFERENCES nombre_tabla [ ( columna1 [ , columna2 ... ] ) ]


[ ON DELETE { CASCADE | SET DEFAULT | SET NULL } ]
[ ON UPDATE { CASCADE | SET DEFAULT | SET NULL } ]

Las cláusulas ON DELETE y ON UPDATE indican qué acción hay que ejecutar en el caso
en que una tupla en la tabla referenciada sea eliminada o actualizada. De hecho, en dichos
casos en la columna referenciante (que es la que se está definiendo) podría haber valores
inconsistentes. Las acciones pueden ser:

○ CASCADE: eliminar la tupla que contiene la columna referenciante (en el caso de


ON DELETE) o también actualizar la columna referenciante (en el caso de ON
UPDATE).
○ SET DEFAULT: asignar a la columna referenziante su valor de defecto.
○ SET NULL: asignar a la columna referenciante el valor NULL.

• un control de valor, con el que se permite o no asignar un valor a la columna en función del
resultado de una expresión. La sintaxis que se usa es:

CHECK (expresión_condicional)

donde expresión_condicional es una expresión que ofrece verdadero o falso.


Por ejemplo, si estamos definiendo la columna COLUMNA1, con el siguiente control:

CHECK ( COLUMNA1 < 1000 )

en dicha columna se podrán incluir sólo valores inferiores a 1000.

vínculo_de_tabla: son vínculos de integridad que se pueden referir a más columnas de la tabla.
Son:

• la definición de la llave primaria:

PRIMARY KEY ( columna1 [ , columna2 ... ] ) Véase que en este caso, a diferencia de la
definición de la llave primaria como vínculo de columna, ésta se puede formar con mas de
un atributo.

• las definiciones de las llaves externas:

FOREIGN KEY ( columna1 [ , columna2 ... ] ) definiciones_de_referencia

La definición_de_referencia tiene la misma sintaxis y significado que la que puede


aparecer como vínculo de columna.

• un control de valor, con la misma sintaxis y significado que el que se puede usar como
vínculo de columna.

Para aclarar mejor el uso de la instrucción CREATE TABLE, veamos algunas órdenes que
implementan la base de datos bibliográfica ejemplificada.

CREATE TABLE Publication (


ID INTEGER PRIMARY KEY,
type CHAR(18) NOT NULL
);

La instrucción anterior crea la tabla Publication, formada por las dos columna ID de tipo INTEGER,
y type de tipo CHAR(18). ID es la llave primaria de la relación. En el atributo type hay un vínculo de
no nulidad.

CREATE TABLE Book (


ID INTEGER PRIMARY KEY REFERENCES Publication(ID),
title VARCHAR(160) NOT NULL,
publisher INTEGER NOT NULL REFERENCES Publisher(ID),
volume VARCHAR(16),
series VARCHAR(160),
edition VARCHAR(16),
pub_month CHAR(3),
pub_year INTEGER NOT NULL,
note VARCHAR(255)
);

Crea la relación Book, formada por nueve atributos. La llave primaria es el atributo ID, que es
también una llave externa hacia la relación Publication. Sobre los atributos title, publisher y
pub_year hay vínculos de no nulidad. Además, el atributo publisher es una llave externa hacia la
tabla Publisher.

CREATE TABLE Author (


publicationID INTEGER REFERENCES Publication(ID),
personID INTEGER REFERENCES Person(ID),
PRIMARY KEY (publicationID, personID)
);

Crea la relación Author, compuesta por dos atributos: publicationID y personID. La llave primaria en
este caso está formada por la combinación de los dos atributos, como está indicado por el vínculo
de tabla PRIMARY KEY. PublicationID es una llave externa hacia la relación Publication, mientras
que personID lo es hacia la relación Person.

El archivo create_biblio.sql contiene todas las órdenes necesarias para crear la estructura de la
base de datos bibliográfica ejemplificada.

SQL dinámico

El componente dinámico de SQL permite que en un programa se construyan y realicen consultas


SQL en tiempo de ejecución. En cambio, las instrucciones de SQL incorporado deben estar
presentes en tiempo de compilación y se compilan utilizando un preprocesador
de SQL incorporado. Por medio de SQL dinámico los programas pueden crear consultas SQL en
tiempo de ejecución (tal vez basadas en datos introducidos por el usuario) y pueden ejecutarlas
inmediatamente o dejarlas preparadas para su ejecución. La preparación de una
instrucción SQL dinámica la compila y los usos posteriores de la instrucción preparada usan la
versión compilada.

VISTAS
Una vista es una tabla derivada de otras tablas (básicas o virtuales).Una vista se caracteriza
porque:

• Se considera que forma parte del esquema externo.


• Una vista es una tabla virtual (no tiene una correspondencia a nivel físico)
• Se puede consultar como cualquier tabla básica.
• Las actualizaciones se transfieren a la/s tabla/s original/es(con ciertas limitaciones
Muchas bases de datos relacionales que se utilizan en aplicaciones del mundo real tienen
esquemas complejos y formados por muchas tablas. En ocasiones, es conveniente que algunos
grupos o perfiles de usuarios tengan una vista parcial de ese esquema, o que tengan una visión de
la misma con una estructura diferente a la del esquema que realmente está almacenado.
Precisamente para estos casos, el lenguaje SQL permite definir vistas.
Una vista es esencialmente una consulta almacenada que devuelve un conjunto de resultados y a
la que se le pone un nombre. Una vista es una “tabla virtual”, aparece como una tabla más del
esquema, aunque realmente no lo es.

Aplicaciones de las vistas.


Para la especificación de tablas con información que se accede con frecuencia pero no posee
existencia física:
• Información derivada de la relación entre varias tablas.
• Información derivada de la formación de grupos de tuplas (p.e. parala obtención de
estadísticas).
• En general: información derivada de consultas complejas a la que se accede
confrecuencia.
• Como mecanismo de seguridad: creación de vistas con, únicamente, losatributos de las
tablas a los cuales se desea permitir acceder a determinados usuarios.
• Para la creación de esquemas externos.

VENTAJAS DE LAS VISTAS.

Las vistas ofrecen una gran variedad de ventajas y pueden resultar utiles en muchos tipos
diferentes de bases de datos. En las bases de datos para computadoras personales las vistas
suelen ser una comodidad , y se definen para simplificar las peticiones a la base de datos, las
vistas ofrecen esta ventajas principales:

• SEGURIDAD: Se puede conceder permiso a cada usuario para que solo tenga acceso a
la base de datos concretos que ese usuario esta autorizado a ver , restringiendo asi el
acceso de los usuarios a los datos almacenados.
• SIMPLICIDAD DE LAS CONSULTAS: Las vistas pueden extraer datos de varias tablas
diferentes y presentarlas como si fueran una sola tabla , convirtiéndolo las consultas a
varias tablas en consultas a una sola tabla formuladas a la vista.
• SIMPLICIDAD ESTRUCTURAL: las vistas pueden ofrecer a los usuarios una vista
personalizada de la estructura de la base de datos, presentando la base de datos como un
conjunto de tablas virtuales que tiene sentido para el usuario.
• AISLAMIENTO DE LAS MODIFICACIONES: Las vistas pueden presentar una imagen
consistente y no nodificada de las estructura dr la base de datos, aunque las tablas
fuentes subyacentes se dividan , se restructuren o cambien de nombre.
• INTEGRIDAD DE LOS DATOS: Si se tiene acceso a los datos y se introducen mediante
vistas, el DBMS pueden comprobarlos de manera automática para asegurarse de que
cumplen las restricciones de integridad especificadas.

Creacion de vistas
CREATE VIEW es la orden que permite la creación de la vista. vista es el nombre de la tabla virtual
que se va a crear.(comalista_columna) son los nombres de los atributos de la tabla y es opcional,Si
no se especifica, el nombre coincide con el nombre de los atributosresultantes en expresión_tabla.
es obligatorio si algún atributo de expresión_tabla es el resultado de una función de agregación o
una operación aritmética.
La sintaxis para la creación de vistas en SQL es la siguiente:

CREATE | REPLACE VIEW vista [(comalista_columna)]


AS expresión_tabla [with check option]
en donde:
• expresión_tabla es una consulta SQL cuyo resultado será el contenido de la vista.
• WITH CHECK OPTION es opcional y se debe incluir si se desea actualizar lavista de una
manera íntegra.
Para la eliminación de una vista se utiliza la instrucción:
• DROP VIEW vista [restrict | cascade];

Motivos por los que una vista NO es actualizable:
• Contiene operadores conjuntistas (UNION, INTERSECT,…).
• El operador DISTINCT
• Funciones agregadas (SUM, AVG, ..)
• La cláusula GROUP BY

Vista sobre una tabla básica


El sistema traducirá la actualización sobre la vista en una operación deactualización sobre la
relación básica.
Siempre que no se viole ninguna restricción de integridad definida sobre dicha relación.

Vista sobre una concatenación de relaciones:


La actualización sólo puede modificar una de las tablas básicas, lactualización modificará la
relación básica que cumpla la propiedad deconservación de la clave (aquella relación tal que su
clave primaria podría sertambién clave de la vista),la actualización no se realizará si viola alguna
de las restricciones definidassobre la relación básica que se va a actualizar.
Operaciones sobre Vistas
Consultas
La consultas sobre las vistas se tratan de igual modo que sobre las tablas.
Actualizaciones
La información puede ser actualizada en las vistas directamente o a través de las tablas sobre las
que se definen.

Existen algunas restricciones:


Borrado de filas de una tabla a través de una vista :La vista se debe crear con filas de
una sola tabla; sin utilizar las cláusulas GROUP BY y DISTINCT; y sin utilizar funciones de
grupo o referencias a pseudocolumnas (ROWNUM).
Actualización de filas a través de una vista :La vista ha de estar definida según las
restricciones anteriores y además ninguna de las columnas a actualizar debe haber sido
definida como una expresión.
Inserción de filas en una tabla a través de una vista :Todas las restricciones y además todas
las columnas obligatorias de la tabla asociada deben estar presentes en la vista.

Reglas Evento-Condición-Acción.
Forma de una regla de actividad:
Evento - Condición - Acción
acción que el sistema ejecuta cuando como respuesta a la ocurrencia de
un evento cuando cierta condición se satisface:
• evento: operación de actualización
• condición: expresión lógica del SQL. Sólo se ejecutará la acción si
esta condición existe y es verdadera.
• acción: procedimiento escrito en un lenguaje de programación que
incluye instrucciones de manipulación de la BD.

Aplicaciones de los disparadores


Define el comportamiento activo del sistema aplicaciones:
• Comprobación de restricciones de integridad
• Restauración de la consistencia
• Definición de reglas de funcionamiento de la organización mantenimiento de información derivada.

Disparadores en SQL.
definición_regla::=
{CREATE | REPLACE} TRIGGER nombre_regla
{BEFORE | AFTER | INSTEAD OF} evento [disyunción_eventos]
ON {nombre_relación | nombre_vista}
[ [REFERENCING OLD AS nombre_referencia
[NEW AS nombre_referencia] ]
[FOR EACH {ROW | STATEMENT} [WHEN ( condición ) ] ]
bloque PL/SQL
disyunción_eventos ::= OR evento [disyunción_eventos]
evento ::= INSERT | DELETE | UPDATE [OF comalista_nombre_atributo]

EVENTOS
{BEFORE | AFTER | INSTEAD OF} evento [disyunción_eventos]
ON {nombre_relación | nombre_vista}
disyunción_eventos ::= OR evento [disyunción_eventos]
evento ::=
INSERT | DELETE | UPDATE [OF comalista_nombre_atributo]
EVENTOS
Parametrización de eventos:
– los eventos de las reglas FOR EACH ROW están parametrizados pametrización implícita:
• evento INSERT o DELETE: n (n grado de la relación)
• evento UPDATE: 2*n
– nombre de parámetros:
• evento INSERT: NEW
• evento DELETE: OLD
• evento UPDATE: OLD y NEW
– se pueden usar en la condición de la regla

– se pueden usar en el bloque PL/SQL


CONDICIONES
WHEN (condición)
– expresión lógica de sintaxis similar a la condición de la cláusula WHERE de la
instrucción SELECT
no puede contener subconsultas ni funciones agregadas
– sólo se puede hacer referencia a los parámetros del evento

Disparadores en SQL.
ACCIONES
bloque PL/SQL
– bloque escrito en el lenguaje de programación de Oracle PL/SQL
– sentencias de manipulación de la BD: INSERT, DELETE, UPDATE,
SELECT ... INTO ...
– sentencias de programa: asignación, selección, iteración
– sentencias de manejo de errores

– sentencias de entrada/salida.
Lenguaje de reglas:
• Creación: CREATE TRIGGER nombre_regla ...
• Eliminación: DROP TRIGGER nombre_reglas
• Modificación: REPLACE TRIGGER nombre_regla ...
• Recompilación: ALTER TRIGGER nombre_regla COMPILE
• Des/Habilitar regla: ALTER TRIGGER nombre_regla [ENABLE | DISABLE]
• Des/Habilitar todas las reglas sobre una relación:

ALTER TABLE nombre_relación [{ENABLE | DISABLE} ALL TRIGGERS


Limitaciones del modelo relacional.
Los modelos de datos tradicionales (relacional, jerárquico y red) han tenidoéxito en aplicaciones
tradicionales de negocios.
Los modelos tradicionales presentan deficiencias en aplicaciones:
• De diseño y fabricación en ingeniería (CAD/CAM/CIM),
• Experimentos científicos,
• Telecomunicaciones,
• Sistemas de información geográfica, y multimedia.

Programación con SQL

Estructura básica

La estructura básica de una expresión para consulta SQL consta de tres cláusulas:

• SELECT
• FROM
• WHERE

La cláusula SELECT se usa para listar los atributos que se desean en el resultado de una consulta.
La cláusula FROM lista las relaciones que se van a examinar en la evaluación de la expresión
La cláusula WHERE costa de un predicado que implica atributos de las relaciones que aparecen en
la cláusula FROM.
Una consulta básica en SQL tiene la forma:
SELECT A1,A2,...,An
FROM r1,r2,...,rn
WHERE P
Donde Ai = atributo ( Campo de la tabla )
ri = relación ( Tabla )
P = predicado ( condición )

Ejemplo 2.1 : Seleccionar todos los nombres de las personas que tengan el apellido MARQUESI de
la tabla persona
SELECT nombre
FROM persona
WHERE apellido = " MARQUESI"

ANSWER NOMBRE

1 MARTIN

2 PABLO
El resultado de una consulta es por supuesto otra relación. Si se omite la cláusula WHERE, el
predicado P es verdadero. La lista A1, A2,..., An puede sustituirse por un asterisco (*) para
seleccionar todos los atributos de todas las relaciones que aparecen en la cláusula FROM, aunque
no es conveniente elegir esta ultima opción salvo que sea necesario pues desperdiciamos mucho
tiempo en obtenerlo

Alias
Es posible renombrar los atributos y las relaciones, a veces por conveniencia y otras veces por ser
necesario, para esto usamos la clausula AS como en el siguiente ejemplo.

Ejemplo 2.2
SELECT P.nombre AS [PRIMER NOMBRE]
FROM persona P
WHERE apellido = "MARQUESI"

ANSWER PRIMER NOMBRE

1 MARTIN

2 PABLO

En este ejemplo cabe destacar un par de cosas. Cuando nos referimos a un atributo como es el
caso de nombre, podemos referirnos a este usando la relación ( o el alias en este ejemplo ) a la
que pertenece el atributo seguido de un punto seguido del atributo <P.nombre>, a veces esta
notación será necesaria para eliminar ambigüedades. Los corchetes los usamos cuando usamos
espacios en blancos o el caratér (–) en el nombre de atributo o alias.
Usar alias en los atributos nos permite cambiar el nombre de los atributos de la respuesta a la
consulta.
Cuando asociamos un alias con una relación decimos que creamos una variable de tupla. Estas
variables de tuplas se definen en la cláusula FROM después del nombre de la relación.
En las consultas que contienen subconsultas, se aplica una regla de ámbito a las variables de
tupla. En una subconsulta esta permitido usar solo variables de tupla definidas en la misma
subconsulta o en cualquier consulta que tenga la subconsulta.

3. Predicados y conectores

Los conectores lógicos en SQL son:

• AND
• OR
• NOT

La lógica de estos conectores es igual que en cualquier lenguaje de programación y sirven para
unir predicados.
Las operaciones aritméticas en SQL son:

• + ( Suma )
• - ( Resta )
• * ( Multiplicación )
• / ( División )

También incluye el operador de comparación BETWEEN, que se utiliza para valores comprendidos
Ejemplo 3.1 encontrar todos los nombres y dni de las personas cuyos dni sea mayor que 26
millones y menor a 28 millones
SELECT nombre, dni
FROM persona
WHERE dni BETWEEN 26000000 and 28000000

ANSWER NOMBRE DNI

1 MARTIN 26125988

2 ESTEFANIA 27128064

3 MELISA 27456224

4 BETANIA 27128765

Análogamente podemos usar el operador de comparación NOT BETWEEN.


SQL también incluye un operador de selección para comparaciones de cadena de caracteres. Los
modelos se describen usando los caracteres especiales:

• El carácter ( % ) es igual a cualquier subcadena


• El operador ( _ ) es igual a cualquier carácter

Estos modelos se expresan usando el operador de comparación LIKE. Un error muy frecuente es
tratar de utilizar los modelos mediante el operador de igualdad ( = ) lo cual es un error de sintaxis.
Ejemplo 3.2 : encontrar los nombres que comiencen con la letra p o el nombre tenga exactamente
6 caracteres de la relación persona
SELECT nombre
FROM persona
WHERE (nombre LIKE "P%") OR (nombre LIKE "_ _ _ _ _ _")

ANSWER NOMBRE

1 MARTIN

2 PABLO

3 MELISA

4 SANDRA

Análogamente podemos buscar desigualdades usando el operador de comparación NOT LIKE.


4. Tuplas duplicadas

Los lenguajes de consulta formales se basan en la noción matemáticade relación como un


conjunto. Por ello nunca aparecen tuplas duplicadas en las relaciones. En la practica la eliminación
de duplicados lleva bastante tiempo. Por lo tanto SQL permite duplicados en las relaciones. Así
pues en las consultas se listaran todas las tuplas inclusive las repetidas.
En aquellos casos en los que queremos forzar la eliminación de duplicados insertamos la palabra
clave DISTINCT después de la cláusula SELECT
Ejemplo 4.1: Listar todos los apellidos no repetidos de la relación persona
SELECT DISTINCT apellido
FROM persona

ASWER APELLIDO

1 MARQUESI

2 SANCHEZ

3 GUISSINI

4 ALEGRATO

5 BRITTE

6 ARDUL

7 MICHELLI

8 MUSACHEGUI

9 SERRAT

Si observamos la tabla original de la relación persona veremos que el apellido marquesi aparecía
dos veces, pero debido al uso de DISTINCT en la consulta la relación respuesta solo lista un solo
marquesi.

Operaciones de conjunto.
SQL incluye las operaciones de conjuntos UNION, INTERSECT, MINUS, que operan sobre
relaciones y corresponden a las operaciones del álgebraunión, intersección y resta de conjuntos
respectivamente. Para realizar esta operación de conjuntos debemos tener sumo cuidado que las
relaciones tengan las mismas estructuras.
Incorporemos ahora una nueva relación, llamada jugadores que representa las personas que
juegan al fútbol, sus atributos serán DNI, puesto y nro_camiseta. Supongamos que esta nueva
tabla esta conformada de la siguiente manera

JUGADORES DNI PUESTO NRO_CAMISETA


1 26125988 DELANTERO 9

2 25485699 MEDIO 5

3 28978845 ARQUERO 1

4 29789854 DEFENSOR 3

Ejemplo 4.2 : Obtener todos los nombres de la relación persona cuyos apellidos sean Marquesi o
Serrat
SELECT nombre
FROM PERSONA
WHERE apellido = "MARQUESI"
UNION
SELECT nombre
FROM PERSONA
WHERE apellido = "SERRAT"

ANSWER PRIMER NOMBRE

1 MARTIN

2 PABLO

3 JUAN

Ejemplo 4.3 : Obtener todos los DNI de los que juegan al fútbol y, además, están en la lista de la
relación persona
SELECT dni
FROM persona
INTERSECT
SELECT dni
FROM jugadores

ANSWER DNI

1 26125988

2 25485699

3 28978845

Por omisión, la operación de union elimina las tuplas duplicadas. Para retener duplicados se debe
escribir UNION ALL en lugar de UNION.
Pertenencia a un conjunto
El conector IN prueba si se es miembro de un conjunto, donde el conjunto es una colección de
valores producidos en lo general por una cláusula SELECT. Análogamente el conector NOT IN
prueba la no pertenencia al conjunto
Ejemplo 4.4 : Encontrar los nombres de las personas que juegan al fútbol y, además, se
encuentran en la relación persona
SELECT nombre, apellido
FROM persona
WHERE dni IN
(SELECT dni
FROM jugadores)

ANSWER NOMBRE APELLIDO

s
MARTIN MARQUESI
1

2 PABLO MARQUESI

3 JUAN SERRAT

Es posible probar la pertenencia de una relación arbitraria SQL usa la notación de elementos
<v1,v2,...,vn> para representar una tupla de elementos de n que contiene los valores v1,v2,...,vn.

Comparación de conjuntos
En conjuntos la frase << mayor que algún >> se representa en SQL por ( >SOME ), también podría
entenderse esto como << mayor que el menor de >>, su sintaxis es igual que la del conector IN.
SQL también permite las comparaciones ( >SOME ),( =SOME ) ( >=SOME ), ( <=SOME ) y
( <>SOME ).
También existe la construcción ( >ALL ), que corresponde a la frase << mayor que todos >>. Al
igual que el operador SOME, puede escribirse ( >ALL ),( =ALL ) ( >=ALL ), ( <=ALL ) y ( <>ALL ).
En ocasiones podríamos querer comparar conjuntos para determinar si un conjunto contiene los
miembros de algún otro
conjunto. Tales comparaciones se hacen usando las construcciones CONTAINS y NOT
CONTAINS

5. Pruebas para relaciones vacías

La construcción EXISTS devuelve el valor TRUE si la subconsulta del argumento no esta vacía, y
la construcción NOT EXISTS devuelve TRUE si la consulta es vacía.
Ejemplo 5.1 : encontrar todos los nombre y apellidos de la relación persona si es que en la relación
jugadores existe un jugador con el numero de dni 27128055
SELECT nombre, apellido
FROM persona
WHERE EXISTS
(SELECT dni
FROM jugadores
WHERE dni = 27128055 )
ANSWER NOMBRE APELLIDO

Como el dni = 27128055 no existe en la relación jugadores, la condición es FALSE y por lo tanto la
respuesta es vacía

6. Ordenación de la presentación de tuplas

SQL ofrece al usuario cierto control sobre el orden en el que se va a presentar las tuplas en una
relación. La cláusula ORDER BY hace que las tupla en el resultado dé una consulta en un orden
especifico.
Por omisión SQL lista los elementos en orden ascendente. Para especificar el tipo de ordenación,
podemos especificar DESC para orden descendente o ASC para orden ascendente.
También es posible ordenar los resultados por mas de una atributo
Ejemplo 6.1 : encontrar todos los nombres y apellido de la relación persona y ordenar los
resultados por apellido y nombre en forma descendente
SELECT apellido, nombre
FROM persona
ORDER BY apellido DESC, nombre DESC

ANSWER APELLIDO NOMBRE

1 SERRAT JUAN

2 SANCHEZ ROBERTO

3 MUSACHEGUI BETANIA

4 MICHELLI SOLEDAD

5 MARQUESI PABLO

6 MARQUESI MARTIN

7 GUISSINI ESTEFANIA

8 BRITTE SANDRA

9 ARDUL MELISA

10 ALEGRATO RUBEN

Funciones de agregación
SQL ofrece la posibilidad de calcular funciones en grupos de tuplas usando la cláusula GROUP
BY, también incluye funciones para calcular

• Promedios AVG
• Mínimo MIN
• Máximo MAX
• Total SUM
• Contar COUNT

Para los próximos ejemplos incorporamos una nueva relación llamada PRO que representara los
jugadores profesionales de fútbol, sus atributos serán dni, años_pro, club, valor_actual. Y los
valores son los siguientes:

PRO DNI AÑOS_PRO CLUB VALOR_ACTUAL

1 26125988 5 ALL BOY'S 1000

2 25485699 2 ALL BOY'S 2500

3 27126045 3 LANUS 12000

4 26958644 4 LANUS 6500

5 29120791 1 LANUS 450

Ejemplo 6.2: determinar el valor total en jugadores así como también la cantidad de jugadores de
cada club en la relación pro
SELECT club, SUM(valor_actual) AS VALOR_TOTAL,
COUNT(club) AS NRO_JUGADORES
FROM pro
GROUP BY CLUB

ANSWER CLUB VALOR_TOTAL NRO_JUGADORES

1 ALL BOY'S 3.500,00 2

2 LANUS 18.950,00 3

Ejemplo 6.3: Determinar por cada club cual es el valor_actual del jugador mas caro de la relación
pro

SELECT club, MAX(valor_actual) AS JUG_MAS_CARO


FROM pro
GROUP BY CLUB

ANSWER CLUB JUG_MAS_CARO

1 ALL BOY'S 2500

2 LANUS 12000
Hay ocasiones en la que los duplicados deben eliminarse antes de calcular una agregación.
Cuando queremos eliminar los duplicados del calculo usamos la palabra clave DISTINCT
antepuesto al atributo de agregación que queremos calcular, como por ejemplo COUNT(DISTINCT
club).
Hay ocasiones en las que es útil declara condiciones que se aplican a los grupos mas que a las
tuplas. Para esto usamos la cláusula HAVING de SQL.
Ejemplo 6.4: Determinar por cada club cual es el valor_actual del jugador mas caro, pero con la
condición de que este sea mayor a 10000 de la relación pro
SELECT club, MAX(valor_actual) AS JUG_MAS_CARO
FROM pro
GROUP BY CLUB
HAVING MAX(valor_actual) > 10000

ANSWER CLUB JUG_MAS_CARO

1 LANUS 12000

Si en la misma consulta aparece una cláusula WHERE y una cláusula HAVING, primero se aplica
el predicado de la cláusula WHERE, las tupla que satisfacen el predicado WHERE son colocadas
en grupos por la cláusula GROUP BY. Después se aplica la cláusula HAVING a cada grupo.

7. Modificación de la base de datos

Eliminación
Una solicitud de eliminación se expresa casi de igual forma que una consulta. Podemos suprimir
solamente tuplas completas, no podemos suprimir valores solo de atributos.
DELETE FROM r
WHERE P
Donde P presenta un predicado y r representa una relación. Las tuplas t en r para las cuales P(t) es
verdadero, son eliminadas
de r.
Si omitimos la cláusula WHERE se eliminan todas las tuplas de la relación r ( un buen
sistemadebería buscar confirmación del usuario antes de ejecutar una acción tan devastadora )
Ejemplo 7.1 : Eliminar todas las tuplas de la relación persona en donde apellido sea igual a
"BRITTE"
DELETE FROM persona
WHERE apellido = "BRITTE"

deleted NOMBRE APELLIDO DNI

1 SANDRA BRITTE 25483669

Inserción
Para insertar datos en una relación, especificamos una tupla que se va a insertar o escribimos una
consulta cuyo resultado es un conjunto de tuplas que se van a insertar. La inserción de tuplas la
realizamos mediante las sentencias
INSERT INTO r1
VALUES (v1,v2,...,v)
Ejemplo 7.2 : Insertar una tupla con los mismos valores de la tupla eliminada en el ejemplo anterior
en la relación persona.
INSERT INTO persona
VALUES ("SANDRA","BRITTE",25483669)

inserted NOMBRE APELLIDO DNI

1 SANDRA BRITTE 25483669

En este ejemplo, los valores se especifican en el orden en que se listan los atributos
correspondientes en el esquema de relación. Para poder ingresar los datos en un orden diferente
podríamos haber escrito
INSERT INTO persona(DNI, NOMBRE, APELLIDO)
VALUES (25483669,"SANDRA","BRITTE")

Actualizaciones
En ciertas ocasiones podemos desear cambiar los valores de una tupla sin cambiar todos los
valores en dicha tupla. Para este propósito usamos la sentencia
UPDATE r1
SET A1 = V1, A2 = V2,...,An = Vn
WHERE P
Donde r1 es la relación Ai el atributo a modificar Vi el valor que se le asignara a Ai y P es el
predicado.
Ejemplo 7.3 : En la relación jugadores actualizar la posición de los jugadores que posean la
camiseta numero 5 y asignarles la camiseta numero 7.
UPDATE jugadores
SET nro_camiseta = 7
WHERE nro_camiseta = 5

updated DNI PUESTO NRO_CAMISETA

1 25485699 MEDIO 5

8. Valores nulos

Es posible que para las tuplas insertadas se den valores únicamente a algunos atributos del
esquema. El resto de los atributos son asignados a valores nulos representados por NULL. Para
esto colocamos la palabra reservada NULL como valor del atributo.
Ejemplo 7.4 : Insertar en la relación jugadores un jugador con dni = 26356312, puesto = defensor, y
al cual aun no le han asignado un nro_camiseta.
INSERT INTO jugadores
VALUES(26356312,"DEFENSOR", NULL)

inserted DNI PUESTO NRO_CAMISETA


1 26356312 DEFENSOR

9. Definición de datos

Creación
Una relación en SQL se define usando la orden
CREATE TABLE r(A1 D1, A2 D3,...,An Dn)
Donde r es el nombre de la relación, cada Ai es el nombre de un atributo del esquema de la
relación r y Di es el tipo de dato de Ai. Una relación recién creada esta vacía. La orden INSERT
puede usarse para cargar la relación
Ejemplo 9.1 : crear la relación lesionado con los atributos nombre, apellido ambos de tipo char y
tiempo_inhabilit de tipo entero
CREATE TABLE "lesionado.db" (
NOMBRE CHAR(20),
APELLIDO CHAR(20),
TIEMPO_INHABILT INTEGER)

lesionado NOMBRE APELLIDO TIEMPO_INHABILT

Eliminación
Para eliminar una relación usamos la orden DROP TABLE r, esta orden elimina toda la información
sobre la relación sacada de la base de datos, esta orden es mas fuerte que DELET FROM r ya que
esta ultima elimina todas las tuplas pero no destruye la relación, mientras que la primera si.
Ejemplo 9.2 : eliminar la relación persona
DROP TABLE persona

Actualizacion
La orden ALTER TABLE se usa para añadir atributos a una relación existente. A todas las tuplas
en la relación se les asigna NULL como valor de atributo. La sintaxis de ALTER TABLE es la
siguiente:
ALTER TABLE r1 ADD A1 D1
Ejemplo 9.3 : agregar los atributos de tipo char nombre y apellido a la relación jugadores
ALTER TABLE jugadores ADD NOMBRE CHAR(20)
ALTER TABLE jugadores ADD APELLIDO CHAR(20)

1.-SQL Avanzado.
1.1 Recuperación de datos
1.1.1 Conceptos básicos de SQL
1.1.2 Consultas simples
1.1.3 Consultas multitabla
1.1.4 Consultas sumarias
1.1.5 Subconsultas
1.2 Actualización de datos
1.2.1 Actualizaciones de bases de datos
1.2.2 Integridad de datos
1.3 Estructura de una base de datos
1.3.1 Creación de una base de datos
1.3.2 Vistas
1.4 Programación con SQL
1.4.1 SQL incorporado
1.4.2 SQL dinámico
1.4.3 API de SQL

2. Mejoramiento (Tunning).

2.1 Monitoreo y Desempeño


2.2 Investigación de Benchmark de Bases de Datos
2.3 Métricas de bases de datos

También podría gustarte