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. 2. 3. 4. 5. 6. 7.

SQL SQL SQL SQL SQL SQL SQL

es un lenguaje de administración de bases de datos es un lenguaje cliente / servidor es un lenguaje de acceso a datos por internet es un lenguaje de bases de datos distribuidas es un lenguaje de pasarelas de bases de datos es un lenguaje interactivo de consultas 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 cust_name cust_address cust_credit_limit ) 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 int char(50), char(50), money, PRIMARY KEY,

CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 )

principal.

Copiar código CREATE TABLE part_sample (part_nmbr part_name part_weight part_color int PRIMARY KEY, char(30), decimal(6,2), 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 part_nmbr int, int

FOREIGN KEY REFERENCES part_sample(part_nmbr) ON DELETE NO ACTION, qty_ordered 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. int);

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 2 MARTIN 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 2 MARTIN 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 1 2 3 4 MARTIN DNI 26125988

ESTEFANIA 27128064 MELISA BETANIA 27456224 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 2 3 4 MARTIN PABLO MELISA 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 2 3 4 5 6 7 8 9 MARQUESI SANCHEZ GUISSINI ALEGRATO BRITTE ARDUL MICHELLI MUSACHEGUI 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 2 3 4

26125988 25485699 28978845 29789854

DELANTERO MEDIO ARQUERO DEFENSOR

9 5 1 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 2 3 MARTIN PABLO 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 2 3 26125988 25485699 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 s 1 2 3 PABLO JUAN MARQUESI SERRAT MARTIN APELLIDO MARQUESI

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 1 2 3 4 5 6 7 8 9 10 SERRAT SANCHEZ NOMBRE JUAN ROBERTO

MUSACHEGUI BETANIA MICHELLI MARQUESI MARQUESI GUISSINI BRITTE ARDUL ALEGRATO SOLEDAD PABLO MARTIN ESTEFANIA SANDRA MELISA 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 1 2 3 4 5 26125988 25485699 27126045 26958644 29120791 AÑOS_PRO CLUB 5 2 3 4 1 ALL BOY'S ALL BOY'S LANUS LANUS LANUS VALOR_ACTUAL 1000 2500 12000 6500 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 1 2 ALL BOY'S LANUS VALOR_TOTAL NRO_JUGADORES 3.500,00 18.950,00 2 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 1 2 ALL BOY'S LANUS JUG_MAS_CARO 2500 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 1 LANUS JUG_MAS_CARO 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 1 NOMBRE APELLIDO SANDRA BRITTE DNI 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 1 NOMBRE APELLIDO SANDRA BRITTE DNI 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 1 DNI 25485699 PUESTO MEDIO NRO_CAMISETA 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

Sign up to vote on this title
UsefulNot useful