Base de Datos PDF
Base de Datos PDF
Base de Datos PDF
BASE DE DATOS 2
Índice
Presentación 7
Red de contenidos 9
Unidad de Aprendizaje 1
SISTEMA DE BASE DE DATOS 11
1.1 Tema 1 : Introducción y conceptos básicos 13
1.1.1 : Introducción al curso 13
1.1.2 : Surgimiento histórico de las bases de datos 13
1.1.3 : Definición de base de datos 15
1.1.4 : Objetivos de las bases de datos 16
Unidad de Aprendizaje 2
MODELO CONCEPTUAL 55
2.1 Tema 6 : Modelo conceptual 55
2.1.1 : Modelo conceptual de datos 57
Unidad de Aprendizaje 3
MODELO RELACIONAL Y NORMALIZACION 103
3.1 Tema 12 : Normalización parte 1 105
3.1.1 : Primera forma normal 109
Unidad de Aprendizaje 4
MANIPULACION DE DATOS 139
4.1 Tema 16 : Restricciones 141
4.1.1 : Restricción DEFAULT 141
4.1.2 Restricción CHECK 144
4.1.3 Restricción UNIQUE 150
4.1.4 Restricción IDENTITY 153
Unidad de Aprendizaje 5
IMPLEMENTACION DE CONSULTAS 187
5.1 Tema 19 : Recuperación de datos 189
5.1.1 : Introducción al lenguaje de consultas SQL. 189
5.1.2 : Uso de la sentencia SELECT, FROM, WHERE, ORDER BY 189
5.1.3 : Manipulación de consultas condicionales. Uso de condicionales: 193
operadores lógicos AND, OR. Operadores de
comparación >, <, =, <>, <=, >=. Operador para manejo
de cadenas LIKE. Otros operadores: IN, BETWEEN.
5.1.4 : Funciones para el manejo de fechas: DAY(), MONTH(), YEAR(), 203
DATEPART().
Unidad de Aprendizaje 6
INTRODUCCION A LA PROGRAMACION TRANSACT-SQL 213
6.1 Tema 20 : Introducción a la programación en SQL Server 2014 215
6.1.1 : Declaración de variables locales 215
6.1.2 Procedimientos almacenados con una tabla 218
6.1.3 Aplicación usando procedimientos almacenados con uno y dos 221
Parámetros
Unidad de Aprendizaje 7
CONSULTAS MULTITABLAS 247
7.1 Tema 21 : Uniones internas y externas (INNER JOIN) 249
7.1.1 : Combinaciones internas con Inner Join 250
7.1.2 Combinaciones externas con Left, Right, Full, Cross Join 253
Unidad de Aprendizaje 8
SUBCONSULTAS, VISTAS Y AGRUPAMIENTO 271
8.1 Tema 22 : Subconsultas 273
8.1.1 : Subconsultas. 273
Presentación
Base de Datos es un curso que pertenece a la línea de base de datos y se dicta en las
carreras de Computación e Informática, Administración y Sistemas. Brinda los
conceptos técnicos para diseñar y crear una base de datos relacional.
Al finalizar el curso, el alumno diseña, crea e implementa una base de datos para un
proceso de negocio que contenga la implementación de reglas de negocio, vistas y
procedimientos almacenados, haciendo uso del lenguaje de programación Transact –
SQL y el gestor de base de datos SQL SERVER 2014.
Red de contenidos
UNIDAD
1
SISTEMA DE BASE DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno describe los componentes de una base de
datos a partir de casos propuestos por el profesor, tomados de situaciones
cotidianas y de ejemplos producidos individualmente. Asimismo, determina los
elementos de una base de datos y sus interrelaciones.
TEMARIO
1.1 Tema 1 : Introducción y conceptos básicos
1.1.1 : Introducción al curso
1.1.2 : Surgimiento histórico de las bases de datos
1.1.3 : Definición de base de datos
1.1.4 : Objetivos de las bases de datos
ACTIVIDADES PROPUESTAS
Los alumnos reconocen los principales conceptos de base de datos.
Los alumnos representan el mundo real en entidades.
Los alumnos implementan una base de datos en SQL Server 2014.
La base de datos hoy en día es considerada como una de las herramientas más
ampliamente difundidas en la actual sociedad de la información, es así que son
utilizadas como fuentes de recuperación y almacenamiento de información en todos
los campos a nivel científico, social, económico, político y cultural.
Desde el punto de vista informático, una base de datos es un sistema formado por un
conjunto de datos registrados en lugares de almacenamiento permanente que
permiten el acceso directo a ellos y un conjunto de programas que manipulen ese
conjunto de datos muchas veces llamados sistemas de gestión de base de datos.
Asi mismo, este sistema de Gestión de Bases de datos es un tipo de software muy
específico dedicado a servir de interfaz entre la base de datos, el usuario y las
aplicaciones que la usan; o lo que es lo mismo, una agrupación de programas que
sirven para definir, construir y manipular una base de datos, permitiendo así almacenar
y posteriormente acceder a los datos de forma rápida y estructurada.
Figura 2: Cliente-Servidor
Fuente.- Tomado de http://www.coders.me/wp-content/uploads/2008/03/cliente-servidor.gif
Esta forma de trabajo implica redundancia de datos, que trae aparejada mayor
gasto de memoria y complica las operaciones de actualización (modificar un
dato donde quiera que aparezca). Esto aumenta el tiempo de tratamiento y
atenta contra la integridad de la información.
Además, en la vida real, se establecen relaciones entre los objetos que son
muy difíciles de representar u obtener a partir de sistemas tradicionales de
archivos. Por ejemplo, si se tiene información sobre trabajadores y estudiantes
de una facultad, las aplicaciones requeridas van a definir la manera de
organizar y estructurar los archivos. Si se desean obtener datos como
promedio de las calificaciones de cada alumno, listado de estudiantes por
grupo, categoría científica y docente de cada grupo, y salario de cada uno,
resulta adecuado establecer dos archivos: uno de profesores y otro de
estudiantes.
“Se define una base de datos como una serie de datos organizados y relacionados
entre sí, los cuales son recolectados y explotados por los sistemas de información de
una empresa o negocio en particular”.
“Se le llama base de datos a los bancos de información que contienen datos relativos
a diversas temáticas y categorizados de distinta manera, pero que comparten entre sí
algún tipo de vínculo o relación que busca ordenarlos y clasificarlos en conjunto”.
“Una base de datos es un “almacén” que nos permite guardar grandes cantidades de
información de forma organizada con el objeto de encontrar y utilizar fácilmente dicha
información”.
Existen muchas formas de organizar las bases de datos, pero hay un conjunto de
objetivos generales que deben cumplir todos los SGBD, de modo que faciliten el
proceso de diseño de aplicaciones y que los tratamientos sean más eficientes y
rápidos, dando la mayor flexibilidad posible a los usuarios.
Los usuarios de una base de datos pueden acceder a ella con solicitudes para resolver
muchos problemas diferentes. El SGBD debe contar con la capacidad de una
búsqueda rápida por diferentes criterios, debe permitir que los usuarios planteen sus
demandas de una forma simple, aislándolo de las complejidades del tratamiento de los
archivos y del direccionamiento de los datos. Los SGBD actuales brindan lenguajes de
alto nivel, con diferentes grados de facilidad para el usuario no programador, que
garantizan este objetivo, los llamados sublenguajes de datos.
Lo anterior implica que debe existir una persona o un conjunto, que tenga la
responsabilidad de los datos operacionales: el administrador de la base de datos
puede considerarse parte integrante del SGBD.
Tomemos en cuenta que un dato es cualquier valor que puede representar algo, así
como un número, imagen, sonido, símbolo, nombre, etc.; su característica principal es
que no permite tomar ninguna decisión, ya que son simplemente datos que no tienen
un significado concreto. Estos datos deben procesarse para dotarlos de significado y
convertirlos en algo que nos pueda servir como información.
En este nivel encontramos a las entidades u objetos, que son elementos que
componen nuestro universo y son considerados como elementos que existen y
además están bien diferenciados entre sí, estos poseen propiedades o
características que son fácilmente detectables. Por ejemplo:
Número de placa
Color del auto
Número de puertas
Marca del auto
Modelo del auto
En este nivel, se trabaja con los conceptos más importantes del modelo de
datos, que establecen la relación entre el mundo real y la información
almacenada físicamente en la base de datos, como un dato o registro que
definiremos a continuación:
Sin embargo, hay que distinguir entre el nombre y el valor del atributo, ya
que un nombre de atributo puede tomar diferentes valores sobre un cierto
conjunto que se denomina dominio. A un valor de un atributo se le denomina
ocurrencia del atributo. Por ejemplo:
Atributo Descripcion
COD_PROF Codigo único del profesor.
NOM_PROF Nombre completo del profesor.
CAT_PROF Categoría asignada al profesor.
SUE_PROF Sueldo asignado al profesor.
3º NIVEL: DATOS
El tercer nivel corresponde a los datos propiamente dichos, los cuales son
representados mediante cadenas de caracteres o de bits.
Sin embargo, una colección de bits o caracteres que representa un único valor
de datos y que puede existir independientemente de cualquier información que
se almacena adquiere significado Solo cuando se le asocia a un tipo de
atributo. Se puede, por ejemplo, almacenar permanentemente los valores
ROJO, AZUL, VERDE, etc. y asociarlos en un momento determinado a un tipo
de atributo a través de los valores que toma, representando una ocurrencia en
una tupla. Veamos la integración de todos los niveles expresados en la entidad
Auto:
ENTIDAD AUTO
PLA_AUTO COL_AUTO PUE_AUTO MAR_AUTO MOD_AUTO
AGI-384 Rojo 5 Toyota Rav 4
REGISTROS FRG-254 Azul 5 Kia Sportage
PER-120 Gris 4 Kia Rio 5
Asi mismo, se podría decir que describe políticas, normas, operaciones, definiciones y
restricciones presentes en una organización y que son de vital importancia para
alcanzar los objetivos. Mencionaremos algunos ejemplos:
Por otra parte, una aplicación informática permite reflejar parte del funcionamiento del
mundo real, haciendo que un proceso sea manejado por un usuario de manera
correcta; para que esto ocurra debemos aplicar restricciones, de modo que se prevea
acciones de manera correcta. Para un sistema de base de datos podríamos nombrar
las siguientes reglas de negocio:
Proveedor Producto
Se puede tener una relación entre dos tipos de objetos: PROVEEDOR y PRODUCTO,
de modo que un proveedor puede suministrar muchos productos y que un producto
puede ser suministrado por muchos proveedores y se conoce, además, la CANTIDAD
de cada producto que suministra un proveedor dado.
1 1
Documento_Identidad Persona
1 M
Curso Estudiantes
Finalmente, hay cuatro tipos de relaciones posibles entre dos tipos de artículos A y B:
- La correspondencia de A a B puede ser simple y la recíproca compleja.
- La correspondencia de A a B puede ser compleja y la recíproca simple.
- Ambas correspondencias pueden ser complejas o ambas pueden ser simples.
Caso: BIBLIOTECA
Así mismo, un libro se clasifica por una materia y por ésta se clasifican muchos
libros. De cada materia se conoce el código que la identifica y su nombre. Los libros
tienen muchos ejemplares, pero un ejemplar lo es de un solo libro. De cada
ejemplar se sabe su código y su estado de conservación.
Solución:
Entidad: LIBRO
Código Titulo Cantidad de Paginas
L001 BASE DE DATOS RELACIONALES 500
L002 VISUAL C# 2014 600
Entidad: MATERIA
Código Nombre
M001 BASE DE DATOS
M002 LENGUAJE DE PROGRAMACIÓN
Entidad: EJEMPLAR
Código Estado de conservación
E001 BUENO
E002 REGULAR
Entidad: USUARIO
Codigo Nombres Apellido Paterno Dirección Ocupación
U001 MARIA ACOSTA AV. EL SOL 657 DOCTOR
U002 GUADALUPE ZAMORA AV. LAS ABOGADO
PALMERAS 3458
Existirán varias "vistas externas" diferentes. Cada vista es una representación más o
menos abstracta de alguna porción de la base de datos total y existirá únicamente una
"vista general", consistente en una representación también abstracta de la base de
datos en su totalidad. Igualmente, existirá una única "vista interna" que representa a la
base de datos completa, tal y como está realmente almacenada.
Es importante señalar que todo lenguaje debe incluir un sublenguaje de datos, o sea,
un subconjunto del lenguaje que trata específicamente con los objetos de la base de
datos y sus operaciones.
El esquema externo se escribe usando la porción del DDL del sublenguaje de datos
del usuario; además, tiene que existir una definición de la correspondencia entre el
esquema externo y el esquema lógico global.
Esta vista puede ser muy diferente de la forma en la que los datos son vistos por un
usuario en particular. Pretende ser una vista de los datos tal como son en lugar de
cómo los usuarios están forzados a verlos por las restricciones, digamos, de un
lenguaje particular o de un determinado hardware que utilicen.
La vista lógica se define mediante el esquema lógico que incluye las definiciones de
cada uno de los diferentes tipos de artículos lógicos. El esquema lógico se describe
usando otro lenguaje de definición de datos: el DDL lógico. Si se desea lograr la
independencia de los datos, entonces las definiciones del DDL lógico no deben
comprender ninguna consideración sobre la estructura de almacenamiento ni la
estrategia de acceso. Ellas tienen que ser definiciones sólo referentes al contenido
informativo.
Entonces, es una vista del contenido total de la base de datos y el esquema lógico es
una definición de esa vista. Sin embargo, el esquema lógico no es, simplemente, un
conjunto de definiciones como las que se encuentran, por ejemplo, en un programa
Java. Las definiciones en el esquema lógico deben incluir una gran cantidad de
aspectos adicionales, tales como los chequeos de protección y los chequeos de
integridad.
La vista interna es una representación de bajo nivel de la base de datos completa, que
consiste en múltiples ocurrencias de múltiples tipos de artículos internos.
Básicamente, la vista interna asume un espacio de dirección lineal infinita. Los detalles
de cómo se hace corresponder ese espacio con el almacenamiento físico son muy
específicos de un sistema y deliberadamente se omitieron de la arquitectura.
La vista interna se describe mediante el esquema interno, el cual no sólo define los
diferentes tipos de artículos almacenados, sino que también especifica los índices que
existen, la representación de los campos almacenados, la secuencia física en que
están los artículos almacenados, etc. El esquema interno se describe usando otro
lenguaje de definición de datos: el DDL interno.
Pero como sucede con cualquier sistema de normalización, hay excepciones para casi
todo. De hecho, cada motor de bases de datos tiene sus peculiaridades y lo hace
diferente de otro motor; por lo tanto, el lenguaje SQL normalizado (ANSI) no nos
servirá para resolver todos los problemas, aunque sí se puede asegurar que cualquier
sentencia escrita en ANSI será interpretable por cualquier motor de datos.
En 1986, el ANSI adoptó SQL (sustancialmente adoptó el dialecto SQL de IBM) como
estándar para los lenguajes relacionales y en 1987 se transformó en estándar ISO.
Esta versión del estándar va con el nombre de SQL/86. En los años siguientes, este
ha sufrido diversas revisiones que han conducido primero a la versión SQL/89 y,
posteriormente, a la actual SQL/92.
Las bases de datos son importantes porque permiten almacenar grandes cantidades
de información en forma estructurada, consistente e íntegra y dan la posibilidad a un
desarrollador de utilizarlas mediante programas (aplicaciones); además, les
proporciona a estos una herramienta bajo la cual puedan reducir considerablemente el
tiempo del proceso de búsqueda en profundidad de los datos almacenados.
SQL Server usa la arquitectura Cliente / Servidor para separar la carga de trabajo en
tareas que se ejecuten en computadoras tipo Servidor y tareas que se ejecuten en
computadoras tipo Cliente:
SQL Server 2014 trabaja con dos (2) tipos de bases de datos:
Esta es una versión de SQL (Structured Query Languaje) usada como lenguaje de
programación para SQL Server. SQL es un conjunto de comandos que permite
especificar la información que se desea restaurar o modificar. Con Transact SQL se
puede tener acceso a la información, realizar búsquedas, actualizar y administrar
sistemas de bases de datos relacionales.
SQL Server 2014 se basa en las funciones críticas ofrecidas en la versión anterior,
proporcionando un rendimiento, una disponibilidad y una facilidad de uso innovadores
para las aplicaciones más importantes. Microsoft SQL Server 2014 ofrece nuevas
capacidades en memoria en la base de datos principal para el procesamiento de
transacciones en línea (OLTP) y el almacenamiento de datos, que complementan
nuestras capacidades de almacenamiento de datos en memoria y BI (Business
Intelligence) existentes para lograr la solución de base de datos en memoria más
completa del mercado.
Para crear una base de datos, determine el nombre de la base de datos, el propietario
(el usuario que crea la base de datos), su tamaño, y los archivos y grupos de archivos
utilizados para almacenarla.
a) De forma predeterminada, tienen permiso para crear una base de datos las
funciones fijas del servidor sysadmin y dbcreator, aunque se puede otorgar
permisos a otros usuarios.
b) El usuario que crea la base de datos se convierte en su propietario.
c) En un servidor, pueden crearse hasta 32767 bases de datos.
Se utilizan tres (03) tipos de archivos para almacenar una base de datos:
Algunas consideraciones:
- Cuando se crea una base de datos, todos los archivos que la componen se
llenan con ceros que suplantan los datos de los archivos ya eliminados que
hubieran quedado en el disco. Aunque esto provoque que el proceso de
creación de los archivos sea más largo, es mejor, pues así se evita que el
sistema operativo tenga que llenar los archivos con ceros cuando se escriban
por primera vez datos en los archivos durante las operaciones habituales con la
base de datos. De esta manera, se mejora el rendimiento de las operaciones
cotidianas.
Archivo de Transacciones
- Tamaño: 1072 KB
- Máximo Tamaño: 2147483648 KB
- Tasa de Crecimiento: 10%
Donde:
Crear una base de datos personalizada nos permite especificar las propiedades de
cada uno de los archivos que la compone e inclusive podemos agregar archivos
adicionales como los archivos secundarios.
Los archivos que componen una base de datos tienes características similares, lo que
lo diferencia son los valores en cada una de las características:
FILENAME='C:\base\ventas.mdf'
SIZE=2048KB
SIZE=2MB
SIZE=2
MAXSIZE Es la definición del máximo tamaño que puede llegar a tener una
base de datos. Estos se pueden dar en KB, MB, GB, etc. En caso
no tengamos fijo el máximo tamaño podemos optar por asignar
UNLIMITED, el cual usa el tamaño máximo permitido por el
sistema operativo y la capacidad de disco con que se cuenta. Por
ejemplo:
Donde:
Actividad
Caso 1: BD_EJEMPLO
Caso 2: BD_COMERCIAL
SP_HELPDB BD_COMERCIAL
GO
Caso 3: BD_COMERCIAL
SP_HELPDB BD_COMERCIAL
GO
Caso 4: BD_COMERCIAL
SP_HELPDB BD_COMERCIAL
GO
Autoevaluación
De los siguientes casos, realice lo siguiente:
Una escuela tiene muchas aulas y muchos grupos de clases, pero cada aula
pertenece a una escuela y lo mismo sucede con cada grupo.
2. CASO: Biblioteca
3. CASO: Hospital
5. Caso: VENTAS
Resumen
1. El procesamiento automatizado de datos ha pasado por diferentes etapas en
su desarrollo hasta llegar a la actual, en la que se emplean bases de datos
para el almacenamiento de la información.
13. Existen asociaciones o relaciones enlazando las entidades, que pueden tener o
no atributos. Pueden establecerse sobre la misma entidad o sobre entidades
diferentes. En una relación puede participar cualquier cantidad de entidades.
14. Las relaciones pueden ser de uno a uno (1 : 1), de uno a muchos (1 : m) y de
muchos a muchos (m : m).
15. La arquitectura de un SGBD está compuesta por tres niveles: externo, lógico
global e interno. El nivel lógico global de los datos representa el contenido
informativo total de la base de datos y, desde el punto de vista del diseñador,
es el más importante.
16. Existe una correspondencia entre el nivel externo y el lógico global; y entre
el lógico global y el interno. Para garantizar la independencia de los datos
respecto a los programas de aplicación, cualquier cambio en el nivel interno
debe reflejarse adecuadamente en la correspondencia interna/lógico global,
para no afectar el nivel lógico global.
17. Las principales operaciones que se realizan sobre los archivos son los
siguientes: acceso, que puede ser secuencial o directo, y actualización, que
se refiere a las altas, bajas y modificaciones de la información.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
o http://www3.uji.es/~mmarques/f47/apun/node33.html
En esta página web hallará algunos conceptos complementarios a los
mostrados en el manual sobre la arquitectura de una base de datos.
o http://www.mitecnologico.com/Main/EstructuraArchivosOrganizacionSecuen
cialIndexado
En esta página web encontrará definiciones complementarias al
almacenamiento secuencial indexado.
o http://sistemas.itlp.edu.mx/tutoriales/basedat1/
En esta página web hallará algunos conceptos complementarios a los
mostrados en el manual sobre la introducción a la base de datos.
o http://sistemas.itlp.edu.mx/tutoriales/basedat1/
Es esta página web encontrará definiciones complementarias sobre los
objetivos de las base de datos.
o http://sistemas.itlp.edu.mx/tutoriales/basedat1/
Es esta página web encontrará ejercicios sobre la representación de la
información.
UNIDAD
2
MODELO CONCEPTUAL
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno diseña el diagrama entidad relación (DER)
de un proceso de negocio a partir de casos planteados por el profesor,
relacionando las características del modelo conceptual con el diseño de una
base de datos en SQL Server 2014.
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos implementan un modelo conceptual a partir de un caso.
Los alumnos implementan una base de datos y sus entidades en SQL
Server 2014.
Hemos visto en esta arquitectura que cada nivel de la misma es una cierta forma de
representación abstracta de la información y una de las funciones más importantes del
SGBD consiste precisamente en permitirle al usuario la interacción con los datos en
estos términos abstractos, en lugar de tenerlo que hacer directamente con la forma en
que esos datos están físicamente almacenados. Es por ello que, al acometerse la
tarea de diseño de una base de datos, la atención se debe centrar en el aspecto lógico
de la información, ya que los detalles relacionados con el almacenamiento físico son
parte de todo SGBD comercial que se utilice, y por tanto, no pueden ser modificados.
Utilizan una terminología que no es familiar al usuario del sistema, por lo que
dificultan la comunicación usuario - diseñador.
Además, cada uno de estos modelos está vinculado con un tipo particular de SGBD.
Por todo ello, es necesario tratar con otro tipo de modelo cuando se aborda el
problema del diseño de la base de datos, el cual debe superar los problemas
anteriores y constituye un nivel de abstracción intermedio entre la realidad informativa
y el nivel lógico global de la arquitectura. A este nuevo tipo de modelo se le denomina
modelo conceptual.
Cada elemento de esa relación es una ocurrencia de relación (e1, e2, ..., en), donde las
Ei y ei no tienen que ser necesariamente diferentes. El rol de una entidad en una
relación expresa la función que desempeña dicha entidad en la relación.
Información adicional sobre una entidad (además de los predicados y las relaciones)
se obtiene mediante los atributos asociados con la entidad. Ejemplos de valores que
pueden tomar los atributos son: "rojo", "3", "Juan", etc. y ellos se clasifican en dominios
mutuamente disjuntos, tales como "color", "edad", “nombre”, etc. Un valor de un
dominio puede ser equivalente a otro valor en un dominio diferente. Por ejemplo, "100"
en el dominio "centímetros" es equivalente a "1" en el dominio "metros".
- El único hecho que puede ser registrado sobre los valores en este modelo es
su pertenencia a un dominio. Si se desea representar otra propiedad, el
atributo asociado tiene que ser convertido en una entidad. Por ejemplo, si
queremos registrar la longitud de onda de cada color no podemos hacerlo en el
modelo entidad - relación, sino convirtiendo el atributo COLOR en una entidad.
En ocasiones, una entidad no puede ser identificada únicamente por el valor de sus
propios atributos. En estos casos, se utilizan conjuntamente las relaciones con los
atributos para lograr la requerida identificación unívoca. Estas entidades reciben el
nombre de entidades débiles y se representan en el DER con un doble rectángulo.
El modelo entidad-relación restringe las relaciones a usar para identificar las entidades
débiles a relaciones binarias de, a lo sumo, 1:n. Así, por ejemplo, una ocurrencia de
trabajador puede tener n ocurrencias persona-dependiente asociadas, donde, además,
la existencia de una ocurrencia en la segunda entidad depende de la existencia de una
ocurrencia que le corresponda en la primera entidad.
ocurrencia de la entidad del otro extremo, por lo que, con la llave de la entidad del
extremo muchos está perfectamente determinada también una única ocurrencia de la
entidad del extremo 1. Por ejemplo, en la relación Empresa-trabajador la llave será
DNI-trab.
De modo similar, en una relación de UNO A UNO (1:1) la llave de la relación está
formada por la llave de cualquiera de las dos entidades que participan, pues “A una
ocurrencia de una de ellas le corresponde sólo una ocurrencia de la otra y
viceversa”, por lo que, con la llave de una de las entidades está perfectamente
determinada también una única ocurrencia de la otra entidad. Por ejemplo, si en un
centro de trabajo un trabajador, que se identifica con DNI-Trab, es jefe de un piso, que
se identifica con numpiso, y un piso tiene un jefe, es decir, que la relación es de 1:1,
entonces, la llave de la relación puede ser o DNI-trab o numpiso.
Una entidad se puede relacionar consigo misma. A estas relaciones se les llama,
usualmente, recursivas o cíclicas. Es posible extender la capacidad semántica del
modelo entidad-relación aplicando sobre sus objetos básicos (entidad y relación)
diferentes operaciones, tales como:
GENERALIZACIÓN
Permite formar una nueva entidad, mediante la unión de otras entidades. El
proceso inverso se denomina especialización y divide una entidad en cierto
número de otras entidades.
- AGREGACIÓN
Construye una nueva entidad sobre la base de una relación. A las entidades,
relaciones y conjuntos definidos hasta ahora les llamaremos tipos básicos para
distinguirlos de los nuevos tipos de datos que se obtendrán con las
operaciones anteriores.
Si T1, T2,..., Tn son entidades (que pueden a su vez ser resultado de una
generalización), la generalización define una nueva entidad T con el siguiente
significado:
T = { t | t Ti , 1 i n}
Mejor dicho, para cada ocurrencia t en T existe, al menos, un conjunto Ti que contiene
a esa ocurrencia. Por ejemplo, en el DER anterior, puede ser necesario distinguir los
trabajadores de una empresa de acuerdo a su ocupación como obreros, dirigentes y
administrativos. Esto no puede ser representado en el modelo que está representado
en el DER de la figura anterior y sólo a través del hecho de que la entidad "obrero", por
ejemplo, es siempre (mejor dicho, en todo momento) un subconjunto de la entidad
"trabajador", podemos deducir cierta clase de dependencia entre los dos tipos
Nótese que hemos introducido un nuevo atributo para la entidad trabajador. Este
atributo nos permite distinguir entre los miembros de diferentes clases de trabajadores.
Es importante agregar algo más a lo visto hasta ahora para poder expresar las
siguientes situaciones que se presentan:
Donde:
2.2.2.2 Agregación
Sin embargo, la misma situación puede ser vista de forma algo diferente. En la
empresa, las máquinas pueden estar asignadas a los obreros y estos "equipos"
producir piezas en cierta cantidad.
Si T1, T2, ..., Tn son entidades, la operación define una nueva entidad T con el
significado siguiente:
Mejor dicho, las nuevas ocurrencias se forman como tuplas de ocurrencias de las
entidades componentes. Para que la operación tenga sentido, las entidades T1, T2,...,
Tn tienen que formar parte en alguna relación común y esa relación siempre será
incluida en la representación de la entidad generada (entidad agregada).
Hay una diferencia importante entre estos dos atributos: está claro que la Fecha del
Envío no puede pertenecer a ninguna de las entidades componentes; sin embargo, la
Cantidad Enviada se refiere claramente a las piezas. Diremos entonces, que la
Cantidad Enviada es una "caracterización" de la entidad PIEZA con respecto al
ENVÍO.
Pero la situación del ejemplo podría tener la variante que se muestra en la siguiente
figura, donde se ha definido un número de envío (NUM_ENV) que identifica al envío y
que, por lo tanto, pasa a ser la llave de la entidad agregada:
Para el modelo entidad - relación, incluyendo las dos operaciones estudiadas, pueden
plantearse una serie de restricciones de integridad:
Una entidad débil es aquella cuya existencia depende de otra entidad llamada fuerte.
A manera de ejemplo, se muestra a continuación un DER que representa al alumno de
Medicina como entidad débil de grupo, ya que el alumno se identifica por un número
consecutivo dentro del grupo al que pertenece y que, por lo tanto, puede repetirse en
distintos grupos, por lo que, para identificar a un alumno, es preciso decir “el alumno
número n del grupo código g”. A la vez, la entidad alumnomedicina es una
generalización que tiene como especializaciones a los alumnos de 3er. ciclo o menos
y a los alumnos de 4to. ciclo o más.
En SQL Server una tabla suele denominarse tabla de base, para hacer énfasis sobre
dónde se almacenan los datos. La utilización de <<Tabla de base>>, también distingue
la tabla de una vista (View), (una tabla virtual que es una consulta interna de una tabla
base.)
La sentencia CREATE dentro de SQL Server permite crear todo tipo de objeto desde
una tabla, procedimiento almacenado, funciones, triggers, etc. Veamos el formato
BÁSICO de la sentencia Create para una tabla o entidad:
Donde:
EMPLEADO, TB_EMPLEADO
CAMPO1: Es la especificación de las columnas que cuenta la tabla, así mismo
son llamados columnas o atributos. Así por ejemplo:
- Asignación de restricciones:
Todo lo que se puede crear dentro de una base de datos es considerado como objeto;
es por eso que la sentencia If lo reconoce con la función OBJECT_ID, esta función
identifica el código de objeto que le fue asignado al momento de su creación.
Veamos las posibles acciones que podemos tomar con la sentencia Alter Table:
La sentencia DROP dentro de SQL Server permite eliminar cualquier tipo de objeto de
una base de datos, tales como las tablas, procedimientos almacenados, funciones,
triggers, etc. Su formato para la eliminación de una tabla de datos es:
Así mismo, una clave Foránea o Foreign Key es una o varias columnas de una tabla
cuyos valores deben ser iguales a los de una restricción Primary Key en otra tabla.
SQL Server impone de manera automática la integridad referencial mediante la
utilización de Foreign Key y a esta característica se le denomina integridad referencial
declarativa.
a) Definición de relaciones
b) Relación Uno-a-Varios:
La relación uno a varios (uno a muchos), es el tipo de relación más común. Se podría
decir que:
- En este tipo de relación, una fila de la tabla A puede tener varias columnas
coincidentes en la tabla B.
- Pero una fila de la tabla B sólo puede tener una fila coincidente en la tabla A.
Por ejemplo, las tablas Editor y Libro tienen una relación uno a varios, por la siguiente
razón “Cada editor produce muchos libros, pero cada Libro procede de un único
editor”.
Una relación de uno a varios sólo se crea si una de las columnas relacionadas es una
clave principal o tiene una restricción única (una restricción única impide que el campo
tenga valores repetidos). El lado de la clave principal de una relación de uno a varios
se indica con un símbolo de llave, mientras que el lado de la clave externa de una
relación se indica con un símbolo de infinito en SQL Server.
Veamos el caso más común entre dos tablas o entidades implementada en SQL
Server:
Llave
primaria
Llave
primaria
Llave
Foránea
En las relaciones de varios a varios (muchos a muchos), una fila de la tabla A puede
tener varias filas coincidentes en la tabla B, y viceversa.
Para crear una relación de este tipo, debemos tener en cuenta los siguientes aspectos:
Por ejemplo, la tabla Autor y la tabla Libro tienen una relación de varios a varios
definida por una relación de uno a varios entre cada de estas tablas y la tabla
Autor_Libro. La clave principal de la tabla Autor_Libro es la combinación de la columna
cod_aut (la clave principal de la tabla Autor) y la columna cod_lib (la clave principal de
la tabla Libro).
En una relación de uno a uno, implica que una fila de la tabla A no puede tener más
de una fila coincidente en la tabla B y viceversa. Una relación de uno a uno se crea si
las dos columnas relacionadas son claves principales o tienen restricciones únicas.
Así mismo, podemos decir que este tipo de relación no es común; porque la mayor
parte de la información relacionada de esta manera estaría en una tabla. Se puede
utilizar una relación de uno a uno para:
El lado de la clave principal de una relación de uno a uno se indica con un símbolo de
llave. El lado de la clave externa también se indica con un símbolo de llave.
Una tabla o entidad suele tener un campo o una combinación de campos cuyos
valores identifican de forma única cada fila de la tabla. A estas columnas se les
denomina llave o simplemente clave principal de la tabla.
- Toda tabla de una base de datos debe tener por lo menos una asignación
PRIMARY KEY.
- Ningún campo a la cual se aplique PRIMARY KEY debe aceptar valores nulos,
eso quiere decir, que deben estar asignados como NOT NULL.
- Toda asignación PRIMARY KEY garantiza datos únicos; es decir no se podrá
ingresar dos valores similares, estos son usados mayormente para códigos.
Su formato es:
En una referencia de clave externa, se crea un vínculo entre dos tablas cuando las
columnas de una de ellas hacen referencia a las columnas de la otra que contienen el
valor de clave principal. Esta columna se convierte en una clave externa para la
segunda tabla.
- Una asignación Foreign Key desarrolla la relación uno a muchos entre las
entidades.
- Una tabla puede tener N enlaces foráneos, siempre y cuando la otra tabla
tenga un campo clave que lo asocie.
- Para poder enlazar dos tablas se necesita que una de las columnas sea clave
principal y la otra sea una columna simple, pero que tengan el mismo tipo de
datos y principalmente la misma capacidad.
- Toda asignación FOREING KEY garantiza que los datos ingresados en una
tabla se encuentre asociada a otra; así se genera una dependencia entre los
datos de ambas tablas.
Su formato es:
Solución:
USE MASTER
GO
Actividad
Caso 1: LIGA DE SURCO
La liga cuenta con diferentes clubes de los cuales se tiene su nombre, fecha de
creación, dirección y número de locales. Los clubes tienen distintos tipos de
jugadores contratados. De los jugadores se conoce su código, el cual se puede
repetir para diferentes clubes, los nombres y apellidos, dirección, sexo y fecha de
nacimiento, entre otros datos. Cabe mencionar que un jugador es capitán de otros
jugadores. Ello implicará que deba ser capacitado en cursos de liderazgo y coaching
deportivo.
Finalmente, la liga programa a los equipos en diferentes torneos para que eleven su
nivel deportivo controlando la cantidad de participaciones que tiene un determinado
equipo. Del torneo se registra el nombre del torneo, las fechas de inicio y fin, así como
la disciplina correspondiente.
Solución:
ENTIDAD ATRIBUTOS
CLUB cod_club, nom_club, fec_cre_club, dir_club, nro_local_club
JUGADOR cod_jug, nom_jug, ape_pat_jug, ape_mat_jug, dir_jug,
sex_jug, fecnac_jug
EMPLEADO cod_emp, nom_emp, ape_pat_emp, ape_mat_emp,
dir_emp, sex_emp, fecnac_emp, tel_fijo_emp, tel_cel_emp
TECNICO esp_tec_emp
ADMINISTRATIVO niv_adm_emp
EQUIPO cat_equ, disc_equ
CONTRATO num_cont, fec_ini_con, fec_ter_con
TORNEO cod_tor, nom_tor, fec_ini_tor, fec_ter_tor, disc_tor
Generalización
Agregación
En el DER se deberá agregar los atributos e identificadores de cada entidad, así como
en la relación de EQUIPO – TORNEO (E - T) el atributo cantidad de torneos en que
participa un equipo (CANT_TOR_EQU), como se vio anteriormente.
Tener en cuenta:
Primera solución:
Segunda solución:
Suponga que contamos con la tabla empleado el cual tiene la siguiente estructura:
Realice lo siguiente:
Solución:
Agregar la columna mov_emp (teléfono móvil) de tipo varchar(15) con valores nulos
permitidos.
Agregar las columnas cat_emp (categoría del empleado) de tipo char(3) el cual no
acepte valores nulos y ema_emp (correo electrónico del empleado) de tipo
varchar(50) con valores nulos permitidos.
Nota: Para comprobar los cambios efectuados en la tabla Empleado use la siguiente
sentencia: SP_COLUMNS EMPLEADO
Script que permite implementar la relación de uno a muchos entre la tabla categoría y
empleado, tal como muestra en la siguiente imagen:
Solución:
Solución:
Script que permite implementar la relación de muchos a muchos entre las entidades
empleado y departamento.
Solución:
)
GO
Script que permite implementar la relación uno entre las entidades clientes, persona y
proveedor.
GO
Autoevaluación
De cada uno de los siguientes casos realice:
La empresa de taxis “Rapid Car” cuenta con un conjunto de taxis que brindan servicio
a los hospitales de dicha ciudad. En la empresa trabajan choferes, cada uno de los
cuales se caracteriza por su DNI, nombre y años de servicio.
Así mismo, en la empresa hay numerosos taxis, de los que se conoce la placa, el
número del motor, la marca y el modelo. Un taxi puede ser conducido por diferentes
choferes (en distintos momentos), pero un chofer siempre conduce el mismo taxi. Se
conoce la cantidad de kilómetros totales recorridos por un chofer en su
correspondiente taxi. La empresa brinda servicios a varios hospitales.
Por otra parte, de cada hospital se conoce su nombre, tipo y dirección. Un chofer le
brinda servicios (realiza viajes) a distintos hospitales y a un hospital le brindan
servicios distintos choferes. Se sabe la cantidad de viajes realizados por cada chofer a
cada hospital.
La Biblioteca Nacional del Perú desea efectuar el control de préstamos de los libros y
cubículos a sus diferentes usuarios, para lo cual lo ha contratado a fin de que diseñe y
cree una base de datos.
Así mismo, la biblioteca cuenta con dos (2) tipos de empleados: contratados y
practicantes. De los empleados se guarda el código, nombre, apellidos, sexo,
dirección, fecha de nacimiento, documento de identidad y el tipo del trabajador. Una
solicitud de préstamo es atendida únicamente por un empleado del tipo contratado,
dado que debe dar su autorización mediante la firma de dicho documento. De la
solicitud de préstamo se almacena el número de la misma, la fecha de solicitud y datos
de los usuarios, libros y empleados.
Asimismo, los usuarios pueden ser de dos tipos: alumnos y profesores, por quienes
son de diferentes institutos o colegios, y pueden generar varias solicitudes de
préstamo para diferentes libros o pedidos de cubículos. De los usuarios se almacena
su código, nombre, apellidos, dirección, teléfono de casa y documento de identidad.
Así mismo, para cada mercancía de diferentes países existen diferentes formas de
transportación; para cada país existen diferentes mercancías que son transportadas
en diferentes formas de transportación; y una forma de transportación puede serlo de
diferentes mercancías de diferentes países. Una mercancía procedente de un país
transportada de una forma dada constituye un embarque y para éste se conoce su
fecha de arribo y cantidad.
Resumen
1. El Modelo entidad-relación permite representar lógicamente un caso.
2. En el diagrama entidad-relación, una entidad se representa mediante un
rectángulo, una relación mediante un rombo, un atributo mediante un círculo.
Todos estos elementos deben aparecer debidamente identificados por medio
de un nombre. Los atributos que constituyen la llave de una entidad, deben
tener el círculo rellenado.
3. Una entidad cuyos atributos no sean suficientes para identificarla se denomina
débil y su llave está formada por algún o algunos de sus atributos más la llave
de la entidad que le da origen. Se representa con un doble rectángulo y con la
relación entre ella y la entidad que le da origen. Esta relación es de, a lo sumo,
muchos (por el extremo de la débil) a uno (por el extremo de la entidad que la
origina).
4. La llave de una relación de m:n está formada por la llave de las entidades que
participan en la relación. La llave de una relación de 1:n está formada por la
llave de la entidad del extremo muchos. La llave de una relación de 1:1 está
formada por la llave de cualquiera de las entidades que participan.
UNIDAD
3
MODELO RELACIONAL Y
NORMALIZACIÓN
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno organiza datos no estructurados y los integra
al diseño de la base de datos a partir de documentos comerciales utilizando la
técnica de Normalización (1FN, 2FN, 3FN), además lo implementa en SQL
Server 2014.
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos reconocen los principales conceptos de la normalización de
documentos.
Los alumnos aplican la normalización a formatos.
Los alumnos implementan el resultado de la normalización en SQL Server
2014.
Dados los conjuntos D1, D2, ...., Dn (no necesariamente distintos), R es una
relación sobre esos n conjuntos si está constituida por un conjunto de n-tuplos
ordenados d1,d2,...dn tales que d1 D1, d2 D2, ..., dn .
Es conveniente representar una relación como una tabla bidimensional donde cada fila
representa un n-tuplo, tal como se muestra en la siguiente imagen:
Las columnas de la tabla también son consideradas como atributos de una entidad y
las filas como ocurrencias o tuplas.
En el modelo relacional, tanto los objetos o entidades, como las relaciones que se
establecen entre ellos, se representan a través de "tablas", que en la terminología
relacional se denominan relaciones.
Cada relación está compuesta de filas (las ocurrencias de los objetos) y se les
denomina, en la terminología relacional, como tuplos, tuplas o uplos, uplas (en
realidad, n-tuplos, pero en muchos casos se suprime la n cuando no existe posibilidad
de confusión).
También la relación está compuesta por columnas (los atributos o campos que toman
valores en sus respectivos dominios).
1. No pueden haber dos filas o tuplas iguales en una misma tabla o entidad.
2. El orden asignado a las filas no es significativo.
3. El orden asignado a las columnas no es significativo.
4. Cada valor dentro de la relación (cada valor de un atributo) es un dato atómico
(o elemental), es decir, no descomponible; por ejemplo, un número, una
cadena de caracteres. En otras palabras, en cada posición fila-columna existe
un solo valor, nunca un conjunto de valores.
Una relación que satisface este último punto se denomina "normalizada", aunque
veremos más adelante que, en realidad, lo que ocurre es que está en Primera Forma
Normal.
Las diversas formas de expresar las recuperaciones dan lugar a los lenguajes
relacionales cuyas formas más representativas son:
Desventajas
Normalización
Ventajas de la normalización
Las relaciones en 1FN son un subconjunto del universo de todas las relaciones
posibles. Las relaciones en 2FN son un subconjunto de las que están en 1FN y así
sucesivamente, como se muestra en la siguiente figura:
PASO 1
a) El análisis de este modelo de pedido de productos muestra que los atributos que
se listan a continuación son de interés:
Atributo Descripcion
NUM_PED Numero de pedido.
FEC_PED Fecha en que se realizo el pedido.
NOM_CLI Nombre del cliente solicitante.
DIR_CLI Dirección del cliente.
NUM_PRO Número o código del producto.
DES_PRO Descripción del producto solicitado en pedido.
PUNI_PRO Precio unitario del producto.
CANT_PED Cantidad de productos solicitados en el pedido.
TOT_PED Importe por cada producto solicitado.
IMP_PED Importe total a pagar por todos los productos pedidos.
Nota.- esta es una suposición inicial, que luego se discutirá en la siguiente sesión.
c) Se determina los subconjuntos posibles, es decir los valores cuyos datos son
repetidos. Aquí debemos mencionar que estos atributos se determinando
observando la boleta de pedido.
Atributo Descripcion
NUM_PRO Número o código del producto.
DES_PRO Descripción del producto solicitado en pedido.
PUNI_PRO Precio unitario del producto.
CANT_PED Cantidad de productos solicitados en el pedido.
TOT_PED Importe por cada producto solicitado.
Definición Principal
“Una relación está en 1FN si cumple la propiedad de que sus dominios no tienen
elementos que, a su vez, sean conjuntos”.
Los valores que puede tomar un atributo de una relación son los elementos
contenidos en su correspondiente dominio.
Segunda definición
“Toda relación normalizada, o sea, con valores atómicos de los atributos, está en
1FN”.
Tercera definición
NUM_PRO
DES_PRO
PUNI_PRO
CANT_PED
Ya que un pedido puede contener más de una línea de pedido y, por lo tanto, puede
contener varios números de producto (NUM_PRO), varias descripciones de producto
(DES_PROD), varios precios unitarios (PUNI_PRO) y varias cantidades (CANT_PED).
Esta situación acarrea problemas de actualización, pues habría que decidir la cantidad
máxima de líneas de pedido de productos que se permitiría en un pedido, dado que los
campos de la tabla PEDIDO deben tener un tamaño dado y, entonces, serían capaces
de almacenar sólo una determinada cantidad máxima de valores cada uno de ellos.
Esto sería agregar una limitación en el modelo, pues no tiene ese comportamiento en
la realidad. Además, en general, se desaprovecharía memoria, dado que si se decide,
por ejemplo, que se va a permitir hasta 20 líneas de pedido en cada pedido, habría
que definir tamaños de campos para los grupos repetitivos que permitieran almacenar
esa cantidad de valores. Entonces, si en un pedido se solicitan menos de 20
productos, lo cual puede ser muy frecuente, no se utilizaría parte del espacio
reservado para cada campo.
PASO 2
Hay que eliminar esos grupos repetitivos para que la relación esté en 1FN. Para ello,
se crea:
1) Una relación para los campos que sean únicos, es decir, se dejan en la
relación original sólo los atributos que no son repetitivos:
2) Se crea una relación para los grupos repetitivos. Además, se crea una llave
compuesta formada por la llave primaria de la relación original (NUM_PED) y el
atributo del cual dependen los demás atributos repetidos total o parcialmente,
en este caso es NUM_PROD2:
PED-PROD (NUM_PED,NUM_PROD,DES_PRO,PUNI_PRO,CANT_PED,TOT_PED)
PASO 3
Ahora, estas nuevas dos relaciones en 1FN modelan el que nos ocupa. Los problemas
de actualización mencionados anteriormente quedan resueltos con este nuevo
modelo.
Eliminación.- Eliminar una línea de pedido que sea la única que pida un
producto implica perder la información del producto.
Entonces, será necesario aplicar formas normales más fuertes a este modelo para
eliminar los problemas de actualización que presenta, como veremos en los próximos
capítulos.
XY
CODIGO_SUM NOMBRE_SUM
CODIGO_SUM TIPO_SUM
CODIGO_SUM DISTRITO_SUM
La noción de dependencia funcional puede ser extendida hasta cubrir el caso en que
X, Y o ambos atributos sean compuestos.
Esta última explicación muestra que la cantidad tiene dependencia funcional completa
tanto del suministrador como del producto (Entidades Fuertes).
3.1.1.4 Llave
Al hablar de entidad en el modelo entidad - relación, se asumió que existe una llave
para cada entidad, formada por un conjunto de atributos que definen de forma única la
entidad. Un concepto análogo se define para las relaciones o tablas en el modelo
relacional.
Sean:
2) Y X | Y A1, A2, …, An
Lo planteado en el punto 2 es una condición de minimalidad que no se requería para
el concepto de llave en el modelo entidad - relación.
Una relación puede tener varias llaves. Una de ellas se nombra "llave primaria" (la que
se escoja para trabajar) y las restantes se nombran "llaves candidatas". Una
superllave será cualquier superconjunto de una llave. Entonces, una llave es un caso
especial de superllave.
Supongamos que se quiere encontrar las llaves candidatas de una relación R(A, B, C,
D, E) con las siguientes dependencias funcionales:
A B
BC D
AB E
Para comenzar, se parte de que no existen más llaves que dependencias funcionales,
pues el concepto de llave incluye la existencia de dependencia funcional. Se analiza,
por tanto, cada una de las DF presentes en la relación, añadiendo los atributos que
sean imprescindibles en la parte izquierda para lograr determinar a todos los atributos
de la relación. El conjunto de atributos así formado debe ser mínimo.
Luego se analiza cada uno de esos conjuntos mínimos, de forma que, si alguno es un
superconjunto de otro, ya no es llave, sino superllave. Pueden resultar varias llaves
candidatas.
En el ejemplo:
La única llave es AC. No hay ninguna otra llave candidata, pues en las otras DF se
obtiene el mismo conjunto ABC y este conjunto contiene a AC.
Ejemplo:
Sea la relación R (ciudad, calle, código postal). Para abreviar, R(C, A, P) donde se
tiene que:
Atributo llave
Un atributo Ai de R es un atributo llave si él es (o es miembro de) una llave (candidata
o primaria).
Atributo no llave
Un atributo Aj de R es un atributo no llave si él no es miembro de ninguna llave
candidata.
Una relación R se dice que está en 2FN si está en 1FN y si, y solo si, los atributos no
llaves (ni primarias, ni candidatas) de R, si los hubiese, son funcional y completamente
dependientes de la llave primaria de R.
Entonces, se aplica solo a relaciones con llaves compuestas, pues no es posible que
en una relación cuya llave primaria sea simple (compuesta por un solo atributo) haya
atributos que dependan de parte de la llave primaria. Una relación que esté en 1FN y
que tenga una llave primaria simple está en 2FN.
Paso único.- Se determina si existen relaciones con clave compuesta. Si NO las hay,
las relaciones obtenidas en la Primera Forma Normal se encuentran en Segunda
Forma Normal. De lo contrario, se efectúa lo siguiente:
1. Se crea una relación para todos los atributos que dependen funcional y
completamente de la llave (y los atributos que no se analizan por ser atributos
llaves, pertenecientes a claves candidatas).
2. Se crea una relación para los atributos que dependan de cada parte
(subconjunto) de la llave. La llave de la relación así formada será la parte
(subconjunto) de la llave primaria de la cual dependen los atributos.
Pero aún tenemos problemas en este caso que son similares a los vistos, pero con la
relación PEDIDO y, específicamente, cuando se trata de insertar, eliminar o modificar
la información de proveedores:
Esto es lo mismo que decir que se deben eliminar las dependencias transitivas de
atributos no llaves respecto a la llave primaria, estando ya la relación en 2FN.
Este paso se ejecuta examinando todas las relaciones para ver si hay atributos no
llaves que dependan unos de otros. Si se encuentran, se forma una nueva relación
para ellos.
Veamos el siguiente caso; desde una lista donde se visualiza el tipo de sorteo, el año
en que se sorteo, el nombre del ganador y la fecha de nacimiento del ganador ya que
solo pueden entrar al sorteo personas mayores de edad.
Ahora las tablas se encuentran en 3FN separando el atributo transitivo a otra tabla, en
donde este si dependa de la PK.
Veamos otro caso de 3FN; desde una lista donde se visualiza el número de DNI,
nombre completo de un empleado, la especificación de su cargo y el monto de
asignación salarial correspondiente según su cargo.
Como vemos el atributo “salario” no depende funcionalmente del numero de DNI del
empleado; entonces procedemos a separar el salario en una nueva entidad.
La regla de la Tercera Forma Normal establece que todas las dependencias parciales
se deben eliminar y separar dentro de sus propias tablas. Una dependencia parcial es
un término que describe a aquellos datos que no dependen de la llave primaria de la
tabla para identificarlos.
“Una tabla está normalizada en 3FN forma si todas las columnas que no son
llave son funcionalmente dependientes por completo de la llave primaria y no
hay dependencias transitivas. Una dependencia transitiva es aquella en la cual
existen columnas que no son llave que dependen de otras columnas que
tampoco son llave”.
Se desea controlar la actividad de una empresa de proyectos. Para ello se cuenta con
la siguiente información:
Además, se conoce las horas en plan de trabajo que cada trabajador dedica a cada
proyecto. Se sabe que un trabajador puede laborar en varios proyectos y en un
proyecto participan varios trabajadores.
Una mercancía tiene varias calidades (1, 2, 3, etc.) y una calidad puede serlo de varias
mercancías, esta procede de un país y de un país proceden varias mercancías. Una
mercancía tiene una descripción, pero una descripción puede serlo de mercancías con
diferentes códigos.
Pasos:
NRO_ITEM_PRO, DESC_PRO,
NRO_ITEM_CAU, DESC_CAU,
NRO_ITEM_EFE, DESC_EFE,
NRO_ITEM_ALT, DESC_ALT )
3. APLICANDO 1FN
4. APLICANDO 2FN
INFORME ( NRO_INF,
CURSO_INF,
SECCION_INF, ESPECIALIDAD_INF,
SEMESTRE_INF,
FECHA_INF )
5. APLICANDO 3FN
Pasos:
Donde:
Atributo Descripción
NRO_CON Número de control de atención por doctor.
COD_ESP Código de la especialidad.
DES_ESP Descripción de la especialidad del doctor.
FEC_CON Fecha de registro del control de atención.
COD_PAC Código del paciente.
NOM_PAC Nombre completo del paciente.
DIA_PAC Diagnóstico especificado por el doctor.
COD_MED Código de medicamento.
Descripción del medicamento especificado por el doctor
DESC_ME
según el diagnóstico realizado.
COD_MED, DESC_MED
)
3. APLICANDO FN1
5. APLICANDO FN2
CONTROL_ATENCION_PACIENTE(NRO_CON, COD_PAC )
PACIENTE(COD_PAC, NOM_PAC )
CONTROL_ATENCION_MEDICAMENTO(NRO_CON, COD_MED )
MEDICAMENTO(COD_MED, DESC_MED )
CONTROL_ATENCION(NRO_CON, COD_ESP,
DESC_ESP,
COD_DOC,
NOM_DOC,
FECHA_CON )
CONTROL_ATENCION_PACIENTE(NRO_CON, COD_PAC )
PACIENTE(COD_PAC, NOM_PAC )
CONTROL_ATENCION_MEDICAMENTO(NRO_CON, COD_MED )
MEDICAMENTO(COD_MED, DESC_MED )
7. APLICANDO FN3
ESPECIALIDAD(COD_ESP, DESC_ESP )
DOCTOR(COD_DOC, NOM_DOC )
CONTROL_ATENCION_PACIENTE(NRO_CON, COD_PAC )
PACIENTE(COD_PAC, NOM_PAC )
CONTROL_ATENCION_MEDICAMENTO(NRO_CON, COD_MED )
MEDICAMENTO(COD_MED, DESC_MED )
Para obtener el modelo lógico global de los datos, según el enfoque relacional a partir
del DER, se sigue un procedimiento que iremos describiendo paso a paso y
aplicándolo, así mismo, al ejemplo siguiente:
Pasos:
Nótese que la llave estaría formada por las llaves de las 3 entidades regulares
que intervienen en la agregación.
USE MASTER
GO
USE MERCANTIL
GO
)
GO
CREATE TABLE MERCANCIA(
IDMER CHAR(5) NOT NULL PRIMARY KEY,
MONEDA VARCHAR(30) NOT NULL
)
GO
CREATE TABLE TRANSPORTACION(
TIPO VARCHAR(30) NOT NULL PRIMARY KEY,
TARIFA MONEY NOT NULL
)
GO
CREATE TABLE EMPRESA(
NOMBRE_EMP VARCHAR(30) NOT NULL PRIMARY KEY,
RAMA VARCHAR(30) NOT NULL
)
GO
Resumen
1. En el modelo relacional, tanto las entidades como las relaciones se
representan como relaciones (tablas). Las ocurrencias (de las entidades o de
las relaciones) se almacenan como filas y las columnas son los atributos (de
las entidades o de las relaciones).
“Para que una relación esté en 2FN tiene que estar en 1FN, para que esté en
3FN tiene que estar en 2FN y así sucesivamente”.
6. Para transformar una relación que no está en 1FN en otras que sí lo estén y
representen mejor el , se deben eliminar los grupos repetitivos, para lo cual:
9. Una relación R se dice que está en 2FN si está en 1FN y si, y sólo si, los
atributos no llaves (ni primarias, ni candidatas) de R, si los hubiese, son
funcional y completamente dependientes de la llave primaria de R.
10. Una relación R está en 3FN si está en 2FN y si, y sólo si, los atributos no llaves
son independientes de cualquier otro atributo no llave primaria. Esto es lo
mismo que decir que se deben eliminar las dependencias transitivas de
atributos no llaves respecto a la llave primaria, estando ya la relación en 2FN.
12. De modo resumido, se puede decir que los pasos que se deben dar en el
proceso de normalización son:
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas:
o http://sistemas.itlp.edu.mx/tutoriales/basedat1/
En esta página web hallará conceptos complementarios a los mostrados en
el manual sobre la el Modelo Relacional, así como ejemplos didácticos de
su aplicación en los lenguajes de programación de base de datos.
o http://www.mitecnologico.com/Main/ModeloErYNormalizacion
Es esta página web encontrará definiciones complementarias a la
normalización de datos.
o http://www-gist.det.uvigo.es/~martin/bd/ejemplo_norm.pdf
En esta página web se muestra la normalización de una fuente de datos
paso a paso.
o http://sistemas.itlp.edu.mx/tutoriales/basedat1/
En esta página web se muestra conceptos complementarios de cada paso
de la normalización de datos.
o http://www-gist.det.uvigo.es/~martin/bd/ejemplo_norm.pdf
En esta página web se muestra la normalización de una fuente de datos
paso a paso.
UNIDAD
4
MANIPULACIÓN DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno modifica el contenido de una base de datos
mediante la aplicación de las tres sentencias del Lenguaje de Manipulación de
Datos (DML).
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos implementan clausulas de restricciones a las tablas de una
base de datos.
Los alumnos implementan sentencias DML sobre una base de datos.
4.1. Restricciones
4.1.1. Restricción DEFAULT
Por ejemplo:
VALOR POR
CAMPO TIPO ANCHO
DEFECTO
IDEMPLEADO INT
NOMBRE_EMP VARCHAR 30
APELLIDOS_EMP VARCHAR 30
TELEFONO_EMP CHAR 15 000-000000
EST_CIVIL_EMP CHAR 1 S
SUELDO_EMP MONEY 0
NUM_HIJOS_EMP INT 0
Solución:
GO
Listando los registros de la tala EMPLEADO para comprobar que los registros
cumplan con la especificación de los valores por defecto.
Por ejemplo:
-- Creando la tabla
CREATE TABLE EMPLEADO(
IDEMPLEADO INT NOT NULL PRIMARY KEY,
NOMBRE_EMP VARCHAR(30) NOT NULL,
APELLIDOS_EMP VARCHAR(30) NOT NULL,
TELEFONO_EMP CHAR(15) NULL,
EST_CIVIL_EMP CHAR(1) NULL,
SUELDO_EMP MONEY NULL,
NUM_HIJOS_EMP INT NULL
)
GO
SP_HELPCONSTRAINT EMPLEADO
El resultado seria:
Cuando hay una regla y una o más restricciones CHECK para una columna o
columnas, se evalúan todas las restricciones.
Por ejemplo:
Solución:
-- 2. Inserciones validas
INSERT INTO EMPLEADO VALUES (1,'Jose','Blanco',
'525-5685','C',1850,1);
INSERT INTO EMPLEADO VALUES (2,'Maria','Rengifo',
'985-698569','S',2500,0);
INSERT INTO EMPLEADO VALUES (3,'Milagros','Acosta',
'998-562563','D',1100,3);
Por ejemplo:
La restricción UNIQUE asigna a uno o varios campos de una tabla que sus valores no
sean repetidos, es decir que sus valores sean únicos. La forma de implementar la
restricción UNIQUE es al momento de crear la tabla o agregarla después de crear la
tabla; pero si es una tabla existente y contiene registros duplicados, el motor de base
de datos envía un mensaje de error al agregar la restricción UNIQUE.
Por ejemplo:
Solución:
-- Creando la tabla
CREATE TABLE EMPLEADO(
IDEMPLEADO INT NOT NULL PRIMARY KEY,
NOMBRE_EMP VARCHAR(30) NOT NULL,
APELLIDOS_EMP VARCHAR(30) NOT NULL,
TELEFONO_EMP CHAR(15) NULL UNIQUE,
EST_CIVIL_EMP CHAR(1) NULL,
SUELDO_EMP MONEY NULL,
CORREO_EMP VARCHAR(40) NOT NULL UNIQUE
)
GO
- Insertando dos registros, el primero repite el correo electrónico del registro uno,
mientras que el segundo repite el teléfono del mismo registro uno:
Por ejemplo:
NOMBRE_EMP VARCHAR(30) NO
APELLIDOS_EMP VARCHAR(30) NO
TELEFONO_EMP CHAR(15) SI
EST_CIVIL_EMP CHAR(1) SI
SUELDO_EMP MONEY SI
CORREO_EMP VARCHAR(40) NO
Solución:
-- Creando la tabla
CREATE TABLE EMPLEADO(
IDEMPLEADO INT NOT NULL PRIMARY KEY,
NOMBRE_EMP VARCHAR(30) NOT NULL,
APELLIDOS_EMP VARCHAR(30) NOT NULL,
TELEFONO_EMP CHAR(15) NULL,
EST_CIVIL_EMP CHAR(1) NULL,
SUELDO_EMP MONEY NULL,
CORREO_EMP VARCHAR(40) NOT NULL
)
GO
Asigna un valor incremental a una sola columna dentro de una tabla, la asignación
Identity lo podra encontrar normalmente en campos claves de tipo numérico.
Por ejemplo:
EST_CIVIL_EMP CHAR 1
SUELDO_EMP MONEY
CORREO_EMP VARCHAR 40
Solución:
-- Creando la tabla
CREATE TABLE EMPLEADO(
IDEMPLEADO INT PRIMARY KEY IDENTITY(100,1),
NOMBRE_EMP VARCHAR(30) NOT NULL,
APELLIDOS_EMP VARCHAR(30) NOT NULL,
TELEFONO_EMP CHAR(15) NULL,
EST_CIVIL_EMP CHAR(1) NULL,
SUELDO_EMP MONEY NULL,
CORREO_EMP VARCHAR(40) NOT NULL
)
GO
La sentencia INSERT se utiliza para añadir registros a las tablas de la base de datos.
El formato de la sentencia es:
Donde:
- Values: Es la cláusula que permite especificar los valores que contendrá un tabla.
- Valor: Es la información que contendrá cada columna de la tabla, hay que tener
en cuenta los tipos de datos especificados en la creación de la tabla; además de
los valores por defecto o la asignación de identitys.
Para los casos que presentaremos usaremos la tabla EMPLEADO el cual cuenta con
la siguiente estructura:
SELECT, permite asignar un valor a una variable local, para lo cual debemos
considerar que el valor no rompa la regla de declaración, así tenemos que
cuando se envía un número de cualquier tipo; este no debe estar encerrado
entre comillas, mientras que los textos o fechas sí.
-- Creando la tabla
CREATE TABLE PERSONA(
CODIGO_PER INT NOT NULL PRIMARY KEY,
NOMBRE_PER VARCHAR(30) NOT NULL,
APELLI_PER VARCHAR(30) NOT NULL,
TELEFO_PER CHAR(15) NULL,
ECIVIL_PER CHAR(1) NULL,
SUELDO_PER MONEY NULL,
CORREO_PER VARCHAR(40) NOT NULL
)
GO
-- Insertando registros
INSERT INTO PERSONA VALUES
(100,'Carlos','Ramos','(01)522-1523',
'S',1520,'cramos@gmail.com'),
(101,'David','Fernandez','(01)425-5454',
'C',2500,'dfernandez@gmail.com'),
(102,'Selena','Susaya','(01)421-1523',
'V',2200,'ssusaya@gmail.com'),
(103,'Jhon','Hernandez','(01)485-9588',
'C',1800,'jhernandez@gmail.com'),
(104,'Carlos','Pacheco','(01)523-1523',
'C',1750,'cpacheco@gmail.com')
GO
Estas sentencias crean una tabla llamada BK_EMPLEADO2, los cuales tienen
por columnas el código, nombres y apellidos del empleado y todos los registros
de la tabla Empleado.
UPDATE NOMBRE_TABLA
SET COLUMNA = NUEVO_VALOR O EXPRESION
WHERE CONDICION
Donde:
SET COLUMNA=VALOR
SET COLUMNA1=VALOR1, COLUMNA2=VALOR2
- WHERE: Es la condición que deben cumplir los registros para una actualización
de los mismos; recuerde que una actualización es análoga a una modificación de
valores, pero se debe especificar que registros se actualizarán; ya que de otra
manera la actualización ocurrirá a todos los registros.
Su formato es:
Donde:
- WHERE: Es la condición que deben cumplir los registros para una eliminación de
registros correcto. Debemos considerar que esta cláusula es opcional y no colocar
implica la eliminación de todos los registros.
Crear la base de datos COMERCIO a partir del siguiente diagrama de base de datos:
USE MASTER
GO
/* LLAVES FORANEAS */
ALTER TABLE TB_ABASTECIMIENTO
ADD FOREIGN KEY(COD_PRV) REFERENCES TB_PROVEEDOR (COD_PRV)
GO
2.1 Asigne la fecha actual a la fecha de ingreso al registro (FEC_ING) del vendedor;
esto tiene por objetivo llenar dicha fecha de registro con la fecha actual obtenido
desde el sistema.
2.2 Asigne el valor por defecto “000-000000” al teléfono del proveedor (TEL_PRV);
esto permitirá registrar un valor cuando el proveedor aun no registra su teléfono
actual.
INSERT TB_PROVEEDOR(COD_PRV,RAZ_SOC_PRV,
DIR_PRV,COD_DIS,REP_VEN)
VALUES ('PR03', '3M','Av. Venezuela 3018',
'D16', 'Omar Injoque')
INSERT TB_PROVEEDOR(COD_PRV,RAZ_SOC_PRV,
DIR_PRV,TEL_PRV,COD_DIS)
VALUES ('PR03', '3M ','Av. Venezuela 3018',
'4258596','D16')
INSERT TB_PRODUCTO(COD_PRO,DES_PRO,PRE_PRO,
STK_ACT,STK_MIN,UNI_MED,LIN_PRO)
VALUES ('P003','Papel Bulky ', 10.00, 498, 1000,'Mll', 2)
INSERT TB_FACTURA(FEC_FAC,COD_CLI,
FEC_CAN,EST_FAC,COD_VEN)
VALUES (3,'1998-01-09','C003',
'1998-03-11', 2, 'V04')
3.1 Asigne una restricción al sueldo del vendedor (SUE_VEN) de tal forma que solo
permita ingresar valores positivos mayores a cero.
--INSERCIÓN INCORRECTA
INSERT TB_VENDEDOR VALUES ('V02', 'JUAN', 'SOTO', 550,
'2014-02-05', '2', 'D03')
3.2 Asigne una restricción a la columna unidad de medida (UNI_MED) de tal forma
que solo permita el registro de “Mll”, “Uni”, “Cie” y “Doc”.
/* INSERCIONES CORRECTAS */
INSERT TB_PRODUCTO VALUES
('P001','Papel Bond A-4',35.00,200,1500,
'Mll',2,'VERDADERO')
INSERT TB_PRODUCTO VALUES
('P002','Papel Bond Oficio', 35.00, 50, 1500,
'Uni', 2, 'FALSO')
INSERT TB_PRODUCTO VALUES
('P003','Papel Bulky ', 10.00, 498, 1000,
'Cie', 2, 'VERDADERO')
INSERT TB_PRODUCTO VALUES
('P004','Papel Periódico', 9.00, 4285, 1000,
'Doc', 2, 'FALSO')
/* INSERCIÓN INCORRECTA */
3.3 Asigne una restricción a la columna tipo de cliente (TIP_CLI) de tal forma que
solo permita el registro de “1” y “0”.
4.1 Asigne una restricción a la columna descripción del producto de tal forma que no
permite registrar valores repetidos en la descripción.
/* INSERCIÓN CORRECTA */
INSERT TB_PRODUCTO VALUES
('P001','Papel Bond A-4',35.00,200,1500,
'Mll',2,'VERDADERO')
/* INSERCIÓN INCORRECTA */
INSERT TB_PRODUCTO VALUES
('P002','Papel Bond A-4', 35.00, 50, 1500,
'Mll',2, 'FALSO')
4.2 Asigne una restricción a la columna razón social del proveedor de tal forma que no
permite valores repetidos en la razón social del proveedor.
GO
/* INSERCIÓN CORRECTA */
INSERT TB_PROVEEDOR VALUES ('PR01', 'Faber Castell',
'Av. Isabel La Católica 1875',
'4330895', 'D13', 'Carlos Aguirre')
/* INSERCIÓN INCORRECTA */
INSERT TB_PROVEEDOR VALUES ('PR02', 'Faber Castell',
'Av. Lima 471',
'5380926', 'D13', 'Cesar Torres')
5.1 Asigne una restricción a la columna número de factura de tal forma que se registre
valores numéricos enteros consecutivos desde el número cien.
/* INSERTANDO REGISTROS */
INSERT TB_DISTRITO VALUES ('D01', 'Surco')
INSERT TB_DISTRITO VALUES ('D02', 'Jesús María')
INSERT TB_DISTRITO VALUES ('D03', 'San Isidro')
INSERT TB_DISTRITO VALUES ('D04', 'La Molina')
INSERT TB_DISTRITO VALUES ('D05', 'San Miguel')
INSERT TB_DISTRITO VALUES ('D06', 'Miraflores')
INSERT TB_DISTRITO VALUES ('D07', 'Barranco')
INSERT TB_DISTRITO VALUES ('D08', 'Chorrillos')
INSERT TB_DISTRITO VALUES ('D09', 'San Borja')
INSERT TB_DISTRITO VALUES ('D10', 'Lince')
INSERT TB_DISTRITO VALUES ('D11', 'Breña')
INSERT TB_DISTRITO VALUES ('D12', 'Magdalena')
INSERT TB_DISTRITO VALUES ('D13', 'Rimac')
INSERT TB_DISTRITO VALUES ('D14', 'Surquillo')
INSERT TB_DISTRITO VALUES ('D15', 'Pueblo Libre')
INSERT TB_DISTRITO VALUES ('D16', 'Bellavista')
INSERT TB_DISTRITO VALUES ('D17', 'Callao')
INSERT TB_DISTRITO VALUES ('D18', 'San Martin de Porres')
INSERT TB_PROVEEDOR
VALUES
('PR17','Reawse','Av. Santa Rosa 480',
NULL,'D19','María Pérez'),
('PR18','Edusa','Av. Morales Duarez 1260',
'4525536','D29','Pablo Martel'),
('PR19','Ottmer','Urb.Pro Mz B6 Lt 16',
'5369893','D18','Angela Rendilla'),
('PR20','Bari','Av. Arnaldo Marquez 1219',
NULL,'D02','Vanesa Quintana')
7.1 Actualizar el sueldo de todos los vendedores de tal forma que se aumente en S/.
100 a todos los vendedores.
UPDATE TB_VENDEDOR
SET SUE_VEN+=100
GO
7.2 El estado peruano decide reducir la asignación del IGV a 18%, por tal motivo
debe actualizar el porcentaje de IGV de la tabla Factura a 0.18.
UPDATE TB_FACTURA
SET POR_IGV=0.18
GO
7.3 Actualizar el tipo de vendedor a 3 solo a los vendedores cuyo tipo sea 2.
UPDATE TB_VENDEDOR
SET TIP_VEN=3
WHERE TIP_VEN=1
GO
7.4 Actualizar el estado de las órdenes de compra a 2 solo para las órdenes cuyo
código de proveedor sea “PR01”.
UPDATE TB_ORDEN_COMPRA
SET EST_OCO=2
WHERE COD_PRV='PR01'
GO
7.5 Se decide realizar una reducción del 20% a los precios de los productos
siempre y cuando sean productos no importados.
UPDATE TB_PRODUCTO
SET PRE_PRO=PRE_PRO*0.8
WHERE IMPORTADO='FALSO'
GO
DELETE TB_DETALLE_FACTURA
WHERE NUM_FAC=113
GO
Actividad
Para los casos que presentaremos, usaremos la tabla EMPLEADO, el cual cuenta con
la siguiente estructura:
USE MASTER
GO
USE EMPRESA
GO
-- Creando la tabla
CREATE TABLE EMPLEADO(
Figura 70: Visualizando los registros de la tabla EMPLEADO después de la actualización del estado civil
Fuente.- Tomado de SQL SERVER 2014
GO
Si observamos los registros originales notamos que en la tercera fila el sueldo del
empleado es S/. 1100.00; y cumple con el criterio de actualización, por tanto después
de ejecutar la sentencia UPDATE el resultado seria:
El resultado seria S/. 1320.00 que es el resultado de aumentar el 20% al primer valor
S/. 1100.00.
100_jblanco@cibertec.edu.pe
Solo debemos tener en cuenta que el código del empleado es un valor numero y que
para unirlo con el guion bajo y el correo original, este debe ser convertido a char; es
por esa razón que convertimos dicho valor con la función CAST. Finalmente el
resultado sería:
Figura 72: Visualizando los registros de la tabla EMPLEADO después de la actualización en el correo electrónico
Fuente.- Tomado de SQL SERVER 2014
4. Eliminar todos los registros de los empleados cuyo estado civil sea soltero.
GO
Resumen
1. Las restricciones se aplican a reglas de negocio especificadas en el análisis del
proceso de negocio.
Si desea saber más acerca de estos temas, puede consultar las siguientes páginas:
o http://www.ub.edu.ar/catedras/ingenieria/Datos/capitulo4/cap43.htm
Sentencias DDL, DML del SQL Server.
o http://www.edu4java.com/es/sql/sql4.html
Sentencias DDL, DML del SQL Server.
o https://technet.microsoft.com/es-es/library/ms190765(v=sql.105).aspx
Integridad de los datos
UNIDAD
5
IMPLEMENTACIÓN DE
CONSULTAS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno recupera información de una base de datos
utilizando SQL Server 2014 y aplicando múltiples condiciones de comparación
o funciones para el manejo de campos tipo fecha.
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos implementan sentencias de consultas con la función
SELECT.
Los alumnos implementan funciones de fecha integrándolas a las
consultas.
Las consultas de selección se utilizan para indicar al motor de datos que devuelva
información de las bases de datos. Esta información es devuelta en forma de conjunto
de registros que se pueden almacenar en un objeto recordset. Este conjunto de
registros es modificable.
SELECT
[ALL | * | DISTINCT]
[TOP VALOR [PERCENT]]
[ALIAS.] COLUMNA [AS] CABECERA]
[WHERE CONDICION]
[ORDER BY COLUMNA [ASC | DESC]]
- Script que permita mostrar los todos los registros de la tabla Cliente.
SELECT *
FROM TB_CLIENTE
- Script que permita mostrar los todos los registros de la tabla Producto usando alias
en la tabla.
SELECT P.*
FROM TB_PRODUCTO P
SELECT TB_PRODUCTO.*
FROM TB_PRODUCTO
- Script que permita mostrar los registros de la tabla Cliente, tal como se muestra en
el siguiente formato:
SELECT COD_CLI,RAZ_SOC_CLI,DIR_CLI,FEC_REG,TIP_CLI
FROM TB_CLIENTE
SELECT C.COD_CLI,C.RAZ_SOC_CLI,C.DIR_CLI,C.FEC_REG,C.TIP_CLI
FROM TB_CLIENTE C
- Script que permita mostrar los registros de la tabla Factura, tal como se muestra en
el siguiente formato:
SELECT F.NUM_FAC,F.FEC_FAC,F.POR_IGV,F.EST_FAC,F.COD_CLI
FROM TB_FACTURA F
- Script que permita mostrar los registros de la tabla Cliente, tal como se muestra en
el siguiente formato:
SELECT CODIGO=C.COD_CLI,
[RAZON SOCIAL]=C.RAZ_SOC_CLI,
DIRECCION=C.DIR_CLI,
[FECHA DE REGISTRO]=C.FEC_REG,
TIPO=C.TIP_CLI
FROM TB_CLIENTE C
- Script que permita mostrar los registros de la tabla Vendedor, tal como se muestra
en el siguiente formato:
Este tipo de consulta permita mostrar solo una ocurrencia de un conjunto de valores
repetidos a partir de una columna de la tabla. Veamos algunas consultas:
- Script que permita mostrar las fecha de registro de factura sin repetirse; obtenidos
desde la tabla Factura:
Script que permita mostrar los códigos de los distritos en la cual se encuentran
registrados los vendedores, debe tener en cuenta que dichos códigos no deben
mostrarse de manera repetida:
Este tipo de consulta permita mostrar la información de los registros ordenados de tal
forma que podemos especificar que columnas deben ordenarse tanto de forma
ascendente como descendente. Veamos algunas consultas ordenadas:
- Script que permita mostrar los registros de la tabla Cliente ordenadas por la razón
social de forma ascendente:
SELECT C.*
FROM TB_CLIENTE C
ORDER BY C.RAZ_SOC_CLI
SELECT C.*
FROM TB_CLIENTE C
ORDER BY 2 ASC
- Script que permita mostrar el código, tipo, nombre completo (nombres y apellidos) y
el sueldo de los vendedores ordenador por el tipo de vendedor de forma
Los números dos y tres hacen referencia a las columnas tipo y vendedor
especificada en la consulta, asi mismo, podríamos usar la siguiente sentencia:
La cláusula WHERE puede usarse para determinar qué registros de las tablas
enumeradas en la cláusula FROM aparecerán en los resultados de la instrucción
SELECT. Después de escribir esta cláusula se deben especificar las condiciones que
deben cumplir dichos resultados para su muestra. Así mismo debemos tener en
cuenta que si no se emplea esta cláusula, la consulta devolverá todas las filas de la
tabla. WHERE es opcional, pero cuando aparece debe ir a continuación de FROM o
INNER JOIN. Veamos algunas consultas de condición simple:
- Script que permita mostrar los detalles registrados para la factura numero 100
obtenidos desde la tabla Detalle de factura.
SELECT DT.*
FROM TB_DETALLE_FACTURA DT
WHERE DT.NUM_FAC=100
- Script que permita mostrar solo los clientes asignados como tipo de cliente 2.
SELECT C.*
FROM TB_CLIENTE C
WHERE C.TIP_CLI=2
- Script que permita toda la información registrada del producto “Papel Periódico”
obtenido desde la tabla Producto.
SELECT P.*
FROM TB_PRODUCTO P
WHERE P.DES_PRO='PAPEL PERIÓDICO'
Operador Descripción
= Determina la igualdad entre dos valores.
> Determina si el primer valor es mayor que el segundo.
>= Determina si el primer valor es mayor o igual que el segundo.
< Determina si el primer valor es menor que el segundo.
<= Determina si el primer valor es menor o igual que el segundo.
SQL usa los operadores de comparación de la misma manera que los lenguajes de
programación; es decir se comparan dos expresión u valores y se emiten un
Verdadero y Falso resultando de la comparación, es así mismo, como se aplica en
SQL. Veamos algunas consultas:
- Script que permita listar los productos cuyo precio sea menor a S/. 10.00.
SELECT P.*
FROM TB_PRODUCTO P
WHERE PRE_PRO<10
- Script que permita listar las facturas cuyo registro en el número de factura sea
mayor a 116.
SELECT F.*
FROM TB_FACTURA F
WHERE F.NUM_FAC>116
Los operadores lógicos soportados por SQL son: AND, OR, XOR, Eqv, Imp, Is y Not. A
excepción de los dos últimos todos poseen la siguiente sintaxis:
Tabla AND
Tabla OR
Tabla XOR
Tabla Eqv
Tabla Imp
- Script que permita listar los vendedores de tipo 2 y además que sean del distrito
cuyo código es D04.
SELECT V.*
FROM TB_VENDEDOR V
WHERE TIP_VEN=2 AND COD_DIS='D04'
- Script que permita listar los productos de tipo nacional y además tenga como
unidad de medida la docena (doc).
SELECT P.*
FROM TB_PRODUCTO P
WHERE IMPORTADO='FALSO' AND UNI_MED='DOC'
- Script que permita listar las facturas registradas (FEC_FAC) en el año 1998.
SELECT F.*
FROM TB_FACTURA F
WHERE F.FEC_FAC>='1998/01/01' AND
F.FEC_FAC<='1998/12/31'
- Script que permita listar las facturas registradas desde el número 100 hasta el
104.
SELECT D.*
FROM TB_DETALLE_FACTURA D
WHERE NUM_FAC>=100 AND NUM_FAC<=104
- Script que permita listar los clientes cuyo código de distrito se encuentre
registrado como D01; así mismo como los de codigo D22.
SELECT C.*
FROM TB_CLIENTE C
WHERE COD_DIS='D01' OR COD_DIS='D22'
- Script que permita listar las facturas registradas desde el número 100 hasta el
102 y además del 117 al 120.
SELECT D.*
FROM TB_DETALLE_FACTURA D
WHERE (NUM_FAC>=100 AND NUM_FAC<=102) OR
(NUM_FAC>=117 AND NUM_FAC<=120)
- Script que permita listar solo los clientes que aun no registran un número de
RUC (RUC_CLI).
SELECT C.*
FROM TB_CLIENTE C
WHERE RUC_CLI IS NULL
SELECT P.*
FROM TB_PRODUCTO P
WHERE NOT P.UNI_MED='UNI'
- Script que permita listar todas las órdenes de compra registradas en el año 1999
con asignación de estado 1.
SELECT O.*
FROM TB_ORDEN_COMPRA O
WHERE NOT(FEC_OCO>='1998/01/01' AND FEC_OCO<='1998/12/31'
AND EST_OCO=1)
Se utiliza para comparar una expresión de cadena con un modelo en una expresión
SQL. Su sintaxis es de la siguiente manera:
Por ejemplo, si introduce Like 'C%' en una consulta SQL, la consulta devuelve todos
los valores de campo que comiencen por la letra C. En una consulta con parámetros,
puede hacer que el usuario escriba el modelo que se va a utilizar.
Veamos la siguiente consulta el cual devuelve los registros de los clientes cuya razón
social comienzan con la letra M seguido de cualquier letra entre A y I y de solo tres
dígitos:
SELECT *
FROM TB_CLIENTE
WHERE RAZ_SOC_CLI Like 'M[A-I]__'
Si, por el contrario, necesitamos una consulta que muestre los registros de los clientes
cuya razón social comienzan con la letra M seguido de cualquier letra entre A y I y de
cualquier cantidad de dígitos, el script sería como sigue:
SELECT *
FROM TB_CLIENTE
WHERE RAZ_SOC_CLI Like 'M[A-I]%'
Para indicar que deseamos recuperar los registros según el intervalo de valores de un
campo, emplearemos el operador Between cuya sintaxis es de la siguiente manera:
En este caso la consulta devolvería los registros que contengan un "campo" con el
valor incluido en el intervalo valor1, valor2 (ambos inclusive). Si anteponemos la
condición Not devolverá aquellos valores no incluidos en el intervalo. Veamos algunas
consultas que involucren el uso de la clausula BETWEEN.
- Script que permita listar todas las órdenes de compra registradas en el primer
semestre del año 1999.
SELECT O.*
FROM TB_ORDEN_COMPRA O
WHERE FEC_OCO BETWEEN '1999/01/01' AND '1999/06/30'
Figura 93: Listado de ordenes de compra del primer semestre del año 1999
Fuente.- Tomado desde SQL Server 2014
- Script que permita listar todas las facturas cuyo número de registro se encuentre
entre los números 111 y 117.
SELECT F.*
FROM TB_FACTURA F
WHERE F.NUM_FAC BETWEEN 111 AND 117
Figura 94: Listado de facturas con numero de factura entre 111 y 117
Fuente.- Tomado desde SQL Server 2014
- Script que permita listar todos los productos cuya letra inicial de su descripción se
encuentre entre las letras A y F.
SELECT P.*
FROM TB_PRODUCTO P
WHERE DES_PRO BETWEEN 'A%' AND 'F%'
5.1.3.6 Operador IN
Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno
de los valores en una lista. Su sintaxis es la siguiente:
- Script que permita listar todas las facturas registradas con los números del 111 al
117.
SELECT F.*
FROM TB_FACTURA F
WHERE F.NUM_FAC IN (111, 112, 113, 114, 115, 117)
- Script que permita listar todos los registros de los vendedores cuyo código de
distrito sea D08 o D04.
SELECT V.*
FROM TB_VENDEDOR V
WHERE COD_DIS IN ('D08','D04')
Devuelve un valor numérico entero que representa el dia según el mes de una
determinada fecha. Veamos algunas consultas:
- Script que permita mostrar el dia correspondiente a una determinada fecha obtenida
a partir de una variable local.
Debemos recordar que para declarar una variable local se debe usar la instrucción
DECLARE y que cada nombre de variable se inicia anteponiendo el símbolo arroba
(@).
- Script que permita mostrar los datos de la factura con el siguiente formato:
Devuelve un valor numérico entero que representa al mes de una determinada fecha.
Veamos algunas consultas:
- Script que permita mostrar los datos de la factura con el siguiente formato:
Devuelve un valor numérico entero que representa al año de una determinada fecha.
Veamos algunas consultas:
- Script que permita mostrar los datos de la factura con el siguiente formato:
- Script que permita mostrar los datos de la factura con el siguiente formato:
Devuelve un valor numérico entero que representa una parte específica de una
determinada fecha. Su formato es:
- Script que permita mostrar todos los valores correspondientes al argumento que
presenta la función DATEPART.
Debemos mencionar que la sentencia UNION permite unir dos o más sentencias;
siempre y cuando cuenten con la misma cantidad de columnas resultantes en la
consulta.
- Script que permita mostrar los datos de la factura con el siguiente formato:
Devuelve un valor numérico entero que representa el recuento entre dos fechas
especificadas. Su formato es:
SELECT F.NUM_FAC,
DATEDIFF(DD,F.FEC_CAN,F.FEC_FAC) AS [DIAS],
DATEDIFF(MM,F.FEC_CAN,F.FEC_FAC) AS [MESES],
DATEDIFF(YY,F.FEC_CAN,F.FEC_FAC) AS [AÑOS],
DATEDIFF(WW,F.FEC_CAN,F.FEC_FAC) AS [SEMANAS]
FROM TB_FACTURA F
GO
SELECT O.NUM_OCO,
DATEDIFF(DD,O.FEC_ATE,GETDATE()) AS [DIAS],
DATEDIFF(MM,O.FEC_ATE,GETDATE()) AS [MESES],
DATEDIFF(YY,O.FEC_ATE,GETDATE()) AS [AÑOS],
DATEDIFF(WW,O.FEC_ATE,GETDATE()) AS [SEMANAS]
FROM TB_ORDEN_COMPRA O
GO
Resumen
1. SQL es un lenguaje de base de datos normalizado, utilizado por el motor de base
de datos de Microsoft SQL.
2. La sentencia SELECT permite componer una consulta que puede ser interpretado
por el servidor de base de datos; el cual emitira un resultado expresado en
registros.
4. Las consultas condicionadas soportan operadores lógicos como AND, OR, XOR,
IS y NOT.
5. Las funciones para el manejo de fechas son DAY, MONTH, YEAR, GETDATE y
DATEPART los cuales se pueden implementar dentro de una consulta SELECT.
Si desea saber más acerca de estos temas, puede consultar las siguientes páginas:
o http://www.tutorialspoint.com/sql/sql-select-query.htm
Sintaxis y casos desarrollados de la sentencia SELECT.
o http://www.campusmvp.es/recursos/post/Fundamentos-de-SQL-Como-
realizar-consultas-simples-con-SELECT.aspx
Fundamentos del uso de la sentencia SELECT.
https://msdn.microsoft.com/es-es/library/ms187731(v=sql.120).aspx
Casos desarrollados de la sentencia SELECT explicados por Microsoft.
UNIDAD
6
INTRODUCCIÓN A LA
PROGRAMACIÓN TRANSACT
SQL
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno implementa instrucciones SQL y de
programación mediante procedimientos almacenados.
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos entienden la importancia de la implementación de
procedimientos almacenados en una base de datos.
Los alumnos implementan procedimientos almacenados usando uno o
más parámetros de entrada.
Los alumnos integran las consultas dentro de los procedimientos
almacenados.
Finalmente, podemos decir que Transact SQL proporciona palabras clave especiales
llamadas lenguaje de control de flujo que permiten controlar el flujo de ejecución de las
instrucciones. El lenguaje de control de flujo se puede utilizar en instrucciones
sencillas, lotes, procedimientos almacenados y disparadores.
- Las variables locales están definidas por el usuario y es aquí donde nos
enfocaremos en esta unidad,
- Mientras que las variables globales las suministra el sistema y están
predefinidas; es decir, no podrán el usuario solo podrá invocarlas pero no
manipularlas.
Por otra parte, las variables locales se declaran, nombran y escriben mediante la
palabra clave DECLARE, y reciben un valor inicial mediante una instrucción SELECT
o SET. Dichas variables deben declararse, reciben un valor y utilizarse en su totalidad
dentro del mismo lote o procedimiento; por ningún motivo debemos ejecutar el
conjunto de instrucciones por separado.
Asi mismo, los nombres de las variables locales deben empezar con el símbolo “@”. A
cada variable local se le debe asignar un tipo de dato definido por el usuario.
- Script que permita declarar una variable de tipo entero, se le asigne un valor y lo
muestre mediante la sentencia SELECT:
Iniciamos declarando la variable local numero de tipo INT, luego asignamos el valor
10 a la variable mediante la instrucción SET y finalmente se muestra el valor
mediante la sentencia SELECT. Otra forma de expresar la sentencia, podría ser de
la siguiente manera:
- Script que permita mostrar la razón social de un determinado proveedor a partir del
código del mismo:
- Incluir parámetros
- Llamar a otros procedimientos
- Devolver un valor de estado a un procedimiento de llamada o lote para indicar el
éxito o el fracaso del mismo y la razón de dicho fallo.
- Devolver valores de parámetros a un procedimiento de llamada o lote
- Ejecutarse en SQL Server remotos
SENTENCIAS
END
GO
EXECUTE NOMBRE
--Ejecutando el procedimiento
EXECUTE SP_LISTAPROVEEDOR
GO
--Ejecutando el procedimiento
EXECUTE SP_LISTAPROVEEDOR
GO
--Ejecutando el procedimiento
EXECUTE SP_LISTAPROVEEDORxINICIAL 'V'
GO
Figura 117: Listado de proveedores cuyo nombre de su representante inicie con “V”
Fuente.- Tomado desde SQL Server 2014
IF ( CONDICION )
BEGIN
SENTENCIAS_VERDADERAS
END
ELSE
BEGIN
SENTENCIAS_FALSAS
END
Veamos un caso del uso de la estructura IF. Procedimiento Almacenado que permita
listar los datos de los proveedores según el código de distrito, en caso no existan
registros de vendedores mostrar el mensaje “El distrito no cuenta con proveedores
registrados”.
--Ejecutando el procedimiento
EXECUTE SP_LISTAPROVEEDORxDISTRITO 'D06'
GO
Evalúa una lista de condiciones y devuelve una de las varias expresiones de resultado
posibles. La expresión CASE tiene dos formatos:
--SIMPLE
CASE COLUMNA
WHEN 'ALTERNATIVA1' THEN 'VALOR RESULTANTE 1'
WHEN 'ALTERNATIVA2' THEN 'VALOR RESULTANTE 2'
ELSE 'VALOR RESULTANTE POR DEFECTO'
END
--BUSCADA
CASE
WHEN CONDICION1 THEN 'VALOR RESULTANTE 1'
WHEN CONDICION2 THEN 'VALOR RESULTANTE 2'
ELSE 'VALOR RESULTANTE POR DEFECTO'
END
WHILE CONDICION
BEGIN
SENTENCIAS | BREAK | CONTINUE
END
GO
Veamos un caso del uso de la estructura repetitiva WHILE, donde se necesita mostrar
los 100 primeros números naturales e imprimir un mensaje de “Número Par” o “Número
Impar” dependiendo de su valor.
Actividad
Usando la base de datos COMERCIO implementaremos los siguientes procedimientos
almacenados:
--Probando el procedimiento
EXEC SP_FECHAACTUAL
GO
--Probando el procedimiento
EXEC SP_LISTAPRODUCTOS
GO
--Probando el procedimiento
EXEC SP_LISTACLIENTES
GO
GO
--Probando el procedimiento
EXEC SP_LISTAVENDEDORES
GO
--Probando el procedimiento
EXEC SP_LISTAPRODUCTOS
GO
--Probando el procedimiento
EXEC SP_LISTACLIENTES
GO
--Probando el procedimiento
EXEC SP_LISTAORDENES
GO
8. Procedimiento Almacenado que liste el detalle de las facturas cuyo código sea
“103” y además se refiera al producto cuyo código sea “P002”.
--Probando el procedimiento
EXEC SP_DETALLEFAC
GO
--Probando el procedimiento
EXEC SP_LISTAFACTURAS
GO
Figura 129: Listado de facturas registradas en el primer semestre del año 1998
Fuente.- Tomado desde SQL Server 2014
10. Procedimiento Almacenado que liste todos los productos cuyo precio se
encuentren entre S/. 5.00 y S/. 10.00 y además sean de origen nacional, es decir,
no productos importados.
--Probando el procedimiento
EXEC SP_LISTAPRODUCTOS
GO
Figura 130: Listado de productos con precio entre S/. 5 y S/. 10 y de importación falsa (nacional)
Fuente.- Tomado desde SQL Server 2014
1. Procedimiento Almacenado que liste todos los productos según sea importado o
no.
SELECT P.*
FROM TB_PRODUCTO P
WHERE P.IMPORTADO=@IMP
GO
--Probando el procedimiento
EXEC SP_LISTAPRODUCTOS 'FALSO'
GO
Figura 131: Listado de productos de tipo Falso en la columna importado (producto nacional)
Fuente.- Tomado desde SQL Server 2014
--Probando el procedimiento
EXEC SP_LISTAFACTURAS 1998
GO
3. Procedimiento Almacenado que liste todos los datos de los clientes según el
código del distrito.
--Probando el procedimiento
EXEC SP_LISTACLIENTES 'D16'
GO
4. Procedimiento Almacenado que liste todos los datos de los clientes según la letra
inicial en su razón social.
--Probando el procedimiento
EXEC SP_LISTACLIENTES 'M'
GO
5. Procedimiento Almacenado que liste todos los datos de los vendedores cuyo
sueldo sea inferior a un determinado monto.
WHERE V.SUE_VEN<@MONTO
GO
--Probando el procedimiento
EXEC SP_LISTAVENDEDOR 1250
GO
6. Procedimiento Almacenado que liste todos los datos de las órdenes de compra
según el código del proveedor.
--Probando el procedimiento
EXEC SP_LISTAORDENES 'PR01'
GO
7. Procedimiento Almacenado que liste todos los datos de los productos entre un
rango de montos que representan el precio del producto.
--Probando el procedimiento
EXEC SP_LISTAPRODUCTOS 15,20
GO
8. Procedimiento Almacenado que liste todos los datos de los clientes según el
código del distrito y tipo de cliente.
--Probando el procedimiento
EXEC SP_LISTACLIENTES 'D14',1
GO
Figura 137: Listando los clientes del distrito con código D14 y tipo de cliente 1
Fuente.- Tomado desde SQL Server 2014
9. Procedimiento Almacenado que liste todos los datos de las órdenes de compra
según el año de registro (FEC_OCO) y un determinado estado (EST_OCO).
--Probando el procedimiento
EXEC SP_LISTAORDENES 1999,1
GO
--PRUEBA
EXEC SP_LISTAFACTURAS 2015
GO
--PRUEBA:
EXEC SP_LISTAORDENES 'PR07'
GO
--PRUEBA:
EXEC SP_LISTAPRODUCTOS 30,20
GO
--PRUEBA
EXEC SP_REGISTRAPRODUCTO 'P021','Cartulina Duplex',
0.5,1000,100,'Doc',2,'FALSO'
GO
--PRUEBA
EXEC SP_REGISTRAVENDEDOR 'V11','MARIA','ZAMORA',
1950,'2015/02/05',1,'D07'
GO
6. Procedimiento Almacenado que permita registrar una factura para lo cual debe
validar que el número de factura sea única, caso contrario, mostrará el mensaje
“NÚMERO DE FACTURA YA SE ENCUENTRA REGISTRADA”. Además de
validar la existencia del código del vendedor, caso contrario, se mostrará el
mensaje “CODIGO DE VENDEDOR NO VALIDO”. Finalmente validar la existencia
del código del cliente, en caso no exista mostrar el mensaje “CODIGO DE
CLIENTE NO VALIDO”.
VALUES(@FFA,@CLI,@FCA,@EST,@VEN)
PRINT 'REGISTRO DE FACTURA CORRECTA'
END
GO
--PRUEBA
EXEC SP_REGISTRAFACTURA '2016/06/05','C003','2016/07/03',1,'V01'
GO
--PRUEBA
EXEC SP_LISTAPRODUCTOS
GO
MENSAJE DE LA
RANGO DE SUELDO COLUMNA
CATEGORIA
[ 1751 [ A
[ 651 ; 1750 ] B
[ 0 ; 650 ] C
--PRUEBA
EXEC SP_LISTAVENDEDORES
GO
--PRUEBA
EXEC SP_LISTAVENDEDORES
GO
Figura 155: Listando las N últimas facturas controladas por variables locales
Fuente.- Tomado desde SQL Server 2014
2. Script que permita mostrar los registros de la tabla DISTRITO de un rango específico,
dichos registros serán mostrados según el orden especificado en el código del distrito
(COD_DIS).
Resumen
1. En está sección se han explicado las extensiones de programación que van
más allá de las implementaciones típicas de SQL y que hacen de Transact
SQL un lenguaje de programación especializado.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas:
o http://technet.microsoft.com/es-es/library/ms187926.aspx
Tutorial para la creación de procedimientos almacenados
o http://www.devjoker.com/contenidos/Tutorial-de-Transact-SQL/238/Procedimientos-
almacenados-en-Transact-SQL.aspx
Tutorial para la creación de procedimientos almacenados
o https://msdn.microsoft.com/es-es/library/ms174290(v=sql.120).aspx
Lenguaje de control de flujo (Transact-SQL)
UNIDAD
7
CONSULTAS MULTITABLAS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno recupera información de una base de datos
utilizando SQL, obtiene registros originados por la selección de uno o varias columnas
procedentes de dos o más tablas.
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos implementan consultas usando dos o más tablas e integradas a los
procedimientos almacenados.
Los alumnos implementan consultas que permiten hacer uso de las uniones
internas y externas integradas a un procedimiento almacenado con parámetros.
- CROSS JOIN
Las combinaciones cruzadas devuelven todas las filas de la tabla izquierda y,
cada fila de la tabla izquierda se combina con todas las filas de la tabla de la
derecha. Las combinaciones cruzadas se llaman también productos cartesianos.
Para entender el tema de combinaciones internas, haremos uso de una consulta que
permita combinar las columnas de las tablas Cliente y Distrito respectivamente.
Debemos considerar que una combinación solo será efectiva si cumplimos con las
siguientes especificaciones:
- Ambas tablas deben tener una columna en común y es esta justamente la que
permitirá unir a las tablas.
- Dichas columnas deben tener el mismo tipo de datos y la misma capacidad.
- No necesariamente las columnas de unión deben llamarse igual en ambas tablas
solo debe cumplir “mismo tipo mismo capacidad”.
SELECT *
FROM TB_CLIENTE C
INNER JOIN TB_DISTRITO D ON C.COD_DIS=D.COD_DIS
GO
Como vemos, la tabla Cliente muestra sus columnas código, razón social, dirección,
teléfono, ruc, código de distrito, fecha de registro, tipo de cliente y nombre del
contacto; mientras que, la tabla Distrito muestra el código del distrito y el nombre del
mismo.
Así mismo, podemos mencionar que el siguiente script tiene el mismo resultado:
SELECT *
FROM TB_CLIENTE C, TB_DISTRITO D
WHERE C.COD_DIS=D.COD_DIS
GO
Como verá en la combinación podemos tener el control de todas las columnas es por
eso que administramos de manera conveniente, pero solo podrán ser invocadas
aquellas columnas que participan de la combinación.
Si a pesar de tener la combinación correcta entre dos tablas, podemos controlar que
columnas deseamos visualizar de la siguiente manera:
SELECT C.*
FROM TB_CLIENTE C
INNER JOIN TB_DISTRITO D ON C.COD_DIS=D.COD_DIS
GO
En el script anterior se muestran solo las columnas de la tabla Cliente a pesar de que
se encuentran combinadas a la tabla Distrito. También podríamos verlo de la siguiente
manera:
SELECT D.*
FROM TB_CLIENTE C
INNER JOIN TB_DISTRITO D ON C.COD_DIS=D.COD_DIS
GO
SELECT C.*
FROM TB_CLIENTE C
INNER JOIN TB_DISTRITO D ON C.COD_DIS=D.COD_DIS
WHERE D.NOM_DIS='SAN MIGUEL'
GO
Figura 160: Listado de clientes del distrito de San Miguel con Inner Join
Fuente.- Tomado desde SQL Server 2014
Las combinaciones internas solo devuelven filas cuando hay una fila de ambas tablas,
como mínimo, que coincide con la condición de la combinación. Las combinaciones
internas eliminan las filas que no coinciden con alguna fila de la otra tabla. Sin
embargo, las combinaciones externas devuelven todas las filas de una de las tablas
o vistas mencionadas en la cláusula FROM, como mínimo, siempre que tales filas
cumplan con alguna de las condiciones de búsqueda de WHERE o HAVING. Entonces
podemos mencionar que:
SQL Server 2014 utiliza las siguientes palabras clave para las combinaciones externas
especificadas en una cláusula FROM:
El operador de combinación externa izquierda, LEFT JOIN, indica que todas las filas
de la primera tabla se deben incluir en los resultados, con independencia si hay datos
coincidentes en la segunda tabla. Es decir, la tabla de la izquierda fuerza a la derecha
a mostrar todos los registros a pesar de no encontrar coincidencias y es justamente
aquí que la tabla de la derecha mostrará el término NULL en los valores no
coincidentes.
SELECT *
FROM TB_DISTRITO D
LEFT JOIN TB_CLIENTE C ON C.COD_DIS=D.COD_DIS
GO
Así mismo, si analizamos el concepto aplicado al LEFT JOIN notamos que la tabla de
la izquierda (Distrito) fuerza a la tabla de la derecha (Cliente) a mostrar información así
no encuentre coincidencias como es el caso de los distritos mencionados
anteriormente.
Finalmente, si necesitamos mostrar solo los distritos que aun no registran cliente, el
script sería el siguiente:
SELECT D.*
FROM TB_DISTRITO D
LEFT JOIN TB_CLIENTE C ON C.COD_DIS=D.COD_DIS
WHERE C.COD_CLI IS NULL
GO
Figura 162: Listado de distritos que no registran clientes con Left Join
Fuente.- Tomado desde SQL Server 2014
SELECT D.*
FROM TB_DISTRITO D
LEFT JOIN TB_CLIENTE C ON C.COD_DIS=D.COD_DIS
WHERE C.COD_DIS IS NULL
GO
SELECT D.*
FROM TB_DISTRITO D
LEFT JOIN TB_CLIENTE C ON C.COD_DIS=D.COD_DIS
WHERE C.TEL_CLI IS NULL
GO
SELECT D.*
FROM TB_DISTRITO D
LEFT JOIN TB_CLIENTE C ON C.COD_DIS=D.COD_DIS
WHERE C.FEC_REG IS NULL
GO
El operador de combinación externa derecha, RIGHT JOIN, indica que todas las filas
de la segunda tabla se deben incluir en los resultados, con independencia si hay datos
coincidentes en la primera tabla. Es decir, la tabla de la derecha fuerza a la izquierda a
mostrar todos los registros a pesar de no encontrar coincidencias y es justamente aquí
que la tabla de la izquierda mostrara el termino NULL en los valores no coincidentes.
SELECT *
FROM TB_CLIENTE C
RIGHT JOIN TB_DISTRITO D ON C.COD_DIS=D.COD_DIS
GO
Así mismo, si analizamos el concepto aplicado al RIGHT JOIN notamos que la tabla de
la derecha (Distrito) fuerza a la tabla de la izquierda (Cliente) a mostrar información así
no encuentre coincidencias; como es el caso de los distritos mencionados
anteriormente.
Finalmente, si necesitamos mostrar solo los distritos que aun no registran cliente
usando Right Join, el script seria el siguiente:
SELECT D.*
FROM TB_CLIENTE C
RIGHT JOIN TB_DISTRITO D ON C.COD_DIS=D.COD_DIS
WHERE C.COD_CLI IS NULL
GO
Figura 164: Listado de distritos que aun no registra clientes con Right Join
Fuente.- Tomado desde SQL Server 2014
Para retener la información que no coincida al incluir las filas no coincidentes en los
resultados de una combinación, utilice una combinación externa completa. SQL Server
2014 proporciona el operador de combinación externa completa, FULL JOIN, que
incluye todas las filas de ambas tablas, con independencia de que la otra tabla tenga o
no un valor coincidente. En forma práctica, podemos decir que FULL JOIN es una
combinación de LEFT JOIN y RIGHT JOIN.
SELECT *
FROM TB_CLIENTE C
FULL JOIN TB_DISTRITO D ON C.COD_DIS=D.COD_DIS
GO
En Full Join no se considera importante la posición de las tablas, pues, al ser una
combinación Full, podemos hacer referencia a cualquier columna de la combinación,
así mismo debemos mencionar que los valores nulos se presentarán cuando los
valores en ambas tablas no coincidan como lo mencionado en el Left y Right Join; con
la diferencia que estos se presentarán al final de los registros.
SELECT D.*
FROM TB_CLIENTE C
FULL JOIN TB_DISTRITO D ON C.COD_DIS=D.COD_DIS
WHERE C.COD_CLI IS NULL
GO
Se emplea Cross Join cuando se quieran combinar todos los registros de una tabla
con cada registro de otra tabla.
Se puede usar un cross join si se quiere una manera rápida de enviar una tabla con
información. Este tipo de joins también se les conoce como producto cartesiano.
Ahora, mostraremos la combinación externa entre las tablas Distrito y Cliente:
SELECT *
FROM TB_CLIENTE C
CROSS JOIN TB_DISTRITO D
GO
Actividad
Usando la base de datos COMERCIO y por medio de procedimientos almacenados,
implemente las siguientes consultas:
--PRUEBA
EXEC SP_LISTADO1
GO
--PRUEBA
EXEC SP_LISTADO2
GO
3. Script que permita mostrar todos los productos según el tipo de línea de producto;
este deberá ser ingresado como la descripción de la línea de producto.
--PRUEBA
EXEC SP_LISTADO3 'UTILES DE OFICINA'
GO
4. Script que permita mostrar todas las órdenes de compra registradas según la razón
social del proveedor.
--PRUEBA
EXEC SP_LISTADO4 'PRAXIS'
GO
5. Script que permita mostrar todos los clientes registrados en un determinado distrito.
WHERE D.NOM_DIS=@DISTRITO
GO
--PRUEBA
EXEC SP_LISTADO5 'SAN MIGUEL'
GO
--PRUEBA
EXEC SP_LISTADO6 1998
GO
--PRUEBA
EXEC SP_LISTADO7 'CESAR OJEDA'
GO
8. Script que permita mostrar todas las facturas registradas por un determinado cliente y
un vendedor en ambos casos el factor de búsqueda será los nombres completos
tanto del cliente como del vendedor.
--PRUEBA
EXEC SP_LISTADO8 'SERVIEMSA','CESAR OJEDA'
GO
Left Join
9. Script que permita listar los datos de los productos que aun no registran venta.
--PRUEBA
EXEC SP_LISTADO9
GO
10. Script que permita listar los datos de los proveedores que aun no registran órdenes
de compra.
--PRUEBA
EXEC SP_LISTADO10
GO
11. Script que permita listar las órdenes de compra que no registran detalle, además de
condicionarlo por un determinado año.
--PRUEBA
EXEC SP_LISTADO11 1998
GO
Right Join
12. Script que permita listar los datos de los productos que aún no registran venta.
--PRUEBA
EXEC SP_LISTADO12
GO
13. Script que permita listar los datos de los proveedores que aún no registran órdenes
de compra.
--PRUEBA
EXEC SP_LISTADO13
GO
Full Join
14. Script que permita listar los datos de los productos que aún no registran venta.
--PRUEBA
EXEC SP_LISTADO14
GO
15. Script que permita listar los datos de los proveedores que aun no registran órdenes
de compra.
--PRUEBA
EXEC SP_LISTADO15
GO
Cross Join
16. Script que permita mostrar la combinación de columnas entre las tablas Cliente y
Factura.
--PRUEBA
EXEC SP_LISTADO16
GO
Resumen
6. En una consulta multitabla, las tablas que contienen los datos son designadas en
la cláusula FROM.
8. Las consultas multitablas más habituales utilizan las relaciones padre / hijo
creadas por las claves primarias y claves foráneas.
9. Una tabla puede componerse consigo misma; las auto composiciones requieren el
uso de alias.
Si desea saber más acerca de estos temas, puede consultar las siguientes páginas:
o http://www.aulaclic.es/sql/t_3_5.htm
Tutorial para el uso de UNIONES EXTERNAS
o http://www.aulaclic.es/sql/t_3_4.htm
Tutorial para el uso de inner join
UNIDAD
8
SUBCONSULTAS, VISTAS Y
AGRUPAMIENTO
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno crea y emplea vistas complejas de
subconjunto, agrupadas y compuestas en una base de datos de un proceso de
negocio real.
TEMARIO
ACTIVIDADES PROPUESTAS
Los alumnos usan los resultados de una consulta como parte de otra en
un determinado proceso.
Los alumnos implementan vistas simples y complejas haciendo uso de
varias tablas.
Los alumnos integran las subconsultas y agrupamiento de datos en
procedimientos almacenados.
8.1. Subconsultas
8.1.1. Subconsultas
Una subconsulta es una consulta SELECT que devuelve un valor único y que puede
estar anidada en una instrucción SELECT, INSERT, UPDATE o DELETE, o dentro
de otra subconsulta.
El resultado de la ejecución es D05, esto nos indica el código que tiene el distrito de
San Miguel en la tabla Distrito.
SELECT C.*
FROM TB_CLIENTE C
WHERE C.COD_DIS='D05'
GO
8.2. Vistas
Es considerado una tabla virtual cuyo contenido se compone de columnas y filas
provenientes de una consulta; esta consulta puede provenir de una o más tablas
dentro de la misma base de datos.
Podríamos determinar algunas ventajas en el uso de las vistas, como por ejemplo:
- También proporciona una interfaz compatible con versiones anteriores al SQL para
emular una tabla cuyo esquema ha cambiado debido a las nuevas versiones.
- La instrucción CREATE VIEW permite crear una vista y esta debe ser la primera
instrucción dentro de un bloque de sentencias.
Cuando se realiza una consulta a través de una vista, el Motor de base de datos se
asegura de que todos los objetos de base de datos a los que se hace referencia en
algún lugar de la instrucción existen, que son válidos en el contexto de la instrucción y
que las instrucciones de modificación de datos no infringen ninguna regla de integridad
de los datos. Las comprobaciones que no son correctas devuelven un mensaje de
error. Las comprobaciones correctas traducen la acción a una acción con las tablas
subyacentes.
Cuando se crea una vista, la información sobre ella se almacena en estas vistas de
catálogo: sys.views, sys.columns y sys.sql_expression_dependencies. El texto de
la instrucción CREATE VIEW se almacena en la vista de catálogo sys.sql_modules.
En el siguiente esquema vemos que la vista alumno (VALUMNO) está compuesta por
información proveniente de las tabla Alumno, Matricula y Curso.
Una vista se puede considerar como una tabla virtual o una consulta almacenada. Los
datos accesibles a través de una vista no están almacenados en un objeto distinto de
la base de datos. Lo que está almacenado en la base de datos es una instrucción
SELECT. El resultado de la instrucción SELECT forma la tabla virtual que la vista
devuelve. El usuario puede utilizar dicha tabla virtual haciendo referencia al nombre de
la vista en instrucciones Transact SQL, de la misma forma en que se hace referencia a
las tablas. Una vista no puede contener la clausula ORDER BY, pero sí lo puede
incluir al usar la vista.
--PROBAR
SELECT * FROM VCLIENTES
- Listar los clientes cuya letra inicial en su razón social empiece con la letra F.
- Listar los clientes cuyo número telefónico tenga en su segundo carácter el número
4.
Figura 189: Listando los clientes cuyo segundo número telefónico sea 4 desde una vista
Fuente.- Tomado desde SQL Server 2014
Veamos por ejemplo, como implementar dos vistas horizontales que permitan separar
los clientes de tipo 1 y 2.
SELECT C.*
FROM TB_CLIENTE C
WHERE C.TIP_CLI=2
GO
--PRUEBA
SELECT * FROM VCLIENTES1
SELECT * FROM VCLIENTES2
Una vista vertical se caracteriza por mostrar ciertas columnas que el diseñador desea
que visualice el usuario. Por ejemplo, visualicemos los registros de la tabla Producto:
Creando una vista de los productos, el cual permitirá a los usuarios visualizar el
nombre del producto, importado y unidad de medida.
--PRUEBA
SELECT * FROM VPRODUCTOS
GO
Función agregada que permite calcular el número de registros que puede devolver una
consulta de acuerdo a un criterio especifico.
Su formato es:
COUNT (EXPRESION)
Debemos considerar que la expresión puede tomar valores como * para hacer
referencia a cualquier columna de una tabla o específicamente una columna de tabla.
Su formato es:
SUM(EXPRESION)
Su formato es:
AVG(EXPRESION)
Su formato es:
MAX(EXPRESION)
Debemos considerar que la expresión puede tomar un valor numérico de cualquier tipo
o también una columna numérica de una tabla.
Su formato es:
MIN(EXPRESION)
Debemos considerar que la expresión puede tomar un valor numérico de cualquier tipo
o también una columna numérica de una tabla.
omiten. No obstante, los valores NULL no se evalúan en ninguna de las funciones SQL
agregadas. Debemos tener en cuenta los siguientes aspectos:
- Si usamos la cláusula WHERE esta excluirá aquellas filas que no desea agrupar.
- Si usamos la cláusula HAVING esta permitirá filtrar los registros una vez
agrupados.
Por último, debemos mencionar que todos los campos de la lista de la sentencia
SELECT deben incluirse en la cláusula GROUP BY o como argumentos de una
función SQL agregada. Veamos un script que permita listar los valores que pertenecen
a la columna importado de la tabla producto.
SELECT P.IMPORTADO
FROM TB_PRODUCTO P
GROUP BY P.IMPORTADO
GO
SELECT P.IMPORTADO,
COUNT(*) AS [TOTAL DE PRODUCTOS]
FROM TB_PRODUCTO P
GROUP BY P.IMPORTADO
GO
--PRUEBA
EXEC SP_TOTALFACTURASXAÑO 1998
GO
Actividad
Usando la base de datos COMERCIO implemente los siguientes casos:
SubConsultas
F.COD_VEN=(SELECT V.COD_VEN
FROM TB_VENDEDOR V
WHERE V.NOM_VEN+SPACE(1)+V.APE_VEN=@VENDEDOR)
GO
Figura 202: Listando las órdenes del proveedor Faber Castell en el año 1998
Fuente.- Tomado desde SQL Server 2014
Vistas
4. Vista que permita mostrar los datos de los proveedores. Seguidamente cree un
procedimiento almacenado que usando la vista, filtre a los vendedores por el
nombre del distrito.
EXEC SP_VISTA1
GO
Figura 203: Listando los datos del proveedor desde una vista
Fuente.- Tomado desde SQL Server 2014
5. Vista que permita mostrar el número de factura, fecha de factura, nombre completo
del cliente y nombre completo del vendedor. Luego cree un procedimiento
almacenado que usando ls vista, filtre las facturas por año.
AS
SELECT V.* FROM VISTA2 V WHERE YEAR(V.FECHA)=@AÑO
GO
Figura 204: Listando las facturas mediante una vista del año 1998
Fuente.- Tomado desde SQL Server 2014
6. Implemente vistas para separar las órdenes de compra por el estado de las órdenes
de compra (1, 2 o 3). Seguidamente cree un procedimiento almacenado que
ingresando como parámetro el estado de la orden (1, 2 o 3) muestras los datos de
la vista correspondiente.
7. Implemente vistas que permitan separar las facturas registradas en el año 1998 y
1999 respectivamente. Seguidamente cree un procedimiento almacenado que
muestre dichas vistas según el año ingresado como parámetro, en caso ingreso un
año no registrado mostrar el mensaje “Año no registra ventas”
Agrupamiento de datos
EXEC SP_TOTALPRODUCTOS
GO
EXEC SP_TOTALCLIENTES
GO
10. Procedimiento almacenado que permita mostrar el total de facturas registradas por
un vendedor, hay que tener en cuenta que se debe mostrar el nombre completo del
vendedor.
IF OBJECT_ID('SP_TOTALFACTURAS')IS NOT NULL
DROP PROC SP_TOTALFACTURAS
GO
EXEC SP_TOTALFACTURAS
GO
EXEC SP_FACTURASXCLIENTE
GO
EXEC SP_MONTOSXFACTURA
GO
13. Procedimiento almacenado que permita mostrar el monto total acumulado por año
según la fecha de facturación.
EXEC SP_MONTOxAÑO
GO
14. Procedimiento almacenado que permita mostrar el total de facturas agrupadas por
año y mes.
EXEC SP_FACTURASXAÑOXMES
GO
Resumen
1. Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia
SELECT. Se puede asignar en la cláusula WHERE una subconsulta al buscar un
determinado valor.
2. Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal
exceptuando que aparece encerrada entre paréntesis.
5. Una vista es una consulta que es accesible como una tabla virtual en una base de
datos relacional.
6. Las vistas tienen la misma estructura que una tabla: filas y columnas. La única
diferencia es que solo se almacena de ellas la definición, no los datos. Los datos
que se recuperan mediante una consulta a una vista se presentarán igual que los
de una tabla.
Si desea saber más acerca de estos temas, puede consultar las siguientes páginas:
o https://es.wikipedia.org/wiki/Vista_(base_de_datos)
Vistas en SQL Server.
o http://deletesql.com/viewtopic.php?f=5&t=13
Agrupamiento de datos.