bases de datos ii

51
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

Upload: depeache

Post on 15-Jun-2015

3.024 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Bases de Datos II

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

Page 2: Bases de Datos II

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 / servidor3. SQL es un lenguaje de acceso a datos por internet4. SQL es un lenguaje de bases de datos distribuidas5. SQL es un lenguaje de pasarelas de bases de datos6. SQL es un lenguaje interactivo de consultas7. 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.

Page 3: Bases de Datos II

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

Page 4: Bases de Datos II

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 bienSELECT 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

Page 5: Bases de Datos II

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, contratoFROM empleadosORDER BY oficina

es equivalente a

SELECT nombre, oficina, contratoFROM 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, oficinarepFROM empleadosORDER BY nombre

Obtiene un listado alfabético de los empleados.

Page 6: Bases de Datos II

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 nombreFROM empleadosWHERE 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

Page 7: Bases de Datos II

utilizar un test especial, el test de valor nulo.Tiene la

SELECT numemp, nombreFROM empleadosWHERE 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

Page 8: Bases de Datos II

. 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).

Page 9: Bases de Datos II

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.*,ciudadFROM empleados, oficinasWHERE empleados.oficina = oficinas.oficina

Consultas Sumarias

Subconsultas

Page 10: Bases de Datos II

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:

Page 11: Bases de Datos II

SELECT numemp, nombreFROM empleadosWHERE 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.repGROUP 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, nombreFROM empleadosWHERE 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.

Page 12: Bases de Datos II

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

Page 13: Bases de Datos II

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.

Page 14: Bases de Datos II

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.

Page 15: Bases de Datos II

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,

Page 16: Bases de Datos II

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

Page 17: Bases de Datos II

(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.

Page 18: Bases de Datos II

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

Page 19: Bases de Datos II

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),

Page 20: Bases de Datos II

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:

Page 21: Bases de Datos II

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>

Page 22: Bases de Datos II

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] ... ] )

Page 23: Bases de Datos II

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.

INTEGERUn 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.

SMALLINTUn 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.

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

DATE, TIME y TIMESTAMPUn 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.

Page 24: Bases de Datos II

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:

o 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).

o SET DEFAULT: asignar a la columna referenziante su valor de defecto.o 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.

Page 25: Bases de Datos II

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

Page 26: Bases de Datos II

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.

VISTASUna 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.

Page 27: Bases de Datos II

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

Page 28: Bases de Datos II

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ónacción que el sistema ejecuta cuando como respuesta a la ocurrencia deun 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 siesta condición existe y es verdadera.

Page 29: Bases de Datos II

• acción: procedimiento escrito en un lenguaje de programación queincluye instrucciones de manipulación de la BD.

Aplicaciones de los disparadoresDefine 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/SQLdisyunció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]EVENTOSParametrizació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

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

Page 30: Bases de Datos II

Disparadores en SQL.ACCIONESbloque 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

Page 31: Bases de Datos II

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ónLa 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,...,AnFROM r1,r2,...,rnWHERE PDonde 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 personaSELECT nombreFROM personaWHERE 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

AliasEs 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.2SELECT P.nombre AS [PRIMER NOMBRE]FROM persona PWHERE 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

Page 32: Bases de Datos II

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 comprendidosEjemplo 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, dniFROM personaWHERE dni BETWEEN 26000000 and 28000000

ANSWER NOMBRE DNI

1 MARTIN 26125988

2 ESTEFANIA 27128064

3 MELISA 27456224

4 BETANIA 27128765

 

Page 33: Bases de Datos II

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 personaSELECT nombreFROM personaWHERE (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 SELECTEjemplo 4.1: Listar todos los apellidos no repetidos de la relación personaSELECT DISTINCT apellidoFROM persona

ASWER APELLIDO

1 MARQUESI

2 SANCHEZ

3 GUISSINI

Page 34: Bases de Datos II

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 SerratSELECT nombreFROM PERSONAWHERE apellido = "MARQUESI"UNIONSELECT nombreFROM PERSONAWHERE apellido = "SERRAT"

Page 35: Bases de Datos II

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 dniFROM persona

INTERSECTSELECT 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 conjuntoEl 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 conjuntoEjemplo 4.4 : Encontrar los nombres de las personas que juegan al fútbol y, además, se encuentran en la relación personaSELECT nombre, apellidoFROM personaWHERE dni IN(SELECT dniFROM jugadores)

ANSWER NOMBRE APELLIDO

s

1

MARTIN MARQUESI

2 PABLO MARQUESI

Page 36: Bases de Datos II

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 conjuntosEn 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 otroconjunto. 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 27128055SELECT nombre, apellidoFROM personaWHERE EXISTS(SELECT dniFROM jugadoresWHERE 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 atributoEjemplo 6.1 : encontrar todos los nombres y apellido de la relación persona y ordenar los resultados por apellido y nombre en forma descendenteSELECT apellido, nombreFROM personaORDER BY apellido DESC, nombre DESC

Page 37: Bases de Datos II

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ónSQL 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

Page 38: Bases de Datos II

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 proSELECT club, SUM(valor_actual) AS VALOR_TOTAL,COUNT(club) AS NRO_JUGADORESFROM proGROUP 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_CAROFROM proGROUP 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 proSELECT club, MAX(valor_actual) AS JUG_MAS_CAROFROM proGROUP BY CLUBHAVING MAX(valor_actual) > 10000 

ANSWER CLUB JUG_MAS_CARO

Page 39: Bases de Datos II

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ónUna 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 rWHERE PDonde P presenta un predicado y r representa una relación. Las tuplas t en r para las cuales P(t) es verdadero, son eliminadasde 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 personaWHERE apellido = "BRITTE"

deleted NOMBRE APELLIDO DNI

1 SANDRA BRITTE 25483669

InserciónPara 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 r1VALUES (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 escritoINSERT INTO persona(DNI, NOMBRE, APELLIDO)

VALUES (25483669,"SANDRA","BRITTE")

Page 40: Bases de Datos II

ActualizacionesEn ciertas ocasiones podemos desear cambiar los valores de una tupla sin cambiar todos los valores en dicha tupla. Para este propósito usamos la sentenciaUPDATE r1SET A1 = V1, A2 = V2,...,An = VnWHERE PDonde 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 jugadoresSET nro_camiseta = 7WHERE 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 jugadoresVALUES(26356312,"DEFENSOR", NULL)

inserted DNI PUESTO NRO_CAMISETA

1 26356312 DEFENSOR

 

9. Definición de datos

CreaciónUna relación en SQL se define usando la ordenCREATE 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ónEjemplo 9.1 : crear la relación lesionado con los atributos nombre, apellido ambos de tipo char y tiempo_inhabilit de tipo enteroCREATE TABLE "lesionado.db" (NOMBRE CHAR(20),APELLIDO CHAR(20),TIEMPO_INHABILT INTEGER)

Page 41: Bases de Datos II

lesionado NOMBRE APELLIDO TIEMPO_INHABILT

 

EliminaciónPara 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 personaDROP TABLE persona

ActualizacionLa 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 D1Ejemplo 9.3 : agregar los atributos de tipo char nombre y apellido a la relación jugadoresALTER TABLE jugadores ADD NOMBRE CHAR(20)ALTER TABLE jugadores ADD APELLIDO CHAR(20)

1.-SQL Avanzado.1.1 Recuperación de datos1.1.1 Conceptos básicos de SQL1.1.2 Consultas simples1.1.3 Consultas multitabla1.1.4 Consultas sumarias1.1.5 Subconsultas1.2 Actualización de datos1.2.1 Actualizaciones de bases de datos1.2.2 Integridad de datos1.3 Estructura de una base de datos1.3.1 Creación de una base de datos1.3.2 Vistas1.4 Programación con SQL1.4.1 SQL incorporado1.4.2 SQL dinámico1.4.3 API de SQL 2. Mejoramiento (Tunning). 2.1 Monitoreo y Desempeño2.2 Investigación de Benchmark de Bases de Datos

Page 42: Bases de Datos II

2.3 Métricas de bases de datos