Enero, 2015
MANUAL DE BASE DE DATOS RELACIONALES
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 1
Por Joseph Arquímedes Collado & José Luis López González
MANUAL BASE DE DATOS
RELACIONALES
Manual Base de Datos Relaciones
Primera edición:
Enero 2015
Elaborado por:
Joseph Arquímedes Collado Tineo & José Luis López González
Santo Domingo, Rep. Dom.
Índice
Introducción ............................................................................................................................... 1
Acerca de los autores ................................................................................................................. 2
Concepto de Base de Datos........................................................................................................ 3
¿Qué es una Base de Datos? .................................................................................................. 4
Tipos de Bases de Datos ........................................................................................................ 5
Bases de Datos Jerárquicas ................................................................................................ 5
Bases de Datos de Red ....................................................................................................... 6
Bases de Datos Relacionales .............................................................................................. 7
Entidad y atributos ................................................................................................................. 8
Diagramas Entidad-Relación ................................................................................................... 10
Lógica de creación de tablas .................................................................................................... 13
Reglas de normalización ...................................................................................................... 14
Primera Forma Normal .................................................................................................... 15
Segunda Forma Normal ................................................................................................... 15
Tercera Forma Normal ..................................................................................................... 16
Esquemas y objetos de esquemas en SQL Server .................................................................... 20
Objetos de Esquemas ........................................................................................................... 22
Entorno Microsoft SQL Server ................................................................................................ 25
Creación de usuarios y asignación de permisos ................................................................... 28
Backup y restauración de una base de datos ........................................................................ 31
Creación y modificación de tablas ........................................................................................... 34
CREATE TABLE ................................................................................................................ 35
ALTER TABLE ................................................................................................................... 36
DROP TABLE ..................................................................................................................... 37
DELETE .............................................................................................................................. 37
Columnas calculadas ............................................................................................................ 38
Tipos de datos .......................................................................................................................... 40
Numéricos exactos ............................................................................................................... 41
Numéricos aproximados ...................................................................................................... 42
Fecha y hora ......................................................................................................................... 42
Cadena de caracteres ............................................................................................................ 43
Cadena de caracteres Unicode ............................................................................................. 43
Cadenas binarias .................................................................................................................. 44
Implementación de integridad de datos ................................................................................... 45
Integridad de datos ............................................................................................................... 46
Integridad referencial ........................................................................................................... 46
Restricciones ........................................................................................................................ 47
Uso de restricciones ......................................................................................................... 48
Definición de restricciones .............................................................................................. 49
Control de restricciones ................................................................................................... 51
Insertar registros: INSERT ...................................................................................................... 52
Concepto de la instrucción INSERT .................................................................................... 53
Inserción individual ......................................................................................................... 53
Inserción múltiple ............................................................................................................ 55
Consulta de datos usando la sentencia SELECT ..................................................................... 56
Selección de datos ................................................................................................................ 57
Especificaciones de la instrucción ................................................................................... 57
Crear una tabla a partir de una consulta ........................................................................... 60
Rendimiento de consultas ................................................................................................ 62
Evaluar el uso de DISTINCT ............................................................................................... 63
Recuperar solamente datos de interés .................................................................................. 63
El operador TOP .................................................................................................................. 63
Uso de operadores en la cláusula WHERE .......................................................................... 64
Uso de NOT IN .................................................................................................................... 64
Mejores prácticas en el uso del operador LIKE ................................................................... 65
El operador OR .................................................................................................................... 65
Uso de GROUP BY ............................................................................................................. 66
Actualización de datos: UPDATE ........................................................................................... 67
Sentencia UPDATE ............................................................................................................. 68
Eliminación de datos: DELETE & TRUNCATE TABLE ...................................................... 70
Sentencia DELETE .............................................................................................................. 71
Concepto de TRUNCATE TABLE ..................................................................................... 72
Diferencias entre DELETE y TRUNCATE TABLE ........................................................... 72
Caso de estudio ........................................................................................................................ 74
Planteamiento del caso ......................................................................................................... 75
Presentacion del caso de estudio .......................................................................................... 76
Consultando múltiples tablas con JOIN ................................................................................... 77
Concepto de JOIN ................................................................................................................ 78
Características de JOIN.................................................................................................... 78
Tipos de JOIN .................................................................................................................. 78
INNER JOIN ........................................................................................................................ 79
Forma explícita vs implícita............................................................................................. 83
LEFT JOIN .......................................................................................................................... 83
RIGHT JOIN ........................................................................................................................ 86
FULL JOIN .......................................................................................................................... 87
CROSS JOIN ....................................................................................................................... 88
Funciones de fecha y formas de conversión de datos .............................................................. 89
Funciones de fecha ............................................................................................................... 90
Funciones para manipular cadenas ...................................................................................... 92
Funciones de conversión de datos........................................................................................ 94
Uso de Sub - Consultas ............................................................................................................ 95
Definición de Sub – Consulta .............................................................................................. 96
Sub – consulta para un único registro .................................................................................. 97
¿Cómo retornar un solo registro con una sub - consulta? .................................................... 97
Sub – consulta para múltiples registros ............................................................................... 98
¿Cómo retornar múltiples registros con una sub - consulta? ............................................... 99
Introducción
El profesional de la informática es aquel que posee el conocimiento y maneja las técnicas
necesarias para responder a las distintas necesidades tecnológicas que la sociedad manifieste.
Su importancia es tal, que en cualquier tipo de actividad, empresarial, económica, personal,
política, su participación es vital para el correcto manejo de las herramientas e información
que las tecnologías de la información ponen a nuestra disposición.
Las Bases de Datos, como repositorio de toda esa información que se genera en las
actividades mencionadas anteriormente, juegan un papel protagónico dentro de todas las
disciplinas y ramificaciones de la informática, es por esto que aprender a diseñar, administrar
o desarrollar Bases de Datos es de mucha importancia, tanto para los profesionales como los
estudiantes.
Este Manual de Base de Datos Relacionales ha sido preparado con el objetivo de explicar los
conceptos del diseño lógico del modelo relacional, creación y modificación de tablas,
funciones, integridad referencial, consultas avanzadas y muchos otros conceptos y ejemplos
prácticos, de manera que el lector obtenga un conocimiento adecuado para así adentrase del
todo en el mundo de las bases de datos.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 1
Acerca de los autores
Joseph Arquímedes Collado Tineo nació en Santo Domingo, R.D., en el año 1990,
actualmente es estudiante de término de Ingeniería de Sistemas en la Universidad Católica
Santo Domingo, en ese rol brinda servicios de administración y desarrollo de base de datos,
desarrollo de sistemas informáticos a nivel administrativo, imparte talleres de capacitación y
asesora a pequeñas empresas en cuanto a la implementación de sistemas informáticos.
Los principales sectores en los que se ha desempeñado son: telecomunicaciones,
programación, SQA, mini markets, farmacias, almacenes y análisis de sistemas.
José Luis López González nació en santo domingo, RD en el año 1990 y actualmente es
estudiante universitario de la carrera de Ingeniería de Sistemas en la Universidad Católica
Santo Domingo. Su experiencia en la informática se enfoca básicamente en el desarrollo.
Actualmente utiliza C# como lenguaje de programación para los proyectos en los que
participa además de impartir cursos de base de datos en SQL Server.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 2
UNIDAD I
Concepto de Base de Datos
Metas de Aprendizaje:
Tener un concepto preciso de Base de Datos
Conocer los principales tipos de modelos de Base de Datos
Entender qué son las entidades y atributos
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 3
¿Qué es una Base de Datos?
Es ampliamente mencionado que la información es uno de los activos más importantes que
tenemos los seres humanos como sociedad organizada y moderna, es por eso que su correcto
almacenamiento y uso apropiado es de suma importancia, y más aún en tiempos como estos
en los que grandes cantidades de datos son manejados por casi cualquier tipo de
organización, empresa, gobierno, etc.
Una Base de Datos es cualquier conjunto de datos organizados para su almacenamiento en la
memoria de una o varias computadoras, diseñado para facilitar su acceso y actualización.
Estas a su vez están compuestas por una estructura de filas y columnas que en una Base de
Datos tradicional se llaman registros y campos respectivamente. Al conjunto de varios
registros se le llama archivo.
Durante las décadas de los 60 y 70 surge el concepto de las Bases de Datos; sin embargo, el
objetivo principal siempre ha sido la administración óptima de la información y el uso que se
le puede dar a la misma. Una analogía válida sería la de una guía telefónica; estas contienen
una lista de registros, cada uno de los cuales consiste en tres campos básicos: nombre,
dirección y número de teléfono.
Los sistemas encargados de automatizar el uso de las base de datos son llamados Sistemas de
Gestión de Base de Datos (SGBD); este tipo de software muy específico se dedica a servir de
interfaz entre la Base de Datos, el usuario y las aplicaciones que la utilizan. Se compone de
un lenguaje de definición, un lenguaje de manipulación y un lenguaje de consulta de datos.
Entre las principales características de los Sistemas de Gestión de Base de Datos podemos
mencionar:
Independencia lógica y física de los datos.
Redundancia mínima.
Acceso concurrente por parte de múltiples usuarios.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 4
Integridad de los datos.
Consultas complejas optimizadas.
Seguridad de acceso y auditoría.
Respaldo y recuperación.
Acceso a través de lenguajes de programación estándar.
Tipos de Bases de Datos
Las Bases de Datos pueden clasificarse de distintas maneras, ya sea por la viabilidad de los
datos almacenados o por el modelo de administración que utilice. Por su modelo de
administración pueden clasificarse en:
Bases de Datos Jerárquicas
Éstas son Bases de Datos que, como su nombre indica, almacenan su información en una
estructura jerárquica. En este modelo los datos se organizan en una forma similar a un árbol
(visto al revés), en donde un nodo padre de información puede tener varios hijos. El nodo que
no tiene padres es llamado raíz, y a los nodos que no tienen hijos se los conoce como hojas.
Figura 1 – Modelo de Base de Datos Jerárquica.
Una de las principales limitaciones de este modelo es su incapacidad de representar
eficientemente la redundancia de datos.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 5
Bases de Datos de Red
Éste es un modelo ligeramente distinto del jerárquico; su diferencia fundamental es la
modificación del concepto de nodo: se permite que un mismo nodo tenga varios padres
(posibilidad no permitida en el modelo jerárquico).
Fue una gran mejora con respecto al modelo jerárquico, ya que ofrecía una solución eficiente
al problema de redundancia de datos; pero, aun así, la dificultad que significa administrar la
información en una Base de Datos de Red ha significado que sea un modelo utilizado en su
mayoría por programadores más que por usuarios finales.
Figura 2 – Modelo de Bases de Datos de Red.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 6
Bases de Datos Relacionales
Éste es el modelo utilizado en la actualidad para modelar problemas reales y administrar
datos dinámicamente. Las Bases de Datos Relacionales se basan en el uso de tablas (también
se las llama relaciones). Las tablas se representan gráficamente como una estructura
rectangular formada por filas y columnas. Cada columna almacena información sobre una
propiedad determinada de la tabla (se le llama también atributo). Cada fila posee una
ocurrencia o un ejemplar de la instancia o relación representada por la tabla (a las filas se las
llama también tuplas).
En este modelo, el lugar y la forma en que se almacenen los datos no tienen relevancia (a
diferencia de otros modelos como el jerárquico y el de red). Esto tiene la considerable ventaja
de que es más fácil de entender y de utilizar para un usuario esporádico de la base de datos.
La información puede ser recuperada o almacenada mediante “consultas” que ofrecen una
amplia flexibilidad y poder para administrar la información.
El lenguaje más habitual para construir las consultas a Bases de Datos relacionales es SQL
(Structured Query Lenguage) o Lenguaje Estructurado de Consultas, un estándar
implementado por los principales motores o sistemas de gestión de Bases de Datos
relacionales.
Durante su diseño, una base de datos relacional pasa por un proceso al que se le conoce como
normalización de una base de datos.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 7
Figura 3 – Modelo de Base de Datos Relacional.
Entidad y atributos
El objeto básico que se representa en un modelo Entidad/Relación es la entidad: una “cosa”
del mundo real con autonomía de las demás entidades. Éstas pueden ser un objeto con
existencia física (una persona, auto, casa, etc.), o un objeto con existencia conceptual (una
compañía, un curso universitario, etc.).
Una entidad está descrita y se representa por sus características o atributos. Por ejemplo, la
entidad Persona tiene las características nombre, apellido, género, estatura, peso, fecha de
nacimiento.
Los atributos definen o identifican las características de las entidades. Cada entidad contiene
uno o más atributos que dan información sobre dicha entidad.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 8
Figura 4 - Representación de una entidad con sus atributos.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 9
UNIDAD II
Diagramas Entidad-Relación
Metas de Aprendizaje:
Conocer la importancia de los diagramas Entidad-Relación
Saber cómo está conformado un diagrama Entidad-Relación
Identificar cada tipo de atributos de un diagrama Entidad-Relación
Aprender los distintos tipos de relaciones existentes entre varias entidades
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 10
Los diagramas Entidad Relación, denominados por sus siglas como E/R, son un modelo que
representa a la realidad a través de un esquema gráfico empleando la terminología de
entidades, que son objetos que existen y son los elementos principales que se identifican en el
problema a resolver con el diagramado y se distinguen de otros por sus características
particulares denominadas atributos. El enlace que rige la unión de las entidades está
representado por la relación del modelo.
A continuación se presentan las figuras correspondientes en un diagrama Entidad Relación:
Atributo
Entidad Relación Entidad
Atributo simple: son aquellos atributos que poseen un único valor y su ocurrencia es
siempre necesaria, o sea, no puede obviarse.
Atributo opcional: son aquellos que poseen un único valor y puede darse el caso en que
su ocurrencia es nula.
Atributo único o principal: es aquel que identifica a cada instancia como única y no
repetible.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 11
Atributo multivalor: como su nombre lo indica, este puede estar formado por uno o varios
valores correspondientes a la misma instancia.
Otro componente importante de cualquier modelo relacional es de qué forma esas relaciones
se asocian entre sí. Esas asociaciones, o relaciones, se vinculan en forma significativa, lo que
contribuye a garantizar la integridad de los datos de modo que una acción realizada en una
relación no repercuta negativamente en los datos de otra relación.
Hay tres tipos principales de relaciones:
Una a una (1,1): una relación entre dos relaciones en la cual una tupla en la primera
relación esté relacionada con al menos una tupla en la segunda relación, y viceversa.
Una a varias (1,M): una relación entre dos relaciones en la cual una tupla en la
primera relación esté relacionada con ninguna, una o más tuplas en la segunda
relación, y una tupla en la segunda relación esté relacionada con al menos una tupla
de la primera.
Varias a varias (M,M): una relación entre dos relaciones en la cual una tupla en la
primera relación esté relacionada con ninguna, una o más tuplas en la segunda
relación, y viceversa.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 12
UNIDAD III
Lógica de creación de tablas
Metas de Aprendizaje:
Comprender la lógica tras la creación de tablas en el modelo relacional
Aprender los antecedentes históricos de las formas normales
Conocer las tres principales reglas de normalización
Saber identificar la redundancia de datos en las tablas
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 13
Reglas de normalización
La parte central de los principios del modelo relacional es el concepto de normalización, una
técnica para producir un conjunto de relaciones que poseen un conjunto de ciertas
propiedades que minimizan los datos redundantes y preservan la integridad de los datos
almacenados tal como se mantienen (añadidos, actualizados y eliminados). El proceso fue
desarrollado por E.F. Codd en 1972, y el nombre es un chiste político debido a que el
presidente Nixon estaba “normalizando” relaciones con China en ese momento. Codd
imaginó que si las relaciones con un país pueden normalizarse, entonces seguramente podría
normalizar las relaciones de la base de datos. La normalización se define por un conjunto de
normas, que se conocen como formas normales, que proporcionan una directriz específica de
cómo los datos son organizados para evitar anomalías que den lugar a inconsistencias y
pérdida de los datos tal como se mantienen almacenados en la base de datos.
La normalización es un proceso en el cual se transforman datos complejos a un conjunto de
estructuras de datos más pequeñas, que además de ser más simples y estables, son más fáciles
de mantener. La normalización se adoptó porque el viejo estilo de poner todos los datos en un
solo lugar, como un archivo o una tabla de la base de datos, era ineficiente y conducía a
errores de lógica cuando se trataban de manipular los datos.
La normalización también hace las cosas más fáciles de entender. Los seres humanos
tenemos la tendencia de simplificar las cosas al máximo. Lo hacemos con casi todo, desde los
animales hasta con los automóviles. Vemos una imagen de gran tamaño y la hacemos más
simples agrupando cosas similares juntas. Las guías que la normalización provee crean el
marco de referencia para simplificar una estructura de datos compleja.
Otra ventaja de la normalización de base de datos es el consumo de espacio. Una base de
datos normalizada ocupa menos espacio en disco duro que una no normalizada. Hay menos
repetición de datos, lo que tiene como consecuencia un mucho menor uso de espacio de
disco.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 14
Existen básicamente tres niveles de normalización: Primera Forma Normal (1FN), Segunda
Forma Normal (2FN) y Tercera Forma Normal (3FN). Cada una de estas formas tiene sus
propias reglas. Cuando una base de datos se conforma a un nivel, se considera normalizada a
esa forma de normalización.
Primera Forma Normal
La regla de la Primera Forma Normal establece que las columnas repetidas deben eliminarse
y colocarse en tablas separadas.
Poner la base de datos en la Primera Forma Normal resuelve el problema de los encabezados
de columna múltiples. Muy a menudo, los diseñadores de bases de datos inexpertos harán
algo similar a la tabla no normalizada. Una y otra vez, crearán columnas que representen los
mismos datos. La normalización ayuda a clarificar la base de datos y a organizarla en partes
más pequeñas y más fáciles de entender. En lugar de tener que entender una tabla gigantesca
y monolítica que tienen muchos diferentes aspectos, sólo tenemos que entender los objetos
pequeños y más tangibles, así como las relaciones que guardan con otros objetos también
pequeños.
Segunda Forma Normal
La regla de la Segunda 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 vez alcanzado el nivel de la Segunda Forma Normal, se controla la mayoría de los
problemas de lógica. Podemos insertar un registro sin un exceso de datos en la mayoría de las
tablas.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 15
Tercera Forma Normal
Una tabla está normalizada en esta 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.
Cuando las tablas están en la Tercera Forma Normal se previenen errores de lógica cuando se
insertan o borran registros. Cada columna en una tabla está identificada de manera única por
la llave primaria, y no debe haber datos repetidos. Esto provee un esquema limpio y elegante,
que es fácil de trabajar y expandir.
Para ilustrar el procedimiento de normalización presentamos el siguiente ejemplo:
Al examinar estos registros, podemos darnos cuenta que contienen un grupo repetido para
NUM_ITEM, DESC_ITEM, CANT y PRECIO. La 1FN prohíbe los grupos repetidos, por lo
tanto tenemos que convertir a la primera forma normal. Los pasos a seguir son:
Tenemos que eliminar los grupos repetidos.
Tenemos que crear una nueva tabla con la PK (Primary Key) de la tabla base y el
grupo repetido.
Los registros quedan ahora conformados en dos tablas que llamaremos ORDENES y
ARTICULOS_ORDENES.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 16
ORDENES
ARTICULOS_ORDENES
Ahora procedemos a aplicar la segunda forma normal 2FN, es decir, tenemos que eliminar
cualquier columna no llave que no dependa de la llave primaria de la tabla. Los pasos a seguir
son:
Determinar cuáles columnas que no son llave no dependen de la llave primaria de la tabla.
Eliminar esas columnas de la tabla base.
Crear una segunda tabla con esas columnas y la(s) columna(s) de la PK de la cual
dependen.
La tabla ORDENES está en 2FN. Cualquier valor único de ID_ORDEN determina un solo
valor para cada columna. Por lo tanto, todas las columnas son dependientes de la llave
primaria ID_ORDEN.
Por su parte, la tabla ARTICULOS_ORDENES no se encuentra en 2FN ya que las columnas
PRECIO y DESC_ITEM son dependientes de NUM_ITEM, pero no son dependientes de
ID_ORDEN. Lo que haremos a continuación es eliminar estas columnas de la tabla
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 17
ARTICULOS_ORDENES y crear una tabla ARTICULOS con dichas columnas y la llave
primaria de la que dependen.
Las tablas quedan ahora de la siguiente manera:
ARTICULOS_ORDENES
ARTICULOS
La tercera forma normal nos dice que tenemos que eliminar cualquier columna no llave que
sea dependiente de otra columna no llave. Los pasos a seguir son:
Determinar las columnas que son dependientes de otra columna no llave.
Eliminar esas columnas de la tabla base.
Crear una segunda tabla con esas columnas y con la columna no llave de la cual son
dependientes.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 18
Al observar las tablas que hemos creado, nos damos cuenta que tanto la tabla ARTICULOS,
como la tabla ARTICULOS_ORDENES se encuentran en 3FN. Sin embargo, la tabla
ORDENES no lo está, ya que NOM_CLIENTE y ESTADO son dependientes de
ID_CLIENTE, y esta columna no es la llave primaria.
Para normalizar esta tabla, moveremos las columnas no llave y la columna llave de la cual
dependen dentro de la nueva tabla CLIENTES. Las nuevas tablas CLIENTES y ORDENES
se muestran a continuación:
ORDENES
CLIENTES
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 19
UNIDAD IV
Esquemas y objetos de esquemas en SQL Server
Metas de Aprendizaje:
Entender el concepto de Esquemas en SQL Server
Comprender cómo está organizada la estructura de SQL Server
Saber cuáles son los objetos de Esquema
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 20
El entorno SQL es un conjunto de partes que tienen un papel que desempeñar, y estos a su
vez se dividen de manera jerárquica en sus diversos componentes. Cada uno de estos
componentes, sean Agentes SQL, Clientes SQL, identificadores de autorización, catálogos,
etc., trabajan de manera relacional para respaldar las operaciones de SQL tales como la
creación y modificación de objetos, almacenamiento y consulta de información, o
modificación y eliminación de datos.
Los esquemas forman parte de los Catálogos, estos últimos son una estructura jerárquica en el
cual estos componen el objeto primario y los esquemas como los objetos secundarios como se
muestra en la siguiente figura:
Figura 5 - Representación modelo de Entorno SQL
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 21
El esquema actúa como un contenedor de objetos (tablas, vistas, dominios, tipos definidos
por el usuario, etc.), los que a su vez almacenan los datos SQL o realizan otras funciones con
datos relacionados. Cada esquema, los objetos contenidos en el esquema y los datos SQL
dentro de esos objetos son propiedad del identificador de autorización asociado con ese
esquema.
A diferencia de los catálogos, los esquemas son ampliamente implementados en los SGBD.
Sin embargo, como con los catálogos, SQL deja la mayor parte de los detalles de
implementación a los proveedores de dichos sistemas, aun cuando el estándar proporciona un
lenguaje para la creación y eliminación de esquemas. Para crear un esquema se usa la
instrucción CREATE SCHEMA, y para eliminar un esquema se usa la instrucción DROP
SCHEMA.
Objetos de Esquemas
En la parte inferior del nivel del catálogo jerárquico se ubican los objetos de esquema. Los
objetos de esquema son un conjunto de componentes relacionados que están contenidos
dentro de un esquema. Éste es el nivel en el que se almacenan los datos SQL, será capaz de
definir los objetos de SQL, modificar esas definiciones, y almacenar y manipular los datos de
SQL dentro de los objetos.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 22
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 23
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 24
UNIDAD V
Entorno Microsoft SQL Server
Metas de Aprendizaje:
Conocer el entorno básico de Microsoft SQL Server Management Studio
Aprender a crear un usuario
Saber cómo asignar permisos a un usuario
Aprender a hacer una copia de seguridad de una base de datos
Aprender a restaurar una copia de seguridad de una base de datos
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 25
SQL Server es un sistema de administración de bases de datos relacionales desarrollado por
Microsoft, el cual posee una serie de características como soporte de transacciones,
procedimientos almacenados y un completo entorno gráfico que permite el uso de comandos
DDL y DML de manera gráfica.
Al abrir el SQL Server, el servidor nos solicitará el tipo y el nombre del servidor al cual
queremos conectarnos y el tipo de autenticación. SQL Server admite dos modos de
autenticación, el modo de autenticación de Windows y el modo mixto. La autenticación de
Windows es el modo predeterminado, y a menudo se denomina seguridad integrada debido a
que este modelo de seguridad de SQL Server está integrado estrechamente en Windows. Para
iniciar sesión en SQL Server, se confía en las cuentas de usuario y grupo específicas de
Windows. Los usuarios de Windows que ya hayan sido autenticados no tienen que presentar
credenciales adicionales.
Figura 6 – Ventana de autenticación de SQL Server
El modo mixto admite la autenticación tanto de Windows como de SQL Server. Los pares de
nombre de usuario y contraseña se mantienen en SQL Server.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 26
Una vez accedamos estaremos en el entorno principal del servidor. En el desarrollo de este
tema estaremos utilizando el motor de base de datos o “Database Engine”.
Figura 7 – Interfaz básica de SQL Server Management Studio
La configuración básica de la interfaz de SQL Server está conformada por una barra de
herramientas, el explorador de objetos y la pestaña de consultas donde se escriben las
consultas.
La barra de herramientas está conformada por una serie de accesos directos a las opciones
más utilizadas como la lista de las bases de datos disponibles, abrir una nueva consulta, abrir,
guardar e imprimir un archivo, entre otros.
El explorador de objetos proporciona una interfaz jerárquica para ver y administrar los
objetos de cada instancia de SQL Server. El panel de detalles del explorador de objetos
muestra una vista tabular de los objetos de instancia y la capacidad de buscar objetos
específicos. Las funciones del explorador de objetos varían ligeramente según el tipo de
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 27
servidor, aunque, por lo general, incluyen características de desarrollo de bases de datos y
características de administración para todo tipo de servidores.
La pestaña o ventana de consulta es el editor de texto en el cual se diseñan las consultas con
las que manejaremos nuestra información. El lenguaje utilizado en el motor de base de datos
es el Transact-SQL, el cual permite el manejo de variables, control de transacciones y el
manejo de errores y excepciones.
Creación de usuarios y asignación de permisos
El SQL Server permite la creación de usuarios de manera gráfica; estos son asignados a un
objeto de esquema específico o a una base de datos según los permisos que le sean asignados.
Para crear un nuevo usuario de SQL Server primero hay que estar conectado bajo la
autenticación de Windows y de esta manera tener acceso a las opciones de seguridad del
servidor.
A continuación se expande la carpeta seguridad ubicada en el explorador de objetos, luego
click derecho sobre Logins y click en New Login.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 28
Figura 8 – Explorador de Objetos de SQL Server Management Studio
En la ventana de nuevo Login se debe asignar un nombre de usuario, activar la opción SQL
Server authentication, se llenan las casillas de contraseña y en la parte inferior asignar una
base de datos predeterminada.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 29
Figura 9 – Ventana de Nuevo Usuario
Al presionar el botón OK se está asignando un nuevo usuario a la base de datos que se
determinó, sin embargo, este usuario no tiene permisos a los objetos de dicha base de datos,
los cuales deben ser asignados a través de las opciones de seguridad en el menú expandible
de la base de datos en el explorador de objetos.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 30
Figura 10 – Ventana de permisos de usuario
Para asignar permisos al usuario recién creado, debemos ir a las opciones desplegables de la
base de datos a la cual le hemos asignado el nuevo usuario, entramos a la opción de
seguridad, usuarios y hacemos click derecho en el usuario y luego a propiedades.
En esta ventana podemos asignar los permisos o roles que deseamos, siempre y cuando
tengamos los permisos para eso.
Backup y restauración de una base de datos
La capacidad de poder recuperar nuestra información en caso de pérdida es una facultad
inmensurable, pues existen distintas amenazas que ponen en riesgo la integridad de nuestros
datos. SQL Server Management Studio nos brinda esa opción haciendo Backup o copia de
seguridad a nuestra base de datos.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 31
Hacer una copia de seguridad de nuestra base de datos es relativamente fácil y consta de los
siguientes pasos:
Al acceder a nuestro usuario de SQL Server, debemos hacer click derecho sobre la base de
datos que queremos hacer copia de seguridad, luego a la opción task y seguido a copia de
seguridad o Backup.
Figura 11 – Ventana de copia de seguridad de una base de datos
En la ventana que nos muestra debemos asignar un nombre al archivo, elegir una ruta en la
cual se va a guardar y presionar el botón OK.
Para restaurar una copia de seguridad el proceso es bastante sencillo. Hacemos click sobre la
carpeta Database en nuestro explorador de objetos, luego a Restore Database.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 32
Figura 12 – Ventana de restauración de una base de datos
En esta nueva ventana asignamos un nombre a la base de datos a restaurar, seguido de
seleccionar la opción From device, en la cual vamos a buscar la ubicación de nuestro archivo
y presionamos OK.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 33
UNIDAD VI
Creación y modificación de tablas
Metas de Aprendizaje:
Aprender a crear tablas
Saber cómo modificar una tabla
Saber cómo borrar los datos de una tabla
Aprender cómo borrar una tabla
Saber cómo crear columnas calculadas
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 34
En el entorno SQL, las tablas son la unidad básica de gestión de datos. La mayoría de la
programación que se hace en SQL se relaciona directa o indirectamente con esas tablas.
Como resultado, antes de insertar la información en la base de datos o modificar esa
información, las tablas apropiadas deben haberse creado.
Actualmente existen tres instrucciones básicas que permiten definir, cambiar o eliminar las
definiciones de tablas en SQL. Se puede utilizar la instrucción CREATE TABLE para añadir
una tabla, la instrucción ALTER TABLE para modificar esa definición, o la instrucción
DROP TABLE para eliminar la tabla y sus datos de la base de datos. Veamos a continuación
un análisis más detallado de estas y otras instrucciones de manejo de tablas.
CREATE TABLE
Para comprender la sintaxis SQL para CREATE TABLE es preciso tener una buena idea de
cómo está conformada una tabla. Las tablas se dividen en filas y columnas. Cada fila
representa una parte de los datos, y cada columna puede pensarse como la representación de
un componente de aquella parte de los datos. Entonces, un ejemplo para explicar esta sintaxis
sería el siguiente:
El ejemplo anterior se compone de varias partes: primero está la instrucción CREATE
TABLE quien da inicio a la instrucción, seguido del nombre que se le asigna a la tabla.
Dentro de los paréntesis se encuentra la definición de los campos de la tabla automóviles,
con el nombre del campo, seguido por el tipo de datos que recibe dicho campo, su longitud
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 35
máxima y las restricciones NULL y NOT NULL, las cuales determinan cuales campos son
obligatorios o no.
ALTER TABLE
La instrucción ALTER TABLE se utiliza básicamente para la modificación de tablas
almacenadas en la base de datos. Ésta nos permite tomar varias acciones diferentes: añadir
columnas, modificar columnas, eliminar columnas o modificar restricciones.
Para agregar una columna se utiliza la cláusula ADD. Ésta a su vez va acompañada del
nombre de la columna y el tipo de datos que va a recibir. Ejemplo:
En el ejemplo anterior se utilizó la instrucción ALTER TABLE para agregar una columna a
la tabla clientes, seguido por la cláusula ADD, el nombre de la columna que se va a incluir en
la tabla y el tipo de datos que va a recibir.
Otra manera de utilizar la instrucción ALTER TABLE es en la modificación de columnas; ya
sea el tipo de datos que recibe o las restricciones que tienen asignada. Para ilustrar un
ejemplo para una tabla llamada facturas, en la cual se requiera cambiar el tipo de datos que
recibe la columna nombre a varchar(60).
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 36
A diferencia del ejemplo anterior en el que agregábamos una nueva columna utilizando la
cláusula ADD, en este podemos observar una nueva cláusula llamada ALTER COLUMN
seguida por el nombre de la columna a la que queremos cambiar el tipo de datos y luego el
tipo de dato, en este caso varchar(60).
Para la eliminación de una columna se utiliza la cláusula DROP COLUMN seguido por el
nombre de la columna. Ejemplo:
DROP TABLE
La eliminación definitiva de una tabla es un procedimiento poco común, pero aun así es un
procedimiento básico y su definición es bastante sencilla. Para la eliminación definitiva de
una tabla se utiliza la instrucción DROP TABLE seguida del nombre de la tabla. Ejemplo:
DELETE
La instrucción DELETE permite eliminar registros de una tabla. Su sintaxis es simple, puesto
que solo debemos indicar a qué tabla nos referimos, luego señalamos qué registro deseamos
eliminar mediante la cláusula WHERE. La siguiente consulta elimina todos los registros de la
tabla inventario en las que el valor en la columna cantidad sea igual a cero:
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 37
Columnas calculadas
Una columna calculada es una columna que deduce sus filas del resultado de una operación
entre los valores de dos o más columnas distintas. Éstas pueden obtenerse mediante una
instrucción SELECT, modificando la definición existente de una columna o creando una
nueva.
Para mostrar un ejemplo de una consulta de una columna calculada podemos utilizar un
ejemplo en el que se necesite calcular el monto total luego de aplicar un descuento en la tabla
artículos:
Nótese que se utilizan los principios algebraicos básicos agrupando los valores en paréntesis
y luego realizando el resto de la operación.
Otro ejemplo sería el de modificación de tablas utilizando la instrucción ALTER TABLE, por
ejemplo, agregamos una columna a la tabla artículos cuyos valores sean los requeridos en la
consulta SELECT anterior:
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 38
Por último, si se requiere crear una tabla con las características presentadas en los ejemplos
anteriores se utiliza la instrucción CREATE TABLE de la misma manera:
Nótese que en la definición de la columna precio_total, al igual que en el ejemplo de ALTER
TABLE, no se requiere especificar el tipo de datos de la columna en cuestión.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 39
UNIDAD VII
Tipos de datos
Metas de Aprendizaje:
Conocer los tipos de datos numéricos
Saber cuáles son los tipos de datos de cadena de caracteres
Aprender sobre los tipos de datos binarios
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 40
Cada vez que se define una columna en la instrucción CREATE TABLE, al menos debe
proporcionarse un nombre para la columna y un tipo de dato asociado. El tipo de datos limita
los valores que pueden introducirse en esa columna. Por ejemplo, algunos tipos de datos
limitan los valores de una columna a números, mientras que otros tipos de datos permiten que
se introduzca cualquier carácter. Veamos a continuación un análisis más detallado de los
tipos de datos soportados por SQL.
Numéricos exactos
Tipo de datos
Descripción
Tipo de dato numérico que utiliza valores enteros con un intervalo
Bigint
de (-9,223.372.036.854.775.808 hasta 9,223.372.036.854.775.807)
Tipo de dato numérico que utiliza valores enteros con un intervalo
int
de (-2,147,483,648 hasta 2,147,483,647)
Tipo de dato numérico que utiliza valores enteros con un intervalo
smallint
de (-32,768 hasta 32,767)
Tipo de dato numérico que utiliza valores enteros con un intervalo
tinyint
de (0 hasta 255)
Tipo de dato numérico que tiene precisión y escala fija. Cuando se
decimal utiliza la precisión máxima, los valores válidos se sitúan entre -
10^38 + 1 y 10^38 - 1.
Tipo de dato numérico que tiene precisión y escala fija. Cuando se
utiliza la precisión máxima, los valores válidos se sitúan entre -
numeric
10^38 + 1 y 10^38 - 1. Este tipo de dato es funcionalmente igual al
decimal.
Tipo de dato que representa valores monetarios o de moneda. Tiene
money un intervalo de (-922,337,203,685,477.5808 hasta
922,337,203,685,477.5807)
Tipo de dato que representa valores monetarios o de moneda. Tiene
smallmoney
un intervalo de (- 214.748,3648 a 214.748,3647)
bit Tipo de datos entero que puede aceptar los valores 1, 0 o NULL.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 41
Numéricos aproximados
Tipo de datos
Descripción
Tipo de dato numérico aproximado que utiliza datos numéricos de
Float
coma flotante, o sea, no requiere un rango de exactitud específico.
Real
Fecha y hora
Tipo de datos
Descripción
Date Tipo de dato SQL que define una fecha.
Define una fecha que se combina con una hora del día basada en un
reloj de 24 horas. Puede considerarse como una extensión del tipo
Datetime2 date time, pues tiene un rango de fechas mayor, un valor
predeterminado de precisión fraccionaria y una precisión opcional
especificada por el usuario.
Define una fecha que se combina con una hora del día con fracciones
Datetime
de segundos basada en un reloj de 24 horas.
Define una fecha que se combina con una hora del día con
Datetimeoffset
reconocimiento de la zona horaria y basada en un reloj de 24 horas.
Define una fecha que se combina con una hora del día. La hora está
Smalldatetime en un formato de día de 24 horas, con segundos siempre a cero (:00)
y sin fracciones de segundo.
Define una hora de un día. Éste no distingue la zona horaria y está
Time
basada en un reloj de 24 horas.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 42
Cadena de caracteres
Tipo de datos
Descripción
Datos de cadena no Unicode de longitud fija. La longitud definida
Char
debe ser un valor entre 1 y 8000.
Datos de cadena no Unicode de longitud variable. La longitud
Varchar definida debe ser un valor entre 1 y 8000. A diferencia del char, el
varcha solo almacena la longitud real de los datos especificados.
Datos no Unicode de longitud variable en la página de códigos del
Text
servidor y con una longitud máxima de cadena de (2.147.483.647).
Define una fecha que se combina con una hora del día con
Datetimeoffset
reconocimiento de la zona horaria y basada en un reloj de 24 horas.
Define una fecha que se combina con una hora del día. La hora está
Smalldatetime en un formato de día de 24 horas, con segundos siempre a cero (:00)
y sin fracciones de segundo.
Define una hora de un día. Éste no distingue la zona horaria y está
Time
basada en un reloj de 24 horas.
Cadena de caracteres Unicode
Tipo de datos
Descripción
Nchar Datos de cadena Unicode de longitud fija entre 1 y 4000.
Datos de cadena Unicode de longitud variable en la cual solo se
Nvarchar
ocupa el tamaño de la cadena introducida.
Datos Unicode de longitud variable con una longitud máxima de
Ntext
cadena de 2^30 – 1.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 43
Cadenas binarias
Tipo de datos
Descripción
Datos binarios de longitud fina con una longitud de n bytes, donde n
Binary es un valor que oscila entre 1 y 8000. El tamaño de almacenamiento
es de n bytes.
Datos binarios de longitud variable, n puede ser un valor de 1 a
Varbinary
8000.
Datos Unicode de longitud variable con una longitud máxima de
Ntext
cadena de 2^30 – 1.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 44
UNIDAD VIII
Implementación de integridad de datos
Metas de Aprendizaje:
Conocer el concepto de integridad de datos
Exponer la importancia que tiene la integridad de datos
Enumerar las restricciones de datos más relevantes
Explicar su implementación
Conocer y evaluar su lógica de desarrollo
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 45
Integridad de datos
La integridad de datos hace referencia a los valores reales que se almacenan y se manejan en
las estructuras de datos de la aplicación. Una aplicación debe ejecutar un control sobre los
datos que manejan los procesos de la misma para garantizar la corrección permanente de esos
datos. La exigencia de controlar la integridad de los datos avala la calidad de los datos de la
base de datos.
Garantizar la integridad de los datos es posible gracias a la implementación rigurosa del
concepto de claves primarias y foráneas como las que se presentan a continuación:
Normalizar datos: explica el proceso de perfeccionar las definiciones de datos para
eliminar registros o grupos repetidos y dependencias innecesarias.
Definir reglas de la organización: es la forma en que las políticas de la empresa
controlan la gestión de los datos.
Proporcionar integridad referencial: describe la forma en que la integridad
referencial evita el daño de los datos.
Validación de datos: En esta parte se maneja la validación de campos y validación de
datos.
Integridad referencial
La integridad referencial significa que la clave externa de una tabla de referencia debe
referirse a una fila validad de la tabla a la cual se haga la referencia. El objetivo de la
integridad referencial es mantener una relación sincronizada entre dos tablas durante las
operaciones de actualización y eliminación de datos. Por otro lado, SQL Server ofrece una
gama de restricciones que nos facilitan controlar e implementar integridad de datos y
referencial.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 46
Restricciones
Existen tres tipos de restricciones de integridad
Restricciones relacionadas con tablas
Afirmaciones
Restricciones de dominio
Dentro de estas tres categorías las restricciones más implementadas son las
restricciones relacionadas con tablas y esta se divide en: restricciones de tabla y
restricciones de columna. Una restricción de columna se declara cuando se define una
nueva columna, mientras que las restricciones de tabla se incluyen como un elemento
de tabla.
Restricciones de columna
NOT NULL
CHECK
FOREIGN KEY
PRIMARY KEY
UNIQUE
Restricciones de tabla
UNIQUE
FOREIGN KEY
PRIMARY KEY
CHECK
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 47
Uso de restricciones
NOT NULL: en el momento que se requiere que un campo sea obligatorio, ósea que no se
pueda quedar vacío, usted debe utilizar dicha restricción.
DEFAULT: si se requiere especificar un valor en un campo el cual no se han insertado datos,
se utiliza la restricción DEFAULT si el campo no recibe datos, obtenga un valor por defecto.
CHECK: Cuando se requiera verificar la información que va a contener un campo, se debe
usar esta restricción ya que permite validar la información que va a contener ese campo según
la restricción CHECK.
UNIQUE: Se utiliza cuando se necesita que un campo contenga valores únicos, ósea valores
que sean significativos que identifique a cada fila de todas las demás.
PRIMARY KEY: Solo se puede definir un PRIMARY KEY en una tabla, esta restricción al
igual que la UNIQUE se utiliza cuando se requiere que un campo contenga valores únicos.
FOREIGN KEY: Esta restricción se encarga de mantener la integridad relacional de los
datos, en el sentido de que si el valor de un campo de una tabla hace referencia a otro campo
de una segunda tabla que contiene ese mismo valor, no se podrá eliminar ese valor ya que
esta referenciado y relacionado en otra tabla. Sin una restricción FOREIGN KEY se pierde la
integridad relacional de cierto conjunto de datos que se encuentren relacionados.
Nota
*El uso de restricciones tiene una relevancia muy importante en el diseño de una base
de datos, porque no solo establece seguridad, sino que también, garantiza la integridad
de la información contenida en una base de datos*.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 48
Definición de restricciones
Definir una restricción en una tabla sigue dos formas, por ejemplo:
1) Se definen restricciones de columna para una tabla llamada Factura
CREATE TABLE Factura
(
id_factura int identity(1,1) PRIMARY KEY,
id_cliente int NOT NULL,
id_usuario int NOT NULL,
monto_total float NOT NULL,
monto_recibido float NOT NULL,
devuelta float NOT NULL,
fecha date
)
Figura
Definición del problema
El nombre de esta tabla es Factura, se declara un campo que identificara la tabla de manera
única llamado id_factura el cual utilizara la secuencia auto-incremental identity que
procederá a generar una secuencia de números desde el 1 a 1. Podemos ver el uso de la
restricción de columna NOT NULL.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 49
2) Se definen restricciones de tabla y columna para las tablas Factura, Cliente y
Usuarios
CREATE TABLE Facturas
(
id_factura int identity(1,1),
id_cliente int NOT NULL,
id_usuario int NOT NULL,
monto_total float NOT NULL,
monto_recibido float NOT NULL,
devuelta float NOT NULL,
fecha date,
CONSTRAINT pk PRIMARY KEY(id_factura),
CONSTRAINT fore FOREIGN KEY(id_cliente)
REFERENCES Cliente(id_cliente),
CONSTRAINT f_k FOREIGN KEY(id_usuario)
REFERENCES Usuarios(id_usuario)
)
CREATE TABLE Cliente
(
id_cliente int identity(1,1),
nombre varchar(60) NOT NULL,
apellido varchar(60) NOT NULL,
cedula varchar(13) NOT NULL,
direccion varchar(100) NOT NULL,
celular varchar(12) NOT NULL,
fecha_registro date,
CONSTRAINT pi_k PRIMARY KEY(id_cliente)
CREATE TABLE Usuarios
(
id_usuario int identity(1,1),
nombre varchar(60) NOT NULL,
apellido varchar(60) NOT NULL,
nombre_usuario varchar(60) NOT NULL,
contrasena varbinary(128) NOT NULL,
id_rol int NOT NULL,
fecha_registro date
CONSTRAINT p_k PRIMARY KEY(id_usuario)
)
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 50
Definición del problema
En este caso se declara tanto restricciones de columna ósea NOT NULL y restricciones de
tabla como los CONSTRAINT. Recuerde que después de los FOREIGN KEY, en los
REFERENCES es que va a separar por comas. Se aplican restricciones de tabla FOREIGN
KEY y PRIMARY KEY y restricciones de columna NOT NULL. Las restricciones
FOREIGN KEY están haciendo referencias a los campos id_cliente y id_usuario de manera
que, si en la tabla Factura existe un id_usuario = 1 y en la tabla Usuario existe un id_usuario
= 1, para eliminar esa o esas facturas donde el id_usuario = 1, tendremos que desactivar
ese FOREIGN KEY ya que como esta restricción establece una integridad relacional entre
dos campos de diferentes tablas y si estos datos coinciden no se podrán eliminar a menos que
desactive la restricción FOREIGN KEY.
Control de restricciones
Utilizando los dos casos anteriores de la tabla Factura, Para deshabilitar
un CONSTRAINT:
ALTER TABLE Factura NOCHECK CONSTRAINT Fore
Para habilitar un CONSTRAINT:
ALTER TABLE Factura CHECK CONSTRAINT Fore
Si quiere definir una restricción de una tabla en el caso de que no las estableció en la
creación, use ALTER para modificar la tabla:
ALTER TABLE Factura
ADD CONSTRAINT fore FOREIGN KEY (id_cliente) REFERENCES
Cliente(id_cliente)
Si desea eliminar ese CONSTRAINT use el comando ALTER y DROP:
ALTER TABLE Orders
DROP CONSTRAINT fore
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 51
UNIDAD IX
Insertar registros: INSERT
Metas de Aprendizaje:
Conocer el uso de la sentencia insert.
Especificar los tipos de insert.
Describir su forma.
Evaluar su importancia.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 52
Concepto de la instrucción INSERT
Para almacenar datos en una base de datos debemos insertar filas en las tablas. Para eso SQL
pone a disposición la sentencia INSERT. La sentencia INSERT es una de las instrucciones
más simples; esta tiene dos modos de trabajo, está la inserción única y la inserción múltiple.
Inserción individual
Para poder realizar la inserción individual de filas en las tablas de la base de datos, debemos
usar la sentencia INSERT INTO. Esta es la inserción que más será utilizada en este curso.
INSERT INTO <nombre_tabla>
[(<campo1>[,<campo2>,...])]
values
(<valor1>,<valor2>,...);
Algo muy importante a destacar es que si queremos omitir un campo en la sentencia INSERT
INTO este campo tiene que permitir valores nulos, ósea, que el campo debe contar con la
restricción de columna NULL, que por defecto al momento de crear una tabla si no se
especifica una restricción de columna, esta admite inmediatamente valores nulos.
Figura tabla usuarios
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 53
Para poder hacer una inserción individual en la Tabla Usuarios tenemos dos opciones. La
primera es especificar todos los campos después de INTO y luego especificar las expresiones.
Por ejemplo:
INSERT INTO
Usuarios(nombre,apellido,nombre_usuario,contrasena,id_rol,fech
a_registro)
VALUES('Emmanuel','DeLeon
Guzman','Emmanuel','12345',1,GETDATE())
Por otro lado, tenemos la opción de realizar una inserción en todos los campos sin necesidad
de especificarlos:
INSERT INTO Usuarios
VALUES('Emmanuel','DeLeon
Guzman','Emmanuel','12345',1,GETDATE())
La diferencia está en que si se quiere insertar un nuevo registro y se van a completar todos los
campos de la tabla, no se tienen que especificar todos los campos, solamente haciendo
INSERT INTO Usuarios VALUES (Expr) es suficiente. Ahora si se necesita insertar datos
solamente en algunos campos en específico, deben definirse cuales serán esos campos.
Este es un ejemplo de una inserción que se va a realizar pero solamente en dos campos:
INSERT INTO Usuarios(nombre,apellido)
VALUES('Emmanuel','De Leon Guzman')
Recuerde que a menos que los demás campos de la Tabla Usuarios permitan valores nulos, se
podrá ejecutar esta inserción, de lo contrario, SQL Server le mostrara el mensaje 515,
mostrándole que los campos que tienen una restricción de columna NOT NULL no permiten
valores nulos y que deben ser completados con un valor.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 54
Inserción múltiple
Para lograr realizar una inserción múltiple, SQL Server permite combinar la sentencia
INSERT con la sentencia SELECT. El resultado que se produce es una inserción basada en
las filas retornadas por la sentencia SELECT.
Figura Tabla Factura
Definición del problema
Actualmente, la empresa x cuenta con una tabla llamada Factura. El problema está en que se
quiere realizar una transferencia de esas facturas a una tabla llamada Historial_Factura, pero
solamente de las facturas emitidas en el año 2014 suponiendo que la tabla Historial_Factura
tiene la misma estructura que la tabla Factura.
Solución:
INSERT INTO Historial_Factura
SELECT
*
FROM Factura
WHERE fecha='2014-01-01'
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 55
UNIDAD X
Consulta de datos usando la sentencia SELECT
Metas de Aprendizaje:
Definir la función y estructura de la sentencia select.
Demostrar el potencial de la instrucción.
Detallar el orden de procesamiento lógico de la sentencia select
Analizar y evaluar el rendimiento de cada consulta
Interpretar un plan de ejecución
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 56
Selección de datos
Esta instrucción recupera las filas de una base de datos y habilita la selección de varias filas y
columnas de tablas que se encuentran contenidas dentro de una base de datos. El proceso más
relevante que podemos llevar a cabo en una base de datos es la consulta de los datos. No
serviría de nada contar con una base de datos si no pudiéramos consultarla. Esta es una de las
instrucciones más utilizadas en el mundo de las bases de datos.
Su estructura es la siguiente:
SELECT [ALL | DISTINCT ]
<nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>|<nombre_vista>
[{,<nombre_tabla>|<nombre_vista>}]
[WHERE <condicion> [{ AND | OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condicion>[{ AND|OR <condicion>}]]
[ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC]
[{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]
Especificaciones de la instrucción
SELECT: Palabra clave y reservada que indica que la sentencia de SQL que queremos
ejecutar es de selección.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 57
ALL: Indica que queremos seleccionar todos los valores. Es el valor por defecto y no suele
especificarse casi nunca.
DISTINCT: Indica que queremos seleccionar sólo los valores distintos no repetidos.
FROM: Indica la tabla desde la que queremos recuperar los datos. En el caso de que exista
más de una tabla se hace una combinación de tablas usando la instrucción JOIN. En las
consultas combinadas es necesario aplicar una condición de combinación a través de una
cláusula WHERE.
WHERE: Especifica una condición que debe cumplirse para que los datos sean devueltos
por la consulta. Admiten los operadores lógicos AND y OR.
GROUP BY: Especifica la agrupación que se da a los datos. Se usa siempre en combinación
con funciones agregadas.
HAVING: Especifica una condición que debe cumplirse para que los datos sean devueltos
por la consulta. Su funcionamiento es similar al de WHERE pero aplicado al conjunto de
resultados devueltos por la consulta. Debe aplicarse siempre junto a GROUP BY y la
condición debe estar referida a los campos contenidos en ella.
ORDER BY: Presenta el resultado ordenado por las columnas indicadas. El orden puede
expresarse con ASC “orden ascendente” y DESC “orden descendente”. El valor
predeterminado es ASC.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 58
Ejemplo básico
Figura tabla Usuarios
“La figura muestra la estructura de la tabla Usuarios. Esta contiene siete campos”.
SELECT
*
FROM Usuarios
SELECT
nombre,apellido
FROM Usuarios
Figura resultados de las consultas
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 59
Crear una tabla a partir de una consulta
En algunas ocasiones, no solo se necesita obtener el resultado de una consulta usando la
instrucción SELECT, sino que también se necesita almacenar los datos retornados por la
instrucción y almacenarlos en una tabla persistente. Esta operación se puede realizar de la
siguiente manera:
Definición del problema
Se necesita obtener el nombre y apellido de los usuarios que están contenidos en la Tabla
Usuarios la cual contiene cinco registros para luego almacenarlos en una nueva tabla
persistente llamada Historial_Usuarios.
Solución
Usar INTO después de la selección de los campos en la instrucción SELECT, a partir de esto
se creara una nueva tabla persistente. El uso de INTO debe efectuarse en momentos donde no
se hagan muchas consultas al servidor.
SELECT
nombre,apellido
INTO dbo.Historial_Usuarios
FROM Usuarios
SELECT
nombre,apellido
FROM dbo.Historial_Usuarios
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 60
Figura muestra las filas afectadas y el resultado de la consulta
Si existe una situación en la cual se tenga que almacenar datos en una tabla, pero, no se
necesita que esta tabla sea persistente, se tiene que hacer uso de las tablas temporales globales
o locales.
Solución
Se pueden almacenar esos registros en una tabla temporal local o global. El resultado es el
mismo, lo que cambia es el concepto de la tabla.
SELECT
nombre,apellido
INTO ##Mi_Tabla_Temporal
FROM Usuarios
SELECT
*
FROM ##Mi_Tabla_Temporal
SELECT
nombre,apellido INTO #Mi_Tabla_Temporal
FROM Usuarios
SELECT
nombre,apellido FROM #Mi_Tabla_Temporal
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 61
Rendimiento de consultas
Mejorar rendimiento de UNION
Imagine un caso en el cual se quiera mezclar dos conjuntos de datos:
SELECT column_name1, column_name2
FROM table_name1
WHERE column_name1 = some_value
UNION
SELECT column_name1, column_name2
FROM table_name1
WHERE column_name2 = some_value
Para obtener un mayor rendimiento de esta consulta, con DISTINCT se obtiene los registros
únicos aunque se repitan en la tabla, si existen cinco registros No.1 solo mostrara un solo
registro del No.1, la consulta es dela siguiente manera:
SELECT DISTINCT column_name1, column_name2
FROM table_name1
WHERE column_name1 = some_value OR column_name2 = some_value
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 62
Evaluar el uso de DISTINCT
Un aspecto relativo al rendimiento es la evaluación del uso de la sentencia DISTINCT.
Muchos desarrolladores aplican esta sentencia por defecto. Sólo debe usarse si sabemos que
la consulta puede retornar registros duplicados. Además esto puede provocar un mal
funcionamiento de la aplicación que hace uso de los datos.
Recuperar solamente datos de interés
Un retorno de datos y campos innecesarios reduce el rendimiento y aumenta la degradación
del sistema. Cuando se realiza un SELECT *, este retorna todos los campos y datos de la
tabla impidiendo el uso de índices y incrementando así el tiempo de la consulta ya que se
tienen que recorrer todas las filas y columnas. Por tal razón, se debe evitar el uso de SELECT
*.
El operador TOP
Si se requiere desarrollar una aplicación en la que los usuarios tengan que ejecutar consultas,
la recomendación seria implementar el uso del operador TOP, ya que el usuario va a ejecutar
sus consultas pero, estas consultas estarán limitas a las filas especificadas por el usuario.
Usar esta técnica ayuda a que el usuario no tenga que retornar todos los datos que se
encuentran almacenados en una tabla.
SELECT
TOP(2) nombre,apellido
FROM Usuarios
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 63
Figura uso del operador TOP
“Esta figura muestra que usando el operador TOP se limita el retorno de filas. La tabla Usuarios contiene
cinco registros”.
Uso de operadores en la cláusula WHERE
El uso de operadores dentro de la cláusula WHERE aumenta el rendimiento de una consulta,
lista de operadores siguiendo un orden bueno malo, bueno malo etc.
=
>, >=, <, <=
LIKE
<>
Uso de NOT IN
Como administrador de base de datos, se tiene que evitar el uso de este operador, ya que este
obliga al SQL Server Optimizer a realizar una búsqueda (“Scan”). En lugar de eso, utilice una
de estas tres recomendaciones:
Usar EXISTS o NOT EXISTS
Usar IN
Usar LEFT OUTER JOIN
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 64
Mejores prácticas en el uso del operador LIKE
No es lo mismo usar LIKE ‘%P’ que LIKE ‘P%’, la segunda opción es más óptima porque si
existe un índice puede agilizar el proceso de búsqueda por carácter.
El operador OR
Es posible que las QUERIES que lancemos nos encontremos que existen operadores OR que
muchas veces pueden reescribirse mediante la sentencia UNION ALL, de cara a mejorar el
rendimiento de la QUERY. Por ejemplo echemos un vistazo a la siguiente consulta:
SELECT
nombre,apellido
FROM names
WHERE nombre = 'Miguel' or Apellido = 'Collado Tineo'
Esta consulta tiene tres condiciones en la cláusula WHERE separadas. De cara a que esta
consulta use un indice, debemos tener un indice sobre todas las columnas que están en dicha
cláusula. Este ejemplo puede ser reescrito usando un UNION ALL en lugar de un OR, tal y
como muestra el ejemplo:
SELECT
nombre,apellido
FROM Usuarios
WHERE nombre = 'Miguel'
UNION ALL
SELECT
nombre,apellido
FROM Usuarios
WHERE Apellido = 'Collado Tineo'
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 65
Uso de GROUP BY
No debe hacer uso de GROUP BY si no existe ningún campo que esté trabajando bajo una
función de agregación. GROUP BY tiene mejor rendimiento que DISTINCT.
Forma incorrecta
SELECT
id_cliente,id_usuario,monto_factura
FROM Factura
GROUP BY id_cliente,id_usuario,monto_factura
Forma correcta
SELECT
id_cliente,id_usuario,AVG(monto_factura)
FROM Factura
GROUP BY id_cliente,id_usuario
“Recuerde que siempre debe especificar en el GROUP BY las columnas que no están
bajo una función de agregación”.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 66
UNIDAD XI
Actualización de datos: UPDATE
Metas de Aprendizaje:
Conocer la función de la sentencia update.
Especificar su operación.
Dominar el proceso de actualización combinando tablas.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 67
Sentencia UPDATE
Esta sentencia se utiliza para cambiar el contenido de uno o varios registros de una o varias
columnas de una base de datos. A continuación se presentara su estructura:
UPDATE nombre_tabla
SET columna1 = nuevo_valor1, columna2 = nuevo_valor2
WHERE columna3 = valor_contenido_en_la_tabla
La estructura de esta sentencia es muy fácil, donde luego de UPDATE se especifica el
nombre de la tabla la cual se va a realizar una actualización. En la parte de SET, se
especifican las columnas de la tabla las cuales van a recibir un nuevo valor, y por último esta
la cláusula WHERE, en esta se define cual será la condición o condiciones para que un
registro sea actualizado.
En la siguiente tabla se muestra un ejemplo en el cual se quiere actualizar el campo
monto_recibido cuando el id_cliente sea igual a uno.
UPDATE Factura
SET monto_recibido=500
WHERE id_cliente=1
Pero recuerde que en algunas situaciones se necesitan actualizar todos los registros y por tal
razón no es necesario el uso de WHERE ya que esta cláusula permite actualizar un registro o
un conjunto de registros bajo una condición.
UPDATE Factura
SET monto_recibido=500
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 68
En este siguiente ejemplo, se puede notar que en SET podemos definir todas las columnas
que se requieran actualizar de una tabla.
UPDATE Factura
SET monto_recibido=500,id_usuario=1
WHERE monto_total>=2500 AND monto_total<=@3000
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 69
UNIDAD XII
Eliminación de datos: DELETE & TRUNCATE TABLE
Metas de Aprendizaje:
Entender su uso y consecuencias de la misma.
Describir las diferencias entre delete y truncate.
Determinar cuándo hacer uso de delete o truncate.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 70
Sentencia DELETE
Esta sentencia se utiliza para eliminar uno o varios registros de una misma tabla. En una
instrucción DELETE en la cual se desee eliminar registro de más de una tabla, se debe
incluir el nombre de la tabla. Si se especifica más de una tabla en una instrucción DELETE,
estas deben tener una relación muchos a uno. Algo importante que cabe destacar es que si se
quiere proceder a eliminar todos los registros de una tabla, es mejor eliminar la tabla que usar
la sentencia DELETE, porque esta consume muchos recursos.
Una consulta de borrado no elimina solo los datos en campos específicos, sino todos los
registros de una tabla, claro, si no se define una condición usando WHERE.
La siguiente instrucción no es eficiente, porque elimina todos los registros de una tabla, y si
esa tabla contara con dos millones de registros, esta consumiría muchos recursos, así que
sería mejor aplicar un DROP sobre la tabla.
DELETE FROM Factura
Puede aplicar instrucciones como esta porque solo eliminara uno o algunos registros de la
tabla.
DELETE FROM Factura
WHERE id_cliente IN(1,2,3)
DELETE FROM Factura
WHERE monto_recibido>=2500
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 71
Concepto de TRUNCATE TABLE
Truncate table es similar a la instrucción DELETE, pero esta no hace uso de la cláusula
WHERE y es más rápida y consume menos recursos de registro de transacciones y del
sistema.
No puede utilizar TRUNCATE TABLE en las siguientes tablas:
Tablas a las que se hace referencia mediante una restricción FOREIGN KEY. (Puede
truncar una tabla que tenga una clave externa que haga referencia a sí misma).
Tablas que participan en una vista indexada.
Tablas que se publican mediante replicación transaccional o replicación de mezcla.
Si la tabla contiene una columna de identidad, el contador para dicha columna se restablece al
valor de inicialización definido para ella. Si no se define ningún valor de inicialización, se
utiliza el valor predeterminado 1. Para conservar el contador de identidad, utilice DELETE.
Solamente con especificar TRUNCATE TABLE <Nombre de la tabla>, inmediatamente la
tabla es truncada.
TRUNCATE TABLE Factura
Diferencias entre DELETE y TRUNCATE TABLE
Truncate
Es una operación DDL.
No permite el borrado selectivo. TRUNCATE TABLE elimina todo el contenido de la
tabla.
No se puede ejecutar, si la tabla tiene asociadas, aun si no existiesen registros en la
tabla que contiene la FK.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 72
Es la forma más rápida de eliminar el contenido de una tabla.
No se activa ningún TRIGGER al ejecutarse (a partir de SQL Server 2005, es posible
capturar el evento mediante un DDL TRIGGER, pero a modo de auditoría, no es
posible tener acceso a los valores que fueron eliminados).
En caso que la tabla tuviese un campo Identity, se resetea el valor a 1 (o al valor base
determinado en el campo).
TRUNCATE TABLE desasocia (deallocate) las páginas de datos de la tabla.
El logueo en el transaction log es mínimo. Solo registra el dealloc de las páginas de
datos.
No puede ser ejecutado si la tabla tiene asociadas vistas indexadas.
Delete
Es una operación DML.
Permite el borrado selectivo, mediante la cláusula WHERE.
Se puede ejecutar si hay FK asociadas a la tabla, pero siempre y cuando no tenga
registros asociados o la FK este deshabilitada.
Es más lenta.
Puede activarse el TRIGGER de ON DELETE y poder determinar que registros están
siendo eliminados. siendo eliminados.
No resetea el valor del campo Identity, en caso que la tabla tuviese uno.
DELETE FROM marca cada registro afectado, como eliminado.
Loguea cada operación sobre los registros afectados.
Se puede ejecutar si la tabla tiene vistas indexadas.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 73
UNIDAD XIII
Caso de estudio
Metas de Aprendizaje:
Aplicar las técnicas y procedimientos necesarios para desarrollar una base de
datos
Especificar las entidades y atributos necesarios
Determinar la lógica y orden de un proceso
Relacionar las entidades de manera correcta
Especificar los tipos de datos usados
Enumerar las restricciones utilizadas
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 74
Planteamiento del caso
Sugar Company S.A es un restaurante perfecto para comer bien y degustar una excelente
comida en la cena o almuerzo, y muy especialmente, para cenas Románticas. Se encuentra en
un entorno de amplios jardines con piscina y terrazas llenas de encanto.
Benjamin Fernandez, propietario de la empresa Sugar Company S.A, ha decidido
implementar un nuevo sistema para su restaurante que le permita gestionar y controlar todas
las operaciones que se realizan en todo el dia dentro del restaurante. Todas las operaciones
como: asignaciones de mesas, verificacion de mesas disponibles y facturacion se realizan
manualmente. El nuevo sistema debe tener la capacidad de automatizar estas y las demas
operaciones que se realizan, desde la entrada del cliente hasta su respectiva salida del lugar.
Requerimientos:
Automatizar las operaciones que realizan los camareros, cajeros, recepcionistas y
cocineros dentro del restaurante.
Analizar y desarrollar los procesos pertinentes para la automatizacion de las
operaciones dentro del restaurante.
Contar con una base de datos que permita registrar y gestionar toda la informacion y
las operaciones que se realizan en el restaurante.
Segmentar las entidades que trabajaran en este nuevo sistema.
La informacion que va a gestionar este nuevo sistema tiene que ser almacenada bajo
una perfecta estructura relacional.
Se necesita que los procesos sean claros y eficientes.
No se puede eliminar la informacion permanentemente, porque esta sera usada para
realizar estudios estadisticos.
Se debe presentar el diagrama entidad – relacion desarrollado.
El sistema debe contar con la capacidad de poder asignar privilegios a los usuarios,
digase camarero, cajero entre otros.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 75
Presentacion del caso de estudio
El caso de estudio debera ser presentado en el aula, a traves de una presentacion en Power
Point. El tiempo de la presentacion es minimo 25 minutos y la presnetacion debe contener
lo siguiente:
Agenda
Descripcion del problema
Descripcion de procesos
Esquemas definidos
Entidades y atributos implementados
Tipo de datos
Restricciones utilizadas
Diagrama entidad – relacion
Recomendación
Describir su experiencia trabajando en este proyecto
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 76
UNIDAD XIV
Consultando múltiples tablas con JOIN
Metas de Aprendizaje:
Comprender el concepto e implementación de un join
Identificar qué tipo de join se debe aplicar en cada situación
Conocer las ventajas que proporcionan los join
Aprender a utilizar las relaciones entre dos o más tablas
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 77
Concepto de JOIN
Esta sentencia que proporciona SQL nos permite hacer una consulta combinando registros de
una o varias tablas en una base de datos relacional. Existen tres tipos de JOIN: interno,
externo y cruzado. En casos especiales, es necesario que se tenga que combinar una tabla con
si misma; este tipo de JOIN se le conoce como SELF-JOIN.
Características de JOIN
Un join se utiliza para consultar datos de más de una tabla.
La condición de un join que se vaya a establecer en una consulta, debe definirse en la
cláusula WHERE. Aunque se recomienda que se establezcan en la cláusula FROM.
Si se va a combinar una tabla por un campo donde ambos campos tengan el mismo
nombre, se deberá especificar un alias para ambas tablas.
Tipos de JOIN
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL JOIN
CROSS JOIN
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 78
INNER JOIN
Con esta operación se calcula el producto cruzado de todos los registros; así cada registro en
la tabla A es combinado con cada registro de la tabla B; pero solo permanecen aquellos
registros en la tabla combinada que satisfacen las condiciones que se especifiquen. Este es el
tipo de JOIN más utilizado, por lo que es considerado el tipo de combinación
predeterminado.
Existen dos formas de hacer un INNER JOIN: de manera explícita e implícita. Ambas son
similares solo cambia la forma de expresión. Por ejemplo:
“Se necesita obtener los id de facturas, él monto recibido y el nombre del usuario que
efectuó esa factura”
Tabla Facturas Tabla Usuarios
Tabla Clientes
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 79
CREATE TABLE Clientes
(
id_cliente int identity(1,1),
nombre varchar(60) NOT NULL,
apellido varchar(60) NOT NULL,
cedula varchar(13) NOT NULL,
direccion varchar(100) NOT NULL,
celular varchar(12) NOT NULL,
fecha_registro date,
CONSTRAINT pi_k PRIMARY KEY(id_cliente)
INSERT INTO Clientes VALUES('Carlos','Reyes','001-9876542-3','Calle El
Manantial esquina Nicolas de Ovando #45','829-345-6789',GETDATE())
INSERT INTO Clientes VALUES('Royel','Rodriguez','402-9898542-9','Calle D
#95','849-987-4567',GETDATE())
INSERT INTO Clientes VALUES('Cesar','Cordero','223-4567542-3','Calle
Osvaldo Jerez #66 Mi Hogar','829-335-0265',GETDATE())
CREATE TABLE Usuarios
(
id_usuario int identity(1,1),
nombre varchar(60) NOT NULL,
apellido varchar(60) NOT NULL,
nombre_usuario varchar(60) NOT NULL,
contrasena varchar(128) NOT NULL,
id_rol int NOT NULL,
fecha_registro date
CONSTRAINT p_k PRIMARY KEY(id_usuario)
)
INSERT INTO Usuarios
VALUES('Alexander','Gil','AlexGil','12345',1,GETDATE())
INSERT INTO Usuarios
VALUES('Ivan','Alburquerque','Ivan02','987654321',2,GETDATE())
INSERT INTO Usuarios
VALUES('Begni','Martinez','Begni9876','7685432',1,GETDATE())
INSERT INTO Usuarios VALUES('Jose','Lopez','JLopez','876543',2,GETDATE())
CREATE TABLE Facturas
(
id_factura int identity(1,1),
id_cliente int NOT NULL,
id_usuario int NOT NULL,
monto_total float NOT NULL,
monto_recibido float NOT NULL,
devuelta float NOT NULL,
fecha date,
CONSTRAINT pk PRIMARY KEY(id_factura),
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 80
CONSTRAINT fore FOREIGN KEY(id_cliente)
REFERENCES Cliente(id_cliente),
CONSTRAINT f_k FOREIGN KEY(id_usuario)
REFERENCES Usuarios(id_usuario)
)
INSERT INTO Facturas VALUES(2,1,4500,5000,500,GETDATE())
INSERT INTO Facturas VALUES(1,2,3800,4000,200,GETDATE())
INSERT INTO Facturas VALUES(1,3,350,400,50,GETDATE())
Forma explicita:
SELECT
f.id_factura,f.monto_recibido,u.nombre
FROM Facturas f
INNER JOIN Usuarios u ON(f.id_usuario=u.id_usuario)
Forma implícita:
SELECT
id_factura,monto_recibido,nombre
FROM Facturas,Usuarios
WHERE Facturas.id_usuario=Usuarios.id_usuario
Análisis de resultados
Observe que los resultados de la consulta usando el INNER JOIN de manera explícita e
implícita retorna el mismo resultado.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 81
Por qué solo los id_factura 1, 2 y 3?
La razón es sencilla, el INNER JOIN hace una combinación de registros que son equivalentes
entre sí, solamente va a combinar los registros de las tablas Facturas y Usuarios cuando los
id_usuario de la tabla Factura coincidan con los id_usuario de la tabla Usuarios.
Note que se insertaron 3 registros en la tabla Facturas, donde se especificaron los id_usuario
1, 2 y 3.
INSERT INTO Facturas VALUES(2,1,4500,5000,500,GETDATE())
INSERT INTO Facturas VALUES(1,2,3800,4000,200,GETDATE())
INSERT INTO Facturas VALUES(1,3,350,400,50,GETDATE())
Se insertaron 4 registros en la tabla Usuarios, como la sentencia INSERT solamente permite
insertar un registro por vez, los 3 primeros en este caso serían Alexander, Ivan y Begni. En la
tabla Facturas se especificaron los id_usuario 1,2 y 3, por eso, es que solamente aparecen
esas facturas de esos usuarios por que el INNER JOIN solamente combina los registros que
son equivalentes entre sí.
INSERT INTO Usuarios
VALUES('Alexander','Gil','AlexGil','12345',1,GETDATE())
INSERT INTO Usuarios
VALUES('Ivan','Alburquerque','Ivan02','987654321',2,GETDATE())
INSERT INTO Usuarios
VALUES('Begni','Martinez','Begni9876','7685432',1,GETDATE())
INSERT INTO Usuarios VALUES('Jose','Lopez','JLopez','876543',2,GETDATE())
Además que la condición del INNER JOIN se estableció en la cláusula ON. Cuando los
id_usuario de la tabla Facturas sean igual a los id_usuario de la tabla Usuarios.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 82
Forma explícita:
SELECT
f.id_factura,f.monto_recibido,u.nombre
FROM Facturas f
INNER JOIN Usuarios u ON(f.id_usuario=u.id_usuario)
Forma implícita:
SELECT
id_factura,monto_recibido,nombre
FROM Facturas,Usuarios
WHERE Facturas.id_usuario=Usuarios.id_usuario
Forma explícita vs implícita
La más usada es la forma explícita, por la razón de que esta permite establecer alias para las
tablas y es más fácil identificar las columnas mencionadas en una consulta porque se
mencionan por medio del alias y se evita así la confusión de pensar ¿De cual tabla es la
columna?
LEFT JOIN
La sentencia LEFT JOIN retorna la pareja de todos los valores de la izquierda con los valores
de la tabla de la derecha correspondientes, o retorna un valor nulo NULL en caso de no
correspondencia. El operador de combinación 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.
El resultado de esta operación siempre contiene todos los registros de la tabla de la izquierda
(la primera tabla que se menciona en la consulta), aun cuando no exista un registro
correspondiente en la tabla de la derecha para uno de la izquierda. La sentencia LEFT
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 83
OUTER JOIN retorna la pareja de todos los valores de la tabla izquierda con los valores de la
tabla de la derecha correspondientes, o retorna un valor nulo NULL en caso de no
correspondencia.
Usando el ejemplo anterior utilizado en INNER JOIN de tablas y registros, aplicaremos lo
siguiente:
Deshabilitaremos los CONSTRAINT para poder insertar nuevos registros para la prueba de la
sentencia LEFT JOIN
ALTER TABLE Clientes NOCHECK CONSTRAINT ALL
ALTER TABLE Facturas NOCHECK CONSTRAINT ALL
ALTER TABLE Usuarios NOCHECK CONSTRAINT ALL
Insertaremos dos nuevos registros en la tabla Factura
INSERT INTO Facturas VALUES(20,11,350,400,50,GETDATE())
INSERT INTO Facturas VALUES(35,15,350,400,50,GETDATE())
Ahora, consultaremos la tabla Factura usando LEFT JOIN. Esta consulta retornara los id de
factura, el monto recibido y el nombre del cliente
Análisis de resultados
SELECT
f.id_factura,f.monto_recibido,c.nombre
FROM Facturas f
LEFT JOIN Clientes c ON(f.id_cliente=c.id_cliente)
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 84
Observe que el resultado de la consulta retorna dos valores null de la columna nombre. ¿Por
qué?
La sentencia LEFT JOIN retorna los registros de la tabla izquierda que coincidan con los de
la derecha y retorna valores null cuando no existe correspondencia. Recuerde que se
insertaron 3 registros en la tabla clientes.
INSERT INTO Clientes VALUES('Carlos','Reyes','001-9876542-3','Calle El
Manantial esquina Nicolas de Ovando #45','829-345-6789',GETDATE())
INSERT INTO Clientes VALUES('Royel','Rodriguez','402-9898542-9','Calle D
#95','849-987-4567',GETDATE())
INSERT INTO Clientes VALUES('Cesar','Cordero','223-4567542-3','Calle
Osvaldo Jerez #66 Mi Hogar','829-335-0265',GETDATE())
En la tabla Factura, se insertaron 2 nuevas facturas, las instrucciones son:
INSERT INTO Facturas VALUES(20,11,350,400,50,GETDATE())
INSERT INTO Facturas VALUES(35,15,350,400,50,GETDATE())
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 85
Observe que se usaron como id_usuario los id 20 y 35 que no existen en la tabla ya que solo
registramos anteriormente 4, pero, estamos asumiendo que si existían y que fueron
eliminados de la tabla Usuarios. Por otro lado, los id_cliente que se especificaron en las
sentencias INSERT fueron 11 y 15 que estamos asumiendo que existían en la tabla Clientes
pero que fueron eliminados para alcanzar el objetivo de la demostración de LEFT JOIN.
Cuando consultamos la tabla usando la sentencia LEFT JOIN, esta retorna el siguiente
resultado:
La razón de los valores null es porque el LEFT JOIN que especificamos en la cláusula ON
establece la condición cuando los id_cliente de la tabla Facturas sean igual a los id_cliente de
la tabla Clientes y ya que los id_cliente 20 y 35 no existen en la tabla Clientes, la consulta
retorna valores null en el campo nombre.
RIGHT JOIN
Esta operación es inversa a la anterior; el resultado de esta operación siempre contiene todos
los registros de la tabla de la derecha (la segunda tabla que se menciona en la consulta), aun
cuando no exista un registro correspondiente en la tabla de la izquierda para uno de la
derecha. La sentencia RIGHT OUTER JOIN retorna la pareja de todos los valores de la tabla
derecha con los valores de la tabla de la izquierda correspondiente, o retorna un valor nulo
NULL en caso de no correspondencia, por ejemplo:
SELECT
f.id_factura,f.monto_recibido,c.nombre
FROM Facturas f
RIGHT JOIN Clientes c ON(f.id_cliente=c.id_cliente)
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 86
Esta consulta retornaría el id_factura, monto_recibido y nombre de la tabla Factura
combinada con la tabla Clientes cuando el id_cliente de la tabla derecha, ósea Clientes,
coincida o no en la tabla izquierda ósea Factura.
Esta consulta retorna los nombres de los clientes, pero, como es un RIGHT JOIN, los
id_cliente no existen en la tabla Factura. Por tal razón, los id_factura y monto_recibido se
reflejan como NULL.
FULL JOIN
Esta operación presenta los resultados de tabla izquierda y tabla derecha aunque no tengan
correspondencia en la otra tabla. La tabla combinada contendrá, entonces, todos los registros
de ambas tablas y presentará valores null para registros sin pareja.
SELECT
f.id_factura,f.monto_recibido,c.nombre
FROM Facturas f
FULL JOIN Clientes c ON(f.id_cliente=c.id_cliente)
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 87
La consulta retorna los registros que coinciden o no pero de ambas tablas.
CROSS JOIN
Presenta el producto cartesiano de todos los registros de las dos tablas. Este omite la
condición en el JOIN. El código SQL para realizar este producto cartesiano enuncia las tablas
que serán combinadas, pero no incluye algún predicado que filtre el resultado.
SELECT
f.*,c.*
FROM Facturas f
CROSS JOIN Clientes c
CROSS JOIN combina todos los campos sin ninguna condición.
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 88
UNIDAD XV
Funciones de fecha y formas de conversión de datos
Metas de Aprendizaje:
Comprender el uso de las funciones de fecha
Aprender a convertir tipos de datos
Conocer las ventajas y desventajas de las funciones de fecha
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 89
Funciones de fecha
Función Descripción
DATEADD
Retorna un valor date con el intervalo number
especificado, agregado a un valor
DATEPART especificado de ese valor date.
DATEADD (datepart , number , date)
DECLARE @FECHA DATE = '1-8-2011'
SELECT 'YEAR' 'PERIODO ',
DATEADD(YEAR,1,@FECHA) 'NUEVA
FECHA'
UNION ALL
SELECT
'QUARTER',DATEADD(QUARTER,1,@FECHA)
UNION ALL
SELECT
'MONTH',DATEADD(MONTH,1,@FECHA)
UNION ALL
SELECT 'DAY',DATEADD(DAY,1,@FECHA)
UNION ALL
SELECT 'WEEK',DATEADD(WEEK,1,@FECHA)
GO
DATEDIFF Retorna el número de límites DATEPART de
fecha y hora entre dos fechas especificadas.
SET DATEFORMAT DMY
DECLARE @FECHAINICIAL DATE = '01-08-
2011';
DECLARE @FECHAFINAL DATE = '01-09-
2011';
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 90
SELECT DATEDIFF(DAY,
@FECHAINICIAL,@FECHAFINAL) AS
'DURACION'
DATENAME Retorna una cadena de caracteres que
representa el DATEPART especificado de la
fecha especificada.
DATENAME ( datepart , date )
SELECT DATENAME(MONTH, GETDATE()) AS
'MES';
DATEPART Retorna un entero que representa el
DATEPART especificado del date
especificado.
DATEPART ( datepart , date )
SELECT DATEPART(MONTH, GETDATE()) AS
'MES';
DAY Devuelve un entero que representa la parte
del día DATEPART de la fecha especificada.
SELECT DAY('01/9/2011') AS 'DÍA DEL
MES';
GETDATE() Retorna la fecha del sistema
SELECT GETDATE() 'FECHA DEL SISTEMA';
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 91
MONTH
Retorna un entero que representa el mes de
date especificado. MONTH devuelve el
mismo valor que DATEPART (month, date).
SELECT MONTH(GETDATE()) AS 'MES DE LA
FECHA DE
SISTEMA';
YEAR Retorna un entero que representa el año de
date especificado. YEAR devuelve el mismo
valor que DATEPART (year, date).
SELECT YEAR(GETDATE()) AS 'AÑO DE LA
FECHA DE SISTEMA';
Funciones para manipular cadenas
Función Descripción
LEFT() Retorna la parte izquierda de una cadena de
caracteres con el número de caracteres
especificado.
LEFT(expresión_caracter,
integer_expression)
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 92
LEN() Retorna el número de caracteres de la
expresión de cadena especificad, excluidos
los espacios en blanco finales.
LEN(string)
LOWER() Retorna una expresión de caracteres después
de convertir en minúsculas los datos de
caracteres en mayúsculas.
LOWER(expresion_caracter)
LTRIM() Retorna una expresión de caracteres tras
quitar todos los espacios iniciales en blanco.
LTRIM(expresion_caracter)
RTRIM() Retorna una cadena de caracteres después de
truncar todos los espacios en blanco finales.
RTRIM(expresion_caracter)
UPPER() Retorna una expresión de caracteres con
datos de caracteres en minúsculas convertidos
a mayúsculas.
UPPER(expresion_caracter)
SUBSTRING() Devuelve parte de una expresión de
caracteres, binaria, de texto o de imagen.
SUBSTRING(valor_expresion,
inicio_expresion,
longitud_expresion)
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 93
Funciones de conversión de datos
Función Descripción
CAST() Esta función convierte una expresión a un
tipo de dato.
CAST(expresión AS
tipo_dato[(longitud)])
CONVERT() Convierte una expresión a un tipo de dato,
pero, con un estilo.
CONVERT(tipo_dato [(longitud)],
expresión [, estilo])
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 94
UNIDAD XVI
Uso de Sub - Consultas
Metas de Aprendizaje:
Comprender el uso de las funciones de fecha
Aprender a convertir tipos de datos
Conocer las ventajas y desventajas de las funciones de fecha
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 95
Definición de Sub – Consulta
Una sub - consulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT.
Normalmente se utilizan para filtrar una cláusula WHERE o HAVING con el conjunto de
resultados de la sub - consulta, aunque también pueden utilizarse en la lista de selección.
Consideraciones para hacer una sub – consulta:
Primero se ejecuta la sub – consulta y luego la consulta principal.
Se analiza el resultado que retorna la sub – consulta, para luego ser utilizado en la
consulta principal.
Es necesario encerrar las sub – consultas entre paréntesis.
No usar clausulas ORDER BY dentro de una sub – consulta.
Utilice operadores para consultas que trabajaran sobre varios registros.
Tipos de sub - consultas
Por un solo registros
Por múltiples registros
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 96
Sub – consulta para un único registro
En este tipo de sub – consultas solo se necesita retornar un solo valor. Para hacer una sub
– consulta que tenga que retornar un solo valor, se necesitan usar operadores lógicos de
comparación. Por ejemplo:
Operador Significado
= Igual que
> Mayor que
< Menor que
>= Mayor igual que
<= Menor igual que
<> Diferente de
¿Cómo retornar un solo registro con una sub - consulta?
Utilizando funciones de grupo como MIN() o MAX(). También haciendo uso de la cláusula
WHERE o HAVING para obtener un solo resultado. Recuerde que los SELECT que están
dentro de paréntesis son las sub – consultas.
SELECT
f.id_factura,f.monto_recibido,c.nombre
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 97
FROM Facturas f
INNER JOIN Clientes c ON(f.id_cliente=c.id_cliente)
WHERE c.id_cliente= (SELECT id_cliente FROM Clientes WHERE id_cliente=2)
SELECT
f.id_factura,f.monto_recibido,c.nombre
FROM Facturas f
INNER JOIN Clientes c ON(f.id_cliente=c.id_cliente)
WHERE c.id_cliente= (SELECT MIN(id_cliente) FROM Clientes)
SELECT
f.id_factura,f.monto_recibido,c.nombre,c.apellido
FROM Facturas f
INNER JOIN Clientes c ON(f.id_cliente=c.id_cliente)
WHERE c.id_cliente= (SELECT MIN(id_cliente) FROM Clientes WHERE
apellido='Rodriguez')
SELECT
f.id_factura,SUM(f.monto_recibido),c.nombre,c.apellido
FROM Facturas f
INNER JOIN Clientes c ON(f.id_cliente=c.id_cliente)
GROUP BY f.id_factura,c.nombre,c.apellido
HAVING SUM(f.monto_recibido)= (SELECT MAX(monto_recibido) FROM Facturas)
Sub – consulta para múltiples registros
Para retornar múltiples registros utilizando una sub – consulta se deben utilizar operadores de
comparación. La siguiente tabla muestra los operadores que se deben utilizar:
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 98
Operador Descripción
IN Compara si uno o más de los elementos
retornados por la sub - consulta coinciden
con los de la lista de la consulta principal.
ANY Compara el valor de la consulta por
cualquiera de los valores que son retornados
por la sub - consulta.
ALL Compara el valor de la consulta con todos los
valores que retorna la sub - consulta.
¿Cómo retornar múltiples registros con una sub - consulta?
Usando los operadores ANY, IN y ALL se puede conseguir hacer una consulta que retorne
múltiples registros.
SELECT
f.id_factura,SUM(f.monto_recibido),c.nombre,c.apellido
FROM Facturas f
INNER JOIN Clientes c ON(f.id_cliente=c.id_cliente)
WHERE f.monto_recibido IN(SELECT MIN(monto_recibido) FROM Facturas)
GROUP BY f.id_factura,c.nombre,c.apellido
SELECT
f.id_factura,SUM(f.monto_recibido),c.nombre,c.apellido
FROM Facturas f
INNER JOIN Clientes c ON(f.id_cliente=c.id_cliente)
WHERE f.monto_recibido >ALL(SELECT MIN(monto_recibido) FROM Facturas)
GROUP BY f.id_factura,c.nombre,c.apellido
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 99
Bibliografía
Microsoft Developer Network (MSDN)
Guille SQL
Pinal Dave (SQL Authority)
Fundamentos de SQL – Autor: Andy Oppel & Robert Sheldon
POR JOSEPH ARQUIMEDES COLLADO & JOSE LUIS LOPEZ GONZALEZ 100