Consultas Avanzada

July 18, 2022 | Author: Anonymous | Category: N/A
Share Embed Donate


Short Description

Download Consultas Avanzada...

Description

 

Bases de datos II

SQL Avanzado. Es una herramienta para la organización, organización, gestión, y recuperación de de los datos datos almace alm acenad nados os en base base de datos datos inform informáti áticas cas.. El acróni acrónimo mo sql sql es la abreviatura abrev iatura STRUCTURTED STRUCTURTED QUERY LENGUAGE LENGUAGE (lenguaje (lenguaje estructurad estructurado o 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 con un tipo especifico de base de datos denominado base base de datos relacionales . Si el sistema sistema informátic informático o se halla en una empresa empresa ,

pude que la base de

datos almac datos almacene ene datos datos de inventa inventario rio , de produc producció ción n , de ventas ventas o de nomi no mina nas s . En una una comp comput utad ador ora a pers person onal al pued puede e que que la base base de dato datos s almacenara almac enara datos datos sobre los cheques cheques emitidos emitidos listas listas de de personas personas y de de sus sus números de teléfono o de datos extra dos de datos se denomina data base data base managment managment system cuyas siglas siglas en ingles ingles son DBMS, DBMS, sistema sistema gestor de base de datos

Conceptos básicos de SQL DEFINICION DE LOS DATOS SQL permite permite que el usuario defina la estructura y la organización 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 de aplicación recuperen 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 aplicación actualicen la base base de datos dato s añadiendo datos datos nuevos, eliminando eliminando datos datos antiguos y modificando modificando los datos almacenados previamente

CONTROL DE ACCESO SQL puede puede utilizar utilizarse se para restring restringirla irla capac capacidad idad del usuario usuario para para recupera recuperarr añadirr y modificar añadi modificar datos, protegiend protegiendo o así los datos almacenad almacenados os contra los accesos no utilizados COMPORTAMIENTO DE LOS DATOS SQL se utiliz utiliza a para para coordi coordinar nar el compo comporta rtamie miento nto de datos datos entre entre usuar usuarios ios concurrentes asegurando así que no interfieran entre si. INTREGIDAD DE LOS DATOS SQL define restricciones de de integridad en la base de datos protegiéndola protegiéndola así el deterioro debido a las actualizaciones inconsistentes por los fallos fallos del sistema

1. 2. 3. 4. 5. 6. 7.

SQL es un lenguaje lenguaje de administra administración ción de bases de datos datos SQL es un un leng lenguaj uaje e clie cliente nte / servi servido dorr SQL es es un lenguaje lenguaje de de acceso acceso a datos datos por por internet internet SQL es es un lenguaje lenguaje de de bases bases de datos datos distrib distribuidas uidas SQL es es un lenguaje lenguaje de de pasarelas pasarelas de de bases bases de datos datos SQL es un lenguaje lenguaje interactivo interactivo de consultas consultas SQL es es un lenguaje lenguaje de de programac programación ión d base base datos datos

Consultas simples SELECT Empezaremos por estudiar Empezaremos estudiar la sentencia sentencia SELECT, que permite recuperar recuperar datos de una o varia variass 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 cóm o selecc seleccion ionar ar columna columnass de una tabla, cómo selecc seleccion ionar ar fila filass y cómo obtene obtenerr las filas filas ordenadas por el criterio que queramos. El resultado de lavez consulta es una tabla lógica, porque no se guarda en el disco sino que está en memoria y cada 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 cláusula FROM indicamos en qué tabla tiene que buscar la información 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 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 Ejemplo: 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), sicon la tabla no está indicar en qué base de datos se encuentra la cláusula IN.en la base de datos activa, debemos

 

En la cláusula cláusula IN el nombre nombre de la base base de datos debe incluir incluir el camino camino completo, completo, la extens extensión ión (.mdb), y estar entre comillas simples

La lista de columnas columnas que queremos queremos que aparezca aparezcan n en el resultado 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 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 queremos que aparezcan aparezcan todas las filas incluidas las duplicadas, 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 operación se utiliza cuando cuando tenemos dos tablas con las mismas column columnas as y quer queremos emos 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, 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 de la unión la composición permite obtener fila con datos dos tablas, esto es diferencia muy útil cuando queremos visualizar filas cuyos datos una se encuentran en de doslas 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 ope operad rador or UNION UNION sirve sirve para para obtener obtener a partir partir de dos tablas con las mismas columnas, 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 composición de tablas, permite emparejar filas de distintas tablas de fo form rma a más más efi eficie ciente nte que que co con n el pr prod oduc ucto to ca cart rtes esia iano no cuan cuando do una una de las las colu columna mnass 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 tabl as busca directame directamente nte en la otr otra a tabla tabla las filas que cumple cumplen n la con condic dición ión,, con lo cual 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  son especificaciones de tabla (nombre de tabla con alias o no, nombre de tabla1 y tabla2  son 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.  son las columnas de emparejamiento. col1, col2  son 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 LEFT JOIN y RIGHT RIGHT JOIN JOIN son otro tipo de compos composici ición ón de tabl tablas, as, también también denomin denominada ada composición externa. Son una extensión del INNER JOIN. Las Las co comp mpos osic icio ione ness vi vist stas as hast hasta a ahor ahora a (e (ell pr prod oduc ucto to cart cartes esia iano no y el IN INNE NER R JOIN JOIN)) so son n 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 apare ce encerrada entre paréntesis, paréntesis, no puede contener contener la cláus cláusula ula 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 consulta que contiene contiene una subconsulta, subconsulta, la subconsulta 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 designadas en la FROM de la consulta consulta principal. Como la subco subconsulta nsulta 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 subconsulta aparece en la lista de selección selección de la consulta principal, 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 subconsulta sería una consulta ya que no se ejecuta para cada fila de la tabla origen sino queformar se ejecuta una sola de vezlaalSELECT principio, su resultado se combina con las filas de la otra tabla para las filas origen 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 actualización de esos datos, es decir insertar insertar nuevas filas, borrar filas o cambiar el contenido de las filas de una tabla. Estas operaciones operaciones modifican 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, 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 reservada VALUES se puede sustituir 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  de la tabla Production.  incluye el tipo de datos    y y un límite de tamaño de 15 caracteres. El dominio Product nvarchar  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). 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.

 Restricc iones, reglas,  Restricciones, r eglas, valores val ores predetermin pre determinados ados 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   Restricciones



Reglas   Reglas



Valores predeterminados predeterminados  



Desencadenadores Desencadenad ores 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 de  Desencadenadores DML,  DML, reglas y reglas y valores predeterminados.El 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. 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. 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

 

CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 )

 

)

int

PRIMARY KEY,

char(50), char(50), money,

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. 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. 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 vea  Restricciones FOREIGN KEY KEY.. Una clave externa de una tabla apunta a una clave candidata de otra tabla. En el siguiente ejemplo, la tabla order_part establece una clave externa que hace referencia a la tabla part_sample previamente definida.

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

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



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



SET NULL especifica especifica que todas las filas con claves externas 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. 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 garantizar en la tabla si se incluyen incluyen las columnas columnas event event_type _type y event_time 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_site event_time char(50), datetime,   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. NULL indica al DBMS Reglas de eliminación SET NULL:La regla de eliminación SET NULL que cuando se elimine una fila padre debe definir automáticamente 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 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 eliminació n indica al DBMS lo que debe hacer cuando un usuario unt untente ente 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 posibiñidade que recuerdan a las disponibles 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 ejemploejemp lo- 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 S   QL 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 declarativas impresióna de informe, la interacción con un llevar usuario o elacciones envío denolos resultados(como de unalaconsulta unauninterfaz gráfica) no se pueden a cabo desde el propio propio SQL. Normalmente Normalmente las aplicaciones aplicaciones tienen varios componentes 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 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 del que modelo relacional. En la terminología en SQLcolumna, no se alude a las relaciones, delrelaciones mismo modo no se usa el término atributo, perousada sí la palabra 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 los identificadores de de columna, puesto la que SQL Entry Level prevé más de 18 de caracteres. Consúltese, todos modos, documentación de la basenombres de datoscon no

 

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ésta FLOAT sin indicar empleando, por tanto, la precisión por defecto, también dependiente delalaprecisión, 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 queen una en lareferenciante tabla referenciada eliminada actualizada.podría De hecho, dichos casos la tupla columna (que essea la que se estáo definiendo) haberenvalores 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 PRIMARY KEY REFERENCES Publication(ID), titleINTEGER 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 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. incorporado. Por medio de SQL dinámico los programas pueden crear consultas 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 quetabla formavirtual parte(no deltiene esquema externo. Una vista es una 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). general: al: in infor forma maci ción ón deri deriva vada da de co cons nsult ultas as comp complej lejas as a la que que se acce accede de • En gener 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 comodidad , y se definen para simp simplificar lificar las peticiones peticiones a la base de datos, las vistas ofrecen esta ventajas principales: •

conceder permiso permiso a cada usuario para que solo tenga tenga acceso a SEGURI SEG URIDAD DAD:: Se puede conceder



la base de datos concretos concretos que ese usuario usuario esta autoriz autorizado ado a ver , restringiend restringiendo o asi el acceso de los usuarios a los datos almacenados. SIMPLICIDAD SIMPLIC IDAD DE LAS CONSULTAS: Las vistas pueden extraer datos de varias tablas diferentes difere ntes y presentarla presentarlass como si fueran fueran una sola tabla , convirtiéndolo convirtiéndolo las consultas a varias tablas en consultas consultas a una sola tabla formuladas a la vista.



SIMPLIC SIM PLICIDAD IDADde EST ESTRUC RUCTURA TURAL: vistas vistas pueden pueden ofrecer ofrecer la a base los usu usuari os una vis vista ta personalizada la estructura dL: de e lalas base de datos, pr presentando esentando dearios datos como un

conjunto de tablas virtuales que tiene sentido para el usuario.

 



AISLAMIENTO AISLAM IENTO DE LAS MODIFIC MODIFICACIONES: ACIONES: Las vistas pueden presentar una imagen



consistent consis tente e y no nodifica nodificada da de las estructu estructura ra dr la base base de dat datos, os, aunque 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)] expresión_tabla [with check option]  AS 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 u na 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 de conservació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: Borra do de filas de Borrado d e una tabla tab la a través travé s de una vista vi sta :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 habe haberr 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ó Restauración 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 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 disyunción_eventos]] evento ::= INSERT | DELETE | UPDATE [OF comalista_nombre_atributo] comalista_nombre_atributo] EVENTOS {BEFORE | AFTER | INSTEAD OF} evento [disyunción_eventos disyunción_eventos]] ON {nombre_relación | nombre_vista} disyunción_eventos ::= OR evento [disyunción_eventos disyunción_eventos]] evento ::= INSERT | DELETE | UPDATE [OF comalista_nombre_atributo] comalista_nombre_atributo] EVENTOS

Parametrización de eventos:  – los eventos de las reglas FOR EACH ROW RO W 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 sintaxis similar a la condició condición 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 parámetros del evento

Disparadores en SQL. ACCIONES  bloque PL/SQL  – bloque escrito en el lenguaje lenguaje de programación de Oracle PL/SQL PL/SQL  – sentencias de manipulación manipulación de la BD: INSERT, DELETE, DELETE, UPDATE,

SELECT ... INTO ...  – sentencias de programa: asignación, asignación, selección, iteración  – sentencias de manejo de errores  – sentencias de entrada/salida. 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 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 la  evaluación de la expresión La cláusula WHERE costa de un predicado que implica atributos de las relaciones que aparecen en la cláusula FROM. Una consulta básica en SQL tiene la forma: SELECT A1,A2,...,An FROM r1,r2,...,rn WHERE P Donde Ai = atributo ( Campo de la tabla ) ri = relación ( Tabla ) P = predicado ( condición ) Ejemplo 2.1 : Seleccionar todos los nombres de las personas que tengan el apellido MARQUESI de la tabla persona SELECT nombre FROM persona WHERE apellido = " MARQUESI"  ANSWER NOMBRE 1

MARTIN

2

PABLO

 

El resultado de una consulta es por supuesto otra relación. Si se omite la cláusula WHERE, el predicado P es verdadero. La lista A1, A2,..., An puede sustituirse por un asterisco (*) para seleccionar todos los atributos de todas las relaciones que aparecen en la cláusula FROM, aunque no es conveniente elegir esta ultima opción salvo que sea necesario pues desperdiciamos mucho tiempo en tiempo  en obtenerlo  Alias Es posible renombrar los atributos y las relaciones, a veces por conveniencia necesario, para esto usamos la clausula AS como en el siguiente ejemplo. y otras veces por ser Ejemplo 2.2 SELECT P.nombre AS [PRIMER NOMBRE] FROM persona P WHERE apellido = "MARQUESI"  ANSWER PRIMER NOMBRE 1

MARTIN

2

PABLO  

En este ejemplo cabe destacar un par de cosas. Cuando nos referimos a un atributo como es el caso de nombre, podemos referirnos a este usando la relación ( o el alias en este ejemplo ) a la que pertenece el atributo seguido de un punto seguido del atributo , 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 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 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 valores comprendidos  comprendidos Ejemplo 3.1 encontrar todos los nombres y dni de las personas cuyos dni sea mayor que 26 millones y menor a 28 millones SELECT nombre, dni FROM persona WHERE dni BETWEEN 26000000 and 28000000  ANSWER NOMBRE

DNI

1

MARTIN

26125988

2

ESTEFANIA 27128064

3

MELISA

27456224

4

BETANIA

27128765  

 Análogamente podemos usar el operador de comparación NOT BETWEEN. SQL también incluye un operador de selección para comparaciones de cadena de caracteres. Los modelos se 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 ( igualdad ( = ) lo cual es un error de sintaxis. Ejemplo 3.2 : encontrar los nombres que comiencen con la letra p o el nombre tenga exactamente 6 caracteres de la relación persona SELECT nombre FROM persona WHERE (nombre LIKE "P%") OR (nombre LIKE "_ _ _ _ _ _")  ANSWER NOMBRE 1

MARTIN

2

PABLO

3

MELISA

4

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

 

4. Tuplas duplicadas Los lenguajes de consulta formales se basan en la noción matemática noción  matemáticade de 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. 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 apellidos la cláusula Ejemplo 4.1: Listar todos los noSELECT repetidos de la relación persona SELECT DISTINCT apellido FROM persona  ASWER APELLIDO 1

MARQUESI

2

SANCHEZ

3

GUISSINI

4

ALEGRATO

5

BRITTE

6

ARDUL

7

MICHELLI

8

MUSACHEGUI

9

SERRAT

Si observamos la tabla original de la relación persona veremos que el apellido marquesi aparecía dos veces, pero debido al uso de DISTINCT en la consulta la relación respuesta solo lista un solo marquesi. Operaciones de conjunto. SQL incluye las operaciones de conjuntos de conjuntos UNION, INTERSECT, MINUS, que operan sobre relaciones y corresponden a las operaciones del álgebra del álgebraunión, unión, intersección y resta de conjuntos respectivamente. Para realizar esta operación de conjuntos debemos tener sumo cuidado que cuidado que las relaciones tengan las mismas estructuras mismas  estructuras.. Incorporemos ahora una nueva relación, llamada jugadores que representa las personas que  juegan al fútbol al fútbol,, sus atributos serán DNI, puesto y nro_camiseta. Supongamos que esta nueva tabla esta conformada de la siguiente manera JUGADORES DNI

PUESTO

NRO_CAMISETA

 

1

26125988

DELANTERO

9

2

25485699

MEDIO

5

3

28978845

ARQUERO

1

4

29789854

DEFENSOR

3  

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

MARTIN

2

PABLO

3

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

 ANSWER DNI 1

26125988

2

25485699

3

28978845

Por omisión, la operación de union elimina las tuplas duplicadas. Para retener duplicados se debe escribir UNION ALL en lugar de UNION.

 

Pertenencia a un conjunto El conector IN prueba si se es miembro de un conjunto, donde el conjunto es una colección de valores producidos en lo general por una cláusula SELECT. Análogamente el conector NOT IN prueba la no pertenencia al conjunto Ejemplo 4.4 : Encontrar los nombres de las personas que juegan al fútbol y, además, se encuentran en la relación persona SELECT nombre, apellido FROM persona WHERE dni IN (SELECT dni FROM jugadores)  ANSWER NOMBRE s

APELLIDO

MARTIN

MARQUESI

2

PABLO

MARQUESI

3

JUAN

SERRAT

1

Es posible probar la pertenencia de una relación arbitraria SQL usa la notación de elementos para representar una tupla de elementos de n que contiene los contiene  los valores v1,v2,...,vn. Comparación de conjuntos En conjuntos la frase > se representa en SQL por ( >SOME ), también podría entenderse esto como >, su sintaxis es igual que la del conector IN. SQL también permite las comparaciones ( >SOME ),( =SOME ) ( >=SOME ), ( ALL ), que corresponde a la frase >. Al igual que el operador SOME, puede escribirse ( >ALL ),( =ALL ) ( >=ALL ), ( 10000  ANSWER CLUB

JUG_MAS_CARO

1

12000

LANUS

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  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 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 sistema debería buscar confirmación del usuario antes de ejecutar una acción tan acción tan devastadora ) Ejemplo 7.1 : Eliminar todas las tuplas de la relación persona en donde apellido sea igual a "BRITTE" DELETE FROM persona WHERE apellido = "BRITTE" deleted

NOMBRE APELLIDO

DNI

1

SANDRA BRITTE

25483669

Inserción Para insertar  datos en  datos en una relación, especificamos una tupla que se va a insertar o escribimos una

 

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

NOMBRE APELLIDO

DNI

1

SANDRA BRITTE

25483669

En este ejemplo, los valores se especifican en el orden en que se listan los atributos correspondientes en el esquema de relación. Para poder  Para  poder  ingresar  ingresar los datos en un orden diferente podríamos haber escrito INSERT INTO persona(DNI, NOMBRE, APELLIDO) VALUES (25483669,"SANDRA","BRITTE")  Actualizaciones En ciertas ocasiones podemos desear cambiar los valores de una tupla sin cambiar todos los valores en dicha tupla. Para este propósito usamos la sentencia UPDATE r1 SET A1 = V1, A2 = V2,...,An = Vn WHERE P Donde r1 es la relación Ai el atributo a modificar Vi el valor que se le asignara a Ai y P es el predicado. Ejemplo 7.3 : En la relación jugadores actualizar la posición de los jugadores que posean la camiseta numero 5 y asignarles la camiseta numero 7. UPDATE jugadores SET nro_camiseta = 7 WHERE nro_camiseta = 5 updated

DNI

PUESTO

1

25485699 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  información  sobre la relación sacada de la base de datos, esta 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) CHA R(20)  ALTER TABLE jugadores ADD APELLIDO CHAR(20) CHA R(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

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF