martes, 6 de octubre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Combinación natural externa a BDUOC (I)

En los ejemplos siguientes veremos cómo varían los resultados que iremos obteniendo según los tipos de combinación externa:

a) Combinación externa izquierda
SELECT e.codigo_empl, e.nombre_empl, e.nombre_dep, e.ciudad_dep, d.telefono
FROM empleados e NATURAL LEFT OUTER JOIN departamentos d;

El resultado sería el que podemos ver a continuación:

lunes, 5 de octubre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Combinación natural interna en BDUOC

Si quisiéramos vincular con una combinación natural interna las tablas empleados y departamentos para saber el código y el nombre de todos los empleados y el nombre, la ciudad y el teléfono de todos los departamentos, haríamos:

SELECT e.codigo_empl, e.nombre_empl, e.nombre_dep, e.ciudad_dep, d.telefono
FROM empleados e NATURAL JOIN departamentos d;

Y obtendríamos el siguiente resultado:

domingo, 4 de octubre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Combinación natural en BDUOC (IV)

b) Por ello disponemos de la combinación externa (outer join), que nos permite obtener todos los valores de la tabla que hemos puesto a la derecha, los de la tabla que hemos puesto a la izquierda o todos los valores de las dos tablas.
Su formato es:

SELECT nombre_columnas_a_seleccionar
FROM t1 [NATURAL] [LEFT|RIGHT|FULL] [OUTER] JOIN t2
{ON condiciones|
[USING (columna [,columna...])}
[WHERE condiciones];

sábado, 3 de octubre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Combinación natural en BDUOC (III)

Combinación interna y externa
Cualquier combinación puede ser interna o externa:
a) La combinación interna (inner join) sólo se queda con las filas que tienen valores idénticos en las columnas de las tablas que compara. Esto puede hacer que perdamos alguna fila interesante de alguna de las dos tablas; por ejemplo, porque se encuentra a NULL en el momento de hacer la combinación. Su formato es el siguiente:


SELECT nombre_columnas_a_seleccionar
FROM t1 [NATURAL] [INNER] JOIN t2
{ON condiciones|
|USING (columna [,columna...])}
[WHERE condiciones];

viernes, 2 de octubre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Combinación natural en BDUOC (II)

Veamos a continuación un ejemplo en el que las columnas para las que se haría la combinación natural se denominan igual en las dos tablas. Ahora queremos saber el código y el nombre de los empleados que están asignados al departamento cuyo teléfono es 977.33.38.52:
SELECT codigo_empl, nombre_empl
FROM empleados NATURAL JOIN departamentos
WHERE telefono = '977.333.852';

La combinación natural también se podría hacer con la cláusula USING, sólo aplicando la palabra reservada JOIN:

SELECT codigo_empl, nombre_empl
FROM empleados JOIN departamentos USING (nombre_dep, ciudad_dep)
WHERE telefono = '977.333.852';

La respuesta que daría sería:

jueves, 1 de octubre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Dos alias para una misma tabla en BDUOC (II)

Combinación natural

La combinación natural (natural join) de dos tablas consiste básicamente, al igual que en el álgebra relacional, en hacer una equicombinación entre columnas del mismo nombre y eliminar las columnas repetidas. La combinación natural, utilizando el SQL92 intermedio o completo, se haría de la forma siguiente:

SELECT nombre_columnas_a_seleccionar
FROM tabla1 NATURAL JOIN tabla2
[WHERE condiciones];

miércoles, 30 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Dos alias para una misma tabla en BDUOC (I)

Si pidiésemos los códigos y los apellidos de los empleados que ganan más que el empleado que tiene por código el número 5, haríamos lo siguiente:

SELECT el.codigo_empl, el.apellido_empl
FROM empleados el JOIN empleados e2 ON el.sueldo > e2.sueldo
WHERE e2.codigo_empl = 5;
Hemos tomado la tabla e2 para fijar la fila del empleado con código número 5, de modo que podamos comparar el sueldo de la tabla e1, que contiene a todos los empleados, con el sueldo de la tabla e2, que contiene sólo al empleado 5.
La respuesta a esta consulta sería:

martes, 29 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla -Ejemplo anterior con el SQL92 intermedio o completo

El ejemplo que hemos expuesto antes utilizando el SQL92 intermedio o completo sería:
SELECT p.codigo_proyecto, p.precio, c.nif, p.codigo_cliente, c.codigo_cli
FROM clientes c JOIN proyectos p ON c.codigo_cli = p.codigo_cliente
WHERE c.codigo_cli = 20;

obtendríamos el mismo resultado de antes.
La opción ON, además de expresar condiciones con la igualdad, en el caso de que las columnas que queramos vincular tengan nombres diferentes, nos ofrece la posibilidad de expresar condiciones con los demás operadores de comparación que no sean el de igualdad. Sería el equivalente a la operación que en álgebra relacional hemos denominado θ-combinación (θ-join).
También podemos utilizar una misma tabla dos veces con alias diferentes, para distinguirlas.

lunes, 28 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Ejemplo de alias en BDUOC (III)

La forma de expresar la combinación que acabamos de ver pertenece al SQL92 introductorio. Una forma alternativa de realizar la equicombinación anterior, utilizando el SQL92 intermedio o completo, sería la siguiente:
SELECT nombre_columnas_a_seleccionar
FROM tabla1 JOIN tabla2
{ON condiciones|USING (columna [, columna...])}
[WHERE condiciones];

domingo, 27 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Ejemplo de alias en BDUOC (II)

Notemos que en WHERE necesitamos expresar el vínculo que se establece entre las dos tablas, en este caso codigo_cli de clientes y codigo_cliente de proyectos. Expresado en operaciones del álgebra relacional, esto significa que hacemos una combinación en lugar de un producto cartesiano.
Fijémonos en que, al igual que en álgebra relacional, la operación que acabamos de hacer es una equicombinación (equi-join); por lo tanto, nos aparecen dos columnas idénticas: c.codigo_ cli y p.codigo_cliente.

sábado, 26 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Ejemplo de alias en BDUOC (I)

c podría ser el alias de la tabla clientes. De este modo, para indicar a qué tabla pertenece codigo_cli, sólo haría falta poner: c.codigo_cli.
Veamos cómo quedaría la consulta anterior expresada mediante alias, aunque en este ejemplo no serían necesarios, porque todas las columnas de las dos tablas tienen nombres diferentes.
Pediremos, además, las columnas c.codigo_cli y p.codigo_cliente.
SELECT p.codigo_proyecto, p.precio, c.nif, p.codigo_cliente, c.codigo_cli
FROM clientes c, proyectos p
WHERE c.codigo_cli = p.codigo_cliente AND c.codigo_cli = 20;

Entonces obtendríamos este resultado:

viernes, 25 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla - Ejemplo de combinación en BDUOC

A continuación mostramos un ejemplo con la base de datos BDUOC en el que queremos saber el NIF del cliente y el código y el precio del proyecto que desarrollamos para el cliente
número 20:

SELECT proyectos.codigo_proyecto, proyectos.precio, clientes.nif
FROM clientes, proyectos
WHERE clientes.codigo_cli = proyectos.codigo_cliente AND clientes.
codigo_cli = 20;

El resultado sería:
Si trabajamos con más de una tabla, puede ocurrir que la tabla resultante tenga dos columnas con el mismo nombre. Por ello es obligatorio especificar a qué tabla corresponden las columnas a las que nos estamos refiriendo, denominando la tabla a la que pertenecen antes de ponerlas (por ejemplo, clientes. codigo_cli). Para simplificarlo, se utilizan los alias que, en este caso, se definen en la cláusula FROM.

jueves, 24 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a más de una tabla

Muchas veces queremos consultar datos de más de una tabla haciendo combinaciones de columnas de tablas diferentes. En el SQL es posible listar más de una tabla que se quiere consultar especificándolo en la cláusula FROM.
1) Combinación
La combinación consigue crear una sola tabla a partir de las tablas especificadas en la cláusula FROM, haciendo coincidir los valores de las columnas relacionadas de estas tablas.

miércoles, 23 de septiembre de 2015

SQL Sentencias de manipulación - Ejemplo de uso de la función de agregación SUM

Veamos un ejemplo de uso de una función de agregación SUM del SQL que aparece en la cláusula HAVING de GROUP BY: “Queremos saber los códigos de los proyectos en los que la suma
de los sueldos de los empleados es mayor que 180.000 euros”:
SELECT num_proyec
FROM empleados
GROUP BY num_proyec
HAVING SUM (sueldo) >1.8E+5;
El resultado de esta consulta sería el que se ve al margen.

martes, 22 de septiembre de 2015

SQL Sentencias de manipulación - Consulta con agrupación de filas en BDUOC

Imaginemos que queremos saber el sueldo medio que ganan los empleados de cada departamento:

SELECT nombre_dep, ciudad_dep, AVG(sueldo) AS sueldo_medio
FROM empleados
GROUP BY nombre_dep, ciudad_dep;

El resultado de esta consulta sería:

lunes, 21 de septiembre de 2015

SQL Sentencias de manipulación - Consultas con agrupación de filas de una tabla

Las cláusulas siguientes, añadidas a la instrucción SELECT FROM, permiten organizar las filas por grupos:
a) La cláusula GROUP BY nos sirve para agrupar filas según las columnas que indique esta cláusula.

b) La cláusula HAVING especifica condiciones de búsqueda para grupos de filas; lleva a cabo la misma función que antes cumplía la cláusula WHERE para las filas de toda la tabla, pero ahora las condiciones se aplican a los grupos obtenidos.
Presenta el siguiente formato:

SELECT nombre_columnas_a seleccionar
FROM tabla_a_consultar
[WHERE condiciones]
GROUP BY columnas_según_las_cuales_se_quiere_agrupar
[HAVING condiciones_por_grupos]
[ORDER BY columna_ordenación [DESC] [, columna [DESC]...]];

domingo, 20 de septiembre de 2015

SQL Sentencias de manipulación - Consulta a BDUOC con respuesta ordenada

Imaginemos que queremos consultar los nombres de los empleados ordenados según el sueldo que ganan, y si ganan el mismo sueldo, ordenados alfabéticamente por el nombre:

SELECT codigo_empl, nombre_empl, apellido_empl, sueldo
FROM empleados
ORDER BY sueldo, nombre_empl;
Esta consulta daría la respuesta siguiente:

Si no se especifica nada más, se seguirá un orden ascendente, pero si se desea seguir un orden descendente es necesario añadir DESC detrás de cada factor de ordenación expresado en la cláusula ORDER BY:
ORDER BY columna_ordenación [DESC] [, columna [DESC] ...]
También se puede explicitar un orden ascendente poniendo la palabra clave ASC (opción por defecto).

sábado, 19 de septiembre de 2015

SQL Sentencias de manipulación - Ordenación de los datos obtenidos en respuestas a consultas

Si se desea que, al hacer una consulta, los datos aparezcan en un orden determinado, es preciso utilizar la cláusula ORDER BY en la sentencia SELECT, que presenta el siguiente formato:
SELECT nombre_columnas_a seleccionar
FROM tabla_a_consultar

[WHERE condiciones]
ORDER BY columna_según_la_cual_se_quiere_ordenar [DESC]
[, col_ordenación [DESC]...];

viernes, 18 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (X)

Ejemplo de uso del predicado EXISTS

Un ejemplo en el que se buscan los códigos y los nombres de los empleados que están asignados a algún proyecto sería:
SELECT codigo_empl, nombre_empl
FROM empleados
WHERE EXISTS (SELECT *
FROM proyectos
WHERE codigo_proyec = num_proyec);

La respuesta a esta consulta sería la que se muestra en el margen.

jueves, 17 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (IX)

Predicado EXISTS

Para comprobar si una subconsulta produce alguna fila de resultados, podemos utilizar la sentencia denominada test de existencia: EXISTS. Para comprobar si una subconsulta no produce ninguna fila de resultados, podemos utilizar NOT EXISTS.

SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE [NOT] EXISTS subconsulta;

miércoles, 16 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (VIII)

a) Veamos un ejemplo de aplicación de ALL para encontrar los códigos y los nombres de los proyectos en los que los sueldos de todos los empleados asignados son menores que el precio del proyecto:

SELECT codigo_proyec, nombre_proyec
FROM proyectos
WHERE precio > ALL (SELECT sueldo
FROM empleados
WHERE codigo_proyec = num_proyec);

Fijémonos en la condición de WHERE de la subconsulta, que nos asegura que los sueldos que observamos son los de los empleados asignados al proyecto de la consulta. La respuesta a esta consulta sería la que aparece en el margen.

b) A continuación, presentamos un ejemplo de ANY/SOME para buscar los códigos y los nombres de los proyectos que tienen algún empleado que gana un sueldo más elevado que el precio
del proyecto en el que trabaja.

SELECT codigo_proyec, nombre_proyec
FROM proyectos
WHERE precio < ANY (SELECT sueldo FROM empleados WHERE codigo_proyec = num_proyec);


La respuesta a esta consulta está vacía, como se ve en el margen.

martes, 15 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (VII)

Predicados ANY/SOME y ALL

Para ver si una columna cumple que todas sus filas (ALL) o algunas de sus filas (ANY/SOME) satisfagan una condición, podemos hacer:

SELECT nombre_columnas_a seleccionar
FROM tabla_a_consultar
WHERE columna operador_comparación {ALL|ANY|SOME}subconsulta;

lunes, 14 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (VI)

Ejemplo de uso del predicado IS NULL

Un ejemplo de uso de este predicado sería “Queremos saber el código y el nombre de todos los empleados que no están asignados a ningún proyecto”:

SELECT codigo_empl, nombre_empl
FROM empleados
WHERE num_proyec IS NULL;
Obtendríamos la respuesta que tenemos al margen.

domingo, 13 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (V)

Predicado IS NULL

Para comprobar si un valor es nulo utilizaremos IS NULL, y para averiguar si no lo es, IS NOT NULL. El formato es:

SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE columna IS [NOT] NULL;

sábado, 12 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (IV)

Ejemplo de uso del predicado LIKE

A continuación presentamos un ejemplo en el que buscaremos los nombres de los empleados que empiezan por J, y otro ejemplo en el que obtendremos los proyectos que comienzan por S y tienen cinco letras:
a) Nombres de empleados que empiezan por la letra J:

SELECT codigo_empl, nombre_empl
FROM empleados
WHERE nombre_empl LIKE ‘J%’;

La respuesta a esta consulta sería la que se muestra en el margen.

b) Proyectos que empiezan por S y tienen cinco letras:

SELECT codigo_proyec
FROM proyectos
WHERE nombre_proyec LIKE ‘S_ _ _ _’;

Y la respuesta a esta otra consulta sería la que aparece en el margen.

viernes, 11 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (III)

Predicado LIKE

Para comprobar si una columna de tipo carácter cumple alguna propiedad determinada, podemos usar LIKE:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE columna LIKE característica;

Los patrones del SQL92 para expresar características son los siguientes:
a) Pondremos un carácter _ para cada carácter individual que queramos considerar.
b) Pondremos un carácter % para expresar una secuencia de caracteres, que puede no estar formada por ninguno.

jueves, 10 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (II)

Predicado IN

Para comprobar si un valor coincide con los elementos de una lista utilizaremos IN, y para ver si no coincide, NOT IN:

miércoles, 9 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Otros predicados (I)

Predicado BETWEEN

Para expresar una condición que quiere encontrar un valor entre unos límites concretos, podemos utilizar BETWEEN:

martes, 8 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Subconsulta en BDUOC

Si quisiéramos saber los códigos y los nombres de los proyectos de precio más elevado, en primer lugar tendríamos que encontrar los proyectos que tienen el precio más elevado.
Lo haríamos de la forma siguiente:

lunes, 7 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional -Subconsultas

Una subconsulta es una consulta incluida dentro de una cláusula WHERE o HAVING de otra consulta. En ocasiones, para expresar ciertas condiciones no hay más remedio que obtener el valor que buscamos como resultado de una consulta.

domingo, 6 de septiembre de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Ejemplo de utilización de la función COUNT (*)

Veamos un ejemplo de uso de la función COUNT, que aparece en la cláusula SELECT, para hacer la consulta “¿Cuántos departamentos están ubicados en la ciudad de Lleida?”:

jueves, 23 de julio de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Funciones de agregración

El SQL nos ofrece las siguientes funciones de agregación para efectuar varias operaciones sobre los datos de una base de datos:
En general, las funciones de agregación se aplican a una columna, excepto la función de agregación COUNT, que normalmente se aplica a todas las columnas de la tabla o tablas seleccionadas. Por lo tanto, COUNT (*) contará todas las filas de la tabla o las tablas que cumplan las condiciones. Si se utilizase COUNT(distinct columna), sólo contaría los valores que no fuesen nulos ni repetidos, y si se utilizase COUNT (columna), sólo contaría los valores que no fuesen nulos.

miércoles, 22 de julio de 2015

martes, 21 de julio de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Consultas a BDUOC seleccionando filas (I)

Si queremos que en una consulta nos aparezcan las filas resultantes sin repeticiones, es preciso poner la palabra clave DISTINCT inmediatamente después de SELECT. También podríamos explicitar que lo queremos todo, incluso con repeticiones, poniendo ALL (opción por defecto) en lugar de DISTINCT. El formato de DISTINCT es:

lunes, 20 de julio de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Consultas a BDUOC seleccionando filas (I)

Veamos un ejemplo en el que pedimos “los códigos de los empleados que trabajan en el proyecto número 4”:

domingo, 19 de julio de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Consultas a BDUOC (II)

Si hubiésemos querido ver sólo el código, el nombre, la dirección y la ciudad, habríamos hecho:

sábado, 18 de julio de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional - Consultas a BDUOC (I)

A continuación presentamos un ejemplo de consulta a la base de datos BDUOC para conocer todos los datos que aparece en la tabla clientes:

viernes, 17 de julio de 2015

SQL Sentencias de manipulación - Consultas a una base de datos relacional

Para hacer consultas sobre una tabla con el SQL es preciso utilizar la sentencia SELECT FROM, que tiene el siguiente formato:
La opción AS nos permite renombrar las columnas que queremos seleccionar o las tablas que queremos consultar que en este caso, es sólo una. Dicho de otro modo, nos permite la definición de alias. Fijémonos en que la palabra clave AS es opcional, y es bastante habitual poner sólo un espacio en blanco en lugar de toda la palabra

jueves, 16 de julio de 2015

SQL Sentencias de manipulación - Introducción de filas en la base de datos relacional BDUOC

Antes de empezar a hacer consultas a la base de datos BDUOC, habremos introducido unas cuantas filas en sus tablas con la sentencia INSERT INTO. De esta forma, podremos ver reflejado el resultado de las consultas que iremos haciendo, a partir de este momento, sobre cada extensión; esto lo podemos observar en las tablas correspondientes a cada extensión, que presentamos a continuación:


miércoles, 15 de julio de 2015

SQL Sentencias de manipulación - Modificación de los valores de algunas filas en BDUOC

Supongamos que queremos incrementar el sueldo de todos los empleados del proyecto 2 en 1.000 euros. La modificación a ejecutar sería:

martes, 14 de julio de 2015

SQL Sentencias de manipulación - Modificación de filas de una tabla

Si quisiéramos modificar los valores de algunas filas de una tabla, tendríamos que utilizar la sentencia UPDATE SET WHERE. A continuación presentamos su formato:

lunes, 13 de julio de 2015

SQL Sentencias de manipulación - Borrado de filas de una tabla - Borrar todas las filas de una tabla en BDUOC

Podemos dejar la tabla proyectos sin ninguna fila:
DELETE FROM proyectos;
En nuestra base de datos, borrar los proyectos del cliente 2 se haría de la forma que mostramos a continuación:

domingo, 12 de julio de 2015

SQL Sentencias de manipulación - Borrado de filas de una tabla

Para borrar valores de algunas filas de una tabla podemos utilizar la sentencia DELETE FROM WHERE. Su formato es el siguiente:
En cambio, si lo que quisiéramos conseguir es borrar todas las filas de una tabla, entonces sólo tendríamos que poner la sentencia DELETE FROM, sin WHERE.

sábado, 11 de julio de 2015

SQL Sentencias de manipulación - Inserción de una fila en BDUOC

La forma de insertar a un cliente en la tabla clientes de la base de datos de BDUOC es:

viernes, 10 de julio de 2015

SQL Sentencias de manipulación - Inserción de filas en una tabla

Antes de poder consultar los datos de una base de datos, es preciso introducirlos con la sentencia INSER TINTO VALUES, que tiene el formato:
Los valores v1, v2, ..., vn se deben corresponder exactamente con las columnas que hemos dicho que tendríamos con el CREATE TABLE y deben estar en el mismo orden, a menos que las volvamos a poner a continuación del nombre de la tabla. En este último caso, los valores se deben disponer de forma coherente con el nuevo orden que hemos impuesto. Podría darse el caso de que quisiéramos que algunos valores para insertar fuesen valores por omisión, definidos previamente con la opción DEFAULT. Entonces pondríamos la palabra reservada DEFAULT. Si se trata de introducir valores nulos, también podemos utilizar la palabra reservada NULL.

jueves, 9 de julio de 2015

SQL Sentencias de manipulación

Una vez creada la base de datos con sus tablas, debemos poder insertar, modificar y borrar los valores de las filas de las tablas. Para poder hacer esto, el SQL92 nos ofrece las siguientes sentencias: INSERT para insertar, UPDATE para modificar y DELETE para borrar. Una vez hemos insertado valores en nuestras tablas, tenemos que poder consultarlos. La sentencia para hacer consultas a una base de datos con el SQL92 es SELECT FROM. Veamos a continuación estas sentencias.

miércoles, 8 de julio de 2015

SQL Definición de la base de datos relacional BDUOC (II)

Al crear una tabla vemos que muchas restricciones se pueden imponer de dos formas: como restricciones de columna o como restricciones de tabla. Por ejemplo, cuando queremos decir cuál es la clave primaria de una tabla, tenemos las dos posibilidades. Esto se debe a la flexibilidad del SQL:
• En el caso de que la restricción haga referencia a un solo atributo, podemos elegir la posibilidad que más nos guste.
• En el caso de la tabla departamentos, tenemos que elegir por fuerza la opción de restricciones de tabla, porque la clave primaria está compuesta por más de un atributo.
En general, lo pondremos todo como restricciones de tabla, excepto NOT NULL CHECK cuando haga referencia a una sola columna.

martes, 7 de julio de 2015

SQL Definición de la base de datos relacional BDUOC (I)

Veamos cómo se crearía la base de datos BDUOC, utilizando, por ejemplo, un SGBD relacional que disponga de la sentencia CREATE DATABASE:

lunes, 6 de julio de 2015

SQL Creación y borrado de vistas Borrar una vista en BDUOC

Para borrar la vista clientes_Barcelona_Girona, haríamos lo siguiente:

DROP VIEW clientes_Barcelona_Girona RESTRICT;

domingo, 5 de julio de 2015

SQL Creación y borrado de vistas Actualización de vistas en BDUOC (IV)

Para borrar una vista es preciso utilizar la sentencia DROP VIEW, que presenta el formato:
DROP VIEW nombre_vista (RESTRICT|CASCADE);
Si utilizamos la opción RESTRICT, la vista no se borrará si está referenciada, por ejemplo, por otra vista. En cambio, si ponemos la opción CASCADE, todo lo que referencie a la vista se borrará con ésta.

sábado, 4 de julio de 2015

SQL Creación y borrado de vistas Actualización de vistas en BDUOC (III)

Si queremos asegurarnos de que se cumpla la condición de la cláusula WHERE, debemos poner la opción WHITH CHECK OPTION. Si no lo hiciésemos, podría ocurrir que alguien incluyese en la vista clientes_Barcelona_Girona a un cliente nuevo con el código 70, de nombre JMB, con el NIF 36.788.224-C, la dirección en NULL, la ciudad Lleida y el teléfono NULL.
Si consultásemos la extensión de la vista clientes_Barcelona_Girona, veríamos:

viernes, 3 de julio de 2015

SQL Creación y borrado de vistas Actualización de vistas en BDUOC (II)

El SGBD no puede actualizar la tabla básica clientes si sólo sabe la clave primaria, y todavía menos la tabla básica proyectos sin la clave primaria; por lo tanto, esta vista no sería actualizable.
En cambio, si definimos una vista para saber los clientes que tenemos en Barcelona o en Girona, haríamos:

jueves, 2 de julio de 2015

SQL Creación y borrado de vistas Actualización de vistas en BDUOC (I)

Si alguien insertase en la vista proyectos_por_cliente, los valores para un nuevo cliente 60 con tres proyectos encargados, encontraríamos que estos tres proyectos tendrían que figurar realmente en la tabla proyectos y, por lo tanto, el SGBD los debería insertar con la información que tenemos, que es prácticamente inexistente. Veamos gráficamente cómo quedarían las tablas después de esta hipotética actualización, que no llegaremos a hacer nunca, ya que iría en contra de la teoría del modelo relacional:

miércoles, 1 de julio de 2015

SQL Creación y borrado de vistas Creación de una vista en BDUOC

Creamos una vista sobre la base de datos BDUOC que nos dé para cada cliente el número de proyectos que tiene encargados el cliente en cuestión.

martes, 30 de junio de 2015

SQL Creación y borrado de vistas

Como hemos observado, la arquitectura ANSI/SPARC distingue tres niveles, que se describen en el esquema conceptual, el esquema interno y los esquemas externos.
Hasta ahora, mientras creábamos las tablas de la base de datos, íbamos describiendo el esquema conceptual. Para describir los diferentes esquemas externos utilizamos el concepto de vista del SQL.
Para crear una vista es necesario utilizar la sentencia CREATE VIEW. Veamos su formato:

Lo primero que tenemos que hacer para crear una vista es decidir qué nombre le queremos poner (nombre_vista). Si queremos cambiar el nombre de las columnas, o bien poner nombre a alguna que en principio no tenía, lo podemos hacer en lista_columnas. Y ya sólo nos quedará definir la consulta que formará nuestra vista.
Las vistas no existen realmente como un conjunto de valores almacenados en la base de datos, sino que son tablas ficticias, denominadas derivadas (no materializadas). Se construyen a partir de tablas reales (materializadas) almacenadas en la base de datos, y conocidas con el nombre de tablas básicas (o tablas de base). La no-existencia real de las vistas hace que puedan ser actualizables o no.

lunes, 29 de junio de 2015

SQL Modificación y borrado de tablas (III)

En este caso tenemos que:
• Si utilizamos la opción RESTRICT, la tabla no se borrará si está referenciada, por ejemplo, por alguna vista.
• Si usamos la opción CASCADE, todo lo que referencie a la tabla se borrará con ésta

domingo, 28 de junio de 2015

SQL Modificación y borrado de tablas (II)

Si queremos modificar una tabla es que queremos realizar una de las siguientes operaciones:
1) Añadirle una columna (ADD columna).
2) Modificar las definiciones por defecto de la columna (ALTER columna).
3) Borrar la columna (DROP columna).
4) Añadir alguna nueva restricción de tabla (ADD restricción).
5) Borrar alguna restricción de tabla (DROPCONSTRAINT restricción).
Para borrar una tabla es preciso utilizar la sentencia DROP TABLE:

DROP TABLE nombre_tabla {RESTRICT|CASCADE};

sábado, 27 de junio de 2015

SQL Modificación y borrado de tablas (I)

Para modificar una tabla es preciso utilizar la sentencia ALTER TABLE. Veamos su formato:



viernes, 26 de junio de 2015

SQL - Aserciones Borrar una aserción en BDUOC

Por ejemplo, para borrar la aserción restriccion1, utilizaríamos la sentencia DROP ASSERTION de la forma siguiente:

DROP ASSERTION restriccion1;

jueves, 25 de junio de 2015

SQL - Aserciones Crear una aserción en BDUOC


Creamos una aserción sobre la base de datos BDUOC que nos asegure que no hay ningún empleado con un sueldo superior a 80.000 asignado al proyecto SALSA:

miércoles, 24 de junio de 2015

SQL - Aserciones

Una aserción es una restricción general que hace referencia a una o más columnas de más de una tabla. Para definir una aserción se utiliza la sentencia CREATE ASSERTION, y tiene el siguiente formato:
CREATE ASSERTION nombre_aserción CHECK (condiciones);

martes, 23 de junio de 2015

SQL Modificación y borrado de claves primarias con claves foráneas que hacen referencia a éstas (II)

Donde una de las restricciones de tabla era la definición de claves foráneas, que tiene el siguiente formato:
Donde NO ACTION corresponde a la política de restricción; CASCADE, a la actualización en cascada, y SET NULL sería la anulación. SET DEFAULT se podría considerar una variante de SET NULL, donde en lugar de valores nulos se puede poner el valor especificado por defecto.

lunes, 15 de junio de 2015

Lenguaje de marcado de hipertexto 5

El lenguaje de marcado de hipertexto es el lenguaje más utilizado para la elaboración de aplicaciones Web. En el trabajo de fin de grado, presentado por Josep Mir el año 2012 con el título “Estudio de los futuros estándares HTML5 y CSS3”, se menciona que el lenguaje de marcado de hipertexto se utiliza para mostrar texto, acompañado de otros elementos como imágenes o tablas, a través de internet. Para visualizar estas páginas e interactuar con ellas el usuario necesita utilizar un “navegador Web”, programa informático que interpreta el lenguaje de marcado de hipertexto y lo visualiza en la interfaz del dispositivo. El lenguaje de marcado de hipertexto es un lenguaje de texto, el cual se puede crear y editar con cualquier editor de texto que se tenga a disposición, como por ejemplo notepad, gedit y otros. También existen editores específicos para el lenguaje de marcado de hipertexto más completo y con más herramientas para este lenguaje, es el caso de DreamWeaver de Adobe, WebStorm de Jetbrains, WebMatrix de Microsoft y otros más. Es un lenguaje bastante sencillo que toma como base el uso de etiquetas para definir a cada elemento del documento.

En el mundo de las aplicaciones Web, en estos últimos años se han venido generando una gran cantidad de aplicaciones para dispositivos móviles, con la premisa de llegar al público de destino independientemente del dispositivo que usen. En la investigación de Wang, publicada el año 2014 bajo el titulo “Ventajas y desventajas de las herramientas HTML5 de desarrollo de aplicaciones móviles Android multiplataforma en dispositivos basados en procesadores Intel”, se menciona que en lugar de usar tecnologías complejas es mucho más fácil y eficaz utilizar herramientas de desarrollo como el lenguaje de marcado de hipertexto cinco para aplicaciones móviles multiplataforma. La clave es que la aplicación tenga las funcionalidades adecuadas para que la experiencia del usuario sea perfecta. En segundo lugar, la aplicación debe tener la capacidad intrínseca de funcionar en los nuevos dispositivos que se suman continuamente al mercado. El lenguaje de marcado de hipertexto cinco tiene varias funcionalidades que le permiten ejecutarse en dispositivos diseñados específicamente para que consuman menos electricidad. Por ejemplo, las laptops, los smartphones y las tabletas tienen procesadores que consumen considerablemente menos energía que los equipos de escritorio. Es el lenguaje de marcado preferido para estructurar y presentar contenido en la Internet.

Las principales ventajas de las herramientas de desarrollo de aplicaciones móviles multiplataforma son: (1) Escribir código lenguaje de marcado de hipertexto cinco es relativamente fácil de aprender y a eso se suma la facilidad de uso. Las empresas ahorran dinero si escriben aplicaciones que funcionan en todos los sistemas operativos en lugar de tener que modificarlas para cada uno. Además, se puede usar el código como referencia para proyectos basados exclusivamente en Android, Windows o iOS. (2) Permite desarrollar aplicaciones que se adaptan fácilmente a distintas resoluciones, tamaños de pantallas, relaciones de aspecto y orientaciones. (3) Permite potenciar las funcionalidades avanzadas, tales como el sistema de posicionamiento global, la cámara y el acelerómetro, en dispositivos modernos y brindar una experiencia de usuario adaptada al contexto en una amplia variedad de dispositivos, incluidos los smartphones y las tabletas electrónicas. (4) Las aplicaciones se pueden implementar como aplicaciones Web locales y también se pueden ver en los navegadores. (5) Las aplicaciones móviles pueden usar los mismos canales de monetización y distribución que las aplicaciones nativas. (6) JavaScript, el lenguaje de marcado de hipertexto cinco y las hojas de estilo en cascada, son la columna vertebral de la Internet y las aplicaciones Web; por lo tanto, la migración de herramientas de desarrollo a dispositivos móviles es más sencilla. (10) Escribir una única vez código de integración permite a las aplicaciones móviles funcionar de manera similar en todas las plataformas, independientemente del dispositivo.

Las desventajas fundamentales son las siguientes: (1) Siempre que se produce un cambio o se agrega una característica en iOS, Android, o Windows, la herramienta de desarrollo tiene que reflejar o tener en cuenta el cambio y hacer los ajustes necesarios en el código. Esto significa que las herramientas de desarrollo de aplicaciones móviles multiplataforma siempre irán detrás de los cambios oficiales. (2) A veces, lleva tiempo tener listas las aplicaciones móviles debido a que los desarrolladores tienen que escribir código para cada plataforma. (3) Los desarrolladores trabajan en lenguajes que no son nativos para las plataformas; por eso, la eficacia del código depende del motor de traducción. Sucede a menudo que las técnicas de codificación son ineficientes o que el código es redundante. (4) La diferencia de tiempos de ejecución de las plataformas a menudo causa complicaciones en el desarrollo de aplicaciones móviles multiplataforma. (5) El estándar “lenguaje de marcado de hipertexto cinco” evolucionó en un período relativamente corto y ello produjo discrepancias en la implementación de atributos hoja de estilo en cascada, etiquetas del lenguaje de marcado y la interfaz de programación de aplicaciones de JavaScript. A veces, estas características se comportan de manera diferente en plataformas distintas. Sin embargo, hay herramientas disponibles para resolver estas discrepancias.

lunes, 8 de junio de 2015

Lenguaje de marcado de hipertexto 5

En el curso completo del lenguaje de marcado de hipertexto, publicado por Ferrer y sus colegas el año 2011, se menciona que World Wide Web o Web, es un sistema que contiene una cantidad de información casi infinita. Pero esta información debe estar ordenada de alguna forma de manera que sea posible encontrar lo que se busca. La unidad básica donde está almacenada esta información son las páginas Web. Estas páginas se caracterizan por contener texto, imágenes, animaciones e incluso sonido y video. Una de las características más importantes de las páginas Web es que son de tipo hipertexto. Esto quiere decir que las páginas no son elementos aislados, sino que están unidas unas a otras mediante los vínculos o enlaces hipertexto. Gracias a estos enlaces el navegante de Internet puede pulsar sobre un texto activo de una página para navegar hasta otra página. Será cuestión del programador de la página inicial decidir que palabras o frases serán activas y a donde conducirá pulsar sobre ellas. En algunos ambientes se discute que la Web ya no es un sistema hipertexto sino hipermedia. Los que defienden el cambio se apoyan en que aunque en sus orígenes la Web constaba únicamente de texto, en la actualidad es un sistema principalmente gráfico y se puede hacer que las zonas activas sean, no sólo texto, sino imágenes, videos, botones, en definitiva cualquier elemento de una página. Cuando los diseñadores de la Web se hicieron esta pregunta decidieron que se debían cumplir, entre otras, las siguientes características: (1) La Web tenía que ser distribuida, es decir que la información debía estar repartida en páginas no muy grandes y enlazadas entre sí. (2) La Web tenía que ser hipertexto y debía ser fácil navegar por ella. (3) Tenía que ser compatible con todo tipo de computadoras y con todo tipo de sistemas operativos. (4) Debía ser dinámico, es decir que el proceso de cambiar y actualizar la información debía ser ágil y rápido.

En el libro publicado el año 2011 con el título “El gran libro de HTML5, CSS3 y Javascript”, Gauchat menciona que el lenguaje de marcado de hipertexto cinco, no es una nueva versión del antiguo lenguaje de etiquetas, ni siquiera una mejora de esta ya antigua tecnología, sino un nuevo concepto para la construcción de aplicaciones Web en una era que combina dispositivos móviles, computación en la nube y trabajos en red. Todo comenzó mucho tiempo atrás con una simple versión del lenguaje de marcado de hipertexto para crear la estructura básica de páginas Web, organizar su contenido y compartir información. El lenguaje y la Web misma nacieron principalmente con la intención de comunicar información por medio de texto. El limitado objetivo del lenguaje de marcado de hipertexto motivó a varias compañías a desarrollar nuevos lenguajes y programas para agregar características a la Web nunca antes implementadas. Este impulso inicial creció hasta convertirse en un popular y poderoso accesorio. Juegos simples juegos y bromas animadas pronto se transformaron en sofisticadas aplicaciones, ofreciendo nuevas experiencias que cambiaron el concepto de la Web para siempre.

El lenguaje de marcado de hipertexto es el lenguaje para describir la estructura de las aplicaciones Web entre las cuales resaltan las denominadas páginas Web. Según Lowery y Fletcher, en el libro publicado el año 2011 titulado “Entrenamiento de 24 horas con el lenguaje de marcado de hipertexto 5”, se menciona que “hipertexto” es cualquier texto presentado en un dispositivo electrónico, sea este una computadora, teléfono inteligente, tableta, o algún otro dispositivo capaz de entender este tipo de contenido, en el cual el texto mencionado tiene un hipervínculo con otro texto que puede estar en la misma página Web, en otra del mismo sitio, o en una completamente diferente. El hipertexto es tal vez lo que define la esencia de Internet, la habilidad de vincular una página Web con otra, creando así una telaraña de información. Mientras que el “lenguaje de marcado” toma este texto plano y con la ayuda de códigos adicionales o etiquetas, lo convierte en un texto de fácil lectura, al cambiar el estilo de la presentación, e incluso introducir características multimedia en las aplicaciones Web.

El Consorcio de la World Wide Web, es la organización responsable de la creación de las especificaciones para el lenguaje de marcado de hipertexto. Este Consorcio ha estado activo desde el comienzo mismo de la Web. Este organismo de normalización ha desarrollado varias versiones del lenguaje de marcado de hipertexto con el paso de los años. En palabras de Hogan, en el libro publicado el año 2010 titulado “HTML5 y CSS3: Desarrolle hoy con los estándares del mañana”, la última versión en alcanzar la etapa final de la recomendación fue el lenguaje de marcado de hipertexto versión 4.01 en el año 1999, conocida básicamente como lenguaje de marcado de hipertexto. De allí la versión más reciente, lenguaje de marcado de hipertexto cinco intenta brindar un soporte más sólido a los entornos multimedia de la Web actuales, mientras guarda su compatibilidad con versiones anteriores. Aunque el lenguaje de marcado de hipertexto, continua desarrollándose y en cambio constante, es posible asegurar que gran parte de sus etiquetas pueden ser utilizadas con seguridad en las aplicaciones Web contemporáneas.

domingo, 26 de abril de 2015

SQL Modificación y borrado de claves primarias con claves foráneas que hacen referencia a éstas (I)

En otra unidad de este curso hemos visto tres políticas aplicables a los casos de borrado y modificación de filas que tienen una clave primaria referenciada por claves foráneas. Estas políticas eran la restricción, la actualización en cascada y la anulación.
El SQL nos ofrece la posibilidad de especificar, al definir una clave foránea, qué política queremos seguir. Veamos su formato:

sábado, 25 de abril de 2015

SQL Restricciones de tabla

Una vez hemos dado un nombre, hemos definido una tabla y hemos impuesto ciertas restricciones para cada una de las columnas, podemos aplicar restricciones sobre toda la tabla, que siempre se deberán cumplir. Las restricciones que se pueden dar son las siguientes:

viernes, 24 de abril de 2015

SQL Restricciones de columna

En cada una de las columnas de la tabla, una vez les hemos dado un nombre y hemos definido su dominio, podemos imponer ciertas restricciones que siempre se tendrán que cumplir. Las restricciones que se pueden dar son las que aparecen en la tabla que tenemos a continuación:


jueves, 23 de abril de 2015

SQL Definiciones por defecto (II)

La posibilidad más utilizada y la opción por defecto, si no especificamos nada, es la palabra reservada NULL. Sin embargo, también podemos definir nuestro propio literal, o bien recurrir a una de las funciones que aparecen en la tabla siguiente:

miércoles, 22 de abril de 2015

SQL Definiciones por defecto (I)

Ya hemos visto en otros módulos la importancia de los valores nulos y su inevitable aparición como valores de las bases de datos.
La opción def_defecto nos permite especificar qué nomenclatura queremos dar a nuestros valores por omisión.
Por ejemplo, para un empleado que todavía no se ha decidido cuánto ganará, podemos elegir que, de momento, tenga un sueldo de 0 euros (DEFAULT 0.0), o bien que tenga un sueldo con un valor nulo (DEFAULT NULL).
Sin embargo, hay que tener en cuenta que si elegimos la opción DEFAULT NULL, la columna para la que daremos la definición por defecto de valor nulo debería admitir valores nulos.
La opción DEFAULT tiene el siguiente formato
DEFAULT (literal|función|NULL)

martes, 21 de abril de 2015

SQL Modificar un dominio en BDUOC

Si quisiéramos añadir una nueva ciudad (Mataró) al dominio que hemos creado antes para las ciudades donde se encuentran los departamentos de la empresa BDUOC, haríamos:

ALTER DOMAIN dom_ciudades DROP CONSTRAINT ciudades_validas;
Con esto hemos eliminado la restricción de dominio antigua. Y ahora tenemos que introducir la nueva restricción:
ALTER_DOMAIN dom_ciudades ADD CONSTRAINT ciudades_validas
CHECK (VALUE IN (‘Barcelona’, ‘Tarragona’, ‘Lleida’, ‘Girona’, ‘Mataro’));

lunes, 20 de abril de 2015

SQL Borrar un dominio de BDUOC

Si quisiéramos borrar el dominio que hemos creado antes para las ciudades donde se encuentran los departamentos de la empresa BDUOC, haríamos:
DROP DOMAIN dom_ciudades RESTRICT;
En este caso nos deberíamos asegurar de que ninguna columna está definida sobre dom_ciudades antes de borrar el dominio.
Para modificar un dominio semántico es necesario utilizar la sentencia ALTER DOMAIN. Veamos su formato:

ALTER DOMAIN nombre_dominio {acción_modificar_dominio|
acción_modif_restricción_dominio};

Donde tenemos lo siguiente:

• acción_modificar_dominio puede ser:

{SET def_defecto|DROP DEFAULT}
• acción_modif_restricción_dominio puede ser:

{ADD restricciones_dominio|DROP CONSTRAINT nombre_restricción}

domingo, 19 de abril de 2015

Creación de un dominio en BDUOC (II)

Para borrar un dominio definido por el usuario es preciso utilizar la sentencia DROP DOMAIN, que tiene este formato:

DROP DOMAIN nombre_dominio {RESTRICT|CASCADE};
En este caso, tenemos que:
• La opción de borrado de dominios RESTRICT hace que el dominio sólo se pueda borrar si no se utiliza en ningún sitio.
• La opción CASCADE borra el dominio aunque esté referenciado, y pone el tipo de datos del dominio allí donde se utilizaba.

sábado, 18 de abril de 2015

Creación de un dominio en BDUOC (I)

Si quisiéramos definir un dominio para las ciudades donde se encuentran los departamentos de la empresa BDUOC, haríamos:

CREATE DOMAIN dom_ciudades AS CHAR (20)
CONSTRAINT ciudades_validas
CHECK (VALUE IN (‘Barcelona’, ‘Tarragona’, ‘Lleida’, ‘Girona’));
De este modo, cuando definimos la columna ciudades dentro de la tabla departamentos no se tendrá que decir que es de tipo CHAR (20), sino de tipo dom_ciudades. Esto nos debería asegurar, según el modelo relacional, que sólo haremos operaciones sobre la columna ciudades con otras columnas que tengan este mismo dominio definido por el usuario; sin embargo, el SQL92 no nos ofrece herramientas para asegurar que las comparaciones que hacemos sean entre los mismos dominios definidos por el usuario.

Por ejemplo, si tenemos una columna con los nombres de los empleados definida sobre el tipo de datos CHAR (20), el SQL nos permite compararla con la columna ciudades, aunque semánticamente no tenga sentido. En cambio, según el modelo relacional, esta comparación no se debería haber permitido.

viernes, 17 de abril de 2015

SQL Creación, modificación y borrado de dominios

Además de los dominios dados por el tipo de datos predefinidos, el SQL92 nos ofrece la posibilidad de trabajar con dominios definidos por el usuario.
Para crear un dominio es necesario utilizar la sentencia CREATE DOMAIN:

jueves, 16 de abril de 2015

SQL Dominios definidos por el usuario

Aunque el SQL92 nos ofrece la sentencia CREATE DOMAIN, hay pocos sistemas relacionales comerciales que nos permitan utilizarla.

miércoles, 15 de abril de 2015

SQL Ejemplos de asignaciones de columnas

Veamos algunos ejemplos de asignaciones de columnas en los tipos de datos predefinidos DATE, TIME y TIMESTAMP:
• La columna fecha_nacimiento podría ser del tipo DATE y podría tener como valor ‘1978-12-25’.
• La columna inicio_partido podría ser del tipo TIME y podría tener como valor ‘17:15:00.000000’.
• La columna entrada_trabajo podría ser de tipo TIMESTAMP y podría tener como valor ‘1998-7-8 9:30:05’.

martes, 14 de abril de 2015

SQL El tratamiento del tiempo

El estándar SQL92 define la siguiente nomenclatura para trabajar con el tiempo:
YEAR (0001..9999)
MONTH (01..12)
DAY (01..31)
HOUR (00..23)
MINUT (00..59)
SECOND (00..59.precisión)
De todos modos, los sistemas relacionales comerciales disponen de diferentes formatos, entre los cuales podemos elegir cuando tenemos que trabajar con
columnas temporales.

lunes, 13 de abril de 2015

SQL Los tipos de datos NUMERIC y DECIMAL

NUMERIC y DECIMAL se describen igual, y es posible utilizar tanto el uno como el otro para definir números decimales.

domingo, 12 de abril de 2015

SQL La sentencia DROP DATABASE

Muchos de los sistemas relacionales comerciales(como por ejemplo Informix, DB2, SQL Server y otros) han incorporado sentencias de borrado de bases de datos
con la siguiente sintaxis:
DROP DATABASE

sábado, 11 de abril de 2015

SQL La instrucción CREATE DATABASE

Muchos de los sistemas relacionales comerciales (como ocurre en el caso de Informix, DB2, SQL Server y otros) han incorporado sentencias de creación de bases de datos con la siguiente sintaxis:
CREATE DATABASE

viernes, 10 de abril de 2015

SQL Tipos de datos (I)

Para cada columna tenemos que elegir entre algún dominio definido por el usuario o alguno de los tipos de datos predefinidos que se describen a continuación: