Академический Документы
Профессиональный Документы
Культура Документы
i
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ejercicios con Insert, Update, y Delete 196
Procedimientos para agrupar y resumir datos en SQL Server. 203
Descargar Base de Datos Northwind 209
Ejercicios con Rollup y Cube 211
Transacciones 213
Funciones de fecha 215
Funciones matemáticas 223
Funciones de cadena 226
Funciones de Sistema 232
Ejercicios con IF y Funciones - 1 de 2 235
Ejercicios con IF y Funciones - 2 de 2 243
Procedimientos almacenados con parametros 253
Variables en procedimientos almacenados 260
Ejercicios de procedimientos almacenados - 1 de 2 265
Ejercicios de procedimientos almacenados - 2 de 2 274
TRIGGERS - Desencadenadores, disparadores 300
Ejercicios con Triggers 303
Vistas 316
ii
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Manual de Instalación de Microsoft SQL Server 2008.
Esta publicación va dirigido a profesionales de tecnología interesados en entender el proceso de instalación de Microsoft
SQL Server 2008, sus componentes, las recomendaciones de seguridad y el significado de todas las opciones disponibles
durante dicho proceso.
Introducciòn al manual
Si bien la instalación de Microsoft SQL Server 2008 no es complicada, es de gran importancia conocer acerca de lo que se
está realizando en cada uno de los pasos del proceso, realizar una instalación a ciegas podría terminar en una instalación
de más o menos servicios de los necesarios, en la implementación de malas prácticas de seguridad entre muchas otras.
Antes de Instalar
Es importante que antes de instalar SQL Server se tengan en cuenta algunas recomendaciones importantes:
2. Revisar que se cumpla con los requerimientos de hardware y software necesarios para instalar SQL Server 2008, la
información al respecto se encuentra en la documentación del producto.
3. Crear cuentas para los servicios de SQL Server, estas cuentas deben ser creadas con privilegios mínimos ya que
durante el proceso de instalación, el asistente les asignará los permisos necesarios para ejecutar los respectivos
servicios.
La creación de estas cuentas de servicio NO es obligatoria para poder instalar SQL Server, pero es una buena práctica de
seguridad
Instalando
A continuación se muestra una guía paso a paso de la instalación de SQL Server 2008, con sus componentes de
administración.
3
ING. JESUS MANUEL HERNANDEZ ZATARAIN
“En SQL Server Installation Center” es posible revisar información detallada acerca de requerimientos para la instalación,
recomendaciones de seguridad y adicionalmente realizar un chequeo de la configuración del sistema.
4
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ahora, vaya al tab “Installation”, y allí seleccione la opción “New SQL Server stand alone installation or add features to
an existing installation”
5
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Observe de nuevo el reporte y haga clic en “OK”
6
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Si está instalando una versión de pruebas (cómo en este ejemplo) de SQL Server, podrá seleccionar la opción
correspondiente para la edición que desee; en una instalación diferente, agregue la clave de producto y haga clic en
“Next”
7
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ahora, lea los términos de licencia y luego, si está de acuerdo seleccione la opción correspondiente y haga clic en “Next”
8
ING. JESUS MANUEL HERNANDEZ ZATARAIN
A continuación, se instalan componentes de soporte necesarios para la instalación, haga clic en “Install” para instalarlos
9
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ahora haga clic en “Next”
10
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ahora, deberá seleccionar las características de SQL server 2008 que desea instalar; Asegúrese de instalar los servicios
que en algún momento vaya a utilizar, si está totalmente seguro que no va a usar un servicio específico cómo Analysis
Services, limpie la casilla de verificación junto a él, y haga clic en “Next”
11
ING. JESUS MANUEL HERNANDEZ ZATARAIN
A continuación tendrá que decidir si la instancia que va instalar es una instancia por defecto o nombrada, en el segundo
caso tendrá que asignar a esta un nombre con el cual la reconocerá a futuro; si la instancia es creada por defecto, la
forma de conectarse a esta desde servidores o equipos clientes remotos, será por medio del nombre de la máquina o de
la dirección ip de la misma. Haga clic en “Next”
12
ING. JESUS MANUEL HERNANDEZ ZATARAIN
En la siguiente ventana, se encuentra un análisis de requerimientos de espacio, cuando se haya comprobado que cuenta
con el espacio de almacenamiento suficiente, haga clic en “Next”
13
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ahora, usted deberá configurar las cuentas con las cuales se ejecutará el servicio; la recomendación es utilizar diferentes
cuentas, sin embargo, en la imagen de la derecha usted puede observar cómo una cuenta es utilizada para ejecutar más
de un servicio, en la parte inferior podría seleccionar la opción para utilizar la misma cuenta para todos los servicios, en
cuyo caso solamente tendrá que escribir credenciales una vez, pero no estará cumpliendo con buenas prácticas de
seguridad. Después de configurar las cuentas, haga clic en el tab “Collation”
14
ING. JESUS MANUEL HERNANDEZ ZATARAIN
En Collation, observe los métodos de ordenamiento que van a ser utilizados tanto para SQL Server cómo para Analysis
Services; es importante que tenga un cuenta si existen regulaciones en su organización acerca del tipo de ordenamiento
a utilizar, y de no ser así, busque que tanto las bases de datos, cómo Analysis Services tengan modelos de ordenamiento
similares para evitar problemas cuando estos dos componentes se conecten entre sí. Haga clic en Next.
15
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ahora, tendrá que definir si va a utilizar un modelo de autenticación Windows o Mixto, y si especifica un modelo mixto
deberá escribir una contraseña para el usuario administrador tipo SQL; Recuerde que el modo mixto permite la
utilización de inicios de sesión tipo SQL (usuarios que no hacen parte de Windows) y es utilizada para dar acceso a SQL
Server desde aplicaciones, entre otras cosas. De todas maneras se recomienda por razones de seguridad y mientras sea
posible, utilizar el modo de autenticación tipo Windows. Agregue también como administrador a cualquier usuario que
vaya a cumplir con dicha tarea, por ejemplo el usuario que está ejecutando la instalación (Add current User) Haga clic en
“Data Directories”.
16
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ahora revise las ubicaciones físicas donde va a quedar instalado SQL Server y cada uno de sus componentes, Haga clic en
Next.
17
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Agregue los usuarios que van a ser administradores de Análisis Services, puede agregar al usuario con el que está
ejecutando la instalación o a cualquier otro usuario, vaya a “Data Directories”
18
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Revise la ubicación donde va a quedar almacenada la información de Analysis Services, haga clic en ‘’Next”
19
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Defina en qué modo va a instalar reporting services, puede instalarlo en el modo nativo (para que pueda usar reporting
services una vez termine la instalación sin necesidad de SharePoint), otro es el modo integrado con SharePoint (que
almacenara sus reportes en una librería de reportes de SharePoint) o bien puede instalar Reporting Services pero no
configurarlo, lo cual implica que luego debería realizar dicha configuración (esta opción se utilizaría si piensa realizar una
configuración escalada de Reporting Services) Para efectos de este ejemplo, seleccionamos el modo nativo. Haga clic en
“Next”
20
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ahora, seleccione las opciones para que se envíen reportes de errores y de uso de características hacia Microsoft y haga
clic en “Next”
21
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Haga clic en “Next”
22
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Revise el resumen y haga clic en “Install”
23
ING. JESUS MANUEL HERNANDEZ ZATARAIN
La instalación está siendo realizada
24
ING. JESUS MANUEL HERNANDEZ ZATARAIN
La instalación ha sido completada
25
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Si desea ver un resumen de la instalación, aquí encuentra un link hacia dicho registro de resumen; Haga clic en “Close”
para salir, la instalación ha sido terminada.
26
ING. JESUS MANUEL HERNANDEZ ZATARAIN
La instalación de todas las ediciones y componentes de SQL Server es similar al ejemplo que se mostró anteriormente,
recuerde que puede instalar todos los componentes o solo algunos de ellos en un equipo; por ejemplo, si se deseara
instalar únicamente los componentes cliente para desde allí conectarse a un servidor de SQL Server ubicado en un lugar
remoto, bastaría con seguir el mismo proceso de instalación y en la página de selección de componentes seleccionar
únicamente los componentes cliente; de la misma manera podría instalarse únicamente la documentación (libros en
pantalla), para tener una buena fuente de información y capacitación en cualquier máquina.
27
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Conocimientos básicos de SQL Server.
Lenguaje de control de datos (DCL) : Se basa en los derechos que tiene el usuario sobre la base da datos (Permisos).
SELECT
INSERT
UPDATE
DELETE
Elementos de sintaxis:
GO: Envia lotes de intrucciones de TRANSACT SQL a las herramientas y utilidades (Sirve para separar bloques de
instrucciones)
EXEC O EXECUTE: Ejecuta funciones definidas por el usuario, procedimientos de sistema y procedimientos almacenados.
Comentarios en SQL:
En línea: --
En Bloque: /* comentario */
Tablas en SQL:
Tabla master: Es la tabla que contiene como generar una base de datos y sobre ella, se crean todas las bases de datos.
28
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Tabla model: Es la tabla modelo, las bases de datos creadas se basan en esta tabla como modelo.
Tabla AdventureWorks, Northwind y Pubs: Son tablas de ejemplos que todo usuario puede trabajar con ellas.
Los nombres que se le dan a las tablas, lo primero es que no pueden empezar por un número, deben empezar por un
signo alfabético, pueden incluir el guion bajo ( _ ), la arroba @ y la almohadilla #.
EJEMPLO: @Contador.
EJEMPLO: @@Error
Tipos de datos:
Numéricos:
Fechas:
datetime à 0,333 s
smalldatetime à 1 minuto
Caracteres:
Texto e Imagen:
Text
29
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ntext
Rowversion
Binario:
Identificadores Unicos: Representa un identificador global único (GUID). Si queremos que no se repita el dato en la base
de datos, usamos este identificador
Uniqueidentifier
Operadores de SQL:
Lógicos:
AND, OR , NOT
De Comparación:
= Igual
< Menor
> Mayor
<> Diferente
30
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Creación y Administración de bases de datos - 1 de 3
Cada vez que generamos una base de datos la información de esta, se incluye dentro de la base de datos
Master en la tabla SysDataBases.
Si al crear la base de datos no establecemos una serie de valores para configurarla, toma como estos valores de
la base de datos Model, la cuál sirve de modelo para crear una base de datos por defecto.
Una base de datos está compuesta de dos tipos de archivo:
2. Registro de transacciones: Es donde se cargan todas las consultas antes de ejecutarlas en los archivos de
datos. Se ejecutan en este registro de transacciones y si el resultado es correcto, se ejecutan en los archivos de
datos. También sirve como histórico ya que almacena todas las transacciones realizadas.
a. LDF
31
ING. JESUS MANUEL HERNANDEZ ZATARAIN
(NAME = Nombre,
Filename = 'Ruta\NombredeArchivo.LDF',
Size = Tamaño por defecto
MaxSize = Tamaño máximo
FileGrowth = Porcentaje / tamaño de crecimiento)
32
ING. JESUS MANUEL HERNANDEZ ZATARAIN
El proceso CREATE DATABASE está asignando 5.00 MB en el disco 'EjemploData'.
El proceso CREATE DATABASE está asignando 3.00 MB en el disco 'EjemploLog'.
SP_HELPDB
Muestra todas las bases de datos del servidor, con su propietario, tamaño hora de creación etc.
SP_SPACEUSED
Muestra el espacio usado de la base de datos que estamos usando actualmente
Elije la base de datos Ejemplo con el comando use y en otra linea escribe exec sp_spaceused. Al ejecutar estas
instrucciones se mostrará algo parecido a la siguiente imagen.
33
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Creación y Administración de bases de datos - 2 de 3.
1. Modificamos la base de datos para añadirle el grupo de archivos secundario, para ello usaremos Add
FileGroup
2. Modificamos la base de datos para añadir un archivo NDF físico al grupo de archivos secundario, para ello
usaremos Add File. Sintaxis:
SP_HelpFile
Muestra información sobre archivos NDF.
Sintaxis: SP_HELPFILE @Filename = ‘Nombredearchivosinextensión’
Alter Database Base de datos Modify File (name = ‘nombre’, propiedades y valores a modificar)
35
ING. JESUS MANUEL HERNANDEZ ZATARAIN
4. Con Add File, podemos añadir un nuevo archivo NDF al archivo secundario de la base de datos elegido.
Sintaxis:
5. Con Remove File, podemos eliminar un archivo elegido de la base de datos Sintaxis:
Sintaxis:
36
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Opciones:
EmptyFile: Indica que el tamaño del archivo reducido, pase a otros archivos secundarios del mismo
grupo.
TruncateOnly: Indica que el tamaño reducido de la base de datos pasa al sistema operativo. Si no
ponemos ninguna opción esta es la opción por defecto.
NoTruncate: Indica que el tamaño reducido de la base de datos no pasa al sistema operativo
7. ShrinkDataBase
Opciones:
EmptyFile: Indica que el tamaño del archivo reducido, pase a otros archivos secundarios del mismo grupo.
TruncateOnly: Indica que el tamaño reducido de la base de datos pasa al sistema operativo. Si no ponemos ninguna
opción esta es la opción por defecto.
NoTruncate: Indica que el tamaño reducido de la base de datos no pasa al sistema operativo.
Ejemplo:
37
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Creación y Administración de bases de datos - 3 de 3.
1º) Crear una base de datos de Clientes con un tamaño de 40 MB y con crecimiento de un 10%.
on primary
(Name=Clientes_Data,
Filename='D:\ClientesData.MDF',
size=25MB,
Maxsize=100MB,
Filegrowth=10%)
log on
(Name=Clientes_Log,
Filename='D:\ClientesLog.LDF',
size=15MB,
Maxsize=40MB,
Filegrowth=10%)
38
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2º) Mostrar si la base de datos está junto a las demás y el espacio usado de mi nueva base de datos.
sp_helpdb
sp_spaceused
39
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3º) Crear un grupo de archivos en mi base de datos clientes que se llame Bajas.
Añadir dos archivos a ese grupo de archivos llamados RelacionAnual y que ocupen 5MB.
add file
(name='RelacionAnual1',
filename='D:\RelacionAnual1.NDF',
size=5MB)
to filegroup Bajas
40
ING. JESUS MANUEL HERNANDEZ ZATARAIN
alter database Clientes
add file
(name='RelacionAnual2',
filename='D:\RelacionAnual2.NDF',
size=5MB)
to filegroup Bajas
4º) Mostrar las características de los archivos que acabamos de incluir y de su grupo.
41
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Exec sp_Helpfile @filename='RelacionAnual1'
5º) Eliminar uno de los archivos del grupo Bajas y modificar el otro para darle un tamaño de 10 MB.
42
ING. JESUS MANUEL HERNANDEZ ZATARAIN
alter Database Clientes
Dbcc shrinkdatabase(Clientes, 2)
43
ING. JESUS MANUEL HERNANDEZ ZATARAIN
7º) Volver a aumentar el tamaño de la base de datos en 5 MB más.
44
ING. JESUS MANUEL HERNANDEZ ZATARAIN
alter Database Clientes
9º) Eliminar el grupo de Bajas de la base de datos junto con sus archivos. Eliminar también la base de datos.
45
ING. JESUS MANUEL HERNANDEZ ZATARAIN
remove filegroup bajas
use master
go
46
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Creación de tipos de datos y tablas.
Se basan en tipos de datos definidos por el SQL. Para crear un tipo de dato se usa un procedimiento almacenado del
sistema.
Administrador Corporativo => Eliges una Tabla => Procedimientos almacenados que empiecen por sp.
Ejemplo:
47
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2. Creación y eliminación de una tabla
Ejemplo:
48
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Para eliminarla una tabla se utiliza la siguiente sintaxis
Ejemplo:
Ejemplo:
49
ING. JESUS MANUEL HERNANDEZ ZATARAIN
alter table Pais add anio int null
Ejemplo:
50
ING. JESUS MANUEL HERNANDEZ ZATARAIN
4. Generación de valores de columnas
Sólo una columna con Identity, el tipo de dato debe ser entero int, numerico numeric o decimal, estos dos últimos con
escala cero.
Sintaxis:
Ejemplo:
51
ING. JESUS MANUEL HERNANDEZ ZATARAIN
create table NINONINO
(
identidad int identity(1,1) not null,
apellido nvarchar(10) null
)
Ejemplo:
52
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Restricciones de tablas en una base de datos.
Default
Sintaxis parcial .
53
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ejemplo
for Descripcion
Check
Sintaxis parcial
Ejemplo
54
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Primary key
Valores exclusivos
Sintaxis parcial
Ejemplo
alter table Producto add constraint Pk_Codigo primary key nonclustered (codigo)
55
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Unique
Sintaxis parcial
Ejemplo
56
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Foreign key
Sintaxis parcial
Ejemplo
alter table Producto add Constraint Fk_Pro_Cat Foreign Key (CategoriaID) References Categoria(CategoriaID)
"Realizo una referencia a la tabla Categoria y el campo CategoriaID para crear una restricción que solamente me permita
insertar Productos que esten en una Categoria de la tabla Categoria"
57
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Característica orientada a las claves externas.
Integridad referencial en cascada
Sintaxis parcial
[Constraint NombreRestriccion) [Foreign Key ] (Columna) References TablaRef (Columnas,…)
[On Delete {Cascade | No Action}]
[On Update {Cascade | No Action}]
NO Action es la predeterminada
-Products
PK ProductId
-Orders
PK OrderId
FK ProductId
Con cascade si borras, borrara lo que este asociado a ella en la otra tabla, pero con No Action no te
dejara borrarlo ya que esta asociado a otra tabla la cual tiene la clave principal.
Con cascade puedes borrar ProductId de products , lo cual borrara productId de orders, con No
Action no lo podras borrar.
Ejemplo
alter table Producto
add Constraint Fk_Pro_Cat Foreign Key (CategoriaID) References Categoria (CategoriaID)
58
ING. JESUS MANUEL HERNANDEZ ZATARAIN
On delete Cascade
On update Cascade
Con estas dos instrucciones al final de la restricción le estoy diciendo que borre todos los productos
de una categoria si dicha categoria es eliminado de la tabla Categoria. Lo mismo sucederá al
modificar.
Deshabilitacion de restricciones
Deshabilitación para la comprobación de los datos existentes o Aplicable a Check y Foreign Key o
Utilizar la opción With NoCheck
Sintaxis parcial
Alter Table [With Check | With NoCheck]
Add Constrain restriccion { Foreign key (Columna,…)
References TablaRef (Columna,…) { Check (Condicion)}
59
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Deshabilitación al cargar nuevos datos
Sintaxis parcial
Alter Table tabla {Check | NoCheck }
Constraint {All | Restricción 1, … } => Para hacer la restriccion a todo , o a sólo lo que está separado
por comas “,”
60
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Valores predeterminados y las reglas como objetos independientes.
Tener en cuenta:
DEFAULT
Sintaxis
use northwind
GO
CREATE DEFAULT Telefono_default AS '(00)000-0000'
GO
EXEC sp_bindefault Telefono_default,'Customers.Phone'
61
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Al desvincularlo de la tabla se invierten los valores
use northwind
EXEC sp_helpconstraint products
Para eliminar varios objetos de la base de datos con una sola sentencia
REGLAS
- Puede contener cualquier expresión valida para una clausula WHERE
- Una columna o tipo de dato definido por el usuario solo puede tener asociado una regla
Sintaxis
use Hospital
create rule Funcion_Rule
as
@Funcion in('INTERINO','ENFERMERO','ENFERMERA')
GO
62
ING. JESUS MANUEL HERNANDEZ ZATARAIN
EXEC sp_bindrule Funcion_rule,'Plantilla.Funcion'
use northwind
GO
CREATE RULE regioncode_rule
AS @regioncode >=1000 and @regioncode <=100
GO
EXEC sp_bindrule regioncode_rule,'Customers.Region'
63
ING. JESUS MANUEL HERNANDEZ ZATARAIN
O también
use northwind
GO
CREATE RULE regioncode_rule AS @regioncode like '[0-9][0-9 ][ 0-9]'
GO
EXEC sp_bindrule regioncode_rule,'Customers.Region'
64
ING. JESUS MANUEL HERNANDEZ ZATARAIN
A continuación, el primero de los procedimientos muestra el texto que se ha utilizado para crear la
regla, el segundo procedimiento renombra el objeto, se puede utilizar con cualquier tipo de objeto de
la base de datos.
Advertencia: al cambiar cualquier parte del nombre de un objeto pueden dejar de ser válidas
secuencias de comandos y procedimientos almacenados. El object ha cambiado su nombre por
'Funcion_Regla'.
65
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Estructuras de las tablas en SQL Server - 1 de 2.
on primary
name = Escuela_Data ,
filename = 'D:\Escuela_Data.mdf' ,
size = 5MB ,
maxsize = 10MB ,
filegrowth = 2%
log on
name = Escuela_Log ,
filename = 'D:\Escuela_Log.ldf' ,
size = 5MB ,
maxsize = 10MB ,
filegrowth = 2%
GO
66
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2. Crear tipos de datos que contengas los datos más comunes para nuestra base de datos. (Mirar las bases de datos y
cuales son sus campos más comunes). Comprobar si se han introducido correctamente estos datos, mostrando
solamente los Tipos de dato que hayamos introducido.
use Escuela
GO
67
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3. Crear la tabla COLEGIOS con los siguientes campos:
Localidad Texto
Provincia Texto
Año_Construcción Fecha
Coste_Construcción Moneda
Cod_Region Numérico
nombre TNoNulo ,
localidad TNulo ,
provincia TNulo ,
68
ING. JESUS MANUEL HERNANDEZ ZATARAIN
4. Crear la tabla PROFESORES con los siguientes campos :
Apellido1 Texto
Apellido2 Texto
Edad Numérico
Localidad Texto
Provincia Texto
Salario Money
69
ING. JESUS MANUEL HERNANDEZ ZATARAIN
create table profesores
cod_profe TNoNulo
nombre TNoNulo ,
apellido1 TNulo ,
apellido2 TNulo ,
localidad TNulo ,
provincia TNulo ,
salario money ,
references colegios(cod_colegio)
70
ING. JESUS MANUEL HERNANDEZ ZATARAIN
5. Crear la tabla REGIONES con los siguientes campos :
regiones TNoNulo
71
ING. JESUS MANUEL HERNANDEZ ZATARAIN
6. Crear la tabla ALUMNOS con los siguientes campos :
Apellido1 Texto
Apellido2 Texto
Fecha_nac Fecha/hora
Localidad Texto
Provincia Texto
nombre TNoNulo ,
72
ING. JESUS MANUEL HERNANDEZ ZATARAIN
apellido1 TNulo ,
apellido2 TNulo ,
fecha_nac smalldatetime ,
localidad TNulo ,
provincia TNulo ,
7. Crear una nueva relación entre el campo Cod_Region de la tabla REGIONES y Cod_Region de la tabla
colegios.
73
ING. JESUS MANUEL HERNANDEZ ZATARAIN
foreign key(cod_region)
references regiones(cod_region)
8. Crear un gráfico que muestre las relaciones que se han obtenido en la base de datos hasta ahora :
74
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Estructuras de las tablas en SQL Server - 2 de 2.
75
ING. JESUS MANUEL HERNANDEZ ZATARAIN
12. Borrar la relación existente entre la tabla profesores y Colegios :
sp_helpconstraint profesores
sp_helpconstraint colegios
alter table profesores drop constraint fk_profesores
13. Crear de nuevo la relación borrada en el ejercicio anterior que tenga relación en cascada y
actualización :
76
ING. JESUS MANUEL HERNANDEZ ZATARAIN
14. Agregar un identificador único en la tabla Regiones :
15. Queremos rellenar los datos de las tablas creadas, para ello vamos a introducir a tres alumnos
en los colegios. Los datos son los siguientes:
Alumnos:
Marta Serrano Lopez Provincia: Madrid Localidad: Madrid
Javier Morgado Palomo Provincia: Alicante Localidad: Arenales del sol
Miguel Torres Tormo Provincia: Barcelona Localidad: Llobregat
Rellenar las tablas convenientemente con datos relacionales. Ejemplo: Region: Comunidad
Valenciana, 3 datos como mínimo en cada tabla.
TABLA REGIONES
Nos dará error por el tipo de dato introducido en el campo regiones, debemos cambiar el tipo de dato
para poder utilizar la tabla
78
ING. JESUS MANUEL HERNANDEZ ZATARAIN
TABLA COLEGIOS
Antes de insertar verifica el código de la región. Debe ser el que te genero la tabla regiones.
79
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SELECT IDENT_SEED('REGIONES') AS [PRIMER VALOR]
SELECT IDENT_CURRENT('REGIONES') AS [VALOR ACTUAL]
SELECT IDENT_INCR('REGIONES') AS [INCREMENTO]
SELECT IDENTITYCOL,REGIONES FROM REGIONES
80
ING. JESUS MANUEL HERNANDEZ ZATARAIN
TABLA ALUMNOS
81
ING. JESUS MANUEL HERNANDEZ ZATARAIN
alter table alumnos alter column Localidad nvarchar(50) null
82
ING. JESUS MANUEL HERNANDEZ ZATARAIN
No se puede eliminar el dato porque está vinculado a una tabla, para poder eliminarlo deberíamos
modificar la tabla y cambiar todos los campos donde el dato está presente.
Borrar todas las tablas, tipos de datos y base de datos. Realizarlo en el siguiente orden.
83
ING. JESUS MANUEL HERNANDEZ ZATARAIN
exec sp_droptype TNulo
exec sp_droptype TNoNulo
go
use master
go
drop database Escuela
1. Crear una nueva base de datos llamada Prueba y las tablas Emp y Dept. Crear la integridad de los datos
utilizando reglas, valores por defecto entre otros, dependiendo del análisis que hagamos previamente.
Creo la base de datos
create database Prueba
on primary
(Name = 'Prueba_Data' ,
Filename = 'D:\Prueba_Data.mdf' ,
Size = 5MB ,
MaxSize = 8MB ,
Filegrowth = 2%)
Log on
(Name = 'Emp_Log' ,
Filename = 'D:\Prueba_Log.ldf' ,
84
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Size = 6MB ,
MaxSize = 8MB ,
Filegrowth = 2%)
Creo las tablas y utilizo los valores Null y Not Null convenientemente.
use Prueba
go
create table Emp
(Emp_no int not null ,
Apellido nvarchar(20) not null ,
Oficio nvarchar(20) not null ,
Dir int null ,
Fecha_alt smalldatetime null ,
Salario int null ,
Comision int null ,
Dept_no int null)
go
create table Dept
(Dept_no int not null ,
Dnombre nvarchar(19) not null ,
Loc nvarchar(20) null)
85
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Poner Restricción Primary Key en Departamento
Alter Table Dept
add constraint PK_Dept Primary Key(Dept_no)
86
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Poner la Foreign Key en Empleados
Alter Table Emp
add constraint FK_Emp Foreign Key (Dept_no)
references Dept (Dept_no)
on Update Cascade
on Delete Cascade
87
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Creo una restricción Check para la Fecha
Alter Table Emp
add constraint CK_Fecha Check (Fecha_alt > '01/01/1970' and Fecha_alt <= GetDate())
88
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Creo una restricción Default para la localidad en Departamento
Alter Table Dept
add constraint DF_Loc Default 'DESCONOCIDA' for Loc
Creo una regla para que todos los empleados tengan asociado director
GO
Create Rule Director_Rule as @Director in(7566,7698,7782,7839)
GO
--Para vincular regla a la columna
exec sp_bindrule Director_Rule, 'Emp.Dir'
--Para desvincular regla a la columna
exec sp_unbindrule 'Emp.Dir', Director_Rule
89
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2. Insertar los datos convenientemente para verificar la integridad de nuestra base de datos
Inserto un departamento
Inserto un empleado
90
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Cambio el código de director (Dir) a uno que exista en la regla.
Cambio la fecha de ingreso del empleado (Fecha_alt) a una que este entre el intervalo
definido en la restricción Check.
91
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Estructura de Base de Datos Hospital – Ejemplo.
Para los temas y ejemplos siguientes vamos a necesitar esta base de datos llamada hospital, la cual nos
proporcionará el soporte para nuestras consultas SQL.
Si deseas la puedes crear a manera de practicas desde tu editor SQL o bien puedes descargarlo desde el link
que dejo al final de esta publicación o también desde el indice de esta serie de publicaciones.
Sin mas preámbulos les presento la estructura de la base de datos Hospital. Vamos a sacarle el máximo de
provecho.
92
ING. JESUS MANUEL HERNANDEZ ZATARAIN
93
ING. JESUS MANUEL HERNANDEZ ZATARAIN
94
ING. JESUS MANUEL HERNANDEZ ZATARAIN
95
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Descarga base de datos Hospital.
http://sh.st/jj8cr
USE MASTER
GO
CREATE DATABASE Hospital
On Primary
(Name = EjemploData,
Filename = 'D:\Hospital.mdf',
Size = 5MB, MaxSize = 10MB,
Filegrowth = 20%)
Log on
(NAME = EjemploLog,
Filename = 'D:\Hospital.ldf',
Size = 3MB,
MaxSize = 5MB,
FileGrowth = 1MB)
GO
USE Hospital
GO
CREATE TABLE Dept
(
Dept_No INT NOT NULL,
DNombre VARCHAR(50) NULL,
Loc VARCHAR(50) NULL,
CONSTRAINT PK_Dept PRIMARY KEY(Dept_No)
)
GO
CREATE TABLE Emp
(
Emp_No INT NOT NULL,
Apellido VARCHAR(50) NULL,
Oficio VARCHAR(50) NULL,
Dir INT NULL,
Fecha_Alt SMALLDATETIME NULL,
Salario NUMERIC(9,2) NULL,
Comision NUMERIC(9,2) NULL,
Dept_No INT NULL
CONSTRAINT PK_Emp PRIMARY KEY(Emp_No),
CONSTRAINT FK_Emp_Dept FOREIGN KEY (Dept_No) REFERENCES Dept(Dept_No)
)
GO
CREATE TABLE Hospital
96
ING. JESUS MANUEL HERNANDEZ ZATARAIN
(
Hospital_Cod INT NOT NULL,
Nombre VARCHAR(50) NULL,
Direccion VARCHAR(50) NULL,
Telefono VARCHAR(50) NULL,
Num_Cama INT NULL,
CONSTRAINT PK_Hospital PRIMARY KEY(Hospital_Cod)
)
GO
CREATE TABLE Doctor
(
Doctor_No INT NOT NULL,
Hospital_Cod INT NOT NULL,
Apellido VARCHAR(50) NULL,
Especialidad VARCHAR(50) NULL
CONSTRAINT PK_Doctor PRIMARY KEY(Doctor_No),
CONSTRAINT FK_Doctor_Hospital FOREIGN KEY (Hospital_Cod) REFERENCES Hospital(Hospital_Cod)
)
GO
CREATE TABLE Sala
(
Sala_Cod INT NOT NULL,
Hospital_Cod INT NOT NULL,
Nombre VARCHAR(50) NULL,
Num_Cama INT NULL
CONSTRAINT PK_Sala PRIMARY KEY(Sala_Cod,Hospital_Cod),
CONSTRAINT FK_Sala_Hospital FOREIGN KEY (Hospital_Cod) REFERENCES Hospital(Hospital_Cod)
)
GO
CREATE TABLE Plantilla
(
Empleado_No INT NOT NULL,
Sala_Cod INT NOT NULL,
Hospital_Cod INT NOT NULL,
Apellido VARCHAR(50) NULL,
Funcion VARCHAR(50) NULL,
T VARCHAR(15) NULL,
Salario NUMERIC(9,2) NULL
CONSTRAINT PK_Plantilla PRIMARY KEY(Empleado_No),
CONSTRAINT FK_Plantilla_Sala01 FOREIGN KEY (Sala_Cod,Hospital_Cod) REFERENCES
Sala(Sala_Cod,Hospital_Cod)
)
GO
CREATE TABLE Enfermo
(
Inscripcion INT NOT NULL,
Apellido VARCHAR(50) NULL,
Direccion VARCHAR(50) NULL,
Fecha_Nac VARCHAR(50) NULL,
S VARCHAR(2) NULL,
NSS INT NULL
97
ING. JESUS MANUEL HERNANDEZ ZATARAIN
)
Bien, ahora nos toca insertar datos en las tablas. La sintaxis SQL de inserción "para datos fijos o ingresados de
forma manual" la podemos clasificar en 3 formas:
INSERT INTO nombre_tabla VALUES (valor1,valor2,valor3,...)
INSERT INTO nombre_tabla (columna1,columna2,columna3,...) VALUES (valor1,valor2,valor3,...)
INSERT INTO nombre_tabla (columna1,columna2,columna3,...) VALUES (valor1,valor2,valor3,...),
(valor1,valor2,valor3,...), (valor1,valor2,valor3,...), (valor1,valor2,valor3,...), ...
Ya conociendo la sintaxis, podemos insertar los datos. Al final de la publicación dejo el script SQL con los
datos listos para insertar. A manera de practica intenta insertar los datos de algunas de las siguientes tablas.
Tabla DEPT
Tabla DOCTOR
Tabla EMP
98
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Tabla ENFERMO
Tabla HOSPITAL
Tabla PLANTILLA
99
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Tabla SALA
http://sh.st/freeze/http://sh.st/jn4zB
Bien es momento de utilizar la base de datos "Hospital" creada en publicaciones anteriores, para realizar las básicas
consultas de selección, que se presentan en toda aplicación informática.
A manera de práctica, realiza las consultas en tu Analizador de Consultas SQL para comprobar los resultados. Recuerda
que digitando se va quedando en la mente y vas comprendiendo poco a poco.
102
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 SELECT * FROM EMP
2. Mostrar el apellido, oficio, salario, salario anual, con las dos extras para aquellos empleados con comisión mayor de
100000.
3. Idéntico del anterior, pero para aquellos empleados que su salario anual con extras supere los 2200000
103
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3 WHERE SALARIO * 14 > 2200000
4. Idéntico del anterior, pero para aquellos empleados que sumen entre salario anual con extras y comisión los 3
millones.
5. Mostrar todos los datos de empleados ordenados por departamento y dentro de este por oficio para tener una visión
jerárquica.
104
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 SELECT * FROM EMP ORDER BY DEPT_NO, OFICIO
105
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Consultas de Selección en SQL Server - Parte 2.
8. Igual que el anterior, para los nacidos antes de 1970 ordenados por número de inscripción descendente
9. Listar todos los datos de la plantilla del hospital del turno de mañana
106
ING. JESUS MANUEL HERNANDEZ ZATARAIN
10. Idem del turno de noche.
11. Visualizar los empleados de la plantilla del turno de mañana que tengan un salario entre 200000 y 225000.
12. Visualizar los empleados de la tabla emp que no se dieron de alta entre el 01/01/80 y el 12/12/82.
1 SELECT * FROM EMP WHERE FECHA_ALT NOT BETWEEN '01/01/1980' AND '31/12/1982'
107
ING. JESUS MANUEL HERNANDEZ ZATARAIN
13. Mostrar los nombres de los departamentos situados en Madrid o en Barcelona.
14. Mostrar aquellos empleados con fecha de alta posterior al 1 de Julio de 1985.
15. Lo mismo que en el ejercicio 14 pero con salario entre 150000 y 400000.
108
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 SELECT * FROM EMP
16. Igual que en el ejercicio 15, pero también incluimos aquellos que no siendo analista pertenecen al departamento 20.
17. Mostrar aquellos empleados cuyo apellido termine en ‘Z’ ordenados por departamento, y dentro de este por
antigüedad.
109
ING. JESUS MANUEL HERNANDEZ ZATARAIN
18. De los empleados del ejercicio 17 quitar aquellos que superen los 200000 mensuales.
110
ING. JESUS MANUEL HERNANDEZ ZATARAIN
20. Igual que el ejercicio 19, pero mostrándolos de forma que se aprecien las diferencias de salario dentro de cada oficio.
111
ING. JESUS MANUEL HERNANDEZ ZATARAIN
21. Del ejercicio 20, nos quedamos solo con aquellos cuyo número de empleado no este entre 7600 y 7900.
112
ING. JESUS MANUEL HERNANDEZ ZATARAIN
24. Mostrar que personal “No Interino” existe en cada sala de cada hospital, ordenado por hospital y sala.
2 FROM PLANTILLA
25. Justificar el resultado de la siguiente consulta SELECT APELLIDO DISTINCT DEPT_NO FROM EMP
113
ING. JESUS MANUEL HERNANDEZ ZATARAIN
26. Seleccionar los distintos valores del sexo que tienen los enfermos.
2 FROM ENFERMO
27. Indicar los distintos turnos de la plantilla del hospital, ordenados por turno y por apellido.
2 FROM PLANTILLA
114
ING. JESUS MANUEL HERNANDEZ ZATARAIN
28. Seleccionar las distintas especialidades que ejercen los médicos, ordenados por especialidad y apellido.
2 FROM DOCTOR
EJEMPLO: LIKE ‘%een’ Muestra todos los caracteres que acaben con een
EJEMPLO: LIKE ‘%een%’ Muestra todos los caracteres que contengan een en ese orden
EJEMPLO: LIKE ‘_en’ Muestra todos los caracteres que contenga tres letras y acaben en en
EJEMPLO: LIKE ‘[CK% ]’ Muestra todos los caracteres que empiecen por C o K
EJEMPLO: LIKE ‘[S-V]ing’ Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en ing
EJEMPLO: LIKE ‘M[^c]%’ Todos los que empiecen por M y segunda letra no sea una c. No hay limite de caracteres.
116
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3. Seleccionar todos los empleados que contengan en su apellido ER.
4. Mostrar todos los empleados cuyo nombre sea de 4 letras y su apellido termine con la letra a
5. Mostrar todos los empleados cuyo apellido comience entre las letras E y F.
117
ING. JESUS MANUEL HERNANDEZ ZATARAIN
6. Mostrar todos los empleados cuyo apellido comience por la letra A, contenga dentro de su apellido de la letra A a la M
y que terminen en O.
7. Mostrar todos los empleados cuyo apellido comience por la letra M y la segunda letra no sea una A.
8. Mostrar todos los empleados cuyo apellido sea de 5 letras y su tercera letra sea entra la A y la S terminando en Z.
118
ING. JESUS MANUEL HERNANDEZ ZATARAIN
9. Mostrar todos los empleados cuyo apellido sea de 6 letras y no comience entre la A y la D.
10. Mostrar todos los que empiecen por la A y cuya cuarta letra no esté comprendida entre A – G
Hola nuevamente!! Te recuerdo que para esta serie de ejercicios estamos utilizando la base de datos Hospital, la
cual puedes descargarla desde el indice. Sin más que decir vayamos al punto.
Las funciones de agregado son funciones que se utilizan para calcular valores en las tablas. Si queremos usarlas
combinándolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son funciones.
Con la sentencia group by no se utiliza la clausula where, se utilizara una clausula propia de la
expresión: HAVING. Equivalente a where
AVG: Realiza la media sobre la expresión dada, debe ser un tipo de dato Int.
1. Encontrar el salario medio de los analistas, mostrando el número de los empleados con oficio
analista.
2. Encontrar el salario mas alto, mas bajo y la diferencia entre ambos de todos los empleados con
oficio EMPLEADO.
120
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3. Visualizar los salarios mayores para cada oficio.
121
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 SELECT DEPT_NO AS [Nº DE DEPARTAMENTO]
2 , COUNT(*) AS [Nº DE PERSONAS] FROM EMP
3 GROUP BY DEPT_NO HAVING COUNT(*) > 3
7. Visualizar el número de enfermeros, enfermeras e interinos que hay en la plantilla, ordenados por
la función.
122
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Funciones de agregado - Parte 2.
8. Visualizar departamentos, oficios y número de personas, para aquellos departamentosque tengan dos o más personas
trabajando en el mismo oficio.
9. Calcular el salario medio, Diferencia, Máximo y Mínimo de cada oficio. Indicando el oficio y el número de empleados
de cada oficio.
10. Calcular el valor medio de las camas que existen para cada nombre de sala. Indicar el nombre de cada sala y el
número de cada una de ellas.
123
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 SELECT SALA_COD AS [SALA], NOMBRE
11. Calcular el salario medio de la plantilla de la sala 6, según la función que realizan. Indicar la función y el número de
empleados.
12. Averiguar los últimos empleados que se dieron de alta en la empresa en cada uno de los oficios, ordenados por la
fecha.
2 GROUP BY OFICIO
3 ORDER BY 1
124
ING. JESUS MANUEL HERNANDEZ ZATARAIN
13. Mostrar el número de hombres y el número de mujeres que hay entre los enfermos.
14. Mostrar la suma total del salario que cobran los empleados de la plantilla para cada función y turno.
125
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2 GROUP BY HOSPITAL_COD
2 WHERE FUNCION='ENFERMERA'
4 ORDER BY 1
JOIN
Se usa para combinar resultados entre varias tablas. Microsoft recomienda usar Join ya que
consume menos recursos.
Para ver como manejamos este tipo de consultas.
Consultas Internas
Combina las tablas comparando los valores comunes de los campos indicados mediante
combinaciones cruzadas.
126
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Sintaxis:
- Inner Join: Indica que combine los campos con resultados comunes
- Full Join: Indica que combine todos los campos aunque los resultados sean diferentes.
Ejemplos :
1 SELECT APELLIDO,OFICIO,DNOMBRE
2 FROM EMP
3 INNER JOIN DEPT
4 ON EMP.DEPT_NO=DEPT.DEPT_NO
ORDER BY DEPT.DNOMBRE
5
127
ING. JESUS MANUEL HERNANDEZ ZATARAIN
La combinación Full Join muestra las coincidencias de la tabla Dept con Emp, más los valores que
no coincidan, como el departamento Producción, que no tiene empleados.
1 SELECT APELLIDO,OFICIO,DNOMBRE
2 FROM EMP
4 ON EMP.DEPT_NO=DEPT.DEPT_NO
5 ORDER BY DEPT.DNOMBRE
Se podría decir que es como la suma de utilizar left join y right join.
128
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Consultas de combinación en SQL Server - Parte 2.
Consultas Externas
Al igual que las consultas de combinación internas, combina los valores comunes de los campos
indicados y además de la tabla que queramos, devuelve también el resto de valores aunque no
coincidan. Para ello usaremos las siguientes opciones combinadas con join:
Sintaxis:
- Left Join: Indica que muestre todos los resultados de la columna de la izquierda
- Right Join: Indica que muestre todos los resultados de la columna de la derecha
- Cross Join: Muestra un producto cartesiano combinando todos los resultados de las dos tablas.
Ejemplos 1:
1 SELECT APELLIDO,OFICIO,DNOMBRE
2 FROM EMP
3 LEFT OUTER JOIN DEPT
4 ON EMP.DEPT_NO=DEPT.DEPT_NO
ORDER BY DEPT.DNOMBRE
5
Si existiera algún empleado que no tenga asignado un departamento, la consulta traería los datos del
empleado, pero el nombre del departamento tendría el valor null porque no tendría ningún
departamento asociado y en la consulta le estamos diciendo que seleccione los empleados aunque
no tengan departamento asociado, ponemos como principal la tabla de la izquierda (EMP).
129
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ejemplo 2:
1 SELECT APELLIDO,OFICIO,DNOMBRE
2 FROM EMP
3 RIGHT OUTER JOIN DEPT
4 ON EMP.DEPT_NO=DEPT.DEPT_NO
ORDER BY DEPT.DNOMBRE
5
En esta consulta el departamento de producción tiene valores null porque le hemos dicho que
seleccione la tabla de la derecha como principal (dept), con lo cual selecciona todos los campos
de la tabla departamentos con coincidencias con emp o sin ellas.
130
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ejemplo 3:
1 SELECT APELLIDO,OFICIO,DNOMBRE
2 FROM EMP
3 CROSS JOIN DEPT
Realiza un producto cartesiano combinando todos los empleados con todos los departamentos.
131
ING. JESUS MANUEL HERNANDEZ ZATARAIN
132
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Combinaciones con mas de dos tablas
Ya hemos visto como combinar 2 tablas con inner join, el siguiente ejemplo muestra como combinar
las 3 tablas que tenemos en la base de datos. Podremos combinar tantas tablas como queramos
usando inner join o full join.
1
2 SELECT P.APELLIDO AS [APELLIDO]
,S.NOMBRE AS [SALA]
3 ,H.NOMBRE AS [HOSPITAL],
4 S.NUM_CAMA AS [Nº DE CAMAS]
5 FROM PLANTILLA P INNER JOIN SALA AS S
6 ON P.HOSPITAL_COD = S.HOSPITAL_COD
AND P.SALA_COD = S.SALA_COD
7 INNER JOIN HOSPITAL AS H
8 ON H.HOSPITAL_COD = P.HOSPITAL_COD
9
133
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Podremos usar tantos inner join como queramos en nuestras consultas, pero habrá que tener
cuidado a la hora de realizar las combinaciones para que no salgan productos cartesianos en la
consulta.
Esta consulta devuelve el nombre del empleado, el nombre de la sala donde trabaja, el nombre del
hospital y el número de camas.
Para ello crearemos dos copias de la misma tabla poniéndole un alías, para posteriorme nte
combinar los resultados de ambas copias.
1
SELECT A.EMP_NO AS [PRIMER EMPLEADO]
2 ,A.APELLIDO,A.DEPT_NO
3 ,B.EMP_NO AS [SEGUNDO EMPLEADO],
4 B.APELLIDO
5 FROM EMP AS A INNER JOIN EMP AS B
ON A.EMP_NO = B.EMP_NO
6 ORDER BY B.EMP_NO
7
134
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Base de datos Pubs - SQL Server.
Para poder realizar los ejercicios de consultas, con tablas combinadas mediante las instrucciones JOIN, tanto
internas como externas, necesitaremos de la base de datos Pubs. La cual comparto tanto en diagrama como
el script de la creación e inserción de datos. Descargenlo al final de esta publicación o desde el indice, es
necesario si deseas seguir esta serie de ejercicios. Puedes hacer clic en la imagen para agrandarla.
135
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Descargar Base de Datos Pubs Aquí.
http://sh.st/jn4D8
136
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Uso de Join SQL Server - Ejercicios con combinaciones internas y
externas.
1) Realizar una consulta que muestre los nombres de los autores y editores ubicados en la misma ciudad
1
USE PUBS
2 SELECT A.AU_FNAME AS [NOMBRE]
3 ,A.AU_LNAME AS [APELLIDO]
4 ,P.PUB_NAME AS [EDITOR]
5 FROM AUTHORS AS A
ON
7
A.CITY = P.CITY
8
2) Obtener todos los nombres y editores de todos los libros cuyos anticipos pagados son superiores a 7500
1 USE PUBS
,P.PUB_NAME AS [EDITOR]
3
,T.ADVANCE AS [ANTICIPO]
4
FROM TITLES AS T
5
INNER JOIN PUBLISHERS AS P
6
ON
7
T.PUB_ID=P.PUB_ID
8 WHERE
9 T.ADVANCE>7500
137
ING. JESUS MANUEL HERNANDEZ ZATARAIN
10
3) Seleccionar todos los titulos, nombre y apellidos del autor de todos los libros de cocina tradicional.
1
SELECT A.AU_LNAME AS [NOMBRE]
2
,A.AU_FNAME AS [APELLIDO]
3
,T.TITLE AS [TITULO]
4 FROM AUTHORS AS A
6 ON
7 A.AU_ID=TA.AU_ID
138
ING. JESUS MANUEL HERNANDEZ ZATARAIN
4) Seleccione nombre, apellido de los autores y el nombre de la editorial de todos aquellos escritores cuya ciudad sea la
misma que la de la editorial. Pero en la consulta también se incluirán los demás autores de la tabla authors
1
SELECT A.AU_LNAME AS [NOMBRE]
2 ,A.AU_FNAME AS [APELLIDO]
3 ,P.PUB_NAME AS [EDITOR]
4 FROM AUTHORS AS A
ON
6
A.CITY=P.CITY
7
5) Recuperar los títulos y el índice del almacén de todos los libros que vendieron más de 25 unidades.
139
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1
SELECT S.STOR_ID AS [ALMACEN ID]
2 ,T.TITLE AS [TITULO]
3 FROM TITLES AS T
5 ON
6 T.TITLE_ID = S.TITLE_ID
WHERE
7
S.QTY>25
8
6) Modificación al ejercicio anterior: incluir también los títulos de aquellos libros que no superaron las 25 unidades en
sus ventas
2 ,T.TITLE AS [TITULO]
3 FROM TITLES AS T
5 ON
140
ING. JESUS MANUEL HERNANDEZ ZATARAIN
7) Realizar una consulta que devuelva el titulo, editorial y autor de cada libro.
5 ON
6 T.PUB_ID = P.PUB_ID
ON
8
TA.TITLE_ID = T.TITLE_ID
9
INNER JOIN AUTHORS AS A
10
ON
11
TA.AU_ID = A.AU_ID
141
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Descargar Scripts SQL
http://sh.st/jn5J7
--1) Realizar una consulta que muestre los nombres de los autores y editores ubicados en la misma ciudad
USE PUBS
SELECT A.AU_FNAME AS [NOMBRE]
,A.AU_LNAME AS [APELLIDO]
,P.PUB_NAME AS [EDITOR]
FROM AUTHORS AS A
INNER JOIN PUBLISHERS AS P
ON
A.CITY = P.CITY
--2) Obtener todos los nombres y editores de todos los libros cuyos anticipos pagados son superiores a 7500
USE PUBS
142
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SELECT T.TITLE AS [TITULO]
,P.PUB_NAME AS [EDITOR]
,T.ADVANCE AS [ANTICIPO]
FROM TITLES AS T
INNER JOIN PUBLISHERS AS P
ON
T.PUB_ID=P.PUB_ID
WHERE
T.ADVANCE>7500
--3) Seleccionar todos los titulos, nombre y apellidos del autor de todos los libros de cocina tradicional.
--4) Seleccione nombre, apellido de los autores y el nombre de la editorial de todos aquellos escritores cuya ciudad sea
la misma que la de la editorial. Pero en la consulta también se incluirán los demás autores de la tabla authors
--5) Recuperar los títulos y el índice del almacén de todos los libros que vendieron más de 25 unidades.
--6) Modificación al ejercicio anterior: incluir también los títulos de aquellos libros que no superaron las 25 unidades en
sus ventas
--7) Realizar una consulta que devuelva el titulo, editorial y autor de cada libro.
1. Seleccionar el apellido, oficio, salario, numero de departamento y su nombre de todos los empleados cuyo
salario sea mayor de 300000
1
SELECT E.APELLIDO
2
,E.OFICIO
3 ,E.SALARIO
5 ,DNOMBRE AS [DEPARTAMENTO]
6 FROM EMP AS E
144
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2. Mostrar todos los nombres de Hospital con sus nombres de salas correspondientes.
4 S.HOSPITAL_COD = H.HOSPITAL_COD
2 ,D.LOC AS [CIUDAD]
3 FROM EMP AS E
145
ING. JESUS MANUEL HERNANDEZ ZATARAIN
4 RIGHT OUTER JOIN DEPT AS D
5 ON D.DEPT_NO = E.DEPT_NO
GROUP BY D.LOC
6
4. Visualizar cuantas personas realizan cada oficio en cada departamento mostrando el nombre del
departamento.
SELECT D.DNOMBRE AS [Nº DEPARTAMENTO]
1 ,COUNT(*) AS [Nº DE PERSONAS]
2 ,E.OFICIO
3 FROM EMP E
ON E.DEPT_NO = D.DEPT_NO
5
GROUP BY E.DEPT_NO, E.OFICIO,D.DNOMBRE
146
ING. JESUS MANUEL HERNANDEZ ZATARAIN
5. Contar cuantas salas hay en cada hospital, mostrando el nombre de las salas y el nombre del hospital.
1
SELECT COUNT(S.NOMBRE) AS [NUMERO DE SALAS]
2 ,S.NOMBRE AS [SALA]
3 ,H.NOMBRE AS [HOSPITAL]
4 FROM SALA AS S
ON H.HOSPITAL_COD = S.HOSPITAL_COD
6
GROUP BY S.NOMBRE,H.NOMBRE
7
2 ,D.DNOMBRE AS [DEPARTAMENTO]
3 FROM EMP E
5 ON D.DEPT_NO = E.DEPT_NO
GROUP BY D.DNOMBRE
6
147
ING. JESUS MANUEL HERNANDEZ ZATARAIN
7. Buscar aquellos departamentos con cuatro o mas personas trabajando.
1
SELECT D.DNOMBRE AS [DEPARTAMENTO]
2 ,COUNT(*) AS [Nº DE PERSONAS]
3 FROM EMP E
5 ON E.DEPT_NO = D.DEPT_NO
GROUP BY D.DEPT_NO,D.DNOMBRE
6
HAVING COUNT(*) >= 4
7
8. Calcular el valor medio de las camas que existen para cada nombre de sala. Indicar el nombre de cada sala
y el codigo de cada una de ellas.
2 ,NOMBRE
3 ,SALA_COD
4 FROM SALA
GROUP BY NOMBRE,SALA_COD
5
148
ING. JESUS MANUEL HERNANDEZ ZATARAIN
9. Calcular la media salarial por ciudad.
4 ON D.DEPT_NO = E.DEPT_NO
GROUP BY D.LOC
5
10. Mostrar los doctores junto con el nombre de hospital en el que ejercen, la dirección y el teléfono del
mismo.
1
SELECT D.APELLIDO
2 ,H.NOMBRE
3 ,H.DIRECCION
4 ,H.TELEFONO
5 FROM DOCTOR D
149
ING. JESUS MANUEL HERNANDEZ ZATARAIN
11. Mostrar los nombres de los hospitales junto con el mejor salario de los empleados de cada hospital.
3 FROM PLANTILLA P
5 ON P.HOSPITAL_COD = H.HOSPITAL_COD
GROUP BY H.NOMBRE
6
12. Visualizar el nombre de los empleados de la plantilla junto con el nombre de la sala, el nombre del hospital
y el número de camas libres de cada una de ellas.
2 ,S.NOMBRE AS [SALA]
3 ,H.NOMBRE AS [HOSPITAL],
150
ING. JESUS MANUEL HERNANDEZ ZATARAIN
4 S.NUM_CAMA AS [Nº DE CAMAS]
ON P.HOSPITAL_COD = S.HOSPITAL_COD
6
AND P.SALA_COD = S.SALA_COD
7
INNER JOIN HOSPITAL AS H
8
ON H.HOSPITAL_COD = P.HOSPITAL_COD
13. Visualizar el máximo salario, mínimo salario de los empleados dependiendo de la ciudad en la que
trabajen. Indicando el número total de trabajadores por ciudad.
1
SELECT COUNT(E.EMP_NO) AS [Nº DE TRABAJADORES]
2
,D.LOC AS [CIUDAD]
3 ,MAX(E.SALARIO) AS [SALARIO MÁXIMO]
5 FROM EMP E
ON E.DEPT_NO = D.DEPT_NO
7
GROUP BY D.LOC
151
ING. JESUS MANUEL HERNANDEZ ZATARAIN
14. Averiguar la combinación de que salas podría haber por cada uno de los hospitales.
3 FROM SALA AS S
152
ING. JESUS MANUEL HERNANDEZ ZATARAIN
15. Mostrar el Numero de empleado, apellido, oficio y Nombre del departamento de los empleados, junto al
Número de empleado, apellido, oficio y Nombre del departamento de sus subordinados respectivamente, para
obtener una visión jerarquica de la empresa.
SELECT A.EMP_NO AS [Nº DE EMPLEADO]
1
,A.APELLIDO AS [JEFE], A.OFICIO
2
,D.DNOMBRE AS [DEPARTAMENTO]
3
,B.EMP_NO AS [Nº EMPLEADO]
4 ,B.APELLIDO AS [SUBORDINADO]
5 ,B.OFICIO
6 ,D.DNOMBRE AS [DEPARTAMENTO]
7 FROM EMP AS A
153
ING. JESUS MANUEL HERNANDEZ ZATARAIN
12 ORDER BY B.DIR
13
14
http://sh.st/jn49J
--1. Seleccionar el apellido, oficio, salario, numero de departamento y su nombre de todos los empleados cuyo salario
sea mayor de 300000
SELECT E.APELLIDO
,E.OFICIO
,E.SALARIO
,D.DEPT_NO AS [Nº DEPT]
,DNOMBRE AS [DEPARTAMENTO]
FROM EMP AS E
INNER JOIN DEPT AS D ON
E.DEPT_NO = D.DEPT_NO
WHERE E.SALARIO > 300000
--2. Mostrar todos los nombres de Hospital con sus nombres de salas correspondientes.
154
ING. JESUS MANUEL HERNANDEZ ZATARAIN
--3. Calcular cuantos trabajadores de la empresa hay en cada ciudad.
--4. Visualizar cuantas personas realizan cada oficio en cada departamento mostrando el nombre del departamento.
--5. Contar cuantas salas hay en cada hospital, mostrando el nombre de las salas y el nombre del hospital.
--8. Calcular el valor medio de las camas que existen para cada nombre de sala. Indicar el nombre de cada sala y el
codigo de cada una de ellas.
--10. Mostrar los doctores junto con el nombre de hospital en el que ejercen, la dirección y el teléfono del mismo.
SELECT D.APELLIDO
,H.NOMBRE
,H.DIRECCION
,H.TELEFONO
FROM DOCTOR D
INNER JOIN HOSPITAL H
ON H.HOSPITAL_COD = D.HOSPITAL_COD
--11. Mostrar los nombres de los hospitales junto con el mejor salario de los empleados de cada hospital.
--12. Visualizar el nombre de los empleados de la plantilla junto con el nombre de la sala, el nombre del hospital y el
número de camas libres de cada una de ellas.
--13. Visualizar el máximo salario, mínimo salario de los empleados dependiendo de la ciudad en la que trabajen.
Indicando el número total de trabajadores por ciudad.
--14. Averiguar la combinación de que salas podría haber por cada uno de los hospitales.
--15. Mostrar el Numero de empleado, apellido, oficio y Nombre del departamento de los empleados, junto al Número
de empleado, apellido, oficio y Nombre del departamento de sus subordinados respectivamente, para obtener una
visión jerarquica de la empresa.
157
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Operador Union en SQL Server.
Es un operador que combina un conjunto de resultados, por ejemplo, una sentencia SELECT con
OTRA.
Ejemplo:
?
1
SELECT APELLIDO,
2 OFICIO AS
3 'OFICIO/FUNCION'
4 ,SALARIO FROM EMP
5 UNION
6 SELECT APELLIDO,
FUNCION, SALARIO FROM
7 PLANTILLA
8
158
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Recomendaciones a la hora de usar las combinaciones:
159
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SubConsultas en SQL Server.
160
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Para correlacionar datos
- Expresión dinámica que cambia en cada fila de una consulta externa
- Es una combinación entre la subconsulta y la fila de la consulta externa.
- Dividen consultas complejas con dos o más consultas simples relacionadas
?
1 SELECT APELLIDO, OFICIO,DEPT_NO
2 FROM EMP AS E
3 WHERE 20 <
4 (SELECT DEPT_NO FROM DEPT AS D
5 WHERE E.DEPT_NO = D.DEPT_NO
AND D.DNOMBRE = 'VENTAS')
6
?
1 SELECT DISTINCT E1.OFICIO FROM EMP AS E1
2 WHERE E1.OFICIO IN(SELECT E2.OFICIO FROM EMP AS E2
3 WHERE E1.DEPT_NO <> E2.DEPT_NO)
Se debe utilizar antes una combinación que una subconsulta, la combinación sería asi, dando los mismos
resultados:
?
SELECT DISTINCT E1.OFICIO FROM EMP AS E1
1 INNER JOIN EMP AS E2
161
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2 ON E1.OFICIO = E2.OFICIO
3 WHERE E1.DEPT_NO <> E2.DEPT_NO
4
Esta es la consulta utilizando el HAVING, que es la que deberíamos utilizar antes que una subconsulta de
simulación HAVING:
?
1 SELECT E1.APELLIDO,E1.OFICIO, E1.SALARIO
2 FROM EMP AS E1
3 INNER JOIN EMP AS E2
4 ON E1.OFICIO = E2.OFICIO
5 GROUP BY E1.OFICIO, E1.SALARIO,E1.APELLIDO
HAVING E1.SALARIO > AVG (E2.SALARIO)
6
162
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SubConsultas en SQL Server
Es una SELECT anidada en una instrucción INSERT, DELETE, SELECT o UPDATE.
163
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Para correlacionar datos
- Expresión dinámica que cambia en cada fila de una consulta externa
- Es una combinación entre la subconsulta y la fila de la consulta externa.
- Dividen consultas complejas con dos o más consultas simples relacionadas
?
1 SELECT APELLIDO, OFICIO,DEPT_NO
2 FROM EMP AS E
3 WHERE 20 <
4 (SELECT DEPT_NO FROM DEPT AS D
5 WHERE E.DEPT_NO = D.DEPT_NO
AND D.DNOMBRE = 'VENTAS')
6
164
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Clausulas EXISTS Y NOT EXISTS en SQL Server.
Recomendaciones:
Utilizar subconsultas para dividir una consulta compleja.
Utilizar Alias para tablas en subconsultas correlacionadas y combinaciones.
Utilizar EXISTS en vez de IN
Saludos seguidores del manual SQL Server. A continuación los ejercicios de subconsultas utilizando la Base
de Datos Hospital. Descarguen el script de la BD en el indice si aún no la tienen.
1. Mostrar el numero de empleado, el apellido y la fecha de alta del empleado mas antiguo de la empresa
1 SELECT EMP_NO,APELLIDO,
165
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2. Mostrar el numero de empleado, el apellido y la fecha de alta del empleado mas modernos de la empresa.
1 SELECT EMP_NO,APELLIDO,
3. Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jiménez.
4. Queremos saber el apellido, oficio, salario y número de departamento de los empleados con salario mayor
que el mejor salario del departamento 30.
1 SELECT APELLIDO, OFICIO, SALARIO, DEPT_NO FROM EMP WHERE SALARIO >
2 (SELECT
166
ING. JESUS MANUEL HERNANDEZ ZATARAIN
5. Mostrar el apellido, la función, sala o departamento de todos los empleados que trabajen en la empresa.
1
SELECT E.APELLIDO, E.OFICIO AS [CARGO EN EMPRESA], D.DNOMBRE AS [OFICINA]
2
FROM EMP AS E
3
INNER JOIN DEPT AS D
4
ON E.DEPT_NO = D.DEPT_NO<
5
UNION
6 SELECT P.APELLIDO, P.FUNCION, S.NOMBRE
7 FROM PLANTILLA AS P
9 ON P.HOSPITAL_COD = S.HOSPITAL_COD
UNION
11
SELECT D.APELLIDO, D.ESPECIALIDAD, H.NOMBRE
12
FROM DOCTOR AS D
13
INNER JOIN HOSPITAL AS H
14
ON D.HOSPITAL_COD = H.HOSPITAL_COD
15
ORDER BY 3
16
167
ING. JESUS MANUEL HERNANDEZ ZATARAIN
6. Averiguar el salario de todos los empleados de la empresa, de forma que se aprecien las diferencias entre
ellos.
2 UNION
168
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3 SELECT APELLIDO, SALARIO FROM PLANTILLA
4 ORDER BY 2 DESC
7. Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que el de
cualquier empleado de ventas.
4 ORDER BY 2
169
ING. JESUS MANUEL HERNANDEZ ZATARAIN
8. Mostrar los empleados que tienen mejor salario que la media de los directores, no incluyendo al presidente.
9. Mostrar el apellido, función, salario y código de hospital de los empleados de la plantilla que siendo
enfermeros o enfermeras pertenecen al hospital SAN CARLOS.
2 (FUNCION
170
ING. JESUS MANUEL HERNANDEZ ZATARAIN
10. Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiología.
11. Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General.
3 NOMBRE =
12. Mostrar el apellido de los enfermos que nacieron antes que el Señor Miller.
2 FROM
171
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Descargar Scripts SQL.
http://sh.st/jn6tE
--1. Mostrar el numero de empleado, el apellido y la fecha de alta del empleado mas antiguo de la empresa
SELECT EMP_NO,APELLIDO,
FECHA_ALT FROM EMP WHERE FECHA_ALT = (SELECT MIN(FECHA_ALT) FROM EMP)
--2. Mostrar el numero de empleado, el apellido y la fecha de alta del empleado mas modernos de la empresa.
SELECT EMP_NO,APELLIDO,
FECHA_ALT FROM EMP WHERE FECHA_ALT = (SELECT MAX(FECHA_ALT) FROM EMP)
--3. Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jiménez.
--4. Queremos saber el apellido, oficio, salario y número de departamento de los empleados con salario mayor que el
mejor salario del departamento 30.
SELECT APELLIDO, OFICIO, SALARIO, DEPT_NO FROM EMP WHERE SALARIO > (SELECT
MAX (SALARIO) FROM EMP WHERE DEPT_NO = 30)
--5. Mostrar el apellido, la función, sala o departamento de todos los empleados que trabajen en la empresa.
172
ING. JESUS MANUEL HERNANDEZ ZATARAIN
UNION
SELECT P.APELLIDO, P.FUNCION, S.NOMBRE
FROM PLANTILLA AS P
INNER JOIN SALA AS S
ON P.HOSPITAL_COD = S.HOSPITAL_COD
AND P.SALA_COD = S.SALA_COD
UNION
SELECT D.APELLIDO, D.ESPECIALIDAD, H.NOMBRE
FROM DOCTOR AS D
INNER JOIN HOSPITAL AS H
ON D.HOSPITAL_COD = H.HOSPITAL_COD
ORDER BY 3
--6. Averiguar el salario de todos los empleados de la empresa, de forma que se aprecien las diferencias entre ellos.
--7. Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que el de cualquier
empleado de ventas.
--8. Mostrar los empleados que tienen mejor salario que la media de los directores, no incluyendo al presidente.
--9. Mostrar el apellido, función, salario y código de hospital de los empleados de la plantilla que siendo enfermeros o
enfermeras pertenecen al hospital SAN CARLOS.
173
ING. JESUS MANUEL HERNANDEZ ZATARAIN
--10. Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiología.
--11. Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General.
--12. Mostrar el apellido de los enfermos que nacieron antes que el Señor Miller.
SELECT APELLIDO FROM ENFERMO WHERE FECHA_NAC < (SELECT FECHA_NAC FROM
ENFERMO WHERE APELLIDO = 'MILLER B.')
Variables
Definidas en una instrucción DECLARE (Con una sola @)
Valores asignados con instrucción SET o SELECT (Con una sola @)
Ámbito global o local
Sintaxis:
Bucles
Nivel de instrucción:
Bloques BEGIN......END
174
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Bloques IF.............ELSE
Construcciones WHILE
Ejemplos:
1
--IF
2 DECLARE @N INT
3 SET @N = 5
4 IF (@N % 2)= 0
5 PRINT 'PAR'
ELSE
6 PRINT 'IMPAR'
7
1
2 --BUCLES
DECLARE @N INT
3 SET @N = 1
4 WHILE @N < 10
5 BEGIN
6 IF (@N % 2) = 0
SELECT @N AS NUMERO
7 SET @N = @N + 1
8 END
9
175
ING. JESUS MANUEL HERNANDEZ ZATARAIN
CASE en SQL Server.
Las expresiones a nivel de fila evalúan un resultado devuelto por la consulta y dependiendo de los valores que utilicemos
lo sustituyen para mejorar la presentación de los datos.
1
CASE expresion
2 WHEN valor1 THEN resultado1
3 ELSE resultadoN
4 END
5 CASE
ELSE resultado2
7
END
8
1 --CASE
2 DECLARE @N INT
3 SET @N = 1
4 WHILE (@N<100)
176
ING. JESUS MANUEL HERNANDEZ ZATARAIN
5 BEGIN
13
EJEMPLO:
Esto se puede utilizar también para inicializar variables. Es el mismo caso pero utilizando el CASE para inicializar una
variable.
177
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2 SET @N = 1
BEGIN
4
IF (@N < 50)
5
SET @VALOR = 'MENOR DE 50'
6
ELSE
7
SET @VALOR = 'MAYOR DE 50'
8
SET @TIPO = CASE (@N % 2)
9 WHEN 1 THEN 'IMPAR'
10 ELSE 'PAR'
11 END
SET @N = @N + 1
13
END
14
15
178
ING. JESUS MANUEL HERNANDEZ ZATARAIN
CONVERT se usa para convertir el numero a una cadena de dos caracteres y lo concatenamos con @tipo.
1
DECLARE @N INT,@TIPO CHAR(10)
2
SET @N = 5
3
IF (@N BETWEEN 4 AND 6)
4
BEGIN
5
WHILE (@N > 0)
6 BEGIN
9 ELSE 'PAR'
10 END
179
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ejercicios con CASE en SQL Server.
1. Queremos saber a qué empleados eliminariamos si quitasemos los departamentos 10 y 30 y cúales se mantendrían.
Mostrar un informe con el apellido, salario, oficio y fechas de alta en la empresa.
3 ELSE
4 'SE MANTIENE'
5 END
180
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2. Debemos hacer recortes de salario en la empresa, para ello debemos saber a que personas recortaremos el sueldo,
cuales se mantendrán y cuales subiremos el puesto. Utilizar todos los empleados de la empresa(Plantilla y Empleados)
Cuando el salario sea menor de 100000, Subiremos sueldo, cuando esté entre 100000 y 250000 lo mantendremos y
cuando sea superior, lo bajaremos.
6 FROM EMP
7 UNION
181
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3. Queremos saber que empleados de la plantilla trabajan en turno de tarde, noche o en otros, para ello mostraremos
‘Tarde’ o ‘Noche’ dependiendo de sus valores.
182
ING. JESUS MANUEL HERNANDEZ ZATARAIN
4. Queremos cambiar de localidad en Barcelona, para ello tenemos que saber qué empleados cambiarian de localidad y
cúales no. Combinar tablas y mostrar el nombre del departamento junto a los datos del empleado.
1
SELECT D.DNOMBRE AS [DEPARTAMENTO]
2 ,E.APELLIDO,'CAMBIAR DE LOCALIDAD' = CASE
4 ELSE
6 END
183
ING. JESUS MANUEL HERNANDEZ ZATARAIN
5. Queremos saber el número de trabajadores que cambiarían de localidad si cambiasemos a Barcelona y que número
de trabajadores no cambiarian de localidad.
1
SELECT COUNT(E.EMP_NO) AS [Nº DE TRABAJADORES],
2 D.LOC AS [CIUDAD],'CAMBIAR' = CASE
5 END
ON D.DEPT_NO = E.DEPT_NO
7
GROUP BY D.LOC
8
184
ING. JESUS MANUEL HERNANDEZ ZATARAIN
6. Mostrar el apellido, la dirección, la fecha de nacimiento mostrando la década en la que está cada persona y el sexo
mostrando si es masculino o femenino de la tabla enfermo.
12 ELSE
19 FROM ENFERMO
20 ORDER BY FECHA_NAC,S
185
ING. JESUS MANUEL HERNANDEZ ZATARAIN
7. Mostrar el apellido, el salario, el oficio y el nombre del departamento de todos los empleados aunque no tengan
departamento. Si no tienen departamento mostraré que no tienen departamento. Mostraré además si tienen comisión
o si no tienen comisión.
1 SELECT E.APELLIDO,E.OFICIO,E.SALARIO
2 ,DEPARTAMENTO =
3 ISNULL(D.DNOMBRE,'SIN DEPARTAMENTO')
10 ON E.DEPT_NO = D.DEPT_NO
11 ORDER BY D.DNOMBRE
186
ING. JESUS MANUEL HERNANDEZ ZATARAIN
8. Mostrar todas las camas que existen para cada hospital y cada sala. Mostraré el nombre del hospital, las salas y su
número de camas. Si no hubiese camas para algún hospital las dejaré a 0. También mostraré que son muchas camas
cuando sean más de 90, buen número cuando sean mayores de 40 y pocas camas para las demás.
6 ELSE
7 'POCAS CAMAS'
8 END
FROM SALA AS S
9
FULL JOIN HOSPITAL AS H
10
ON H.HOSPITAL_COD = S.HOSPITAL_COD
11
GROUP BY H.NOMBRE,S.NUM_CAMA,S.NOMBRE
12
ORDER BY H.NOMBRE,S.NUM_CAMA
187
ING. JESUS MANUEL HERNANDEZ ZATARAIN
13
9. Seleccionar qué empleados están dentro de la media y cuales están por debajo de la media, mostrando el apellido,
oficio, salario, comisión y el nombre de los departamentos. No dejar ningún campo a NULL.
3 SELECT E.APELLIDO,E.OFICIO,E.SALARIO,E.COMISION
4 ,MEDIA = CASE
11 ON E.DEPT_NO = D.DEPT_NO
12 GROUP BY E.APELLIDO,E.OFICIO,E.SALARIO,E.COMISION,D.DNOMBRE
13 ORDER BY MEDIA
188
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Descargar Scripts SQL
http://sh.st/jnlwo
--1. QUEREMOS SABER A QUÉ EMPLEADOS ELIMINARIAMOS SI QUITASEMOS LOS DEPARTAMENTOS 10 Y 30 Y CÚALES SE
MANTENDRÍAN. MOSTRAR UN INFORME CON EL APELLIDO, SALARIO, OFICIO Y FECHAS DE ALTA EN LA EMPRESA.
--2. DEBEMOS HACER RECORTES DE SALARIO EN LA EMPRESA, PARA ELLO DEBEMOS SABER A QUE PERSONAS
RECORTAREMOS EL SUELDO, CUALES SE MANTENDRÁN Y CUALES SUBIREMOS EL PUESTO. UTILIZAR TODOS LOS
EMPLEADOS DE LA EMPRESA(PLANTILLA Y EMPLEADOS)
--CUANDO EL SALARIO SEA MENOR DE 100000, SUBIREMOS SUELDO, CUANDO ESTÉ ENTRE 100000 Y 250000 LO
MANTENDREMOS Y CUANDO SEA SUPERIOR, LO BAJAREMOS.
189
ING. JESUS MANUEL HERNANDEZ ZATARAIN
'BAJAR SUELDO'
END
FROM EMP
UNION
SELECT APELLIDO,SALARIO, 'ACCION' = CASE
WHEN SALARIO < 100000 THEN 'SUBIR SUELDO'
WHEN SALARIO BETWEEN 150000 AND 250000 THEN 'MANTENER SUELDO'
ELSE
'BAJAR SUELDO'
END
FROM PLANTILLA
--3. QUEREMOS SABER QUE EMPLEADOS DE LA PLANTILLA TRABAJAN EN TURNO DE TARDE, NOCHE O EN OTROS, PARA
ELLO MOSTRAREMOS ‘TARDE’ O ‘NOCHE’ DEPENDIENDO DE SUS VALORES.
--4. QUEREMOS CAMBIAR DE LOCALIDAD EN BARCELONA, PARA ELLO TENEMOS QUE SABER QUÉ EMPLEADOS
CAMBIARIAN DE LOCALIDAD Y CÚALES NO. COMBINAR TABLAS Y MOSTRAR EL NOMBRE DEL DEPARTAMENTO JUNTO A
LOS DATOS DEL EMPLEADO.
--6. MOSTRAR EL APELLIDO, LA DIRECCIÓN, LA FECHA DE NACIMIENTO MOSTRANDO LA DÉCADA EN LA QUE ESTÁ CADA
PERSONA Y EL SEXO MOSTRANDO SI ES MASCULINO O FEMENINO DE LA TABLA ENFERMO.
--7. MOSTRAR EL APELLIDO, EL SALARIO, EL OFICIO Y EL NOMBRE DEL DEPARTAMENTO DE TODOS LOS EMPLEADOS
AUNQUE NO TENGAN DEPARTAMENTO. SI NO TIENEN DEPARTAMENTO MOSTRARÉ QUE NO TIENEN DEPARTAMENTO.
MOSTRARÉ ADEMÁS SI TIENEN COMISIÓN O SI NO TIENEN COMISIÓN.
SELECT E.APELLIDO,E.OFICIO,E.SALARIO
,DEPARTAMENTO =
ISNULL(D.DNOMBRE,'SIN DEPARTAMENTO')
,COMISION = CASE COMISION
WHEN 0 THEN 'SIN COMISION'
ELSE
'CON COMISION'
191
ING. JESUS MANUEL HERNANDEZ ZATARAIN
END
FROM EMP E
LEFT JOIN DEPT D
ON E.DEPT_NO = D.DEPT_NO
ORDER BY D.DNOMBRE
--8. MOSTRAR TODAS LAS CAMAS QUE EXISTEN PARA CADA HOSPITAL Y CADA SALA. MOSTRARÉ EL NOMBRE DEL
HOSPITAL, LAS SALAS Y SU NÚMERO DE CAMAS. SI NO HUBIESE CAMAS PARA ALGÚN HOSPITAL LAS DEJARÉ A 0.
TAMBIÉN MOSTRARÉ QUE SON MUCHAS CAMAS CUANDO SEAN MÁS DE 90, BUEN NÚMERO CUANDO SEAN MAYORES
DE 40 Y POCAS CAMAS PARA LAS DEMÁS.
--9. SELECCIONAR QUÉ EMPLEADOS ESTÁN DENTRO DE LA MEDIA Y CUALES ESTÁN POR DEBAJO DE LA MEDIA,
MOSTRANDO EL APELLIDO, OFICIO, SALARIO, COMISIÓN Y EL NOMBRE DE LOS DEPARTAMENTOS. NO DEJAR NINGÚN
CAMPO A NULL.
* Cuando hay llaves es porque se debe elegir entre uno de los dos, esta barra | indica
que se debe poner uno de los dos valores.
Uso INSERT...SELECT:
Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos. La consulta SELECT
debe devolver los datos adecuados para la tabla donde vamos a introducir los valores.
Creación de una tabla mediante SELECT INTO: Creación de una tabla que a la vez se le introducen
valores.
1 USE Hospital
193
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2 INSERT INTO emp (Apellido,Salario)
3 VALUES ('SERRA', DEFAULT)
Con esta sentencia se pone el valor predeterminado que tenga la tabla, si no tiene valor por defecto, pondrá null,
lo que equivale a no poner el dato. Los valores por defecto se verán más adelante.
DELETE: Elimina una o varias filas. Hay un control de las modificaciones (Borrado) que se
estan haciendo.
TRUNCATE TABLE: Elimina todas las filas de la tabla (La tabla con su estructura no se
elimina, sólo los datos de la tabla). No crea filas en el registro de transacciones, con lo cual es el
método más rápido de borrar.
Ejemplo:
Ejemplo :
1 USE NORTHWIND
2 UPDATE PRODUCTS
3 SET UNITPRICE = (UNITPRICE * 1.1 )
Ejemplo :
Cambiar el salario de los empleados del dept 30 donde el departamento sea 60.
A continuación vamos a realizar ejercicios con consultas de acción, es decir, utilizaremos Insert, Update y
Delete.
El requisito para ejecutar estos ejercicios es tener la base de datos HOSPITAl, la cual puedes descargar
desde el indice.
Empecemos.
1. Dar de alta con fecha actual al empleado Jose Escriche Barrera como programador perteneciente al
departamento de informatica.Tendra un salario base de 70000 pts/mes y no cobrara comision, ¿qué dificultad
plantea el alta de este empleado? ¿Cómo podria solucionarse ?
2 VALUES(60,'INFORMATICA','MADRID')
2 VALUES(8596,'ESCRICHE','PROGRAMADOR','07/02/02',70000,0,60)
196
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2. Se quiere dar de alta un departamento de informática situado en Fuenlabrada (Madrid).
2 VALUES(70,'INFORMATICA','FUENLABRADA')
3. El departamento de ventas por motivos de peseteros se traslada a Lerida, realizar dicha modificación.
4. En el departamento anterior se dan de alta dos empleados: Julián Romeral y Luis Alonso. Su salario base
es de 80000 pts y cobrarán una comisión del 15% de su salario.
2 VALUES(30, 'ROMERAL',80000,80000*0.15,7500)
2 VALUES(30, 'ALONSO',80000,80000*0.15,7600)
5. Modificar la comisión de los empleados de la empresa, de forma que todos tengan un incremento del 10%
del salario.
2 AND T='N'
7. Incrementar en 5000 pts el salario de los empleados del departamento de ventas y del presidente, tomando
en cuenta los que se dieron de alta antes que el presidente de la empresa.
197
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1
UPDATE EMP SET SALARIO = SALARIO + 5000
2 FROM EMP AS E
4 ON E.DEPT_NO = D.DEPT_NO
6 'PRESIDENTE')
8. Se tienen que desplazar cien camas del Hospital SAN CARLOS para un Hospital de Venezuela. Actualizar
el número de camas del Hospital SAN CARLOS.
9. Crear una tabla llamada Mujeres e insertar los enfermos con este sexo.
1
CREATE TABLE MUJERES
2
(
3
Inscripcion INT NOT NULL,
4 Apellido VARCHAR(50) NULL,
7 S VARCHAR(2) NULL,
198
ING. JESUS MANUEL HERNANDEZ ZATARAIN
10. Crear una tabla llamada Empleados e introducir todos los datos de la tabla EMP en ella.
2 (
10 )
11 GO
11. Utilizar la tabla anterior. Subir el salario y la comisión en un millón de pesetas y doscientas veinticinco mil
pesetas respectivamente a los empleados que se dieron de alta en este año.
12. Borrar de la tabla mujer al enfermo con número de inscripción igual a 64823.
13. Borrar todos los registros de la tabla Mujeres de la forma más rápida.
14. Utilizar la tabla Empleados. Borrar todos los empleados dados de alta entre las fechas 01/01/80 y
31/12/82.
199
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 DELETE FROM EMPLEADOS WHERE FECHA_ALT BETWEEN '01/01/80' AND '31/12/82'
15. Modificar el salario de los empleados trabajen en la paz y esten destinados a Psiquiatría. Subirles el
sueldo 20000 ptas más que al señor Amigo R.
1
UPDATE PLANTILLA SET SALARIO =
2
(SELECT SALARIO + 20000 FROM PLANTILLA
3 WHERE APELLIDO = 'AMIGO R.')
4 FROM PLANTILLA AS P
6 ON H.HOSPITAL_COD = P.HOSPITAL_COD
ON S.SALA_COD = P.SALA_COD
8
WHERE H.NOMBRE = 'LA PAZ'
9
AND S.NOMBRE = 'PSIQUIÁTRICOS'
10
2 FROM EMP AS E
4 ON E.DEPT_NO = D.DEPT_NO
200
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Descargar Scripts SQL
http://sh.st/jSfpR
--1. DAR DE ALTA CON FECHA ACTUAL AL EMPLEADO JOSE ESCRICHE BARRERA COMO PROGRAMADOR PERTENECIENTE
AL DEPARTAMENTO DE INFORMATICA.TENDRA UN SALARIO BASE DE 70000 PTS/MES Y NO COBRARA COMISION, ¿QUÉ
DIFICULTAD PLANTEA EL ALTA DE ESTE EMPLEADO? ¿CÓMO PODRIA SOLUCIONARSE ?
--3. EL DEPARTAMENTO DE VENTAS POR MOTIVOS DE PESETEROS SE TRASLADA A LERIDA, REALIZAR DICHA
MODIFICACIÓN.
--4. EN EL DEPARTAMENTO ANTERIOR SE DAN DE ALTA DOS EMPLEADOS: JULIÁN ROMERAL Y LUIS ALONSO. SU SALARIO
BASE ES DE 80000 PTS Y COBRARÁN UNA COMISIÓN DEL 15% DE SU SALARIO.
--5. MODIFICAR LA COMISIÓN DE LOS EMPLEADOS DE LA EMPRESA, DE FORMA QUE TODOS TENGAN UN INCREMENTO
DEL 10% DEL SALARIO.
--6. INCREMENTAR UN 5% EL SALARIO DE LOS INTERINOS DE LA PLANTILLA QUE TRABAJEN EN EL TURNO DE NOCHE.
--7. INCREMENTAR EN 5000 PTS EL SALARIO DE LOS EMPLEADOS DEL DEPARTAMENTO DE VENTAS Y DEL PRESIDENTE,
TOMANDO EN CUENTA LOS QUE SE DIERON DE ALTA ANTES QUE EL PRESIDENTE DE LA EMPRESA.
--8. SE TIENEN QUE DESPLAZAR CIEN CAMAS DEL HOSPITAL SAN CARLOS PARA UN HOSPITAL DE VENEZUELA.
ACTUALIZAR EL NÚMERO DE CAMAS DEL HOSPITAL SAN CARLOS.
--9. CREAR UNA TABLA LLAMADA MUJERES E INSERTAR LOS ENFERMOS CON ESTE SEXO.
--10. CREAR UNA TABLA LLAMADA EMPLEADOS E INTRODUCIR TODOS LOS DATOS DE LA TABLA EMP EN ELLA.
--11. UTILIZAR LA TABLA ANTERIOR. SUBIR EL SALARIO Y LA COMISIÓN EN UN MILLÓN DE PESETAS Y DOSCIENTAS
VEINTICINCO MIL PESETAS RESPECTIVAMENTE A LOS EMPLEADOS QUE SE DIERON DE ALTA EN ESTE AÑO.
--12. BORRAR DE LA TABLA MUJER AL ENFERMO CON NÚMERO DE INSCRIPCIÓN IGUAL A 64823.
--14. UTILIZAR LA TABLA EMPLEADOS. BORRAR TODOS LOS EMPLEADOS DADOS DE ALTA ENTRE LAS FECHAS 01/01/80 Y
31/12/82.
--15. MODIFICAR EL SALARIO DE LOS EMPLEADOS TRABAJEN EN LA PAZ Y ESTEN DESTINADOS A PSIQUIATRÍA. SUBIRLES
EL SUELDO 20000 PTAS MÁS QUE AL SEÑOR AMIGO R.
ON E.DEPT_NO = D.DEPT_NO
Saludos gente!! En esta oportunidad explicaremos algunas expresiones del Transact SQL para
agrupar y resumir datos.
Como requisito necesitaremos la base de datos de ejemplo Northwind la cual la puedes descargar
desde el indice o en el siguiente enlace : DESCARGAR BD NORTHWIND
Es indispensable tener la base de datos Nortwind porque la utilizaremos no sólo en estos ejemplos;
también la usaremos en las publicaciones de ejercicios de este tema.
203
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Bien, sin más preámbulos iniciemos.
[Order Details]
Order Id : Nº de Pedido.
Producto Id : Nº de Producto.
Ambos campos son Primary Key, con lo que no puede haber una combinación de ambos campos
que sea igual.
OrderId ProductId
1A
1 B
1C
2 A
3 C
ROLLUP
Se usa para presentar resúmenes de datos. A de usarse junto con la clausula group by, lo que hace
es realizar un resumen de los campos incluidos en el rollup.
204
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Este ejemplo suma todas las cantidades, y mediante rollup, muestra una fila con la suma de todas
las cantidades de cada producto, y además, otra fila con la suma de todas las cantidades de todos
los productos. El resultado de este ejemplo, sería el que muestra la imagen:
?
1
SELECT PRODUCTID, ORDERID,
2 SUM(QUANTITY) AS CANTIDAD_TOTAL
3 FROM [ORDER DETAILS]
4 WHERE ORDERID < 10250
5 GROUP BY PRODUCTID, ORDERID
WITH ROLLUP
6 ORDER BY PRODUCTID, ORDERID
7
205
ING. JESUS MANUEL HERNANDEZ ZATARAIN
CUBE
Al igual que Rollup realiza resúmenes de campos agrupados. Pero en este caso muestra un
resumen con cada combinación posible de los campos agrupados.
1
SELECT PRODUCTID, ORDERID,
2 SUM(QUANTITY) AS CANTIDAD_TOTAL
3 FROM [ORDER DETAILS]
4 WHERE ORDERID < 10250
5 GROUP BY PRODUCTID, ORDERID
WITH CUBE
6 ORDER BY PRODUCTID, ORDERID
7
En este caso como vemos en la imagen, hace un resumen con la suma de la cantidad de cada
combinación posible entre el productid y el orderid.
206
ING. JESUS MANUEL HERNANDEZ ZATARAIN
GROUPING
Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una
cláusula de resumen, es decir, para saber por ejemplo si un “Null” de una celda es de la propia tabla
o ha es debido a una clausula Cube o Rollup.
1
SELECT PRODUCTID, GROUPING(PRODUCTID), ORDERID, GROUPING(ORDERID),
2 SUM(QUANTITY) AS CANTIDAD_TOTAL
3 FROM [ORDER DETAILS]
4 WHERE ORDERID < 10250
5 GROUP BY PRODUCTID, ORDERID
WITH CUBE
6 ORDER BY PRODUCTID, ORDERID
7
207
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Vemos que por cada grouping que hemos puesto, sale una columna, 1 indica que el Null es creado
por la clausula Cube y 0 indica que es de la tabla.
Poniéndole un alias al grouping saldría el nombre de columna que le indiquemos.
208
ING. JESUS MANUEL HERNANDEZ ZATARAIN
DESCARGAR BD NORTHWIND.
http://sh.st/jHXyc
1) Realizar una consulta que resuma la cantidad de artículos pedidos por cada índice de producto y número
de pedido. Realizando un cálculo acumulativo.
209
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2 ,ORDERID AS [Nº PEDIDO]
2) Modificación al ejercicio anterior: Realizar el mismo resumen pero únicamente para el producto cuyo id es
50
SELECT PRODUCTID AS [PRODUCTO]
1
,ORDERID AS [Nº PEDIDO]
2
,SUM(QUANTITY) AS [SUMA TOTAL]
3
FROM [ORDER DETAILS]
4
WHERE PRODUCTID = 50
5
GROUP BY PRODUCTID, ORDERID
6 WITH ROLLUP
210
ING. JESUS MANUEL HERNANDEZ ZATARAIN
7 ORDER BY PRODUCTID, ORDERID
3) Realizar un resumen por medio de CUBE y de GROUPING sobre la modificación del ejercicio anterior de tal
manera que sea posible obtener un resumen por producto y por pedido.
8 WITH CUBE
211
ING. JESUS MANUEL HERNANDEZ ZATARAIN
9 ORDER BY PRODUCTID,ORDERID
10
¿Qué filas son de resumen? ¿Cuáles el resumen por producto y cuáles por pedido?
212
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Transacciones en SQL Server.
Una transacción es un conjunto de instrucciones de manipulación de datos que se ejecutan en una misma unidad
de trabajo. El ejemplo más claro son las transacciones bancarias.
1 BEGIN TRAN[SACTION][NombreTransaccion]
Validación de transacción:
Anulación de Transacción:
1
BEGIN TRAN Modificación
2
UPDATE Tabla SET ....
3 UPDATE Tabla1 SET ....
4 SAVE TRAN a
5 UPDATE Tabla2 SET ....
6 UPDATE Tabla3 SET ....
ROLLBACK TRAN a
7 ROLLBACK TRAN Modificacion
8 COMMIT TRAN Modificación
9
El primer Rollback guardaria las que estan en el Begin y el punto de salvamento, deshaciendo las demás
ordenes.
Ejemplo de transacciones usando @@ERROR, con esto se almacena el número del error que se ha producido
en última instancia. Se actualiza en cada instrucción, por eso después de cada sentencia se debe comprobar el
valor de la variable para ver si tiene error. Lo que se hace es crear variables en cada instrucción almacenando el
valor de @@ERROR en cada una de ellas. El valor de las variables debe ser entero.
USE PUBS
1 GO
2 DECLARE @DEL_ERROR INT, @INS_ERROR INT
213
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3 BEGIN TRAN
4 DELETE AUTHORS WHERE AU_ID = '409-56-7088'
SELECT @DEL_ERROR = @@ERROR
5 INSERT AUTHORS VALUES ('409-56-7088', 'BENNET', 'ABRAHAM', '415 658-9932',
6 '6223 BATEMAN ST.', 'BERKELEY', 'CA', '94705', 1)
7 SELECT @INS_ERROR = @@ERROR
8 IF @DEL_ERROR = 0 AND @INS_ERROR = 0
BEGIN
9
10 PRINT 'NO HAY ERRORES NINO NINO'
11 COMMIT TRAN
12 END
13 ELSE
14 BEGIN
IF @DEL_ERROR <> 0
15 PRINT 'HAY ERROR EN EL DELETE'
16 PRINT @INS_ERROR
17 IF @INS_ERROR <> 0
18 PRINT 'HAY ERROR EN EL INSERT'
PRINT @INS_ERROR
19 ROLLBACK TRAN
20 END
21 GO
22
23
214
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Funciones de fecha en SQL Server.
quarter qq , q
month mm , m
dayofyear dy , y
day dd , d
week wk , ww
weekday dw
hour hh
minute mi, n
second ss , s
millisecond ms
microsecond mcs
nanosecond ns
TZoffset tz
GetDate
Funcion que recupera la fecha actual del sistema.
1 select getdate()
Convert, Cast
215
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Convierten explícitamente una expresión de un tipo de datos en otro. CAST y CONVERT proporcionan
funciones similares.
Convert(Tipodedatosdestino, Origen, Estilo)
Tiposdedatosdestino: Siempre ha de ser tipo carácter
Origen: Puede ser tipo fecha, numérico o moneda.
Estilo: Opcional. Es un código que indica el formato en el que devuelve la cadena de caracteres.
Sintaxis:
Convert(TipoDato,Dato)
Cast (Dato as TipoDato)
Ejemplo:
1
2 DECLARE @N INT,@PALABRA NVARCHAR(10)
3 SET @N = 1
SET @PALABRA ='NÚMERO'
4 PRINT CONVERT(NVARCHAR(2),@N) + ' ' + @PALABRA
5 PRINT CAST(@N AS NVARCHAR(2)) + ' ' + @PALABRA
6 WHILE (@N<11)
7 BEGIN
PRINT CONVERT(NVARCHAR(2),@N) + ' ' + @PALABRA
8 PRINT CAST(@N AS NVARCHAR(2)) + ' ' + @PALABRA
9 SET @N = @N + 1
10 END
11
216
ING. JESUS MANUEL HERNANDEZ ZATARAIN
DateName
Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha especificada
Los calculos para las horas no son exactos cuando se trata de SmallDateTime, por lo que devuelve 0.
217
ING. JESUS MANUEL HERNANDEZ ZATARAIN
19 FROM EMP
20 WHERE EMP_NO=7876
21
22
23
Horas:
1
2 SELECT DATENAME(MI,FECHA_ALT) AS 'MINUTOS CON ABREVIATURA'
FROM EMP
3 WHERE EMP_NO = 7876
4
5 SELECT DATENAME(MINUTE,GETDATE()) AS 'MINUTOS SIN ABREVIATURA'
6
7 SELECT DATENAME(MI,GETDATE()) AS 'MINUTOS CON ABREVIATURA'
8
9 SELECT DATENAME(HH,FECHA_ALT) AS 'HORA CON ABREVIATURA'
10 FROM EMP
WHERE EMP_NO = 7876
11
12 SELECT DATENAME(HOUR,GETDATE()) AS 'HORA SIN ABREVIATURA'
13
SELECT DATENAME(HH,GETDATE()) AS 'HORA CON ABREVIATURA'
218
ING. JESUS MANUEL HERNANDEZ ZATARAIN
DatePart
Devuelve la parte de la fecha u hora indicada.
219
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Nombres de Fechas:
Day(fecha)
Devuelve un INT, equivale a datepart
1
SELECT DAY(GETDATE()) AS DIA
2
3 SELECT DATEPART(DD,GETDATE()) AS DIA
4
5 SELECT MONTH(GETDATE()) AS MES
6
7 SELECT DATEPART(MM,GETDATE()) AS MES
8
9 SELECT YEAR(GETDATE()) AS AÑO
10
11 SELECT YEAR(FECHA_ALT) AS AÑO
FROM EMP
12 WHERE EMP_NO = 7876
13
220
ING. JESUS MANUEL HERNANDEZ ZATARAIN
DateAdd
Añade un número a la fecha puesta
221
ING. JESUS MANUEL HERNANDEZ ZATARAIN
DateDiff
Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos.
Sintaxis:
1 SELECT DATEDIFF(YYYY,FECHA_ALT,GETDATE())
2 AS 'DIFERENCIA DE AÑOS ENTRE LA FECHA DE ALTA Y LA FECHA ACTUAL'
3 FROM EMP
4 WHERE EMP_NO = 7876
222
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Funciones matemáticas en SQL Server.
ABS
Obtiene el valor Absoluto
CEILING
Devuelve el entero más pequeño mayor o igual que la expresión numérica dada.
FLOOR
Devuelve el entero más grande menor o igual que la expresión numérica dada.
POWER
Devuelve el valor de la expresión indicada elevada a la potencia especificada.
223
ING. JESUS MANUEL HERNANDEZ ZATARAIN
RAND
Devuelve un valor float aleatorio de 0 a 1.
Las llamadas repetitivas de RAND() en una única consulta producirán el mismo valor.
ROUND
Devuelve una expresión numérica, redondeada a la longitud o precisión especificada.
224
ING. JESUS MANUEL HERNANDEZ ZATARAIN
ROUND siempre devuelve un valor. Si length es un valor negativo y mayor que el número de dígitos anteriores
al separador decimal, ROUND devuelve 0.
1 SELECT ROUND(123.4567,2)
2
3 SELECT ROUND(123.4567,-2)
4
5 SELECT ROUND(123.4567,0)
6
7 SELECT ROUND(123.4567,-3)
SIGN
Devuelve el signo positivo (+1), cero (0) o negativo (-1) de la expresión especificada.
Dice el valor negativo, positivo o neutro (0) del valor especificado
1 SELECT SIGN(-3)
2
3 SELECT SIGN(3)
4
5 SELECT SIGN(0)
225
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SQUARE
Devuelve el cuadrado de la expresión especificada.
SQRT
Devuelve la raíz cuadrada de la expresión especificada.
ASCII
Devuelve el código ASCII del carácter más a la izquierda de una expresión de caracteres.
CHAR
Una función de cadena que convierte un código ASCII int en un carácter.
CHARINDEX
Devuelve la posición inicial de la expresión especificada en una cadena de caracteres.
Argumentos:
expression1
Es una expresión que contiene la secuencia de caracteres que se desea
buscar. Expression1 es una expresión del tipo de cadenas cortas de caracteres.
Expression2
Es una expresión, normalmente una columna,
en la que se busca la cadena especificada. Expression2 es de la categoría del tipo de datos cadena de caracteres.
start_location
Es la posición del carácter de expression2 en el que se empieza la
búsqueda de expression1.
227
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Si no se especifica start_location, es un número negativo o es cero,
la búsqueda empieza al principio de la cadena expression2.
Si expression1 no se encuentra en expression2, CHARINDEX devuelve 0.
Si alguno de los dos es null, devuelve null
LEFT
Devuelve la parte de una cadena de caracteres que comienza en un número de caracteres especificado a partir de
la izquierda
1 SELECT LEFT('murcielago',5)
RIGHT
Devuelve la parte de una cadena de caracteres que comienza en el número de caracteres especificado en
integer_expression a partir de la derecha.
LEN
Cuenta el número de caracteres que se incluyen en la cadena.
228
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 SELECT LEN('murcielago')
LOWER
Convierte a Minúsculas la cadena especificada
UPPER
Convierte a Mayúsculas la cadena especificada
RTRIM y LTRIM
Elimina los espacios que existen a la izquierda y a la derecha respectivamente.
REPLACE
229
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Reemplaza por una tercera expresión todas las apariciones de la segunda expresión de cadena proporcionada en
la primera expresión de cadena
SPACE
Coloca el número de espacios que se le indiquen para entre una cadena de caracteres.
SUBSTRING
Devuelve parte de una expresión de caracteres, binaria, de texto o de imagen.
Sintaxis:
Argumentos:
expression
Es una cadena de caracteres, cadena binaria, texto, imagen,
columna o expresión que incluye una columna.
No deben usarse expresiones que incluyan funciones de agregado.
start
Es un entero que especifica el punto en que comienza la subcadena.
length
Es un entero que especifica la longitud de la subcadena (el número de caracteres o bytes que se devuelven).
230
ING. JESUS MANUEL HERNANDEZ ZATARAIN
REVERSE
Devuelve invertida una expresión de carácter.
1 SELECT REVERSE('hola')
REPLICATE
Repite una expresión de caracteres un número especificado de veces.
1 SELECT REPLICATE('murcielago ',5)
STUFF
Elimina el número de caracteres especificado e inserta otro conjunto de caracteres en un punto de inicio
indicado.
231
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Funciones de Sistema en SQL Server.
ISDATE (Expresion) Dice si la expresión es una fecha o no. Devuelve 1 si la expresión es una
fecha y 0 si no es una fecha.
232
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 SELECT ISNUMERIC('DDD') AS [VALIDACION NUMERO]
ParteNombre es un valor de tipo Int que coge unos determinados valores del
NombreObjeto:
1 Objeto.
2 Propietario
3 Base de Datos
4 Servidor
233
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SYSTEM_USER
USER_NAME()
1 SELECT USER_NAME()
Si el Salario es nulo devolverá la comisión, y si los dos son nulos, devolverá un campo null.
Saludos Gente! En esta oportunidad compartiré 6 ejercicios, en donde ejemplificaremos el uso de IF y las
funciones antes vistas. Para ello debes tener la base de datos Hospital y los registros. Si no tienes la base de
datos, puedes descargarlo desde el indice o desde los siguientes enlaces: DESCARGAR BD HOSPITAL. -
DESCARGAR REGISTROS DE BD HOSPITAL
1. Mostrar una lista de los empleados con el siguiente texto. Si el empleado no tiene nombre o la consulta
devuelve null poner el texto de EMPLEADO SIN NOMBRE.
235
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3 + CAST(OFICIO AS NVARCHAR(15))
2. Modificación del ejercicio anterior, incluir también la diferencia de años que lleva en la empresa el empleado
desde la fecha actual.
236
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3 + LTRIM(CAST(OFICIO AS NVARCHAR(15)))
11 AS [DATOS EMPLEADOS]
13
14
3. Subir el sueldo en 5000 pts a los empleados de la plantilla del hospital La Paz en caso de que la suma de
sus salarios no supere el millon de pesetas, en caso contrario bajar el sueldo en 5000 pts.
237
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 DECLARE @SUMASAL INT
8 BEGIN
9 --SUBIMOS EL SUELDO
11 FROM PLANTILLA AS P
18 + P.APELLIDO
20 + P.FUNCION
27 BEGIN
238
ING. JESUS MANUEL HERNANDEZ ZATARAIN
28 --BAJAMOS EL SUELDO
FROM PLANTILLA AS P
30
INNER JOIN HOSPITAL AS H
31
ON P.HOSPITAL_COD = H.HOSPITAL_COD
32
WHERE H.NOMBRE = 'LA PAZ'
33
--NOTIFICAMOS LA BAJADA
34
SELECT 'AL EMPLEADO DEL HOSPITAL '
35 + H.NOMBRE
36 + ', '
37 + P.APELLIDO
+ P.FUNCION
39
+ ', SE LE HA REDUCIDO EL SUELDO EN 5000 PTS'
40
FROM PLANTILLA AS P
41
INNER JOIN HOSPITAL AS H
42
ON P.HOSPITAL_COD = H.HOSPITAL_COD
43
WHERE H.NOMBRE = 'LA PAZ'
END
http://sh.st/keExg
239
ING. JESUS MANUEL HERNANDEZ ZATARAIN
--1. Mostrar una lista de los empleados con el siguiente texto. Si el empleado no tiene nombre o la consulta devuelve
null poner el texto de EMPLEADO SIN NOMBRE.
+ CAST(OFICIO AS NVARCHAR(15))
[DATOS EMPLEADOS]
--2. Modificación del ejercicio anterior, incluir también la diferencia de años que lleva en la empresa el empleado desde
la fecha actual.
NVARCHAR(15)))
+ LTRIM(CAST(OFICIO AS NVARCHAR(15)))
+ LTRIM(CAST(DATENAME(MONTH,FECHA_ALT) AS NVARCHAR(15)))
+ ' DE '
+ CAST(YEAR(FECHA_ALT) AS CHAR(4))
+ LTRIM(CAST(DATEDIFF(YYYY,FECHA_ALT,GETDATE()) AS NVARCHAR(5)))
240
ING. JESUS MANUEL HERNANDEZ ZATARAIN
+ ' AÑOS','EMPLEADO SIN NOMBRE')
AS [DATOS EMPLEADOS]
--3. Subir el sueldo en 5000 pts a los empleados de la plantilla del hospital La Paz en caso de que la suma de sus salarios
no supere el millon de pesetas, en caso contrario bajar el sueldo en 5000 pts.
FROM PLANTILLA AS P
ON P.HOSPITAL_COD = H.HOSPITAL_COD
PRINT @SUMASAL
BEGIN
--SUBIMOS EL SUELDO
FROM PLANTILLA AS P
ON P.HOSPITAL_COD = H.HOSPITAL_COD
--NOTIFICAMOS LA SUBIDA
+ H.NOMBRE
+ ', '
+ P.APELLIDO
241
ING. JESUS MANUEL HERNANDEZ ZATARAIN
+ ' CON FUNCIÓN DE '
+ P.FUNCION
FROM PLANTILLA AS P
ON P.HOSPITAL_COD = H.HOSPITAL_COD
END
ELSE
BEGIN
--BAJAMOS EL SUELDO
FROM PLANTILLA AS P
ON P.HOSPITAL_COD = H.HOSPITAL_COD
--NOTIFICAMOS LA BAJADA
+ H.NOMBRE
+ ', '
+ P.APELLIDO
+ P.FUNCION
FROM PLANTILLA AS P
ON P.HOSPITAL_COD = H.HOSPITAL_COD
242
ING. JESUS MANUEL HERNANDEZ ZATARAIN
WHERE H.NOMBRE = 'LA PAZ'
END
4. Calcular la media de años que llevan los empleados en la empresa. Si la media supera los 15 años, subir el
sueldo en 20000 pts a los empleados que esten en la primera decada desde la fundación de la empresa. Si no
se supera esta media, se les subirá el sueldo a los empleados que no estén en la primera decada de la
empresa. Mostrar los datos después de la actualización con formato de Fecha Completa: Martes 19 Octubre
1978.
17 BEGIN
243
ING. JESUS MANUEL HERNANDEZ ZATARAIN
18 UPDATE EMP SET SALARIO = SALARIO + 10000 WHERE FECHA_ALT > @DIF
26 ORDER BY FECHA_ALT
27 END
5. Mostrar los años de antigüedad de los empleados, la fecha de alta, y otro campo donde introduciremos los
trienios que lleva en la empresa el trabajador hasta 7 como máximo y cuatro como mínimo. Si está fuera de
este intervalo escribiremos 'No Bonificable'.
244
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1
SELECT APELLIDO, FECHA_ALT
2
,'ANTIGÜEDAD' = CONVERT(NVARCHAR(50)
3
,DATEDIFF(YY,FECHA_ALT, GETDATE())) + ' AÑOS'
4 ,'TRIENIOS' = CASE DATEDIFF(YY,FECHA_ALT, GETDATE()) / 3
245
ING. JESUS MANUEL HERNANDEZ ZATARAIN
6. Calculando la suma de salarios de los directores, subir el sueldo a los que cobren entre el minimo salario y 250000 pts.
Mostrar los datos actualizados antes y después de los empleados que se actualicen.
2 < 1200001
3 BEGIN
7 'DIRECTOR'
10 OFICIO = 'DIRECTOR'
11 GROUP BY SALARIO,APELLIDO
13 ORDER BY SALARIO
16 AND
19 'DIRECTOR'
22 OFICIO = 'DIRECTOR'
246
ING. JESUS MANUEL HERNANDEZ ZATARAIN
23 GROUP BY SALARIO,APELLIDO
25 ORDER BY SALARIO
26 END
27 ELSE
30 BEGIN
33 ORDER BY SALARIO
34 END
35 ELSE
37 > 1300001
38 BEGIN
42 'DIRECTOR'
45 OFICIO = 'DIRECTOR'
46 GROUP BY SALARIO,APELLIDO
247
ING. JESUS MANUEL HERNANDEZ ZATARAIN
50 WHERE OFICIO = 'DIRECTOR'
51 AND
55 OFICIO = 'DIRECTOR'
56 GROUP BY SALARIO,APELLIDO
59 END
http://sh.st/kuXbL
--4. Calcular la media de años que llevan los empleados en la empresa. Si la media supera los 15 años, subir el sueldo en
20000 pts a los empleados que esten en la primera decada desde la fundación de la empresa. Si no se supera esta
248
ING. JESUS MANUEL HERNANDEZ ZATARAIN
media, se les subirá el sueldo a los empleados que no estén en la primera decada de la empresa. Mostrar los datos
después de la actualización con formato de Fecha Completa: Martes 19 Octubre 1978.
BEGIN
,APELLIDO
ORDER BY FECHA_ALT
END
ELSE
BEGIN
UPDATE EMP SET SALARIO = SALARIO + 10000 WHERE FECHA_ALT > @DIF
,APELLIDO
249
ING. JESUS MANUEL HERNANDEZ ZATARAIN
,SALARIO,'ACTUALIZACION COMPLETA' AS [ACTUALIZACION]
FROM EMP
ORDER BY FECHA_ALT
END
--5. Mostrar los años de antigüedad de los empleados, la fecha de alta, y otro campo donde introduciremos los trienios
que lleva en la empresa el trabajador hasta 7 como máximo y cuatro como mínimo. Si está fuera de este intervalo
escribiremos 'No Bonificable'.
,'ANTIGÜEDAD' = CONVERT(NVARCHAR(50)
END
FROM EMP
/*6. Calculando la suma de salarios de los directores, subir el sueldo a los que cobren entre el minimo salario y 250000
pts.
250
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Bajar el sueldo a los que se encuentren entre 250000 y el máximo salario.
Mostrar los datos actualizados antes y después de los empleados que se actualicen.*/
< 1200001
BEGIN
'DIRECTOR'
OFICIO = 'DIRECTOR'
GROUP BY SALARIO,APELLIDO
ORDER BY SALARIO
AND
'DIRECTOR'
OFICIO = 'DIRECTOR'
GROUP BY SALARIO,APELLIDO
251
ING. JESUS MANUEL HERNANDEZ ZATARAIN
ORDER BY SALARIO
END
ELSE
BEGIN
ORDER BY SALARIO
END
ELSE
> 1300001
BEGIN
'DIRECTOR'
OFICIO = 'DIRECTOR'
GROUP BY SALARIO,APELLIDO
AND
252
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SALARIO BETWEEN 200000 AND @MAXSAL
OFICIO = 'DIRECTOR'
GROUP BY SALARIO,APELLIDO
END
Sintaxis:
Instrucciones
Ejemplo 1
3 FROM EMP
GROUP BY DEPT_NO
5
253
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Crea el procedimiento numempdept con el parámetro ndep que es tipo smallint (equivalente al short en
visual).
El procedimiento hace una select que realiza grupos por número de deparamento y cuenta cuantos
empleados hay en cada departamento.
1 EXEC NUMEMPDEPT 20
Ejecuta el procedimiento introduciendo el valor 20 para el parámetro ndep, con lo que haría la select sobre el
departamento 20.
Ejemplo 2
1
CREATE PROCEDURE BUSCAEMP(
2 @NDEP SMALLINT,
3 @NOFICIO NVARCHAR(19))
4 AS
254
ING. JESUS MANUEL HERNANDEZ ZATARAIN
PROCEDIMIENTOS ALMACENADOS CON PARÁMETROS CON VALORES POR DEFECTO
Sintaxis:
Donde Valor es el valor que le damos por defecto, este valor puede almacenar comodines (como % que
equivale a *).
Ejemplo 1
2 AS
4 FROM EMP
GROUP BY DEPT_NO
6
1 EXEC NUMEMP
Ejemplo 2
Sacaría el salario, el oficio y la comisión de todos los que tengan apellido Garcia, sino pusiésemos parámetro,
por defecto sacaría los que tuviesen apellido Rey.
Ejemplo 3
3 AS
5 FROM EMP
Sacaría oficio, salario y comisión de los empleados que tuviesen una s en su apellido.
256
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Ejemplo 4
Introducir oficio y salario debe sacar el apellido de los empleados que tengan el mismo apellido y ganen mas
del salario indicado. Debemos hacer que sino introduce nada saque todos los registros.
4 AS
SELECT APELLIDO FROM EMP WHERE OFICIO LIKE @OFICIO AND SALARIO > @SALARIO
5
Ejemplo 5
Sacar todos los empleados que se dieron de alta entre una determinada fecha inicial y fecha final y que
pertenecen a un determinado departamento.
257
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1
CREATE PROCEDURE TRESPARAMETROS(
2 @FINICIAL DATETIME = '01-01-1980',
5 )
6 AS
Ejemplo 6
Crear procedimiento que inserte un empleado. Crear otro procedimiento que borre un empleado que coincida
con los parámetros indicados (los parámetros serán todos los campos de la tabla empleado)
258
ING. JESUS MANUEL HERNANDEZ ZATARAIN
5 @FECHA_ALT SMALLDATETIME,
6 @SALARIO INT,
@COMISION INT,
7
@DEPT_NO INT)
8
AS
9
INSERT INTO EMP VALUES
10
(@EMP_NO,
11
@APELLIDO,
12 @OFICIO,
13 @DIR,
14 @FECHA_ALT,
15 @SALARIO,
@COMISION,
16
@DEPT_NO)
17
18
19
259
ING. JESUS MANUEL HERNANDEZ ZATARAIN
7 @COMISION INT,
8 @DEPT_NO INT
)
9
AS
10
DELETE FROM EMP WHERE EMP_NO = @EMP_NO
11
AND APELLIDO = @APELLIDO
12
AND OFICIO = @OFICIO
13
AND DIR = @DIR
14 AND FECHA_ALT = @FECHA_ALT
18
19
Sintaxis de declaración
Sintaxis
Instrucciones
Print @Variable
Ejemplo 1:
1
CREATE PROCEDURE TOTALSALCOM @APELLIDO NVARCHAR(25), @TOTAL INT OUTPUT
2
--CREAMOS EL PROCEDIMIENTO CON UN PARÁMETRO Y UNA VARIABLE DE SALIDA
3
AS
4 --DECLARAMOS DOS VARIABLES PARA ALMACENAR VALORES
7 --ASIGNAMOS LOS VALORES CORRESPONDIENTES A LAS VARIABLES Y DESPUÉS LAS SUMAMOS Y LAS GUARDA
Y para ejecutarlo en el analizador de consultas, hemos de declarar la variable que vamos a recuperar también, para
almacenar el valor que nos pasa el procedimiento almacenado en ella. Es decir, en este caso @total almacenará el valor
pasado por la variable del mismo nombre que hay en el procedimiento:
261
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 DECLARE @TOTAL INT
Ejemplo 2:
1
CREATE PROCEDURE TOTALES
2 @NDEPT INT = NULL, @TOTAL INT OUTPUT
3 AS
4 IF @NDEPT IS NULL
6 ELSE
MAS EJEMPLOS:
262
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3 @SALARIO INT = 0 )
4 AS
IF @SALARIO = 0
5
PRINT 'NO HA INTRODUCIDO SALARIO'
6
ELSE
7
SELECT APELLIDO FROM EMP WHERE OFICIO LIKE @OFICIO AND SALARIO > @SALARIO
8
2 (
3 APELLIDO VARCHAR(45),
USUARIO VARCHAR(45),
4
FECHA SMALLDATETIME,
5
NUMERO INT
6
)
7
GO
8
CREATE PROCEDURE BORRAREMP (
9 @APELLIDO VARCHAR(12) = '0000',
11 @NUM INT = 0)
12 AS
263
ING. JESUS MANUEL HERNANDEZ ZATARAIN
13 IF @APELLIDO = '0000'
ELSE
15
BEGIN
16
SELECT @APE = APELLIDO FROM EMP WHERE APELLIDO = @APELLIDO
17
SELECT @NUM = COUNT(APELLIDO) FROM EMP WHERE APELLIDO = @APE
18
IF (@APE = '0')
19
BEGIN
20 PRINT 'APELLIDO NO ENCONTRADO, INTRODUZCA UN APELLIDO DE LA BASE DE DATOS'
21 END
22 ELSE
23 BEGIN
31 END
32
33
34
264
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 --ELIMINAR EL PROCEDIMIENTO ALMACENADO
Para poder realizar los ejercicios de procedimientos almacenados debes tener la base de datos Hospital, la cual puedes
descargar desde el índice o desde los siguientes enlaces: DESCARGAR BD HOSPITAL - http://sh.st/jj8cr
1) Sacar todos los empleados que se dieron de alta entre una determinada fecha inicial y fecha final y que pertenecen a
un determinado departamento.
265
ING. JESUS MANUEL HERNANDEZ ZATARAIN
7
5 @FECHA_ALT SMALLDATETIME,
6 @SALARIO INT,
7 @COMISION INT,
8 @DEPT_NO INT
AS
9
INSERT INTO EMP VALUES
10
(@EMP_NO,
11
@APELLIDO,
12
@OFICIO,
266
ING. JESUS MANUEL HERNANDEZ ZATARAIN
13 @DIR,
14 @FECHA_ALT,
@SALARIO,
15
@COMISION,
16
@DEPT_NO)
17
18
19
3) Crear un procedimiento que recupere el nombre, número y número de personas a partir del número de
departamento.
3 FROM EMP
GROUP BY DEPT_NO
5
1 EXEC NUMEMP_DEPT 30
267
ING. JESUS MANUEL HERNANDEZ ZATARAIN
4) Crear un procedimiento igual que el anterior, pero que recupere también las personas que trabajan en dicho
departamento, pasándole como parámetro el nombre.
2 AS
5 FROM EMP AS E
12 FROM EMP AS E
14 ON E.DEPT_NO = D.DEPT_NO
268
ING. JESUS MANUEL HERNANDEZ ZATARAIN
5) Crear procedimiento para devolver salario, oficio y comisión, pasándole el apellido.
6) Igual que el anterior, pero si no le pasamos ningún valor, mostrará los datos de todos los empleados.
269
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 CREATE PROCEDURE OFICIOSALARIO @PAPELLIDO NVARCHAR(20) ='%' AS
2 SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE @PAPELLIDO
7) Crear un procedimiento para mostrar el salario, oficio, apellido y nombre del departamento de todos los empleados
que contengan en su apellido el valor que le pasemos como parámetro.
2 SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE '%' + @PAPELLIDO + '%'
http://sh.st/kR9Vs
270
ING. JESUS MANUEL HERNANDEZ ZATARAIN
--1) Sacar todos los empleados que se dieron de alta entre una determinada fecha inicial y fecha final y que pertenecen a
un determinado departamento.
@FINICIAL DATETIME,
@FFINAL SMALLDATETIME ,
@DEPT_NO NVARCHAR(10)
AS
@EMP_NO INT,
@APELLIDO NVARCHAR(20),
@OFICIO NVARCHAR(20),
@DIR INT,
@FECHA_ALT SMALLDATETIME,
@SALARIO INT,
@COMISION INT,
@DEPT_NO INT
AS
(@EMP_NO,
@APELLIDO,
271
ING. JESUS MANUEL HERNANDEZ ZATARAIN
@OFICIO,
@DIR,
@FECHA_ALT,
@SALARIO,
@COMISION,
@DEPT_NO)
--3) Crear un procedimiento que recupere el nombre, número y número de personas a partir del número de
departamento.
FROM EMP
GROUP BY DEPT_NO
EXEC NUMEMP_DEPT 30
--4) Crear un procedimiento igual que el anterior, pero que recupere también las personas que trabajan en dicho
departamento, pasándole como parámetro el nombre.
AS
FROM EMP AS E
272
ING. JESUS MANUEL HERNANDEZ ZATARAIN
INNER JOIN DEPT AS D
ON E.DEPT_NO = D.DEPT_NO
, D.DNOMBRE AS [DEPARTAMENTO]
, E.APELLIDO, E.SALARIO
FROM EMP AS E
ON E.DEPT_NO = D.DEPT_NO
--5) Crear procedimiento para devolver salario, oficio y comisión, pasándole el apellido.
--6) Igual que el anterior, pero si no le pasamos ningún valor, mostrará los datos de todos los empleados.
SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE @PAPELLIDO
273
ING. JESUS MANUEL HERNANDEZ ZATARAIN
--7) Crear un procedimiento para mostrar el salario, oficio, apellido y nombre del departamento de todos los empleados
que contengan en su apellido el valor que le pasemos como parámetro.
SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE '%' + @PAPELLIDO + '%'
8) Crear un procedimiento que recupere el número departamento, el nombre y número de empleados, dándole
como valor el nombre del departamento, si el nombre introducido no es válido, mostraremos un mensaje
informativo comunicándolo.
2 AS
12 FROM EMP AS E
274
ING. JESUS MANUEL HERNANDEZ ZATARAIN
13 INNER JOIN DEPT AS D
14 ON E.DEPT_NO = D.DEPT_NO
18
9) Crear un procedimiento para devolver un informe sobre los empleados de la plantilla de un determinado
hospital, sala, turno o función. El informe mostrará número de empleados, media, suma y un informe
personalizado de cada uno que muestre número de empleado, apellido y salario.
2 @VALOR NVARCHAR(30)
AS
3
DECLARE @CONSULTA NVARCHAR(30)
4
SELECT @CONSULTA = NOMBRE
5
FROM HOSPITAL
6
WHERE NOMBRE = @VALOR
7
IF (@CONSULTA IS NULL)
8 BEGIN
275
ING. JESUS MANUEL HERNANDEZ ZATARAIN
11 IF (@CONSULTA IS NULL)
12 BEGIN
19 BEGIN
30 GROUP BY FUNCION
276
ING. JESUS MANUEL HERNANDEZ ZATARAIN
38 BEGIN
39 PRINT 'TURNO'
SELECT T AS [TURNO]
40
,AVG(SALARIO) AS [MEDIA]
41
,COUNT(EMPLEADO_NO) AS [Nº EMPLEADOS]
42
,SUM(SALARIO) AS [SUMA] FROM PLANTILLA
43
GROUP BY T
44
HAVING T = @VALOR
45 SELECT T AS [TURNO]
47 ,APELLIDO, SALARIO
48 FROM PLANTILLA
WHERE T = @VALOR
49
END
50
END
51
ELSE
52
BEGIN
53
PRINT 'SALA'
54
SELECT S.NOMBRE AS [SALA]
55 ,AVG(P.SALARIO) AS [MEDIA]
ON S.HOSPITAL_COD = P.HOSPITAL_COD
59
GROUP BY S.NOMBRE
60
HAVING S.NOMBRE = @VALOR
61
SELECT S.NOMBRE AS [SALA]
62
,P.EMPLEADO_NO AS [Nº EMPLEADO]
63
,P.APELLIDO, P.SALARIO
64 FROM PLANTILLA AS P
277
ING. JESUS MANUEL HERNANDEZ ZATARAIN
65 INNER JOIN SALA AS S
66 ON S.HOSPITAL_COD = P.HOSPITAL_COD
73 ,AVG(P.SALARIO) AS [MEDIA]
84 ON H.HOSPITAL_COD = P.HOSPITAL_COD
END
278
ING. JESUS MANUEL HERNANDEZ ZATARAIN
10) Crear un procedimiento en el que pasaremos como parámetro el Apellido de un empleado. El procedimiento
devolverá los subordinados del empleado escrito, si el empleado no existe en la base de datos, informaremos de ello, si
el empleado no tiene subordinados, lo informa remos con un mensaje y mostraremos su jefe. Mostrar el número de
empleado, Apellido, Oficio y Departamento de los subordinados.
1
CREATE PROCEDURE JEFES
2 @APE NVARCHAR(30)
3 AS
13 ,@SUB = B.EMP_NO
15 ON A.EMP_NO = B.DIR
279
ING. JESUS MANUEL HERNANDEZ ZATARAIN
17 ORDER BY B.DIR
18 IF (@JEFE IS NULL)
BEGIN
19
SELECT A.EMP_NO AS [Nº DE EMPLEADO]
20
,A.APELLIDO AS [JEFE], A.OFICIO
21
,A.DEPT_NO AS [Nº DEPARTAMENTO]
22
,B.EMP_NO AS [Nº EMPLEADO]
23
,B.APELLIDO AS [SUBORDINADO]
24 ,B.OFICIO
26 FROM EMP AS A
ON B.DIR = A.EMP_NO
28
WHERE B.EMP_NO = @EMP
29
ORDER BY B.DIR
30
END
31
ELSE
32
BEGIN
33
SELECT A.EMP_NO AS [Nº DE EMPLEADO]
34 ,A.APELLIDO AS [JEFE], A.OFICIO
37 ,B.APELLIDO AS [SUBORDINADO]
,B.OFICIO
38
,B.DEPT_NO AS [Nº DEPARTAMENTO]
39
FROM EMP AS A INNER JOIN EMP AS B
40
ON A.EMP_NO = B.DIR
41
WHERE B.DIR = @EMP
42
ORDER BY B.DIR
43 END
280
ING. JESUS MANUEL HERNANDEZ ZATARAIN
END
11) Crear procedimiento que borre un empleado que coincida con los parámetros indicados (los parámetros
serán todos los campos de la tabla empleado).
CREATE PROCEDURE BORRA_EMPLEADO
1
@EMP_NO INT,
2
@APELLIDO NVARCHAR(20),
3
@OFICIO NVARCHAR(20),
4
@DIR INT,
5
@FECHA_ALT SMALLDATETIME,
6 @SALARIO INT,
7 @COMISION INT,
8 @DEPT_NO INT
9 AS
281
ING. JESUS MANUEL HERNANDEZ ZATARAIN
17
12) Modificación del ejercicio anterior, si no se introducen datos correctamente, informar de ello con un
mensaje y no realizar la baja. Si el empleado introducido no existe en la base de datos, deberemos informarlo
con un mensaje que devuelva el nombre y número de empleado del empleado introducido. Si el empleado
existe, pero los datos para eliminarlo son incorrectos, informaremos mostrando los datos reales del empleado
junto con los datos introducidos por el usuario, para que se vea el fallo.
2 @EMP_NO INT
3 ,@APELLIDO NVARCHAR(20)
4 ,@OFICIO NVARCHAR(20)
,@DIR INT
5
,@FECHA_ALT SMALLDATETIME
6
,@SALARIO INT
7
,@COMISION INT
8
,@DEPT_NO INT
9
AS
10 DECLARE @VALOR NVARCHAR(30)
282
ING. JESUS MANUEL HERNANDEZ ZATARAIN
15 AND DIR = @DIR
23 BEGIN
END
26
ELSE
27
BEGIN
28
PRINT 'DATOS INTRODUCIDOS ERRONEAMENTE: '
29
PRINT CAST(@EMP_NO AS NVARCHAR(4)) + ' ' + @APELLIDO + ' '
30
+ @OFICIO + ' ' + CAST(@DIR AS NVARCHAR(4)) + ' '
31
+ CAST(@FECHA_ALT AS NVARCHAR(12)) + ' '
32 + CAST(@SALARIO AS NVARCHAR(10)) + ' '
34 + CAST(@DEPT_NO AS NVARCHAR(4))
283
ING. JESUS MANUEL HERNANDEZ ZATARAIN
42 + CAST(@FECHA_ALT AS NVARCHAR(12)) + ' '
13) Crear un procedimiento para insertar un empleado de la plantilla del Hospital. Para poder insertar el
empleado realizaremos restricciones:
- El oficio para insertar deberá estar entre los que hay en la base de datos, al igual que el Turno.
- (Opcional) Podremos insertar por el código del hospital o sala y por su nombre.
2 @HOSPITAL NVARCHAR(30)
3 ,@SALA NVARCHAR(30)
,@EMPLEADO INT
4
,@APELLIDO NVARCHAR(30)
5
,@FUNCION NVARCHAR(30)
6
,@TURNO NVARCHAR(2)
7
,@SALARIO INT
8
AS
9 DECLARE @HOSPITAL2 INT
285
ING. JESUS MANUEL HERNANDEZ ZATARAIN
22 IF (@SALA2 IS NULL OR @HOSPITAL2 IS NULL)
23 BEGIN
29
PRINT 'NO SE HA REALIZADO LA INSERCIÓN'
30 END
31 ELSE
32 BEGIN
42 PRINT ''
END
44
ELSE
45
BEGIN
46
IF (@SALARIO > 500000)
47
BEGIN
48
286
ING. JESUS MANUEL HERNANDEZ ZATARAIN
49 PRINT 'EL SALARIO MÁXIMO PARA LOS TRABAJADORES
58 END
59 END
END
60
END
61
ELSE
62
BEGIN
63
PRINT 'EL NÚMERO DE EMPLEADO INTRODUCIDO ESTÁ REPETIDO: ' +
64
CAST(@EMPLEADO AS NVARCHAR(4))
65
PRINT 'NO SE HA REALIZADO LA INSERCIÓN'
END
--8) Crear un procedimiento que recupere el número departamento, el nombre y número de empleados, dándole como
valor el nombre del departamento, si el nombre introducido no es válido, mostraremos un mensaje informativo
comunicándolo.
AS
IF (@DEPTDEF IS NULL)
ELSE
BEGIN
FROM EMP AS E
ON E.DEPT_NO = D.DEPT_NO
END
--9) Crear un procedimiento para devolver un informe sobre los empleados de la plantilla de un determinado hospital,
sala, turno o función. El informe mostrará número de empleados, media, suma y un informe personalizado de cada uno
que muestre número de empleado, apellido y salario.
288
ING. JESUS MANUEL HERNANDEZ ZATARAIN
CREATE PROCEDURE EMPPLANTILLA
@VALOR NVARCHAR(30)
AS
FROM HOSPITAL
IF (@CONSULTA IS NULL)
BEGIN
IF (@CONSULTA IS NULL)
BEGIN
WHERE T = @VALOR
IF (@CONSULTA IS NULL)
BEGIN
IF (@CONSULTA IS NULL)
BEGIN
END
ELSE
BEGIN
PRINT 'FUNCION'
GROUP BY FUNCION
FROM PLANTILLA
END
END
ELSE
BEGIN
PRINT 'TURNO'
SELECT T AS [TURNO]
,AVG(SALARIO) AS [MEDIA]
GROUP BY T
HAVING T = @VALOR
SELECT T AS [TURNO]
,APELLIDO, SALARIO
FROM PLANTILLA
WHERE T = @VALOR
END
END
ELSE
BEGIN
PRINT 'SALA'
290
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SELECT S.NOMBRE AS [SALA]
,AVG(P.SALARIO) AS [MEDIA]
ON S.HOSPITAL_COD = P.HOSPITAL_COD
GROUP BY S.NOMBRE
,P.APELLIDO, P.SALARIO
FROM PLANTILLA AS P
ON S.HOSPITAL_COD = P.HOSPITAL_COD
END
END
ELSE
BEGIN
PRINT 'HOSPITAL'
,AVG(P.SALARIO) AS [MEDIA]
ON H.HOSPITAL_COD = P.HOSPITAL_COD
GROUP BY H.NOMBRE
FROM PLANTILLA AS P
ON H.HOSPITAL_COD = P.HOSPITAL_COD
END
--10) Crear un procedimiento en el que pasaremos como parámetro el Apellido de un empleado. El procedimiento
devolverá los subordinados del empleado escrito, si el empleado no existe en la base de datos, informaremos de ello, si
el empleado no tiene subordinados, lo informa remos con un mensaje y mostraremos su jefe. Mostrar el número de
empleado, Apellido, Oficio y Departamento de los subordinados.
@APE NVARCHAR(30)
AS
IF (@EMP IS NULL)
BEGIN
PRINT 'NO EXISTE NINGUN EMPLEADO CON ESTE APELLIDO: ' + @APE
END
ELSE
BEGIN
,@SUB = B.EMP_NO
ON A.EMP_NO = B.DIR
292
ING. JESUS MANUEL HERNANDEZ ZATARAIN
WHERE B.DIR = @EMP
ORDER BY B.DIR
IF (@JEFE IS NULL)
BEGIN
,B.APELLIDO AS [SUBORDINADO]
,B.OFICIO
FROM EMP AS A
ON B.DIR = A.EMP_NO
ORDER BY B.DIR
END
ELSE
BEGIN
,B.APELLIDO AS [SUBORDINADO]
,B.OFICIO
ON A.EMP_NO = B.DIR
ORDER BY B.DIR
293
ING. JESUS MANUEL HERNANDEZ ZATARAIN
END
END
--11) Crear procedimiento que borre un empleado que coincida con los parámetros indicados (los parámetros serán
todos los campos de la tabla empleado).
@EMP_NO INT,
@APELLIDO NVARCHAR(20),
@OFICIO NVARCHAR(20),
@DIR INT,
@FECHA_ALT SMALLDATETIME,
@SALARIO INT,
@COMISION INT,
@DEPT_NO INT
AS
294
ING. JESUS MANUEL HERNANDEZ ZATARAIN
--12) Modificación del ejercicio anterior, si no se introducen datos correctamente, informar de ello con un mensaje y no
realizar la baja. Si el empleado introducido no existe en la base de datos, deberemos informarlo con un mensaje que
devuelva el nombre y número de empleado del empleado introducido. Si el empleado existe, pero los datos para
eliminarlo son incorrectos, informaremos mostrando los datos reales del empleado junto con los datos introducidos por
el usuario, para que se vea el fallo.
@EMP_NO INT
,@APELLIDO NVARCHAR(20)
,@OFICIO NVARCHAR(20)
,@DIR INT
,@FECHA_ALT SMALLDATETIME
,@SALARIO INT
,@COMISION INT
,@DEPT_NO INT
AS
IF (@VALOR IS NULL)
BEGIN
IF (@VALOR IS NULL)
295
ING. JESUS MANUEL HERNANDEZ ZATARAIN
BEGIN
END
ELSE
BEGIN
+ CAST(@DEPT_NO AS NVARCHAR(4))
+ CAST(@DEPT_NO AS NVARCHAR(4))
END
END
ELSE
BEGIN
END
/*13) Crear un procedimiento para insertar un empleado de la plantilla del Hospital. Para poder insertar el empleado
realizaremos restricciones:
- Para insertar, lo haremos por el nombre del hospital y por el nombre de sala, si no existe la sala o el hospital, no
insertaremos y lo informaremos.
- El oficio para insertar deberá estar entre los que hay en la base de datos, al igual que el Turno.
- (Opcional) Podremos insertar por el código del hospital o sala y por su nombre.*/
@HOSPITAL NVARCHAR(30)
,@SALA NVARCHAR(30)
,@EMPLEADO INT
,@APELLIDO NVARCHAR(30)
,@FUNCION NVARCHAR(30)
,@TURNO NVARCHAR(2)
,@SALARIO INT
297
ING. JESUS MANUEL HERNANDEZ ZATARAIN
AS
IF (@EMPLEADO2 IS NULL)
BEGIN
BEGIN
DATOS:'
PRINT ''
END
ELSE
BEGIN
WHERE T = @TURNO
298
ING. JESUS MANUEL HERNANDEZ ZATARAIN
IF (@FUNCION2 IS NULL OR @TURNO2 IS NULL)
BEGIN
VÁLIDOS'
PRINT ''
END
ELSE
BEGIN
BEGIN
END
ELSE
BEGIN
END
END
END
END
ELSE
BEGIN
END
Son procedimientos asociados a una tabla. Se activan cuando se produce una eliminación,
modificación o inserción en la tabla asociada.
Si tenemos una tabla de clientes, y otra de informes, por ej. cada vez que se produzca una baja en
clientes, almacenamos el nombre y apellidos del cliente en informe para posteriormente hacer una
estadística con los clientes borrados.
Tenemos la tabla de nominas, cada vez que un usuario acceda a ella, el trigger se activa y almacena
su nombre en otra tabla.
En este caso como queremos borrar, obtendremos la información de la tabla Deleted, que es una
tabla de sistema donde se almacenan todos los datos borrados de todas las tablas. Con lo que la
instrucción quedaría así.
1
CREATE TRIGGER [BORRADOR]
2 ON DEPT
3 FOR DELETE
4 AS
5 DELETE FROM EMP
6 FROM EMP, DELETED
WHERE
7 EMP.DEPT_NO = DELETED.DEPT_NO
8
300
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1 DELETE FROM DEPT WHERE DEPT_NO = 70
1 CREATE TRIGGER
2 INSERTAR_EMP
3 ON EMP
4 FOR INSERT
5 AS
SELECT * FROM INSERTED
6
Una vez creado el Trigger realizamos una insercción de datos y obtenemos los siguientes resultado.
1 INSERT INTO EMP(Emp_No, Apellido, Oficio, Dir, Fecha_Alt, Salario, Comision, Dept_No)
2 VALUES(7455,'GANOZA','EMPLEADO',7902,'29/05/2015',15520,0,20)
301
ING. JESUS MANUEL HERNANDEZ ZATARAIN
insertar en la tabla deleted el registro antes de ser modificado y en la tabla inserted el registro ya
modificado, porque entiende que se ha borrado un registro y se ha insertado otro.
Con lo cuál para crear un trigger que se active con un update, trabajaremos con las tablas del
sistema deleted e inserted.
1
2 CREATE TRIGGER [MODIFICAR]
ON DEPT
3 FOR UPDATE
4 AS
5 UPDATE EMP
6 SET
7 DEPT_NO = INSERTED.DEPT_NO
FROM EMP,DELETED,INSERTED
8 WHERE
9 EMP.DEPT_NO = DELETED.DEPT_NO
10
Este ejemplo suele funcionar en el caso que se desea actualizar en cascada y no existe una
referencia de clave foránea.
Lo que haría es que cuando modificamos el código de un registro en la tabla dept, se activa el
trigger, va a la tabla Emp y actualiza los departamento con el nuevo código, que coincidan con el
código eliminado. Para ejemplificarlo de algún modo, si actualizo el código del departamento 50 a 80,
lo que hace el trigger es buscar en la tabla Emp todos los departamentos con código 50 y
actualizarlos a 80.
Super Ejemplo
El siguiente ejemplo almacenará en una tabla que crearemos un registro con datos de cada fila que
borremos, modifiquemos o insertemos.
Este registro contendrá
Nº de empleado.
Usuario que realizó la consulta de acción.
Fecha de la consulta de acción.
Tipo de operación realizada.
1) Creamos la tabla
Siguiendo este ejemplo puedes crear los trigger para insert y update.
Para poder realizar los ejercicios de esta publicación necesitarás descargar la Base de Datos Hospital, pero no la que
compartimos en publicaciones anteriores, sino una nueva versión adaptada para ejecutar estos trigger. Lo único que se
hizo de la versión anterior es quitarles las restricciones de clave tanto primarias como foráneas.
http://sh.st/kCFEA
1) Crear un Trigger que borre en cascada sobre la tabla relacionada cuando borremos una sala. Mostrar el
registro borrado al ejecutar el Trigger.
303
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3 AS
2) Crear un Trigger que se active cuando Actualicemos alguna sala del hospital, modificando sus tablas
relacionadas. Mostrar el registro Actualizado.
1
CREATE TRIGGER MODIFICARSALA
2
ON SALA
3 FOR UPDATE
4 AS
5 UPDATE PLANTILLA
304
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3) Crear un Trigger que se active al eliminar un registro en la tabla hospital y modifique las tablas
correspondientes.
1
CREATE TRIGGER BORRARHOSPITAL ON HOSPITAL
2
FOR DELETE
3 AS
5 PLANTILLA.HOSPITAL_COD = DELETED.HOSPITAL_COD
SALA.HOSPITAL_COD = DELETED.HOSPITAL_COD
7
DELETE FROM DOCTOR FROM DOCTOR,DELETED WHERE
8
DOCTOR.HOSPITAL_COD = DELETED.HOSPITAL_COD
9
4) Crear un Trigger para controlar la inserción de empleados, cuando insertemos un empleado se copiarán
datos sobre la inserción en una tabla llamada Control_BD. Los datos que se copiarán son el Número de
empleado, El usuario que está realizando la operación, la fecha y el tipo de operación.
305
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1
CREATE TABLE Control_BD
2
(
3
EMP_NO INT NULL,
4
USUARIO VARCHAR(20) NULL,
5
FECHA DATETIME NULL,
6 OPERACION VARCHAR(15) NULL
7 )
8 GO
ON EMP
10
FOR INSERT
11
AS
12
INSERT INTO Control_BD (EMP_NO, USUARIO, FECHA, OPERACION)
13
SELECT INSERTED.EMP_NO, USER_NAME(), GETDATE(), 'INSERCION'
14
FROM INSERTED
15
1 INSERT INTO EMP(EMP_NO, APELLIDO, OFICIO, DIR, FECHA_ALT, SALARIO, COMISION, DEPT_NO)
2 VALUES(7455,'GANOZA','EMPLEADO',7902,'29/05/2015',15520,0,20)
5) Crear un Trigger que actue cuando se modifique la tabla hospital y sobre todas las tablas con las que esté
relacionadas.
306
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1
CREATE TRIGGER MODIFHOSPITAL ON HOSPITAL
2
FOR UPDATE
3
AS
4
UPDATE PLANTILLA
5
SET HOSPITAL_COD = INSERTED.HOSPITAL_COD
6 FROM PLANTILLA, INSERTED, DELETED
8 UPDATE SALA
6) Crear un Trigger en la tabla plantilla. Cuando actualicemos la tabla plantilla, debemos comprobar que el
hospital que actualizamos existe, si intentamos actualizar el código de hospital, no podremos hacerlo si no
existe relación con algún código de hospital. Realizar el mismo Trigger para las tablas relacionadas con
Hospital.
2 FOR UPDATE
3 AS
FROM HOSPITAL AS H
6
307
ING. JESUS MANUEL HERNANDEZ ZATARAIN
7 INNER JOIN INSERTED AS I
8 ON H.HOSPITAL_COD = I.HOSPITAL_COD
IF (@HOSPITAL IS NULL)
9
BEGIN
10
PRINT 'NO EXISTE EL CODIGO DE HOSPITAL'
11
UPDATE PLANTILLA SET HOSPITAL_COD = D.HOSPITAL_COD
12
FROM PLANTILLA AS H
13
, INSERTED AS I
14 , DELETED AS D
16 END
17 ELSE
19
7) Modificar el Trigger del ejercicio 4, utilizando transacciones y control de errores, si la operación es correcta,
mostrará un mensaje positivo, si la operación no es correcta mostrará el error y un mensaje que indique que
no se ha llevado a cabo la operación.
ALTER TRIGGER [DAR ALTA]
1
ON EMP
308
ING. JESUS MANUEL HERNANDEZ ZATARAIN
2 FOR INSERT
3 AS
10 BEGIN
11 ROLLBACK TRAN
PRINT @@ERROR
13
END
14
ELSE
15
BEGIN
16
COMMIT TRAN
17
PRINT 'EMPLEADO INSERTADO CORRECTAMENTE'
18
END
19
20
21
1 INSERT INTO EMP(EMP_NO, APELLIDO, OFICIO, DIR, FECHA_ALT, SALARIO, COMISION, DEPT_NO)
2 VALUES(8741,'ZEGARRA','EMPLEADO',7902,'30/05/2015',15520,0,20)
309
ING. JESUS MANUEL HERNANDEZ ZATARAIN
8) Crear un trigger que guarde los datos en la tabla controltrigger cuando se realice la baja de un empleado.
1
CREATE TRIGGER [DAR BAJA]
2 ON EMP
3 FOR DELETE
4 AS
SELECT DELETED.EMP_NO,USER_NAME(),GETDATE(),'BAJA'
6
FROM DELETED
7
9) Crear un Trigger que guarde los datos en la tabla ControlTrigger cuando se relice una modificación en un
empleado. Guardar la hora de la actualización en un campo aparte en la tabla ControlTrigger. (Añadir un
campo)
310
ING. JESUS MANUEL HERNANDEZ ZATARAIN
1
ALTER TABLE Control_BD ADD HORA VARCHAR(10)
2
GO
3
CREATE TRIGGER [MODIFICAREMP]
4
ON EMP
5 FOR UPDATE
6 AS
9 + CONVERT(CHAR(2),DATEPART(MI,GETDATE()))
+ ':' + CONVERT(CHAR(2),DATEPART(SS,GETDATE()))
10
INSERT INTO Control_BD(EMP_NO,USUARIO,FECHA,OPERACION,HORA)
11
SELECT DELETED.EMP_NO,USER_NAME(),GETDATE(),'MODIFICACION',@HORA
12
FROM DELETED, INSERTED
13
WHERE DELETED.EMP_NO = INSERTED.EMP_NO
14
10) Borrar todos los Triggers creados después de haber sido probados.
311
ING. JESUS MANUEL HERNANDEZ ZATARAIN
4 DROP TRIGGER [DAR ALTA]
http://sh.st/kCFD7
--1) Crear un Trigger que borre en cascada sobre la tabla relacionada cuando borremos una sala. Mostrar el registro
borrado al ejecutar el Trigger.
--2) Crear un Trigger que se active cuando Actualicemos alguna sala del hospital, modificando sus tablas relacionadas.
Mostrar el registro Actualizado.
--3) Crear un Trigger que se active al eliminar un registro en la tabla hospital y modifique las tablas correspondientes.
--4) Crear un Trigger para controlar la inserción de empleados, cuando insertemos un empleado se copiarán datos sobre
la inserción en una tabla llamada Control_BD. Los datos que se copiarán son el Número de empleado, El usuario que
está realizando la operación, la fecha y el tipo de operación.
INSERT INTO EMP(EMP_NO, APELLIDO, OFICIO, DIR, FECHA_ALT, SALARIO, COMISION, DEPT_NO)
VALUES(7455,'GANOZA','EMPLEADO',7902,'29/05/2015',15520,0,20)
--5) Crear un Trigger que actue cuando se modifique la tabla hospital y sobre todas las tablas con las que esté
relacionadas.
--6) Crear un Trigger en la tabla plantilla. Cuando actualicemos la tabla plantilla, debemos comprobar que el hospital que
actualizamos existe, si intentamos actualizar el código de hospital, no podremos hacerlo si no existe relación con algún
código de hospital. Realizar el mismo Trigger para las tablas relacionadas con Hospital.
--7) Modificar el Trigger del ejercicio 4, utilizando transacciones y control de errores, si la operación es correcta,
mostrará un mensaje positivo, si la operación no es correcta mostrará el error y un mensaje que indique que no se ha
llevado a cabo la operación.
INSERT INTO EMP(EMP_NO, APELLIDO, OFICIO, DIR, FECHA_ALT, SALARIO, COMISION, DEPT_NO)
VALUES(8741,'ZEGARRA','EMPLEADO',7902,'30/05/2015',15520,0,20)
--8) CREAR UN TRIGGER QUE GUARDE LOS DATOS EN LA TABLA CONTROLTRIGGER CUANDO SE REALICE LA BAJA DE UN
EMPLEADO.
--9) Crear un Trigger que guarde los datos en la tabla ControlTrigger cuando se relice una modificación en un empleado.
Guardar la hora de la actualización en un campo aparte en la tabla ControlTrigger. (Añadir un campo)
--10) Borrar todos los Triggers creados después de haber sido probados.
Las vistas son consultas ya realizadas, pueden ser de una sola tabla o de varias. Muy útiles si por ejemplo
queremos que un usuario solo tenga acceso a unas determinadas columnas de una tabla pero no a otras, para eso
crearemos una vista con las columnas que puede ver. Las vistas tienen la propiedad que si cambiamos el
nombre de las tablas o columnas a las que hace referencia, automáticamente se cambian en esta.
Create View
Sintaxis:
Ejemplo:
Crea una vista llamada VistaEmpleados que contiene nº de empleado, apellido, fecha de alta, y nombre de
departamento de las tablas Empleados y Departamento.
1
CREATE VIEW VISTAEMPLEADOS
2 AS
3 SELECT EMP_NO, APELLIDO, FECHA_ALT, DNOMBRE
4 FROM EMP
5 INNER JOIN DEPT
ON
6 EMP.DEPT_NO = DEPT.DEPT_NO
7
316
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Vemos que la vista aparece en el nodo Vistas de la base de datos en el explorador de objetos del SQL Server
Management Studio.
317
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Si después de esto, modificamos los datos de las tablas aceptadas por la vista...
Volvemos a ver los datos de la vista y vemos que también han cambiado, ya que la Vista no es una copia de los
datos si no una consulta realizada sobre los datos originales...
318
ING. JESUS MANUEL HERNANDEZ ZATARAIN
También se pueden realizar consultas usando campos de tablas mezclados con campos de vistas.
Ejemplo:
319
ING. JESUS MANUEL HERNANDEZ ZATARAIN
También se puede realizar una vista con datos de una consulta de una tabla y una vista.
1
CREATE VIEW VISTAEMPUNIONHOSPITAL
2 AS
3 SELECT EMP_NO, APELLIDO, DNOMBRE
4 FROM VISTAEMPLEADOS
5 UNION
SELECT EMPLEADO_NO, APELLIDO, CAST(HOSPITAL_COD AS VARCHAR(6))
6 FROM PLANTILLA
7
320
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SP_HelpText
Sintaxis:
1 SP_HelpText Vista
Ejemplo:
1 SP_HelpText VistaEmpleados
321
ING. JESUS MANUEL HERNANDEZ ZATARAIN
SP_Depends
Muestra las tablas, campos e incluso vistas de las que depende una vista.
Sintaxis:
1 SP_Depends Vista
Ejemplo:
1 SP_Depends VistaEmpUnionHospital
Drop View
322
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Sintaxis:
Ejemplo:
Crea una Vista encriptada, de forma que si hacemos una consulta con Sp_HelpText o SP_Depends solo nos devulve un
mensaje indicando que la vista está encriptada.
Sintaxis:
2 With Encryption
3 As
4 Sentencias Sql
Ejemplo:
2 WITH ENCRYPTION
3 AS
323
ING. JESUS MANUEL HERNANDEZ ZATARAIN
5 UNION
7 UNION
1 sp_helptext APELLIDOS
Crea una vista cuyos datos a los que hace referencia, no se pueden modificar o borrar, para que los resultados de la vista
no se vean afectados. Esto es muy práctico en caso de que por ejemplo hagamos una vista con una consulta que usa
where.
Sintaxis:
2 AS
3 SENTENCIA SQL
Ejemplo:
2 AS
324
ING. JESUS MANUEL HERNANDEZ ZATARAIN
3 SELECT * FROM EMP WHERE OFICIO='VENDEDOR'
Con esta opción no podremos actualizar los campos que tenemos en el Where de la Vista, pero la tabla si que podemos
modificarla, con lo cual ofrecemos permisos sobre la vista al usuario y no le damos permisos de ningún tipo sobre la
tabla, que el usuario trabaje sobre las vistas.
Con la siguiente actualización no podría realizar modificaciones sobre la vista, porque le he puesto With Check Option.
De esta forma le doy permisos sobre la vista, pero no sobre la tabla, y no podrá modificar un cambio en el campo que yo
he puesto.
Con la siguiente actualización si me permitiría realizar modificaciones aunque tuviese with Check Option en la vista, ya
que estoy trabajando sobre la Tabla.
325
ING. JESUS MANUEL HERNANDEZ ZATARAIN
Espero haber ayudado en algo. Hasta la próxima oportunidad!
326
ING. JESUS MANUEL HERNANDEZ ZATARAIN