Modelo relacional

Estructura. Filas. Columnas. Tablas. Atributos. Dominios. Tuplas. Claves. Consultas. Operaciones. {SQL}. DDL. Bases de Datos relacionales

4 downloads 208 Views 70KB Size

Story Transcript

MODELO RELACIONAL MODELO RELACIONAL Definido en 1970 por E.F. Codd. Este modelo utiliza tablas para representar las entidades y relaciones existentes entre ellas. Estructura del Modelo La organización de las tablas se realiza de la siguiente manera Columnas Filas Para que una tabla cumpla con los requisitos de la estructura relacional debe cumplir las siguientes condiciones: • Debe tener un solo tipo de filas dándole un formato que debe mantenerse durante todo su trabajo y con la misma cantidad de filas. • Cada fila debe ser única y no pueden existir filas duplicadas. • Cada columna debe ser única y no deben existir columnas duplicadas. • Cada columna debe ser definida con un nombre específico. • El valor de una columna para una fila debe ser único, no pueden existir múltiples valores en una posición de la columna. • Los valores de cada columna deben pertenecer al dominio que representan y este dominio puede utilizarce en varias columnas. Las tablas que cumplan con esta condición se denominan Tablas Relacionales y este concepto se utiliza para definir que este tipo de tablas puede asociarse a otras que cumplan con la misma condición, además se le asocian las siguientes propiedades: • Las filas pueden estar en cualquier orden. • A una fila se la hace referencia mediante todos los valores que la forman. • Las columnas pueden estar en cualquier orden. • Se hace referencia a una columna mediante el nombre que la identifica. Pero se utilizan otros términos para referirnos a las filas y columnas. Se conocerá como tuplas a cada una de las filas y atributos a cada una de las columnas. Atributos

Tuplas

CODFRUTA 123 236

NOMFRUTA Manzana Peras

PRECIO 300 250

Se denomina Grado de una tabla relacional al número de atributos que la componen, G(frutas) = 3. Se denomina Cardinalidad de una tabla relacional al número de tuplas que la conforman, C(frutas) = 2. 1

Dominios Es el conjunto de los posibles valores para una o más columnas de la tabla relacional, luego los valores contenidos en una columna pertenecen a un dominio que previamente se define y para ello se distinguen dos tipos de dominios: • Dominios generales o continuos: Aquellos que contienen todos los posibles valores entre un máximo y un mínimo predefinido: Peso de un material : números reales y positivos Saldo de cuantas : números reales negativos y positivos. Fechas de nacimiento : todas aquellas desde que se tiene noción hasta hoy. • Dominios restringidos o discretos: Aquellos que contiene ciertos valores entre un máximo y un mínimo predefinido: Estado civil : Casado, soltero, viudo, anulado. Regiones de Chile : 13 regiones. Sexo : Femenino , masculino. Claves Para accesar la información en las tablas relacionales se debe elegir una clave que distinga a una tupla en particular. La clave se forma tomando un atributo o un conjunto de ellos. Como condición de que exista una tabla relacional no pueden existir filas duplicadas lo que implica que siempre debe existir al menos una clave (en el peor de los casos estará formada por varios atributos). Para encontrar la clave adecuada se deben buscar en los dominios de los atributos junto con los enlaces conceptuales que existen entre ellos de manera tal de encontrar valores determinados que identifiquen la tupla de la tabla. No se debe buscar la clave en los valores concretos de las tuplas sino que en todos los posibles valores de los atributos, es decir su dominio. Ejemplo: Sea la siguiente tabla para el personal de una empresa PERSONAL IDENTIFI NOMBRE 493 Pedro 181 Luis 830 María 341 Ana

DIRECCION Gomez Carreño 1380 Pedro Prado 2903 Amunátegui 3020 Manuel Rodríguez 1727

TELEFONO 441327 441850 410029 415674 2

679 911

Juan Pilar

Sargento Aldea 1584 Vivar 1211

384566 412369

Se observa que el atributo IDENTIFI es el que engloba de mejor manera a la tabla PERSONAL ya que cualquier valor del dominio de dicho atributo identifica a una única tupla, luego no puede aparecer un mismo valor de IDENTIFI en dos tuplas diferentes, por lo tanto IDENTIFI pasa a ser la clave de esta tabla. Supongamos que el personal puede utilizar automóviles que pertenecen a la empresa y los datos de dichos automóviles se encuentran en la tabla denominada AUTOS−PERSONAL. AUTOS−PERSONAL IDENTIFI MATRICULA 723 KZ−1264 181 LS−3490 524 AA−2020 524 CD−2478 181 AA−1635 911 AA−2411 308 AA−2020

MARCA Ford Opel Opel BMW Renault Opel Opel

MODELO Fiesta Corsa Corsa 318 R−21 Corsa Corsa

COLOR Blanco Blanco Negro Azul Negro Negro Negro

KM 579 3991 86754 38805 64483 48805 86754

En esta tabla se representan los diferentes autos que puede utilizar un empleado determinado, el auto se identifica por el número de matrícula, que podría ser la clave para esta tabla, pero el auto puede ser utilizado por distintos empleados en distintos momentos, por lo tanto el número de matrícula no podría ser una clave única (debe existir una clave tal que se relacionen ambas tablas). Tampoco sirve la MARCA, el MODELO o el COLOR del automóvil, tampoco los KM pues estos varían siempre. Luego la clave no tiene más remedio que ser compuesta, es decir una combinación entre MATRICULA e IDENTIFI. Se sabe que en la tabla PERSONAL los valores de las tuplas no se repiten, es decir no existen dos personas con los mismos atributos (Recordar claves candidatas, clave primaria o principal, clave ajena). Para elegir la clave principal nos debemos basar en el dominio, ya que luego la B.D. utilizará las claves principales para acceder y relacionar a todas las tablas. Se deben tener en cuenta las siguientes consideraciones para saber si la clave escogida es la correcta: • Sus valores deben ser diferentes de nulos. • La cantidad de memoria que ocupen debe ser mínima. • Debe de ser fácil su codificación. • El contenido de sus valores no debe variar. • Se pueden utilizar como claves ajenas en otras tablas para permitir la interrelación. Las claves se utilizan para más adelante definir índices sobre ellas (formas de acceso, donde los índices primarios están formados por las claves principales y los índices secundarios formados por las claves secundarias). Se da el caso que en algún momento se necesita acceder a la información o tenerla agrupada mediante atributos que no son claves se generan índices secundarios múltiples ya que los atributos que lo forman no son 3

claves y sus valores se repiten dentro de la tabla índice. Las claves ajenas son muy importantes ya que la integridad da la B.D. se mantiene en gran parte mediante las transacciones que se realizan con dichas claves ALGEBRA Y CÁLCULO RELACIONAL Las operaciones definidas sobre las tablas están basadas en el álgebra relacional. Cada operación tomará como operandos una o varias tablas y como resultado se genera otra tabla la que puede volverse a utilizar para otras operaciones. Se distinguirán dos tipos de operaciones: básicas, independientes del resto de las operaciones y derivadas, realizan en un proceso llamadas a las operaciones básicas. Entre las operaciones básicas se distinguen las que las que utilizan una sola tabla de entrada para obtener resultados, operaciones unarias; existen también las que utilizan dos tablas como entradas, operaciones binarias. Operaciones Básicas: Operaciones Unarias: • Selección • Proyección Operaciones Binarias: • Unión • Producto cartesiano • Diferencia Operaciones Derivadas: • Intersección • Cociente (división) • Join Selección: Extrae las tuplas especificadas de una relación dada (es decir restringe la relación solo a las tuplas que satisfagan una condición dada). Utiliza el símbolo S.

Proyección: Extrae los atributos especificados de una relación dada (las columnas). Utiliza el símbolo P.

Unión: Construye una relación formada por todas las tuplas que aparecen en cualquiera de las dos relaciones especificadas. Utiliza el símbolo U.

4

Producto: O producto cartesiano, construye a partir de dos relaciones dadas una relación que contenga todas las combinaciones posibles de tuplas, una de cada una de las dos relaciones. Utiliza el símbolo x. A B C

X Y

x

A A

X Y X B

= B

Y C C

X y

Diferencia: Construye una relación con las tuplas de la primera relación que no aparezcan en la segunda relación. Utiliza el símbolo −−.

Intersección: Construye una relación con aquellas tuplas que aparezcan en las dos relaciones especificadas. Utiliza el símbolo ".

Cociente: (División) Toma dos relaciones, una binaria una unaria y construye una relación formada por todos los valores de un atributo de la relación binaria que concuerdan (en el otro atributo) con todos los valores en una relación unaria. Utiliza el símbolo /. A A A B C

X Y Z X Y

/

X Y Z

A =

Join: (Reunión, Unión natural, Yunción) Construye a partir de dos relaciones especificadas una relación que contiene todas las posibles combinaciones de tuplas, una de cada una de las dos relaciones tales que las dos tuplas participantes en una combinación dada satisfagan alguna condición especificada. Utiliza el símbolo *. A1 A2 A3

B1 B2 B3

*

B1 B2 B3

C1 C2 C3

=

A1 A2 A3

B1 B2 B3

C1 C2 C3

LENGUAJE DE CONSULTAS COMERCIALES En 1981 IBM comercializó el SQL (Structured Query Language, Lenguaje de Consulta Estructurado) el que actualmente es ocupado en la mayoría de las bases de datos relacionales. SQL es un lenguaje que utiliza el usuario para el manejo de las B.Ds. y puede darse de dos formas: 1.− Usando un lenguaje de programación (lenguaje anfitrión) como Fortran, C, C++, Visual, etc., donde las sentencias SQL están formando parte de las sentencias propias del programa anfitrión (embebida). 2.− Usando directamente el SQL través de programas de consultas como QMF, QBF, QMF, SPUFI.

5

Además se puede decir que SQL está formado por dos sublenguajes: • El DDL encargado de permitir la descripción de los objetos que conforman la B.D. • El DML capaz de suministrar las operaciones necesarias para manejar los datos (modificaciones, consultas, eliminación, inserción). El formato de las sentencias SQL es libre, no sigue ninguna regla de tabulación y se puede escribir en cualquier número de líneas y en cualquier parte de ellas. Para separar una sentencia SQL de otra se utiliza, comúnmente, el carácter ; (su utilización no es obligatoria en el caso de ejecutar una única sentencia). Para trabajar con las sentencias SQL se tendrán en cuenta ejemplos que se basarán en las tablas VUELOS, AVIONES y RESERVAS. VUELOS NUM_VUELO ORIGEN IB600 MADRID BA467 MADRID IB0640 MADRID IB3742 MADRID LH1349 COPENHAGUE AF577 BILBAO IB3709 DUBLIN IB778 BARCELONA IB721 BARCELONA IB327 MADRID IB023 MADRID IB368 MALAGA IB610 MALAGA IB510 SEVILLA IB318 SEVILLA

DESTINO LONDRES LONDRES BARCELONA BARCELONA FRANCFORT PARIS BARCELONA ROMA SEVILLA SEVILLA TENERIFE BARCELONA LONDRES MADRID MADRID

HORA_SALIDA 10.30.00 20.40.00 06.45.00 09.15.00 10.20.00 10.10.00 14.35.00 09.45.00 16.40.00 18.05.00 21.20.00 22.25.00 15.05.00 07.45.00 10.45.00

TIPO_AVION 320 73S 320 72S 320 737 D9S 72S 72S 72S 72S D9S 73S 72S 72S

RESERVAS NUM_VUELO FECHA_SALIDA IB600I 2000−06−20 IB600I 2000−06−21 IB600I 2000−06−22 BA467 2000−06−20 BA467 2000−06−21 BA467 2000−06−22 IB0640 2000−06−20 IB0640 2000−06−21 IB0640 2000−06−22 IB3709 2000−06−20 IB3709 2000−06−21

PLAZAS_LIBRES 46 80 91 32 49 79 15 21 39 60 72 6

IB3709 IB510 IB510 IB510

2000−06−22 2000−06−20 2000−06−21 2000−06−22

85 19 31 40

AVIONES TIPO

CAPACIDAD

LONGITUD

ENVERGADURA

D9S 320 72S 73S 737

110 187 160 185 172

38,80 42,15 36,20 44,10 38,90

28,50 32,60 25,20 30,35 29,00

VELOCIDAD CRUCERO 815,0 853,0 820,0 815,0 793,0

LENGUAJE DE DEFINICIÓN DE DATOS (DDL) • Creación de base de datos (también la abre): CREATE DATABASE [Nombre B.D] Ejemplo: CREATE DATABASE AEROPUERTO • Creación de tablas: CREATE TABLE | DBF [Nombre tabla] (NombreCampo TipoCampo. ) [NULL | NOT NULL] [CHECK | ERROR] [DEFAULT] [PRIMARY KEY | UNIQUE] . . Ejemplo: CREATE TABLE VUELOS (NUM_VUELO CHAR(6) NOT NULL ORIGEN CHAR(15) NOT NULL 7

DESTINO CHAR(15) NOT NULL HORA_SALIDA TIME NOT NULL TIPO_AVION CHAR(3) ); LENGUAJE DE MANIPULACIÓN DE DATOS (DML) Sintaxis genérica SELECT .. FROM .. [WHERE ..] [GROUP BY ] [HAVING .] [ORDER BY ..] .. • Selección de todas las columnas: SELECT * FROM AVIONES; Ejemplo AVIONES TIPO

CAPACIDAD

LONGITUD

ENVERGADURA

D9S 320 72S 73S 737

110 187 160 185 172

38,80 42,15 36,20 44,10 38,90

28,50 32,60 25,20 30,35 29,00

VELOCIDAD CRUCERO 815,0 853,0 820,0 815,0 793,0

• Selección de una columna específica: SELECT FECHA_SALIDA FROM RESERVAS; Ejemplo FECHA_SALIDA 8

2000−06−20 2000−06−21 2000−06−22 2000−06−20 2000−06−21 2000−06−22 2000−06−20 2000−06−21 2000−06−22 2000−06−20 2000−06−21 2000−06−22 2000−06−20 2000−06−21 2000−06−22 • Selección de múltiples columnas: SELECT NUM_VUELO, ORIGEN, DESTINO FROM VUELOS; Ejemplo NUM_VUELO ORIGEN IB600 MADRID BA467 MADRID IB0640 MADRID IB3742 MADRID LH1349 COPENHAGUE AF577 BILBAO IB3709 DUBLIN IB778 BARCELONA IB721 BARCELONA IB327 MADRID IB023 MADRID IB368 MALAGA IB610 MALAGA IB510 SEVILLA IB318 SEVILLA

DESTINO LONDRES LONDRES BARCELONA BARCELONA FRANCFORT PARIS BARCELONA ROMA SEVILLA SEVILLA TENERIFE BARCELONA LONDRES MADRID MADRID

• Reordenamiento de las columnas durante la selección: SELECT TIPO, ENVERGADURA, LONGITUD FROM AVIONES; 9

Ejemplo TIPO D9S 320 72S 73S 737

ENVERGADURA LONGITUD 28,50 38,80 32,60 42,15 25,20 36,20 30,35 44,10 29,00 38,90

SELECT LONGITUD, TIPO, ENVERGADURA FROM AVIONES; Ejemplo LONGITUD TIPO 38,80 D9S 42,15 320 36,20 72S 44,10 73S 38,90 737

ENVERGADURA 28,50 32,60 25,20 30,35 29,00

Luego, el orden de selección determina el orden del despliegue. • Selección de filas: Si no se especifica la cláusula WHERE se mostrarán todas las filas. SELECT DESTINO FROM VUELOS; Ejemplo DESTINO LONDRES LONDRES BARCELONA BARCELONA FRANCFORT PARIS BARCELONA ROMA SEVILLA SEVILLA TENERIFE BARCELONA 10

LONDRES MADRID MADRID Si se especifica la cláusula WHERE sólo se mostrarán las filas indicadas SELECT DESTINO FROM VUELOS WHERE ORIGEN = MADRID; Ejemplo DESTINO LONDRES LONDRES BARCELONA BARCELONA SEVILLA TENERIFE SELECT ORIGEN,DESTINO,HORA_SALIDA FROM VUELOS WHERE NUM_VUELO = IB721; Ejemplo BARCELONA, SEVILLA, 16.40.00 • Ordenamiento de filas: Como se explicó anteriormente las filas en el modelo relacional no tienen un orden particular. Un orden predeterminado en SQL es ascendente (A a Z, 0 a 9), entonces si se desea otro orden se debe utilizar el comando ORDER BY el cual es el único que asegura que las filas serán desplegadas de acuerdo a especificaciones dadas por el usuario. SELECT NUM_VUELO FROM VUELOS ORDER BY NUM_VUELO; Ejemplo Atributos de NUM_VUELO antes del orden

11

NUM_VUELO IB600 BA467 IB0640 IB3742 LH1349 AF577 IB3709 IB778 IB721 IB327 IB023 IB368 IB610 IB510 IB318 Atributos de NUM_VUELO después del orden NUM_VUELO AF577 BA467 IB023 IB0640 IB318 IB327 IB368 IB3709 IB3742 IB510 IB600 IB610 IB721 IB778 LH1349 Para ordenar en sentido descendente (de Z a A y de 9 a 0), se debe agregar la palabra reservada DESC al final de cada campo por el que se desea ordenar en sentido descendente. SELECT NUM_VUELO FROM VUELO ORDER BY NUM_VUELO DESC;

12

Ejemplo Atributos de NUM_VUELO antes del orden descendente NUM_VUELO IB600 BA467 IB0640 IB3742 LH1349 AF577 IB3709 IB778 IB721 IB327 IB023 IB368 IB610 IB510 IB318 Atributos de NUM_VUELO después del orden descendente NUM_VUELO LH1349 IB778 IB721 IB610 IB600 IB510 IB3742 IB3709 IB368 IB327 IB318 IB0640 IB023 BA467 AF577 • Ordenamiento de filas para criterios múltiples: Cuando se ordena utilizando criterios múltiples se siguen ciertos criterios para llevar un orden adecuado y sin enredarse al momento de utilizar los comandos de SQL.

13

Se denomina orden primar al elemento colocado en primer lugar, luego de la sentencia ORDER BY el cual puede llevar o no las sentencias DESC o ASC según se requiera. Luego viene el elemento de orden secundario, terciario, etc. SELECT * FROM VUELOS ORDER BY NUM_VUELO DESC, ORIGEN; NUM_VUELO ORIGEN LH1349 COPENHAGUE IB778 BARCELONA IB721 BARCELONA IB610 MALAGA IB600 MADRID IB510 SEVILLA IB3742 MADRID IB3709 DUBLIN IB368 MALAGA IB327 MADRID IB318 SEVILLA IB0640 MADRID IB023 MADRID BA467 MADRID AF577 BILBAO

DESTINO FRANCFORT ROMA SEVILLA LONDRES LONDRES MADRID BARCELONA BARCELONA BARCELONA SEVILLA MADRID BARCELONA TENERIFE LONDRES PARIS

HORA_SALIDA 10.20.00 09.45.00 16.40.00 15.05.00 10.30.00 07.45.00 09.15.00 14.35.00 22.25.00 18.05.00 10.45.00 06.45.00 21.20.00 20.40.00 10.10.00

TIPO_AVION 320 72S 72S 73S 320 72S 72S D9S D9S 72S 72S 320 72S 73S 737

OPERADORES LÓGICOS EN LA SELECCIÓN DE REGISTROS • Igual a, = : SELECT ORIGEN,DESTINO,HORA_SALIDA FROM VUELOS WHERE NUM_VUELO = IB721; Ejemplo BARCELONA, SEVILLA, 16.40.00 • Distinto a, != (<>) : SELECT NUM_VUELO, DESTINO,HORA_SALIDA FROM VUELOS WHERE ORIGEN != MADRID;

14

Ejemplo NUM_VUELO DESTINO LH1349 FRANCFORT AF577 PARIS IB3709 BARCELONA IB778 ROMA IB721 SEVILLA IB368 BARCELONA IB610 LONDRES IB510 MADRID IB318 MADRID

HORA_SALIDA 10.20.00 10.10.00 14.35.00 09.45.00 16.40.00 22.25.00 15.05.00 07.45.00 10.45.00

• Mayor que, > : SELECT TIPO, CAPACIDAD FROM AVIONES WHERE VELOCIDAD CRUCERO > 820; Ejemplo TIPO 320 737

CAPACIDAD 187 172

• Mayor e igual que, >= : SELECT TIPO, CAPACIDAD FROM AVIONES WHERE VELOCIDAD CRUCERO > 820; TIPO 320 72S 737

CAPACIDAD 187 160 172

• Menor que (<) y Menor e igual que (<=) se ocupan de la misma manera. • Igual a cualquier miembro de la lista, IN : El operador IN permite seleccionar las filas cuyos valores corresponden a los de una lista (utiliza el conectivo or). SELECT *

15

FROM RESERVAS WHERE NUM_VUELO IN (IB600I, IB510); Ejemplo NUM_VUELO FECHA_SALIDA IB600I 2000−06−20 IB600I 2000−06−21 IB600I 2000−06−22 IB510 2000−06−20 IB510 2000−06−21 IB510 2000−06−22

PLAZAS_LIBRES 46 80 91 19 31 40

• Rango de valores, BETWEEN.AND : Permite seleccionar filas cuyos valores o atributos se encuentran en un rango determinado SELECT * FROM RESERVAS WHERE PLAZAS_LIBRES BETWEEN 60 AND 86; Ejemplo NUM_VUELO FECHA_SALIDA IB600I 2000−06−21 BA467 2000−06−22 IB3709 2000−06−20 IB3709 2000−06−21 IB3709 2000−06−22

PLAZAS_LIBRES 80 79 60 72 85

SELECT * FROM RESERVAS WHERE PLAZAS_LIBRES NOT BETWEEN 60 AND 86; Ejemplo NUM_VUELO FECHA_SALIDA IB600I 2000−06−20 IB600I 2000−06−22 BA467 2000−06−20 BA467 2000−06−21 IB0640 2000−06−20 IB0640 2000−06−21

PLAZAS_LIBRES 46 91 32 49 15 21 16

IB0640 IB510 IB510 IB510

2000−06−22 2000−06−20 2000−06−21 2000−06−22

39 19 31 40

• Uso de patrones de búsqueda, LIKE : Se utiliza para buscar cadenas de caracteres. Para utilizar este operador se necesitan otros que ayudan a realizar las operaciones: % se utiliza para cadenas de caracteres (cero o más), _ se utiliza para cadenas de un carácter (guión bajo). SELECT NUM_VUELO, ORIGEN, DESTINO FROM VUELOS WHERE ORIGEN LIKE C%; Ejemplo NUM_VUELO ORIGEN DESTINO LH1349 COPENHAGUE FRANCFORT SELECT NUM_VUELO, ORIGEN, DESTINO FROM VUELOS WHERE DESTINO LIKE P____; Ejemplo NUM_VUELO ORIGEN AF577 BILBAO

DESTINO PARIS

SELECT NUM_VUELO, ORIGEN, DESTINO FROM VUELOS WHERE ORIGEN NOT LIKE MA%; Ejemplo NUM_VUELO ORIGEN LH1349 COPENHAGUE AF577 BILBAO IB3709 DUBLIN IB778 BARCELONA IB721 BARCELONA

DESTINO FRANCFORT PARIS BARCELONA ROMA SEVILLA 17

IB510 IB318

SEVILLA SEVILLA

MADRID MADRID

• Valores nulos, IS NULL : Se debe tener en cuenta que un valor NULL es distinto de cero o blanco. SELECT * FROM VUELOS WHERE NUM_VUELO IS NULL; Ejemplo NUM_VUELO ORIGEN

DESTINO

HORA_SALIDA TIPO_AVION

SELECT * FROM VUELOS WHERE NUM_VUELO IS NOT NULL; Ejemplo NUM_VUELO ORIGEN IB600 MADRID BA467 MADRID IB0640 MADRID IB3742 MADRID LH1349 COPENHAGUE AF577 BILBAO IB3709 DUBLIN IB778 BARCELONA IB721 BARCELONA IB327 MADRID IB023 MADRID IB368 MALAGA IB610 MALAGA IB510 SEVILLA IB318 SEVILLA

DESTINO LONDRES LONDRES BARCELONA BARCELONA FRANCFORT PARIS BARCELONA ROMA SEVILLA SEVILLA TENERIFE BARCELONA LONDRES MADRID MADRID

HORA_SALIDA 10.30.00 20.40.00 06.45.00 09.15.00 10.20.00 10.10.00 14.35.00 09.45.00 16.40.00 18.05.00 21.20.00 22.25.00 15.05.00 07.45.00 10.45.00

TIPO_AVION 320 73S 320 72S 320 737 D9S 72S 72S 72S 72S D9S 73S 72S 72S

• Inversión de valores, NOT : Como se ha demostrado anteriormente el operador NOT invierte el valor de alguno de l.os operadores anteriores, NOT BETWEEN, NOT LIKE, IS NOT NULL.

18

CONDICIONES MÚLTIPLES Existe la posibilidad de ordenar todas estas condiciones (y las que vendrán más adelante) en una misma sentencia ocupando los paréntesis y operadores como AND y OR. Lo que se debe tener en cuenta es la precedencia de ellos y respetar por lo tanto dichas normas. SELECT * FROM RESERVAS WHERE NUM_VUELO = IB0640 AND FECHA_SALIDA BETWEEN 2000−06−21 AND 2000−06−22; Ejemplo NUM_VUELO FECHA_SALIDA IB0640 2000−06−21 IB0640 2000−06−22

PLAZAS_LIBRES 21 39

SELECT * FROM RESERVAS WHERE NUM_VUELO = IB0641 OR FECHA_SALIDA = 2000−06−21 AND PLAZAS_LIBRES < 50; NUM_VUELO = IB0641 OR FECHA_SALIDA = 2000−06−21 AND PLAZAS_LIBRES < 50; Ejemplo NUM_VUELO FECHA_SALIDA BA467 2000−06−21 IB0640 2000−06−21 IB510 2000−06−21

PLAZAS_LIBRES 49 21 31

EXPRESIONES NUMÉRICAS En SQL se pueden usar operadores aritméticos los que permiten realizar cálculos numéricos, éstos son: add (+), substract (−), multiply (*) y divide (/). Al igual que en matemáticas, estas operaciones tienen un orden de precedencia: División 1er orden Multiplicación

19

Adición 2do orden. Sustracción Si se tienen operaciones del mismo orden juntas se comienza por la que está más a la izquierda. Los paréntesis rompen la precedencia y ellos mismos se pueden utilizar para controlar el orden de evaluación, luego no es lo mismo 12 * (SALARIO + PRECIO) != 12 * SALARIO + PRECIO Se utilizará la siguiente tabla para entregar los ejemplos MEDIDAS PAQUETE ANCHO A3456 4 A3457 12 A3458 10 A3459 15 A3460 10 A3461 10 A3462 5 A3463 8

ALTURA 3 12 20 15 10 20 10 14

LARGO 26 20 34 22 40 34 15 44

PESO 4 10 20 18 40 22 30 35

SELECT PAQUETE, PESO FROM MEDIDAS WHERE (ANCHO * ALTURA) > 143; Ejemplo A3457 10 A3458 20 A3459 18 A3460 40 A3461 22 SELECT PAQUETE, PESO, ANCHO*ALTURA*LARGO Volumen = FROM MEDIDAS WHERE ANCHO > 14; Ejemplo 20

A3458 20 Volumen = 6800 A3459 18 Volumen = 4950 A3460 40 Volumen = 4000 A3461 22 Volumen = 6800 FUNCIONES Se pueden utilizar diversas funciones en las expresiones SQL, siendo las más importantes: COUNT, MIN, MAX, AVG y SUM. • COUNT Permite obtener la cantidad total de atributos que cumplen con una cierta condición. Si existe un valor NULL en alguna columna esta función opera de dos formas, si se ocupa COUNT (*) la función cuenta los elementos con valor NULL, en otros casos no los toma en cuenta COUNT(ALTURA). En el caso de que se encuentre con argumentos vacíos, la función devuelve un valor nulo. SELECT COUNT(*) FROM MEDIDAS; Ejemplo 8 SELECT COUNT(*) FROM MEDIDAS WHERE ALTURA > 12; Ejemplo 4 SELECT COUNT(PESO) FROM MEDIDAS WHERE PESO = 20; Ejemplo 1 • MIN

21

Permite obtener el valor más pequeño de un atributo. SELECT MIN(PESO) FROM MEDIDAS; Ejemplo 4 • MAX Permite obtener el valor más grande de un atributo. SELECT MAX(PESO) FROM MEDIDAS; Ejemplo 40 • AVG Permite obtener el promedio de los valor de un atributo. En este caso los atributos deben ser numéricos. SELECT AVG(PESO) FROM MEDIDAS; Ejemplo 22,375 • SUM Permite obtener la suma de los atributos de una columna. En este caso los atributos deben ser numéricos. SELECT SUM(PESO) FROM MEDIDAS; Ejemplo 179 Para utilizar las funciones SUM, AVG y COUNT es preferible utilizar la palabra reservada DISTINCT la cual permitirá, cuando se desee, sumar o contar los elementos de la tabla sin que se produzcan repeticiones, sobretodo cuando se está sacando un promedio. SELECT COUNT(DISTINCT ANCHO)

22

FROM MEDIDAS; Ejemplo 6 OTRA FUNCIÓN IMPORTANTE • Alias de columnas El encabezado de una columna que se despliega normalmente es el especificado por la tabla, pero es posible desplegar en pantalla un encabezado de columnas distinto especificando un Column Alias en la cláusula SELECT. Para especificar un alias, debe dejarse un espacio en blanco después del nombre del atributo y después de éste escribir el alias que se eligió. SELECT PESO MASA FROM MEDIDAS WHERE LARGO > 28; Ejemplo MASA 40 30 35 OPERACIONES DE ACTUALIZACIÓN SQL incluye tres operaciones de actualización UPDATE (actualización en el sentido de alterar o modificar), DELETE (eliminar) e INSERT (insertar elementos). • UPDATE (Actualizar). Todos los registros de la tabla serán modificados o actualizados. UPDATE tabla SET campo = expresión [campo = expresión] [WHERE condición]; Modificación de un solo registro:

23

UPDATE MEDIDAS SET ANCHO = 25 ALTURA = 25 WHERE PESO = 40; Ejemplo A3456 A3457 A3458 A3459 A3460 A3461 A3462 A3463

4 12 10 15 25 10 5 8

3 12 20 15 25 20 10 14

26 20 34 22 40 34 15 44

4 10 20 18 40 22 30 35

52 40 68 44 80 68 30 88

4 10 20 18 40 22 30 35

Modificar varios registros: UPDATE MEDIDAS SET LARGO * 2; Ejemplo A3456 A3457 A3458 A3459 A3460 A3461 A3462 A3463

4 12 10 15 10 10 5 8

3 12 20 15 10 20 10 14

Se debe tener mucho cuidado al modificar los datos de las tablas, pues se debe estar seguro de lo que se realiza, ya que la información se pierde a medida que se modifican los datos. Existe la posibilidad de trabajar actualizando varias tablas a la vez, si estas tablas están relacionadas con otras se debe tener en cuenta si la modificación afecta o no las tablas relacionadas con la modificada, sí así ocurre se deberán, tal vez, modificar todas las tablas en cuestión. UPDATE VUELOS SET NUM_VUELO = IB0647 WHERE NUM_VUELO = IB0640

24

UPDATE RESERVAS SET NUM_VUELO = IB0647 WHERE NUM_VUELO = IB0640; • DELETE (Eliminar) DELETE FROM tabla [ WHERE condición]; Eliminación de un solo registro: DELETE FROM MEDIDAS WHERE PAQUETE = A3459; Ejemplo A3456 A3457 A3458 A3460 A3461 A3462 A3463

4 12 10 10 10 5 8

3 12 20 10 20 10 14

26 20 34 40 34 15 44

4 10 20 40 22 30 35

26 20 22 15

4 10 18 30

Eliminar varios registros: DELETE FROM MEDIDAS WHERE LARGO > 30; Ejemplo A3456 A3457 A3459 A3462

4 12 15 5

3 12 15 10

Eliminar toda la tabla: DELETE 25

FROM MEDIDAS; Esto no quiere decir que desaparece la tabla, sino que desaparecen los datos de la tabla Ejemplo

De la misma forma que la sentencia UPDATE, la sentencia DELETE modifica los datos en forma irreparable por lo que se debe tener mucho cuidado al eliminar datos, tuplas, etc. • INSERT (Insertar) INSERT INTO tabla [ ( campo [ , campo ] . ) ] VALUES ( literal [ , literal ] . ); Inserción de un solo registro: INSERT INTO MEDIDAS ( PAQUETE, ANCHO, ALTURA, LARGO, PESO) VALUES (A3455, 12, 14, 23, 30 ); Ejemplo A3455 A3456 A3457 A3458 A3459 A3460 A3461 A3462 A3463

12 4 12 10 15 10 10 5 8

14 3 12 20 15 10 20 10 14

23 26 20 34 22 40 34 15 44

30 4 10 20 18 40 22 30 35

En este caso se ingresan valores en todos los campos, si se sabe que esto siempre será así se puede reducir la sentencia a INSERT INTO MEDIDAS (A3455, 12, 14, 23, 30 ); Para insertar registros la tabla debe estar creada de antemano (de lo contrario se produce un error). El valor a insertar debe hacerlo en un lugar específico. El dominio debe ser igual ya sea para el dato a insertar y el campo donde se insertará. 26

Inserción de datos NULL: INSERT INTO MEDIDAS (A3455, 10, 10, 12, NULL); Ejemplo A3455 A3456 A3457 A3458 A3459 A3460 A3461 A3462 A3463

10 4 12 10 15 10 10 5 8

10 3 12 20 15 10 20 10 14

12 26 20 34 22 40 34 15 44

NULL 4 10 20 18 40 22 30 35

Si no se incluye un atributo (columna) en la cláusula INSERT el valor asumido por defecto para ese atributo es NULL. Si al crear la tabla se indicó que un atributo tiene un dominio NOT NULL, ese atributo no puede recibir un valor NULL mediante la sentencia VALUES de INSERT. INSERT INTO MEDIDAS ( PAQUETE, ALTURA, LARGO) VALUES (A3464, 18, 17,); Ejemplo A3456 A3457 A3458 A3459 A3460 A3461 A3462 A3463 A3464

4 12 10 15 10 10 5 8 NULL

3 12 20 15 10 20 10 14 18

26 20 34 22 40 34 15 44 17

4 10 20 18 40 22 30 35 NULL

GUÍA DE EJERCICIO PERSONAL CLAVE 123

APELLIDO NOMBRE PEREZ CARLOS

EDAD 27

SEXO M

PROFESIÓN PROFESOR 27

124 125 122 119 180 100 126 101 111

PORTALES ALFARO COLLAO FLORES PINTO VERA OLIVARES PINTO PALLARÉ

MARÍA CECILIA JUAN EDUARDO JOSÉ MIRIAM JAVIER JORGE PATRICIA

19 35 27 45 33 28 43 29 32

F F M M M F M M F

DOCTOR CONTADOR DOCTOR INGENIERO PROFESOR CONTADOR INGENIERO ABOGADO PROFESOR

• Ordenar la tabla por apellido en forma ascendente y descendente. • Seleccionar sólo al personal femenino. • Seleccione las tuplas donde la profesión no sea contador. • Seleccionar las tuplas donde la clave se encuentre entre 119 y 130. • Busque las tuplas donde el apellido comience con la letra P. • Ubique el nombre de los empleados que tengan edades entre 25 y 35 años. • Inserte una tupla con los datos: 176, Espejo, Paulina, 29, F. • Elimine las tuplas con profesión abogado. • Modifique las tuplas que contengan apellidos que comiencen con la letra C y coloque en su lugar su apellido. NORMALIZACIÓN DE LAS BASES DE DATOS RELACIONALES La normalización es uno de los elementos más importantes del trabajo que se bebe realizar para crear y utilizar las B.Ds. Como se explicó anteriormente, el hecho de que durante el uso de los sistemas tradicionales comenzaran a aparecer problemas de rendimiento de las B.Ds. llevó a los ingenieros informáticos a crear diferentes formas de accesar información de una manera ordenada, segura y con un fácil acceso, pero para poder realizar todo esto los datos insertos en la B.Ds. debían estar ordenados por lo que se tuvo que crear un método que permitiera esto, es aquí que nace la NORMALIZACIÓN. Definición: La normalización es el proceso de transformación de las complejas representaciones de los usuarios y de los almacenamientos de datos, en conjuntos estables de menor tamaño, sencillos, confiables y fáciles de mantener. Historia: Este proceso fue creado por E.F. Codd en 1970 (quien también es el creado de las B.D.s relacionales). Al principio sólo experimentaba tres formas normales, Primera Forma Normal (1F.N.), Segunda Forma Normal (2 F.N.) y Tercera Forma Normal (3 F.N.). Con el paso de los años estas tres formas comenzaron a tener algunos problemas, debido a la gran cantidad de datos existentes, por lo que se tuvo que refinar la 3 F.N. dando origen a la Forma Normal de Boyce y Codd (F.N.B.C [en inglés B.C.N.F.]). Posteriormente Fagin definió la Cuarta Forma Normal (4 F.N.) y la Quinta Forma Normal (5 F.N.). Se estimó que en el caso de llegar a utilizar la Quinta Forma Normal, luego de aplicarla la tabla ya estaría lista para ser usada. PRESENTACIONES Informes DEL USUARIO Relaciones sin estructura definida

RELACIONES NO NORMALIZADAS 28

Paso 1: Eliminar grupos repetidos RELACIONES NORMALIZADAS Paso 2: Eliminar dependencias parciales RELACIONES EN 2° FORMA NORMAL Paso 3: Eliminar dependencias transitivas RELACIONES EN 3° FORMA NORMAL Ejemplo Se tiene el siguiente documento Compañía de Equipos Hidráulicos Mirmidón Vendedor # : 3462 Nombre : Waters Área de ventas : Occidente N° CLIENTE 18765 18830 :

NOMBRE CLIENTE Delta Service Clery and Soto :

N° ALMACEN 4 3 :

DIRECCIÓN ALMACEN Fargo Bismasseles :

VENTAS 13540 10600 :

De acuerdo a este documento podemos observar algunas asociaciones (luego se podrían pasar a un modelo de entidad y relación): Se tiene la siguiente tabla (sin normalizar): NÚMERO NOMBRE ÁREA VENDEDOR VENDEDOR VENTAS

UBICACIÓN VALOR ALMACÉN VENTA

3462

Waters

Fargo

13540

3462

Waters

Bismarels

10600

3462

Waters

Bismarels

9700

:

:

NÚMERO NOMBRE NÚMERO CLIENTE CLIENTE ALMACÉN Delta OCCIDENTE 18765 4 Systems A Levy and OCCIDENTE 18830 3 S Raniers OCCIDENTE 19242 3 Comp : : : :

:

:

: 3593

: Dryne

: ORIENTE

: 18841

: 2

: Superior

: 11560

3593

Dryne

ORIENTE

18899

2

Superior

2590

3593

Dryne

ORIENTE

19565

1

Plymauth

8800

: RW Flood Seward Syst Stodols Inc

29

:

:

:

:

:

:

:

:

: :

: :

: :

: :

: :

: :

: :

: :

:

:

:

:

:

:

:

:

Existen grupos repetitivos, por lo tanto no está normalizada por lo tanto la base de datos no es relacional, es una simple tabla. Utilizando las formas normales se tiene (como es un ejemplo se muestra parte del proceso final, para llegar a lo que se ve deben realizarse varios pasos). VENDEDOR−CLIENTE NÚMERO NÚMERO VENDEDOR CLIENTE

NOMBRE CLIENTE

NÚMERO UBICACIÓN VALOR ALMACÉN ALMACÉN VENTAS

VENTAS CUENTA−ALMACÉN NÚMERO NÚMERO VALOR VENDEDOR CLIENTE VENTAS 3462

18765

13540

3462

18830

10600

3462 3593 : : :

19242 18841 : : :

9700 11560 : : :

NÚMERO NOMBRE NÚMERO CLIENTE CLIENTE ALMACÉN Delta 4 18765 System A Levy and 3 18830 S 19242 Ranier Com 3 18841 RW Flood 2 18899 Seward Syst 2 19565 Stodols Inc 1 : : :

UBICACIÓN ALMACÉN Fargo Bismarels Bismarels Superior Superior Plymauth :

CLIENTE−ALMACÉN NÚMERO CLIENTE

NOMBRE CLIENTE

NÚMERO ALMACÉN

UBICACIÓN ALMACÉN

CLIENTE ALMACÉN NÚMERO CLIENTE 18765 18830 19242 18841 18899 19565 :

NOMBRE CLIENTE Delta System A Levy and S Ranier Com RW Flood Seward Syst Stodols Inc :

NÚMERO ALMACÉN 4 3 3 2 2 1 :

NÚMERO ALMACÉN 1 2 3 4

UBICACIÓN ALMACÉN Plymauth Superior Bismarels Fargo

30

El objetivo de la normalización es obtener el mayor número posible de tablas, pero dejando en cada una de ellas los atributos que se necesitan para representar al objeto (entidad) y la relación entre las entidades a la que se refiere la tabla utilizando las claves. Ventajas que se obtienen por el uso de la normalización: • Facilidad al usarla, ya que al estar los datos en tablas se identifican claramente los objetos y relaciones. • Flexibilidad, pues la información que necesita el usuario se obtienen de las tablas o mediante el uso del álgebra relacional (unión, proyección, selección, etc.) . • Poca redundancia, ya que la información no se duplica (aunque existen casos especiales). • Precisión, ya que se consigue la información correcta mediante la relación de las tablas. • Máximo rendimiento, se ocupa la información que sirve para la aplicación. • Fácil de implementar, las tablas se almacenan físicamente como archivos planos. • Independencia de datos, lo que permite agregar atributos o tablas sin que se afecte la B.Ds. • Claridad, ya que la representación de la información es sumamente clara y sencilla para el usuario. Este proceso, el de normalización, lo debe realizar el analista de sistemas luego de enterarse de todo lo que requiera el usuario; esta información la recolecta mediante varias reuniones con el usuario, interiorizarse de la situación de su entorno y todo ésto debe recopilarse y documentarse. PRIMERA FORMA NORMAL (1 F.N) Una tabla se encuentra normalizada en 1F.N. si los valores que componen el atributo de una tupla son atómicos, esto quiere decir que no deben aparecer valores repetidos. Ejemplo Si observamos la siguiente tabla, ésta no se encuentra en 1F.N. ya que el atributo MEDIDAS tiene varios valores en una misma tupla: MATERIALES COD_MAT 039 067 461

DESCRIPCION MEDIDAS Tornillo 3,5 − 5 − 7 Arandela 2−5 Broca 2,5 − 3 − 3,5

Este es un problema típico lo que trae consigo varios problemas: • Falta de espacio en el campo para los valores que tienen o el desaprovechamiento del espacio cuando algunos campos tienen pocos valores. • Se hace más difícil las actualizaciones (MIE o MIB, modificar−insertar−eliminar (borrar)). Entonces se procede a normalizar de la siguiente manera: • Se localizan los atributos que conforman la clave principal, para el ejemplo COD_MAT. • Se descompone la tabla utilizando la PROYECCIÓN. La clave con los atributos que contiene valores únicos se dejan en una tabla más pequeña continuando con el nombre inicial 31

MATERIALES COD_MAT 039 067 461

DESCRIPCION Tornillo Arandela Broca

Se crea otra tabla con la clave y los atributos que tienen valores múltiples y esta tabla debe llevar un nombre distinto a la tabla anterior. MATER_MEDIDA COD_MAT 039 039 039 067 067 461 461 461

MEDIDAS 3,5 5 7 2 5 2,5 3 3,5

Si deseamos ser aún más minuciosos podemos descomponer aún más esta tabla para acceder a una medida determinada y que cada medida tenga su propia clave: TAB_MEDIDA COD_MED 01 02 03 04 05 06

MEDIDAS 3,5 5 7 2 2,5 3

y MATER_MEDIDA quedaría MATER_MEDIDA COD_MAT 039 039 039 067 067 461

COD_MED 01 02 03 04 02 05

32

461 461

06 01

Luego conociendo la clave COD_MAT y COD_MED se puede conocer el tipo de material y la medida que tiene. CONCEPTO DE DEPENDENCIA FUNCIONAL Se dice que un atributo (o conjunto de atributos) DEPENDE FUNCIONALMENTE de otro atributo (o conjunto de atributos) si y sólo si cada valor del segundo atributo se corresponde., a nivel conceptual, con un único valor del primer atributo. Su representación es la siguiente: A B o A DF B Ejemplo Se sabe que entre los atributos RUT y NOMBRE existe una DEPENDENCIA FUNCIONAL ya que el valor de RUT le corresponde a un solo NOMBRE (a una sola persona). RUT NOMBRE En el caso de que no existan dos nombres completamente iguales se cumple también la dependencia NOMBRE RUT En este caso se tendría RUT NOMBRE Siendo el primer atributo el más significativo. No siempre se cumple esta DEPENDENCIA FUNCIONAL como se puede ver en el ejemplo donde se deben relacionar DIRECCIÓN y RUT ya que varias personas pueden vivir en una misma dirección. PROPIEDADES DE LAS DEPENDENCIAS FUNCIONALES Supongamos que tenemos la tabla relacional T, que tiene como atributos W, X, Y, Z. Entonces podemos definir las siguientes propiedades: • Reflexividad Si los valores del atributo Y están incluidos o son iguales a los atributos X, entonces se cumple que Y DEPENDE FUNCIONALMENTE de X, (Y " X) ! (X Y) Ejemplo (CODPROV " CDPOST) ! (CDPOST CODPROV)

33

Siendo CODPROV código de provincia y CDPOST el código postal. • Aumentación Si el conjunto de atributos Y DEPENDE FUNCIONALMENTE de X, entonces dicha dependencia se mantiene aunque se añada un atributo a ambos conjuntos, (Z Y) ! (X.Z Y.Z) Ejemplo (RUT NOMBRE) ! (RUT.EMPRESA NOMBRE.EMPRESA) • Transitividad Si Y DEPENDE FUNCIONALMENTE de X, y Z DEPENDE FUNCIONALMENTE de Y, entonces se verifica que Z DEPENDE FUNCIONALMENTE de X, (X Y) y (Y Z) ! (X Z) Ejemplo (RUT NOMBRE) y (NOMBRE DIRECCION) ! (RUT DIRECCION) Utilizando estas tres propiedades se puede establecer: • Unión Si Y DEPENDE FUNCIONALMENTE de X y también Z DEPENDE FUNCIONALMENTE de X, implica que Z e Y DEPENDEN FUNCIONALMENTE de X, Ejemplo (RUT NOMBRE) y (RUT DIRECCION) ! (RUT NOMBRE.DIRECCION) • Pseudo−transitividad Si se cumple (X Y) y (W.Y Z) ! (W.X Z) Ejemplo (NOMBRE RUT) y (RUT.EMPRESA SUELDO) ! (NOMBRE.EMPRESA SUELDO) • Descomposición Si el conjunto de atributos Y DEPENDE FUNCIONALMENTE de X y también se cumple que los valores del conjunto de atributos Z están incluidos en los valores de Y, entonces se tiene que cumplir que Z DEPENDE FUNCIONALMENTE de X, (X Y) y (Z " Y) ! (X Z) 34

Ejemplo (RUT CDPOST) y (CDPROV CDPOST) ! (RUT CDPROV) GRÁFICO DE LAS DEPENDENCIAS FUNCIONALES El gráfico de las DF es una forma clara de tener una visión general de los datos y de la cohesión existente entre ellos. La clave que se obtiene al tratar todas las DF se representa dentro de una caja con sus atributos primarios. El resto de los atributos se representa fuera de la caja y también sus dependencias entre ellos. Si existe dependencia entre varios atributos que no son claves éstos irán dentro de la caja como un subconjunto representado por una caja de líneas discontinuas y así no se confunden con la clave de la tabla. Ejemplo A.B.C M | N | S MN B.C O | P | R OP CQ SEGUNDA FORMA NORMAL (2 F.N) Una tabla relacional se encuentra en 2 F.N. si cumple con las siguientes condiciones: Se encuentra en 1 F.N. Todo atributo secundario (los que no pertenecen a la clave principal, fuera de la caja) dependen de la clave completa y por lo tanto no de una parte de ella. Esta forma normal sólo se utiliza si la clave principal es compuesta (formada por varios atributos), si la clave principal de la tabla está formada por un solo atributo la tabla ya está en 2 F.N. Si la tabla T posee los atributos A, B, C, D y la clave es A.B y se cumplen las dependencias: A.B C BD Como se puede ver la tabla no está en 2 F.N. ya que el atributo D no tiene una dependencia funcional con la clave A.B T Para convertir esta tabla relacional a 2F.N. se realiza una proyección de ella y se crean: • Una tabla con la clave y todas sus dependencias totales con los atributos secundarios afectados.

35

T1 • Otra tabla con la parte de la clave que tiene dependencias y los atributos secundarios implicados. T2 La clave de la nueva tabla será la antigua parte de la clave Ejemplo Las personas que trabajan en varias empresas con el sueldo correspondiente, los atributos que se tienen son: RUT NOMBRE EMPRESA SUELDO Existen las siguientes dependencias RUT NOMBRE RUT.EMPRESA SUELDO El gráfico sería EMPLEADOS Se puede observar que esta tabla no se encuentra en 2 F.N., entonces luego de normalizarla se tendría EMPLEADOS PERSONAS 2 1 NÚMERO VENDEDOR + NÚMERO CLIENTE UBICACIÓN ALMACÉN N° ALMACÉN NOMBRE CLIENTE

36

UBICACIÓN ALMACÉN N° ALMACÉN NOMBRE CLIENTE CLIENTE NOMBRE VENDEDOR ÁREA DE VENTAS N° VENDEDOR VALOR VENTAS NÚMERO VENDEDOR NÚMERO CLIENTE NOMBRE VENDEDOR NOMBRE CLIENTE AREA VENTAS NÚMERO ALMACÉN UBICACIÓN ALMACÉN VALOR VENTAS S R Q P O N M B C A

37

C A B D A B C D B NOMBRE RUT EMPRESA SUELDO SUELDO RUT EMPRESA NOMBRE RUT

38

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.