Manual de Microsoft SQL Server TRANSACT SQL
Manual de Microsoft SQL Server TRANSACT SQL
INDICE
27. SubConsultas
31. CASE
39. Transacciones
52. Vistas
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
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
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.
“En SQL Server Installation Center” es posible revisar información detallada acerca de requerimientos para la instalación,
existing installation”
Observe de nuevo el reporte y haga clic en “OK”
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”
Ahora, lea los términos de licencia y luego, si está de acuerdo seleccione la opción correspondiente y haga clic en “Next”
A continuación, se instalan componentes de soporte necesarios para la instalación, haga clic en “Install” para instalarlos
Ahora haga clic en “Next”
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
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
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.
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
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”
Ahora revise las ubicaciones físicas donde va a quedar instalado SQL Server y cada uno de sus componentes, Haga clic en
Next
Agregue los usuarios que van a ser administradores de Análisis Services, puede agregar al usuario con el que está
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”
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”
Haga clic en “Next”
Revise el resumen y haga clic en “Install”
La instalación está siendo realizada
La instalación ha sido completada
Si desea ver un resumen de la instalación, aquí encuentra un link hacia dicho registro de resumen; Haga clic en “Close”
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.
Conocimientos básicos de SQL Server
Elementos de sintaxis:
Directivas de procesos por lotes
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.
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
EJEMPLO: @Contador.
EJEMPLO: @@Error
Operadores de SQL:
Lógicos:
AND, OR , NOT
De Comparación:
= Igual
< Menor
> Mayor
<> Diferente
>= Mayor o igual
<= Menor o igual
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.
a. .MDF
b. .NDF: Contiene las copias de seguridad. También vistas, tablas y consultas que se usan mas frecuentemente. Este tipo
de archivos se puede separar e instalar en diferente máquina que el resto del servidor de la base de datos, para poder
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
a. LDF
On Primary
(Name = Nombre,
Filename = 'Ruta\NombredeArchivo.MDF',
Log on
(NAME = Nombre,
Filename = 'Ruta\NombredeArchivo.LDF',
On Primary
(Name = EjemploData,
Filename = 'D:\Ejemplo.MDF',
Filegrowth = 20%)
Log on
(NAME = EjemploLog,
Filename = 'D:\EjemploLog.ldf',
Size = 3MB,
MaxSize = 5MB,
FileGrowth = 1MB)
SP_HELPDB
Muestra todas las bases de datos del servidor, con su propietario, tamaño hora de creación etc.
SP_SPACEUSED
Son los formados por archivos NDF, donde como hemos visto antes, se almacenan copias de seguridad, vistas etc.
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:
Alter Database Base de datos
Add File
Name = ‘Nombre’,
Filename = ‘Ruta\Archivo.ndf’,
Size = Tamaño en MB
SP_HelpFile
3. Mediante la opción Modify File de Alter Database, podemos modificar un archivo secundario. Sintaxis:
Alter Database Base de datos Modify File (name = ‘nombre’, propiedades y valores a modificar)
4. Con Add File, podemos añadir un nuevo archivo NDF al archivo secundario de la base de datos elegido. Sintaxis:
Add File
(Name = 'Nombre',
Filename = 'Ruta\Archivo.NDF',
5. Con Remove File, podemos eliminar un archivo elegido de la base de datos Sintaxis:
Sintaxis:
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:
1º) Crear una base de datos de Clientes con un tamaño de 40 MB y con crecimiento de un 10%.
sp_helpdb
sp_spaceused
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.
4º) Mostrar las características de los archivos que acabamos de incluir y de su grupo.
5º) Eliminar uno de los archivos del grupo Bajas y modificar el otro para darle un tamaño de 10 MB.
Dbcc shrinkdatabase(Clientes, 2)
use master
go
drop database Clientes
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:
EXEC sp_addtype Ciudad, 'nvarchar(15)', NULL
Ejemplo:
Ejemplo:
Ejemplo:
Sintaxis:
Ejemplo:
Restricciones de tablas en una base de datos
Default
Sintaxis parcial
[ constraint nombre_restricción ] default expresión
Ejemplo
alter table Producto
add constraint DF_Descripcion default 'No especifica'
for Descripcion
Check
Para sentencias Insert y Update
Pueden hacer referencias a columnas en la misma tabla
No pueden contener subconsultas
Sintaxis parcial
[Constraint nombrerestriccion) check ( Expresion )
Ejemplo
alter table Producto
add constraint CHK_Stock Check(Stock > -1)
Primary key
Sólo una por tabla
Valores exclusivos
No se permiten valores nulos
Crea un índice exclusivo en las columnas especificadas (Predet. --> CLUSTERED )
Sintaxis parcial
[Constraint nombrerestriccion] primary key [Clustered | NonClustered ] columnas
Ejemplo
alter table Producto add constraint Pk_Codigo primary key nonclustered (codigo)
Unique
Permite un valor nulo
Permite varias en una tabla
Formadas por una o mas columnas
Exigida con un índice único
Sintaxis parcial
Ejemplo
Foreign key
Deben hacer referencia a PRIMARY KEY o UNIQUE
Proporcionan integridad referencial de una o varias columnas
No crean índices automáticamente
Permisos SELECT o REFERENCES
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
Sintaxis parcial
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
Con cascade puedes borrar ProductId de products , lo cual borrara productId de orders, con No Action no lo podras borrar.
Ejemplo
alter table Producto
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
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
Sintaxis parcial
Constraint {All | Restricción 1, … } => Para hacer la restriccion a todo , o a sólo lo que está separado por comas “,”
Tener en cuenta:
- Pueden vincularse a una o mas columnas o a tipos de datos definidos por el usuario
- Toda regla asociada a la columna y a los tipos de datos valida el valor de un valor predeterminado
- Cualquier restricción CHECK sobre la columna debe validar el valor de un valor predeterminado
- No se puede crear una restricción DEFAULT en una columna que este definida con un tipo de datos definido por el usuario
DEFAULT
Sintaxis
use northwind
GO
GO
use northwind
Para eliminar varios objetos de la base de datos con una sola sentencia
REGLAS
- Una columna o tipo de dato definido por el usuario solo puede tener asociado una regla
Sintaxis
use Hospital
as
@Funcion in('INTERINO','ENFERMERO','ENFERMERA')
GO
EXEC sp_bindrule Funcion_rule,'Plantilla.Funcion'
use northwind
GO
GO
use northwind
GO
GO
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
use Escuela
GO
exec sp_addtype TNoNulo,'nvarchar(15)','Not null'
exec sp_addtype TNulo,'nvarchar(15)','Null'
Localidad Texto
Provincia Texto
Año_Construcción Fecha
Coste_Construcción Moneda
Cod_Region Numérico
Apellido1 Texto
Apellido2 Texto
Edad Numérico
Localidad Texto
Provincia Texto
Salario Money
Apellido1 Texto
Apellido2 Texto
Fecha_nac Fecha/hora
Localidad Texto
Provincia Texto
8. Crear un gráfico que muestre las relaciones que se han obtenido en la base de datos hasta ahora :
Estructuras de las tablas en SQL Server - 2 de 2
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 :
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
TABLA COLEGIOS
Antes de insertar verifica el código de la región. Debe ser el que te genero la tabla regiones.
PARA INTRODUCIR AL SIGUIENTE ALUMNO HAY QUE CAMBIAR LA COLUMNA DE LOCALIDAD PARA QUE ADMITA
MAS CARACTERES.
alter table alumnos alter column Localidad nvarchar(50) null
R','Miguel','Torres','Tormo','15/03/95','LLOBREGAT','BARCELONA',12)
Borrar todas las tablas, tipos de datos y base de datos. Realizarlo en el siguiente orden.
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
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' ,
Size = 6MB ,
MaxSize = 8MB ,
Filegrowth = 2%)
Creo las tablas y utilizo los valores Null y Not Null convenientemente.
use Prueba
go
go
on Update Cascade
on Delete Cascade
add constraint CK_Fecha Check (Fecha_alt > '01/01/1970' and Fecha_alt <= GetDate())
Creo una regla para que todos los empleados tengan asociado director
GO
GO
Inserto un empleado
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.
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
Si deseas la puedes crear a manera de practicas desde tu editor SQL o bien puedes descargarlo desde el link que dejo al
Sin mas preámbulos les presento la estructura de la base de datos Hospital. Vamos a sacarle el máximo de provecho.
SCRIPT SQL DE LA BASE DE DATOS HOSPITAL
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:
Tabla DOCTOR
Tabla EMP
Tabla ENFERMO
Tabla HOSPITAL
Tabla PLANTILLA
Tabla SALA
--***Insertar datos en las tablas de la Base de Datos de ejemplo llamada HOSPITAL***
--Trataremos de mostrar las tres formas de insertar datos fijos o que no provienen de ninguna otra tabla
--
--Insertar datos en la table Dept
INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(10,'CONTABILIDAD','ELCHE')
INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(20,'INVESTIGACIÓN','MADRID')
INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(30,'VENTAS','BARCELONA')
INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(40,'PRODUCCIÓN','SALAMANCA')
GO
--Insertar datos en la tabla Emp
INSERT INTO Emp( Emp_No, Apellido, Oficio, Dir, Fecha_Alt, Salario, Comision, Dept_No)
VALUES
(7369,'SANCHEZ','EMPLEADO',7902,'17/12/1980',10400,0,20),
(7499,'ARROYO','VENDEDOR',7698,'22/02/1981',208000,39000,30),
(7521,'SALA','VENDEDOR',689,'22/02/1981',162500,65000,30),
(7566,'JIMENEZ','DIRECTOR',7839,'02/04/1981',386750,0,20),
(7654,'MARTIN','VENDEDOR',7698,'28/09/1981',182000,182000,30),
(7698,'NEGRO','DIRECTOR',7839,'01/05/1981',370500,0,30),
(7782,'CEREZO','DIRECTOR',7839,'09/06/1981',318500,0,10),
(7788,'NINO','ANALISTA',7566,'30/03/1987',390000,0,20),
(7839,'REY','PRESIDENTE',0,'17/11/1981',650000,0,10),
(7844,'TOVAR','VENDEDOR',7698,'08/09/1981',195000,0,30),
(7876,'ALONSO','EMPLEADO',7788,'03/05/1987',143000,0,20),
(7900,'JIMENO','EMPLEADO',7698,'03/12/1981',123500,0,30),
(7902,'FERNANDEZ','ANALISTA',7566,'03/12/1981',390000,0,20),
(7934,'MUÑOZ','EMPLEADO',7782,'23/06/1982',169000,0,10),
(7119,'SERRA','DIRECTOR',7839,'19/11/1983',225000,39000,20),
(7322,'GARCIA','EMPLEADO',7119,'12/10/1982',129000,0,20)
GO
--Insertar datos en la tabla Hospital
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama) VALUES(19,'Provincial','O Donell
50','964-4256',502)
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama) VALUES(18,'General','Atocha
s/n','595-3111',987)
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama) VALUES(22,'La Paz','Castellana
1000','923-5411',412)
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama) VALUES(45,'San Carlos','Ciudad
Universitaria','597-1500',845)
GO
--Insertar datos en la tabla Doctor
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(22,386,'Cabeza D.','Psiquiatría')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(22,398,'Best D.','Urología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(19,435,'López A.','Cardiología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(22,453,'Galo D.','Pediatría')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(45,522,'Adams C.','Neurología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(18,585,'Miller G.','Ginecología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(45,607,'Chuki P.','Pediatría')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(18,982,'Cajal R.','Cardiología')
GO
--Insertar datos en la tabla Sala
INSERT INTO SALA VALUES(1,22,'Recuperación',10)
INSERT INTO SALA VALUES(1,45,'Recuperación',15)
INSERT INTO SALA VALUES(2,22,'Maternidad',34)
INSERT INTO SALA VALUES(2,45,'Maternidad',24)
INSERT INTO SALA VALUES(3,19,'Cuidados Intensivos',21)
INSERT INTO SALA VALUES(3,18,'Cuidados Intensivos',10)
INSERT INTO SALA VALUES(4,18,'Cardiología',53)
INSERT INTO SALA VALUES(4,45,'Cardiología',55)
INSERT INTO SALA VALUES(6,19,'Psiquiátricos',67)
INSERT INTO SALA VALUES(6,22,'Psiquiátricos',118)
GO
--Insertar datos en la tabla Plantilla
INSERT INTO Plantilla(Hospital_Cod,Sala_Cod,Empleado_No,Apellido, Funcion, T, Salario)
VALUES
(22,6,1009,'Higueras D.','Enfermera','T',200500),
(45,4,1280,'Amigo R.','Interino','N',221000),
(19,6,3106,'Hernández','Enfermero','T',275000),
(19,6,3754,'Díaz B.','Enfermera','T',226200),
(22,1,6065,'Rivera G.','Enfermera','N',162600),
(18,4,6357,'Karplus W.','Interino','T',337900),
(22,1,7379,'Carlos R.','Enfermera','T',211900),
(22,6,8422,'Bocina G.','Enfermero','M',183800),
(45,1,8526,'Frank H.','Enfermera','T',252200),
(22,2,9901,'Núñez C.','Interino','M',221000)
GO
--Insertar datos en la tabla Enfermo
INSERT INTO Enfermo(Inscripcion,Apellido,Direccion,Fecha_Nac,S,NSS)
VALUES
(10995,'Laguía M.','Goya 20','16-may-56','M',280862422),
(14024,'Fernández M.','Recoletos 50','21-may-60','F',284991452),
(18004,'Serrano V.','Alcalá 12','23-jun-67','F',321790059),
(36658,'Domin S.','Mayor 71','01-ene-42','M',160654471),
(38702,'Neal R.','Orense 11','18-jun-40','F',380010217),
(39217,'Cervantes M.','Perón 38','29-feb-52','M',440294390),
(59076,'Miller B.','López de Hoyos 2','16-sep-45','F',311969044),
(63827,'Ruiz P.','Ezquerdo 103','26-dic-80','M',100973253),
(64823,'Fraiser A.','Soto 3','10-jul-80','F',285201776),
(74835,'Benítez E.','Argentina','05-oct-57','M',154811767)
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.
3. Idéntico del anterior, pero para aquellos empleados que su salario anual con extras supere los 2200000
5. Mostrar todos los datos de empleados ordenados por departamento y dentro de este por oficio para tener
una visión jerárquica.
?
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
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'
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.
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.
24. Mostrar que personal “No Interino” existe en cada sala de cada hospital, ordenado por hospital y sala.
2 FROM PLANTILLA
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
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.
5. Mostrar todos los empleados cuyo apellido comience entre las letras E y F.
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.
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.
9. Mostrar todos los empleados cuyo apellido sea de 6 letras y no comience entre la A y la D.
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
Si pongo un valor dentro de la expresión devolverá la cuenta de todos los registros no nulos.
Si pongo un asterisco contará todos los registros aunque tengan valores nulos.
AVG: Realiza la media sobre la expresión dada, debe ser un tipo de dato Int.
?
1 select avg(salario) from emp
?
1 select max(fecha_alt) from emp
?
1 select min(fecha_alt) from emp
?
1 select sum(salario) from emp
1. Encontrar el salario medio de los analistas, mostrando el número de los empleados con oficio analista.
?
1 SELECT COUNT(*) AS [NUMERO DE EMPLEADOS], OFICIO,
2. Encontrar el salario mas alto, mas bajo y la diferencia entre ambos de todos los empleados con oficio EMPLEADO.
?
1 SELECT OFICIO, MAX(SALARIO) AS [SALARIO MAS ALTO]
?
1 SELECT OFICIO, MAX(SALARIO) AS [SALARIO MÁXIMO] FROM EMP GROUP BY OFICIO
?
1 SELECT DEPT_NO AS [Nº DE DEPARTAMENTO],
4 ORDER BY 1
?
1 SELECT DEPT_NO AS [Nº DE DEPARTAMENTO]
2
, COUNT(*) AS [Nº DE PERSONAS] FROM EMP
3
GROUP BY DEPT_NO HAVING COUNT(*) > 3
?
1 SELECT COUNT(*) AS [NUMERO EMPLEADOS], DEPT_NO FROM EMP
3 GROUP BY DEPT_NO
7. Visualizar el número de enfermeros, enfermeras e interinos que hay en la plantilla, ordenados por la
función.
?
1 SELECT COUNT(*) AS [Nº DE PERSONAS], FUNCION FROM PLANTILLA
2 GROUP BY FUNCION
4 ORDER BY FUNCION
Funciones de agregado - Parte 2
8. Visualizar departamentos, oficios y número de personas, para aquellos departamentosque tengan dos o más personas
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.
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
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.
?
1 SELECT COUNT(*) AS [Nº SALAS], HOSPITAL_COD FROM SALA
2 GROUP BY HOSPITAL_COD
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.
Sintaxis:
Ejemplos :
?
1 SELECT APELLIDO,OFICIO,DNOMBRE
2 FROM EMP
3 INNER JOIN DEPT
4 ON EMP.DEPT_NO=DEPT.DEPT_NO
5 ORDER BY DEPT.DNOMBRE
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
3 FULL JOIN DEPT
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.
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
5 ORDER BY DEPT.DNOMBRE
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).
Ejemplo 2:
?
1 SELECT APELLIDO,OFICIO,DNOMBRE
2 FROM EMP
3 RIGHT OUTER JOIN DEPT
4 ON EMP.DEPT_NO=DEPT.DEPT_NO
5 ORDER BY DEPT.DNOMBRE
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.
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.
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 SELECT P.APELLIDO AS [APELLIDO]
2 ,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
7 AND P.SALA_COD = S.SALA_COD
8 INNER JOIN HOSPITAL AS H
9 ON H.HOSPITAL_COD = P.HOSPITAL_COD
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
6 ON A.EMP_NO = B.EMP_NO
7 ORDER BY B.EMP_NO