M B D R: Enero, 2015
M B D R: Enero, 2015
M B D R: Enero, 2015
Primera edición:
Enero 2015
Elaborado por:
Introducción ............................................................................................................................... 1
DELETE .............................................................................................................................. 37
Restricciones ........................................................................................................................ 47
El operador OR .................................................................................................................... 65
Características de JOIN.................................................................................................... 78
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.
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.
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.
Metas de Aprendizaje:
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.
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:
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:
É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.
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.
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.
Entidad y atributos
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.
Diagramas Entidad-Relación
Metas de Aprendizaje:
Atributo
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.
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.
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.
Metas de Aprendizaje:
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 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.
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.
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.
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.
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:
Los registros quedan ahora conformados en dos tablas que llamaremos ORDENES y
ARTICULOS_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.
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:
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
Metas de Aprendizaje:
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:
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.
Metas de Aprendizaje:
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.
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.
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
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.
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.
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.
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.
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.
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.
Metas de Aprendizaje:
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:
ALTER TABLE
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.
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:
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:
Tipos de datos
Metas de Aprendizaje:
Numéricos exactos
Tipo de datos
Descripción
bit Tipo de datos entero que puede aceptar los valores 1, 0 o NULL.
Tipo de datos
Descripción
Real
Fecha y hora
Tipo de datos
Descripción
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.
Tipo de datos
Descripción
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.
Tipo de datos
Descripción
Tipo de datos
Descripción
Metas de Aprendizaje:
Explicar su implementación
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.
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.
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
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.
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.
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*.
Definir una restricción en una tabla sigue dos formas, por ejemplo:
Figura
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.
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
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)
Metas de Aprendizaje:
Describir su forma.
Evaluar su importancia.
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.
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.
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:
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:
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.
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.
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:
Metas de Aprendizaje:
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:
<nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>|<nombre_vista>
[{,<nombre_tabla>|<nombre_vista>}]
Especificaciones de la instrucción
SELECT: Palabra clave y reservada que indica que la sentencia de SQL que queremos
ejecutar es de selección.
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.
“La figura muestra la estructura de la tabla Usuarios. Esta contiene siete campos”.
SELECT
*
FROM Usuarios
SELECT
nombre,apellido
FROM Usuarios
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
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
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:
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
“Esta figura muestra que usando el operador TOP se limita el retorno de filas. La tabla Usuarios contiene
cinco registros”.
=
>, >=, <, <=
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:
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'
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”.
Metas de Aprendizaje:
Especificar su operación.
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
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
UPDATE Factura
SET monto_recibido=500,id_usuario=1
WHERE monto_total>=2500 AND monto_total<=@3000
Metas de Aprendizaje:
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.
Puede aplicar instrucciones como esta porque solo eliminara uno o algunos registros de la
tabla.
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.
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.
Truncate
Delete
Caso de estudio
Metas de Aprendizaje:
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.
Requerimientos:
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
Metas de Aprendizaje:
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
Tipos de JOIN
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL JOIN
CROSS 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 Clientes
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.
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.
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.
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
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
Deshabilitaremos los CONSTRAINT para poder insertar nuevos registros para la prueba de la
sentencia LEFT JOIN
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)
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.
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)
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)
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
Metas de Aprendizaje:
Función Descripción
DATEADD
Retorna un valor date con el intervalo number
especificado, agregado a un valor
DATEPART especificado de ese valor date.
Función Descripción
LEN(string)
LOWER(expresion_caracter)
LTRIM(expresion_caracter)
RTRIM(expresion_caracter)
UPPER(expresion_caracter)
Función Descripción
CAST(expresión AS
tipo_dato[(longitud)])
CONVERT(tipo_dato [(longitud)],
expresión [, estilo])
Metas de Aprendizaje:
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.
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
<> Diferente de
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
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)
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:
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 100