Manual SQL Server 2000
Manual SQL Server 2000
1
MANUAL SQL SERVER 2000
EMP
DEPT
HOSPITAL
2
MANUAL SQL SERVER 2000
DOCTOR
PLANTILLA
SALA
ENFERMO
3
MANUAL SQL SERVER 2000
4
MANUAL SQL SERVER 2000
5
MANUAL SQL SERVER 2000
6
MANUAL SQL SERVER 2000
NOMBRE:
CURSO:
EDICIÓN:
2. Mostrar el apellido, oficio, salario anual, con las dos extras para aquellos empleados
con comisión mayor de 100000.
3. Idem del anterior , pero para aquellos empleados que su salario anual con extras
supere los 2.200.000 ptas.
4. Idem del anterior, pero para aquellos empleados que sumen entre salario anual con
extras y comisión los 3.000.000 millones.
7
MANUAL SQL SERVER 2000
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 200.000 y 225.000 ptas.
12. Visualizar los empleados de la tabla emp que no se dieron de alta entre el 01/01/80
y el 12/12/82.
8
MANUAL SQL SERVER 2000
NOMBRE:
CURSO:
EDICIÓN:
3. Igual que en el ejercicio 2, pero también incluimos aquellos que no siendo analista
pertenecen al departamento 20.
4. Mostrar aquellos empleados cuyo apellido termine en ‘Z’ ordenados por departamento,
y dentro de este por antigüedad.
5. De los empleados del ejercicio 5 quitar aquellos que superen las 200000 ptas mensuales.
7. Igual que el 6, pero mostrandolos de forma que se aprecien las diferencias de salario
dentro de cada oficio.
9
MANUAL SQL SERVER 2000
8. De los del 7, nos quedamos solo con aquellos cuyo número de empleado no este entre
7600 y 7900.
10
MANUAL SQL SERVER 2000
NOMBRE:
CURSO:
EDICIÓN:
11. Mostrar que personal “No Interino” existe en cada sala de cada hospital, ordenado por
hospital y sala.
13. Seleccionar los distintos valores del sexo que tienen los enfermos.
14. Indicar los distintos turnos de la plantilla del hospital, ordenados por turno y por
apellido.
15. Seleccionar las distintas especialidades que ejercen los médicos, ordenados por
especialidad y apellido.
11
MANUAL SQL SERVER 2000
. SELECT
. INSERT
. UPDATE
. DELETE
Elementos de sintaxis:
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 Northwind y Pubs: Son tablas de ejemplos que vienen con SQL
y todo usuario puede trabajar con ellas.
12
MANUAL SQL SERVER 2000
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 #.
Generalmente para las variables locales se usan @ + el nombre.
EJEMPLO: @Contador.
Para las variables totales se usan dos arrobas + el nombre @@Contador
EJEMPLO: @@Error
#Nombre: indica una tabla o procedimiento temporal (Local)
##Nombre: Igual que el anterior pero global.
Tipos de datos:
- Numéricos:
• Enteros int, tinyint, smallint, bigint
• Decimales numeric, decimal, money, smallmoney
• Coma Flotante float, real
- Fechas:
• datetime 0,333 s
• smalldatetime 1 minuto
- Caracteres:
• Ancho fijo: char, nchar
• Ancho Variable: varchar, nvarchar
- Texto e Imagen:
• Text
• Ntext
• Rowversion
- Binario:
• Binary, varbinary Valores tipo byte
• Bit Un solo bit (1 o ninguno)
- Identificadores Unicos:
• Uniqueidentifier
13
MANUAL SQL SERVER 2000
OPERADOR LIKE
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.
14
MANUAL SQL SERVER 2000
4. Mostrar todos los empleados cuyo nombre sea de 4 letras y su apellido termine
con la letra a
select * from emp where apellido like '___a'
5. Mostrar todos los empleados cuyo apellido comience entre las letras E y F.
select * from emp where apellido like '[E-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.
select * from emp where apellido like 'A%[a-m]%o'
7. Mostrar todos los empleados cuyo apellido comience por la letra M y la segunda
letra no sea una A.
select * from emp where apellido like 'M[^A]%'
15
MANUAL SQL SERVER 2000
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.
select * from emp where apellido like '__[a-ñ]_z'
9. Mostrar todos los empleados cuyo apellido sea de 6 letras y no comience entre la
A y la D.
select * from emp where apellido like '[^a-d]_____'
10. Mostrar todos los que empiecen por la A y cuya cuarta letra no esté comprendida
entre A – G
select * from emp where apellido like 'A__[^a-g]%'
16
MANUAL SQL SERVER 2000
Cache es una parte de la memoria en la que se almacenan las partes de ejecución de las
Consultas.
Select top 5 emp_no, apellido from emp Devuelve los 5 primeros empleados
Select top 50 percent apellido from emp Devuelve el 50% de los empleados
17
MANUAL SQL SERVER 2000
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
Operadores de SQL:
• Lógicos:
AND, OR , NOT
• De Comparación:
= Igual
< Menor
> Mayor
<> Diferente
>= Mayor o igual
<= Menor o igual
18
MANUAL SQL SERVER 2000
FUNCIONES DE AGREGADO
2. Encontrar el salario mas alto, mas bajo y la diferencia entre ambos de todos los
empleados con oficio EMPLEADO.
19
MANUAL SQL SERVER 2000
20
MANUAL SQL SERVER 2000
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.
21
MANUAL SQL SERVER 2000
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.
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.
22
MANUAL SQL SERVER 2000
CONSULTAS DE COMBINACIÓN
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:
Select TablaPrincipal.Campo, Tablaconlaquecombinar.Campo
From TablaPrincipal
Inner Join / Full Join Tablaconlaquecombinar
On
Condición para combinar los campos
o Inner Join: Indica que combine los campos con resultados comunes
o Full Join: Indica que combine todos los campos aunque los resultados sean
diferentes.
select apellido,oficio,dnombre
from emp
inner join dept
on emp.dept_no=dept.dept_no
order by dept.dnombre
23
MANUAL SQL SERVER 2000
select apellido,oficio,dnombre
from emp
full join dept
on emp.dept_no=dept.dept_no
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 Empleado SERRA que no tiene departamento y el
departamento EDICIÓN, que no tiene empleados.
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:
Select tablaprincipal.campo, tablaacombinar.campo
From tablaprincipal
left join / right join / cross join tabla
on condición
o left Join: Indica que muestre todos los resultados de la columna de la izquierda
o Right Join: Indica que muestre todos los resultados de la columna de la derecha
o Cross Join: Muestra un producto cartesiano combinando todos los resultados de
las dos tablas.
24
MANUAL SQL SERVER 2000
select apellido,oficio,dnombre
from emp
left outer join dept
on emp.dept_no=dept.dept_no
order by dept.dnombre
El empleado Serra tiene el nombre del departamento con el valor null porque no tiene
ningún departamento asociado y nosotros en la consulta le estamos diciendo que
seleccione los empleados aunque no tengan departamento asociado, ponemos como
principal la tabla de la izquierda (EMP).
select apellido,oficio,dnombre
from emp
right outer join dept
on emp.dept_no=dept.dept_no
order by dept.dnombre
En esta consulta el departamento de edició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.
25
MANUAL SQL SERVER 2000
select apellido,oficio,dnombre
from emp
cross join dept
26
MANUAL SQL SERVER 2000
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.
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
posteriormente combinar los resultados de ambas copias.
27
MANUAL SQL SERVER 2000
28
MANUAL SQL SERVER 2000
(2 filas afectadas)
SOLUCION:
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
(4 filas afectadas)
SOLUCION:
use pubs
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.
(5 filas afectadas)
29
MANUAL SQL SERVER 2000
SOLUCION:
SOLUCION:
30
MANUAL SQL SERVER 2000
5) Recuperar los títulos y el índice del almacén de todos los libros que vendieron
más de 25 unidades.
ALMACEN ID TITULO
---------- --------------------------------------------------------------------------------
7066 Secrets of Silicon Valley
7066 Is Anger the Enemy?
7067 Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean
7896 You Can Combat Computer Stress!
8042 But Is It User Friendly?
(5 filas afectadas)
SOLUCION:
SOLUCION:
31
MANUAL SQL SERVER 2000
SOLUCION:
32
MANUAL SQL SERVER 2000
33
MANUAL SQL SERVER 2000
34
MANUAL SQL SERVER 2000
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.
35
MANUAL SQL SERVER 2000
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_cod 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.
36
MANUAL SQL SERVER 2000
37
MANUAL SQL SERVER 2000
14. Averiguar la combinación de que salas podría haber por cada uno de los
hospitales.
38
MANUAL SQL SERVER 2000
OPERADOR UNION
Select Apellido,
Oficio as
'OFICIO/FUNCION'
,salario from emp
UNION
Select Apellido,
Funcion, Salario from
Plantilla
39
MANUAL SQL SERVER 2000
SUBCONSULTAS
Subconsulta correlacionada
40
MANUAL SQL SERVER 2000
41
MANUAL SQL SERVER 2000
select apellido,fecha_alt,salario
from emp as e
where not exists(select * from dept as o
where e.dept_no = o.dept_no)
Recomendaciones:
42
MANUAL SQL SERVER 2000
SUBCONSULTAS
SELECT emp_no,apellido,
fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)
SELECT emp_no,apellido,
fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)
Select apellido, oficio, salario, dept_no from emp where salario > (select
max (salario) from emp where dept_no = 30)
43
MANUAL SQL SERVER 2000
44
MANUAL SQL SERVER 2000
8. Mostrar los empleados que tienen mejor salario que la media de los directores,
no incluyendo al presidente.
10. Visualizar los datos de los hospitales que tienen personal (Doctores) de
cardiología.
45
MANUAL SQL SERVER 2000
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.’)
46
MANUAL SQL SERVER 2000
Variables
BUCLES
Nivel de instrucción:
• Bloques BEGIN......END
• Bloques IF.............ELSE
• Construcciones WHILE
--BUCLES
Declare @n int
set @n = 0
while @n < 10
begin
if (@n % 2) = 0
select @n as Numero
set @n = @n + 1
end
47
MANUAL SQL SERVER 2000
48
MANUAL SQL SERVER 2000
Nivel De fila
CASE expresion
WHEN valor1 THEN resultado1
ELSE resultadoN
END
CASE
WHEN verdadero THEN resultado1
ELSE resultado2
END
--CASE
DECLARE @N INT
SET @N = 1
WHILE (@N<100)
BEGIN
SELECT @N AS 'NUMERO', CASE
WHEN (@N % 2) = 1 THEN
'IMPAR'
ELSE
'PAR'
END AS 'TIPO'
SET @N = @N + 1
END
49
MANUAL SQL SERVER 2000
EJEMPLO:
Esto se puede utilizar también para inicializar variables. Es el mismo caso pero
utilizando el CASE para inicializar una variable.
50
MANUAL SQL SERVER 2000
Ponemos Cast y Convert para poder concatenar un valor de tipo Int con un valor de tipo
Char, sino intentaría sumarlos y daría error.
51
MANUAL SQL SERVER 2000
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.
52
MANUAL SQL SERVER 2000
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.
53
MANUAL SQL SERVER 2000
ELSE
'HOMBRE'
END
FROM ENFERMO
ORDER BY FECHA_NAC,S
select e.apellido,e.oficio,e.salario
,DEPARTAMENTO =
ISNULL(d.dnombre,'SIN DEPARTAMENTO')
,Comision = case Comision
when 0 then 'SIN COMISION'
else
'CON COMISION'
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.
54
MANUAL SQL SERVER 2000
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.
55
MANUAL SQL SERVER 2000
* 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:
USE Hospital
INSERT INTO emp (Apellido,Salario)
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.
56
MANUAL SQL SERVER 2000
ELIMINACIÓN DE DATOS
- 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.
57
MANUAL SQL SERVER 2000
ACTUALIZACIONES
USE Northwind
UPDATE products
SET unitprice = (unitprice * 1.1 )
Cambiar el salario de los empleados del dept 30 donde el departamento sea 60.
58
MANUAL SQL SERVER 2000
CONSULTAS DE ACCION
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 ?
59
MANUAL SQL SERVER 2000
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.
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.
60
MANUAL SQL SERVER 2000
61
MANUAL SQL SERVER 2000
En el examen de certificación las bases de datos que se suelen usar son las que vienen
de ejemplo en SQL, es decir Northwind y Pubs
Use Base de datos Indica que la siguiente sentencia usará la base de datos indicada.
Ejemplo: Ponemos en el analizador de consultas lo siguiente:
Use Hospital
Select * from Hospital
[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
1 A
1 B
1 C
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.
Select ProductID, OrderId,
Sum(Quantity) As Cantidad_Total
From [Order Details]
Group by ProductID, OrderID
with Rollup
Order by ProductID, OrderID
62
MANUAL SQL SERVER 2000
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.
GROUPING
63
MANUAL SQL SERVER 2000
COMPUTE
Vemos que
muestra la
columna con la
suma total de
todas las
cantidades.
64
MANUAL SQL SERVER 2000
COMPUTE BY
Hace un resumen similiar al realizado mediante Cube o Rollup. Realiza grupos del
campo indicado, y muestra el resultado de la función indicada en una columna aparte
por cada grupo que haya. Su formato es Compute Función(campo) By Campo
NOTA: Los campos por los que van después de la clausula By deben ir incluidos en la
clausula ORDER BY y además en el mismo orden en el que aparecen.
Select Productid, Orderid, Quantity
From [Order Details]
order by ProductID, Orderid
compute Sum(quantity) by productId
65
MANUAL SQL SERVER 2000
66
MANUAL SQL SERVER 2000
Nº PEDIDO CANTIDAD
----------- --------
11070 40
11070 20
11070 30
11070 20
sum
===========
110
sum
===========
110
(6 filas afectadas)
2) Generar un resumen con calculo de subtotales similar al anterior pero para los orderid
11075 y 11076
Nº PEDIDO CANTIDAD
----------- --------
11075 10
11075 30
11075 2
sum
===========
42
Nº PEDIDO CANTIDAD
----------- --------
11076 20
11076 20
11076 10
sum
===========
50
(8 filas afectadas)
67
MANUAL SQL SERVER 2000
Nº PEDIDO CANTIDAD
----------- --------
11075 10
11075 30
11075 2
sum
===========
42
Nº PEDIDO CANTIDAD
----------- --------
11076 20
11076 20
11076 10
sum
===========
50
sum
===========
92
avg
===========
15
4) Seleccionar de forma agrupada por tipo, todos los tipos, la suma de los precios y la
suma del anticipo de la tabla títulos
Select type as [TIPO], price as [PRECIO], advance as [ANTICIPO]
From titles
order by type
compute sum(price) by type
compute avg (advance) by type
68
MANUAL SQL SERVER 2000
sum
=====================
54.9200
avg
=====================
6281.2500
sum
=====================
22.9800
avg
=====================
7500.0000
sum
=====================
42.9500
avg
=====================
7500.0000
sum
=====================
67.5200
avg
=====================
4255.0000
69
MANUAL SQL SERVER 2000
sum
=====================
54.9200
sum
=====================
25125.0000
sum
=====================
22.9800
sum
=====================
15000.0000
sum
=====================
42.9500
sum
=====================
15000.0000
70
MANUAL SQL SERVER 2000
sum
=====================
45.9300
sum
=====================
21.5900
(7 filas afectadas)
sum
=====================
45.9300
71
MANUAL SQL SERVER 2000
sum
=====================
21.5900
sum
=====================
67.5200
(8 filas afectadas)
sum
=====================
22.9800
sum
=====================
15000.0000
sum
=====================
47.8900
sum
=====================
19000.0000
(9 filas afectadas)
72
MANUAL SQL SERVER 2000
sum
=====================
65.4900
sum
=====================
21000.0000
(5 filas afectadas)
sum
=====================
54.9200
max
====
1389
(6 filas afectadas)
73
MANUAL SQL SERVER 2000
11) Realizar una consulta que recupere el tipo, precio y anticipo de la tabla
titles para los libros de cocina. Mostrará la suma de los precios y los
anticipos por tipo y luego, calculará el total general de los precios y los
anticipos para todos los registros seleccionados.
sum
=====================
22.9800
sum
=====================
15000.0000
sum
=====================
47.8900
sum
=====================
19000.0000
sum
=====================
70.8700
sum
=====================
34000.0000
74
MANUAL SQL SERVER 2000
ROLLUP
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.
75
MANUAL SQL SERVER 2000
¿Qué filas son de resumen? ¿Cuáles el resumen por producto y cuáles por pedido?
76
MANUAL SQL SERVER 2000
TRANSACCIONES
77
MANUAL SQL SERVER 2000
USE Pubs
GO
DECLARE @del_error int, @ins_error int
BEGIN TRAN
DELETE authors WHERE au_id = '409-56-7088'
SELECT @del_error = @@ERROR
IF @del_error <> 0
PRINT 'Hay error en el DELETE'
PRINT @ins_error
IF @ins_error <> 0
PRINT 'Hay error en el INSERT'
PRINT @ins_error
ROLLBACK TRAN
END
GO
78
MANUAL SQL SERVER 2000
FUNCIONES DE FECHA
GetDate
select getdate() Funcion que recupera la fecha actual del sistema.
Convert, Cast
Convert(TipoDato,Dato)
Cast (Dato as TipoDato)
Ejemplo:
while (@n<11)
begin
print convert(nvarchar(2),@n) + ' ' + @palabra
print cast(@n as nvarchar(2)) + ' ' + @palabra
set @n = @n + 1
end
79
MANUAL SQL SERVER 2000
DateName
Horas:
select datename(mi,fecha_alt) as 'Minutos' from emp where emp_no =
7867
select datename( minute,getdate()) as 'minutos'
select datename( mi,getdate()) as 'minutos'
select datename( hh,fecha_alt) as 'hora' from emp where emp_no = 7867
select datename( hour,getdate()) as 'hora'-->17
select datename( hh,getdate()) as 'hora'-->17
DatePart
Nombres de Fechas
Day(fecha)
Devuelve un INT, equivale a datepart
80
MANUAL SQL SERVER 2000
DateAdd
DateAdd( datepart , number, date )
Añade un número a la fecha puesta
DatePart es el formato de lo que queremos añadir.
Number es el número que queremos incrementar la fecha expuesta.
select convert(datetime,'1-1-02')
select dateadd(dd,7,'1-1-02')
DateDiff
81
MANUAL SQL SERVER 2000
FUNCIONES MATEMATICAS
ABS
Es 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.
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.
Round(Numero, Redondeo del Número)
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.
Select ROUND(123.4567,2)-->123.4600
Select ROUND(123.4567,-2)-->100.0000
Select ROUND(123.4567,0)-->123.0000
Select ROUND(123.4567,-3)--->0
82
MANUAL SQL SERVER 2000
SIGN
Select SIGN(-3)-->-1
Select SIGN(3)-->1
Select SIGN(0)-->0
SQUARE
Devuelve el cuadrado de la expresión especificada.
SQRT
Devuelve la raíz cuadrada de la expresión especificada.
83
MANUAL SQL SERVER 2000
FUNCIONES DE CADENA
ASCII
Select ASCII('A')-->65
Select ASCII('a')-->97
Select ascii('aula')-->97
CHAR
select char(65)-->A
select char(97)-->a
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.
Si no se especifica start_location, es un número negativo o es cero,
la búsqueda empieza al principio de la cadena expression2.
select charindex('cie','murcielago')-->4
select charindex('cie','murcielago',2)-->4
select charindex('cie','murcielago',5)-->0
select charindex('cie','murcielago',-6)-->4
84
MANUAL SQL SERVER 2000
LEFT
Devuelve la parte de una cadena de caracteres que comienza en un
número de caracteres especificado a partir de la izquierda
select left('murcielago',5)-->murci
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.
select len('murcielago')-->10
LOWER
Convierte a Minúsculas la cadena especificada
UPPER
Convierte a Mayúsculas la cadena especificada
RTRIM y LTRIM
REPLACE
Reemplaza por una tercera expresión todas las apariciones
de la segunda expresión de cadena proporcionada en la primera
expresión de cadena
85
MANUAL SQL SERVER 2000
SPACE
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).
select substring('murcielago',3,5)-->rciel
select substring('murcielago',3,len('murcielago'))-->rciel
REVERSE
Devuelve invertida una expresión de carácter.
select reverse('hola')
REPLICATE
STUFF
Elimina el número de caracteres especificado e inserta
otro conjunto de caracteres en un punto de inicio indicado.
86
MANUAL SQL SERVER 2000
FUNCIONES DE SISTEMA
87
MANUAL SQL SERVER 2000
- SYSTEM_USER
• Devuelve el usuario del sistema actual
• Depende de la autentificación con la que te hayas conectado
- USER_NAME()
• Devuelve el nombre del usuario actual
select user_name()
88
MANUAL SQL SERVER 2000
EJERCICIOS IF y FUNCIONES
DATOS EMPLEADOS
----------------------------------------------------------------------------------------------------
EMPLEADO SIN NOMBRE
EMPLEADO SIN NOMBRE
El señor SERRA con cargo de EMPLEADO se dió de alta el 11 de Diciembre de 1971
El señor SERRANO con cargo de DIRECTOR se dió de alta el 19 de Febrero de 1973
El señor SALA con cargo de DIRECTOR se dió de alta el 19 de Septiembre de 1976
El señor ARROYO con cargo de VENDEDOR se dió de alta el 22 de Febrero de 1981
El señor JIMENEZ con cargo de DIRECTOR se dió de alta el 2 de Abril de 1981
El señor NEGRO con cargo de DIRECTOR se dió de alta el 1 de Mayo de 1981
El señor CEREZO con cargo de DIRECTOR se dió de alta el 9 de Junio de 1981
El señor TOVAR con cargo de VENDEDOR se dió de alta el 8 de Septiembre de 1981
El señor MARTIN con cargo de VENDEDOR se dió de alta el 28 de Septiembre de 1981
El señor REY con cargo de PRESIDENTE se dió de alta el 17 de Noviembre de 1981
El señor FERNANDEZ con cargo de ANALISTA se dió de alta el 3 de Diciembre de 1981
El señor MUÑOZ con cargo de EMPLEADO se dió de alta el 23 de Junio de 1982
El señor GIL con cargo de ANALISTA se dió de alta el 30 de Marzo de 1987
El señor ALONSO con cargo de EMPLEADO se dió de alta el 3 de Mayo de 1987
El señor AGUDO con cargo de VENDEDOR se dió de alta el 19 de Noviembre de 1989
El señor MARTA con cargo de ALUMNA se dió de alta el 12 de Octubre de 2001
El señor RUIZ con cargo de ANALISTA se dió de alta el 30 de Julio de 2002
89
MANUAL SQL SERVER 2000
DATOS EMPLEADOS
---------------------------------------------------------------------------------
EMPLEADO SIN NOMBRE
EMPLEADO SIN NOMBRE
El señor SERRA con cargo de EMPLEADO se dió de alta el 11 de Diciembre de 1971 y
lleva en la empresa 31 años
El señor SERRANO con cargo de DIRECTOR se dió de alta el 19 de Febrero de 1973 y
lleva en la empresa 29 años
El señor SALA con cargo de DIRECTOR se dió de alta el 19 de Septiembre de 1976 y
lleva en la empresa 26 años
El señor Arias con cargo de Analista se dió de alta el 1 de Agosto de 1978 y
lleva en la empresa 24 años
El señor Toro con cargo de Director se dió de alta el 10 de Febrero de 1979 y
lleva en la empresa 23 años
El señor ARROYO con cargo de VENDEDOR se dió de alta el 22 de Febrero de 1981 y
lleva en la empresa 21 años
El señor JIMENEZ con cargo de DIRECTOR se dió de alta el 2 de Abril de 1981 y
lleva en la empresa 21 años
El señor NEGRO con cargo de DIRECTOR se dió de alta el 1 de Mayo de 1981 y lleva
en la empresa 21 años
El señor CEREZO con cargo de DIRECTOR se dió de alta el 9 de Junio de 1981 y
lleva en la empresa 21 años
El señor TOVAR con cargo de VENDEDOR se dió de alta el 8 de Septiembre de 1981 y
lleva en la empresa 21 años
El señor MARTIN con cargo de VENDEDOR se dió de alta el 28 de Septiembre de 1981
y lleva en la empresa 21 años
El señor REY con cargo de PRESIDENTE se dió de alta el 17 de Noviembre de 1981 y
lleva en la empresa 21 años
El señor FERNANDEZ con cargo de ANALISTA se dió de alta el 3 de Diciembre de
1981 y lleva en la empresa 21 años
El señor MARTA con cargo de ALUMNA se dió de alta el 12 de Octubre de 2001 y
lleva en la empresa 1 años
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.
90
MANUAL SQL SERVER 2000
else
begin
--Bajamos el sueldo
update plantilla set salario = salario - 5000
from plantilla as p
inner join hospital_cod as h
on p.hospital_cod = h.hospital_cod
where h.nombre = 'La Paz'
--Notificamos la bajada
select 'Al empleado del Hospital '
+ h.nombre
+ ', '
+ p.apellido
+ ' con función de '
+ p.funcion
+ ', se le ha reducido el sueldo en 5000 pts'
from plantilla as p
inner join hospital_cod as h
on p.hospital_cod = h.hospital_cod
where h.nombre = 'La Paz'
end
-------------------------------------------------------------------------------------------------
Al empleado del Hospital La Paz, Higueras D. con función de Enfermera, se le
ha reducido el sueldo en 5000 pts
Al empleado del Hospital La Paz, Rivera G. con función de Enfermera, se le ha
reducido el sueldo en 5000 pts
Al empleado del Hospital La Paz, Carlos R. con función de Enfermera, se le ha
reducido el sueldo en 5000 pts
Al empleado del Hospital La Paz, Bocina G. con función de Enfermero, se le ha
reducido el sueldo en 5000 pts
Al empleado del Hospital La Paz, Núñez C. con función de Interino, se le ha
reducido el sueldo en 5000 pts
(5 filas afectadas)
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.
91
MANUAL SQL SERVER 2000
end
else
begin
update emp set salario = salario + 10000 where fecha_alt > @dif
select datename(weekday,fecha_alt) + ' '
+ cast(datepart(day,fecha_alt) as char(2)) + ' '
+ datename(month,fecha_alt) + ' '
+ datename(year,fecha_alt) as [FECHA COMPLETA]
,Apellido
,Salario,'Actualizacion Completa' as [ACTUALIZACION]
from emp
where fecha_alt > @dif
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’.
92
MANUAL SQL SERVER 2000
6. Calculando la suma de salarios de los directores, subir el sueldo a los que cobren
entre el minimo salario y 250000 pts.
• Mantener el sueldo a los directores si la suma está entre 1200000 y
1300000.
• 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.
93
MANUAL SQL SERVER 2000
end
else
if (select sum(salario) from emp where oficio = 'director')
> 1300001
begin
print 'Sueldo bajado a los directores'
declare @Maxsal int
select @Maxsal = max(salario) from emp where oficio =
'director'
print 'Antes de la Actualización'
select top 3 with ties salario,apellido from emp where
oficio = 'director'
group by salario,apellido
having salario between 200000 and @MaxSal
order by salario desc
update emp set salario = salario / 1.1
where oficio = 'director'
and
salario between 200000 and @MaxSal
print 'Después de la Actualización'
select top 3 with ties salario,apellido from emp where
oficio = 'director'
group by salario,apellido
having salario between 200000 and @MaxSal
order by salario desc
end
(3 filas afectadas)
(3 filas afectadas)
Después de la Actualización
salario apellido
----------- --------------------------------------------------
380274 JIMENEZ
364299 NEGRO
313167 CEREZO
(3 filas afectadas)
94
MANUAL SQL SERVER 2000
Para realizar relaciones, teniendo el foco sobre Diagramas, botón derecho -> Nuevo
diagrama de base de datos.
95
MANUAL SQL SERVER 2000
Establecemos las
claves principales.
Para ello, nos
posicionamos
sobre el campo
que queramos y
pulsamos el icono
de la llave.
Nos
posicionamos
sobre el campo
clave y
hacemos clic
sobre, el, sin
soltar
arrastramos
hasta el campo
con el que
queremos
establecer la
relación.
96
MANUAL SQL SERVER 2000
Después de
pulsar aceptar,
estará establecida
la relación.
Pulsamos el
icono de guardar
para guardarla.
97
MANUAL SQL SERVER 2000
Sintaxis:
Ejemplo 1
Ejemplo 2
Sintaxis:
Create Procedure Nombre @Variable tipo = Valor
As
Instrucciones
Donde Valor es el valor que le damos por defecto, este valor puede almacenar
comodines (como % que equivale a *).
Ejemplo 1
Create Procedure numemp @ndept smallint = 10
As
Select dept_no, count(*) as [num empleados]
From emp
Where dept_no = @ndept
Group by dept_no
98
MANUAL SQL SERVER 2000
Ejemplo 2
Sacaría el salario, el oficio y la comisión de todos los que tengan apellido Jiménez, sino
pusiésemos parámetro, por defecto sacaría los que tuviesen apellido Rey.
Ejemplo 3
Select oficio, salario, comision from emp where apellido like '%' + @papellido + '%';
Exec salariooficio ‘s’
Sacaría oficio, salario y comisión de los empleados que tuviesen una s en su apellido.
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.
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.
99
MANUAL SQL SERVER 2000
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)
100
MANUAL SQL SERVER 2000
Sintaxis de declaración
Declare @nombre tipo_dato
Sintaxis de asignación directa
Set @nombre = valor
Sintaxis de asignación mediante consulta
Select @nombre = campo from tabla
Sintaxis
Create Procedure Nombre @Variable tipodedato Output
Instrucciones
Print @Variable
Ejemplo 1:
101
MANUAL SQL SERVER 2000
Ejemplo 2:
EJEMPLOS:
end
end
102
MANUAL SQL SERVER 2000
PROCEDIMIENTOS ALMACENADOS
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.
103
MANUAL SQL SERVER 2000
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 +
'%';
Exec salariooficio ‘s’
104
MANUAL SQL SERVER 2000
105
MANUAL SQL SERVER 2000
End
else
Begin
print 'FUNCION'
select Funcion as [Turno]
,avg(salario) as [Media]
,count(empleado_no) as [Nº Empleados]
,sum(salario) as [Suma] from plantilla
group by Funcion
having Funcion = @Valor
select T as [Turno]
,empleado_no as [Nº Empleado]
,Apellido, Salario
from plantilla
where T = @Valor
End
End
Else
Begin
print 'SALA'
select s.nombre as [SALA]
,avg(p.salario) as [Media]
,count(p.empleado_no) as [Nº Empleados]
,sum(p.salario) as [Suma] from plantilla as p
inner join sala as s
on s.hospital_cod = p.hospital_cod
group by s.nombre
having s.nombre = @Valor
106
MANUAL SQL SERVER 2000
107
MANUAL SQL SERVER 2000
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).
108
MANUAL SQL SERVER 2000
IF (@VALOR IS NULL)
BEGIN
SELECT @VALOR = EMP_NO FROM EMP WHERE EMP_NO = @EMP_NO
IF (@VALOR IS NULL)
BEGIN
PRINT 'EMPLEADO NO EXISTENTE EN LA BASE DE DATOS, VERIFIQUE LOS
DATOS DEL SR ' + @APELLIDO
END
ELSE
BEGIN
PRINT 'DATOS INTRODUCIDOS ERRONEAMENTE: '
PRINT CAST(@EMP_NO AS NVARCHAR(4)) + ' ' + @APELLIDO + ' '
+ @OFICIO + ' ' + CAST(@DIR AS NVARCHAR(4)) + ' '
+ CAST(@FECHA_ALT AS NVARCHAR(12)) + ' '
+ CAST(@SALARIO AS NVARCHAR(10)) + ' '
+ CAST(@COMISION AS NVARCHAR(10)) + ' '
+ CAST(@DEPT_NO AS NVARCHAR(4))
SELECT @EMP_NO = EMP_NO, @APELLIDO = APELLIDO
,@OFICIO = OFICIO, @DIR = DIR
,@FECHA_ALT = FECHA_ALT, @SALARIO = SALARIO
,@COMISION = COMISION, @DEPT_NO = DEPT_NO
FROM EMP where emp_no = @VALOR
PRINT 'DATOS REALES DEL EMPLEADO: '
PRINT CAST(@EMP_NO AS NVARCHAR(4)) + ' ' + @APELLIDO + ' '
+ @OFICIO + ' ' + CAST(@DIR AS NVARCHAR(4)) + ' '
+ CAST(@FECHA_ALT AS NVARCHAR(12)) + ' '
+ CAST(@SALARIO AS NVARCHAR(10)) + ' '
+ CAST(@COMISION AS NVARCHAR(10)) + ' '
+ CAST(@DEPT_NO AS NVARCHAR(4))
END
END
ELSE
BEGIN
delete from emp where emp_no = @emp_no
and apellido = @apellido
and oficio = @oficio
and dir = @dir
and fecha_alt = @fecha_alt
and salario = @salario
and comision = @comision
and dept_no = @dept_no
END
109
MANUAL SQL SERVER 2000
110
MANUAL SQL SERVER 2000
111
MANUAL SQL SERVER 2000
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.
Eliminación en Cascada
Como se ve en la sintaxis, le
indicamos que es lo que va a
hacer en el trigger detrás del
For.
112
MANUAL SQL SERVER 2000
Con lo que si por ej. borramos el departamento 20 de la tabla dept, este departamento se
almacenará en la tabla Deleted, una vez borrado, se desencadena el trigger, y borraría de
la tabla empleados, todos los empleados cuyo nº de departamento, coincida con el que
se ha borrado y almacenado en la tabla deleted. Si borrasemos 4 departamentos con una
misma orden, se activaría el trigger con cada departamento borrado.
Como hemos visto en el ejemplo anterior, para borrar existe la tabla de sistema deleted
donde almacena los registros borrados, al igual que para insertar almacena los registros
insertados en la tabla inserted, pero para modificar no existe ninguna tabla update, lo
que hace en realidad es 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 deleted e inserted.
Ejemplo Update:
113
MANUAL SQL SERVER 2000
Con lo que este ejemplo lo que haría es que cuando modificamos un registro en la tabla
dept, se activa el trigger, va a la tabla insert y busca los registros cuyo nº de depto.
Coincida con
Create Trigger
Insertar_Emp
On Emp
for Insert
As
Select * from Inserted
114
MANUAL SQL SERVER 2000
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
2 Creamos el trigger de
borrado en la tabla de
empleados.
115
MANUAL SQL SERVER 2000
TRIGGERS O DESENCADENADORES
2) Crear un Trigger que se active cuando Actualicemos alguna sala del hospital,
modificando sus tablas relacionadas. Mostrar el registro Actualizado.
116
MANUAL SQL SERVER 2000
From Inserted
5) Crear un Trigger que actue cuando se modifique la tabla hospital y sobre todas
las tablas con las que esté relacionadas.
Create
trigger ActualizarPlantilla on Plantilla
for update
as
declare @Hospital int
select @Hospital = i.hospital_cod
from hospital as h
inner join inserted as i
on h.hospital_cod = i.hospital_cod
if (@Hospital is null)
begin
print 'No Existe el codigo de Hospital'
117
MANUAL SQL SERVER 2000
118
MANUAL SQL SERVER 2000
+ convert(char(2),datepart(mi,getdate()))
+ ':' + convert(char(2),datepart(ss,getdate()))
Insert Into ControlTrigger(N_EMP,USUARIO,FECHA,OPERACION,HORA)
Select Deleted.emp_no,User_Name(),GetDate(),'MODIFICACION',@HORA
from Deleted, Inserted
where deleted.emp_no = inserted.emp_no
10) Borrar todos los Triggers creados después de haber sido probados y volver a
dejar la base de datos como estaba desde la copia de seguridad.
119
MANUAL SQL SERVER 2000
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:
120
MANUAL SQL SERVER 2000
SP_HELPDB
Muestra todas las bases de datos del servidor, con su propietario, tamaño hora de
creación etc.
SP_HELPDB
SP_SPACEUSED
Muestra el espacio usado de la base de datos que estamos usando actualmente.
USE EJEMPLO
Exec SP_SPACEUSED
121
MANUAL SQL SERVER 2000
Son los formados por archivos NDF, donde como hemos visto antes, se almacenan
copias de seguridad, vistas etc.
Para crear un grupo de archivo secundario seguiremos los siguientes pasos:
1. Modificamos la base de datos para añadirle el grupo de archivos secundario,
para ello usaremos Add FileGroup
Alter Database Base de datos
Add FileGroup Grupodearchivosecundario
SP_HelpFile
122
MANUAL SQL SERVER 2000
Con Add File, podemos añadir un nuevo archivo NDF al archivo secundario de
la base de datos elegido. Sintaxis:
123
MANUAL SQL SERVER 2000
Sintaxis:
Opciones:
ShrinkDataBase
Sintaxis:
Opciones:
Ejemplo:
124
MANUAL SQL SERVER 2000
1º) Crear una base de datos de Clientes con un tamaño de 40 MB y con crecimiento
de un 10%.
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
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.
125
MANUAL SQL SERVER 2000
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)
9º) Eliminar el grupo de Bajas de la base de datos junto con sus archivos.
Eliminar también la base de datos.
126
MANUAL SQL SERVER 2000
Permite realizar búsquedas en las tablas de datos. Es muy potente y rápido para buscar
en una base de datos documental, ya que no solo realiza búsquedas exactas por palabras
y caracteres, sino también por aproximación e incluso sinónimos (solo para palabras en
inglés). Esto se realiza mediante catálogos de texto, estos catálogos, contienen a su vez
índices de texto, los cuales tienen las palabras características de cada tabla.
Para que una tabla pueda estar en un índice de texto, a de tener una sola clave
principal, no admitir nulos. Además solo podemos indexar en campos de tipo texto
ya que realiza búsquedas por caracteres y palabras.
127
MANUAL SQL SERVER 2000
4. Se ejecutará el Asistente
para indización de texto.
Pulsamos siguiente.
128
MANUAL SQL SERVER 2000
5. Seleccionamos el índice
de la tabla, necesario
para realizar las
búsquedas.
Pulsamos Siguiente.
129
MANUAL SQL SERVER 2000
7. En esta pantalla
deberemos seleccionar
el catálogo en el que se
van a almacenar los
índices de texto. En este
caso, como no existe
ningún catálogo
crearemos un nuevo.
Eligiendo su nombre y
dejando la ubicación por
defecto.
8. Esta pantalla es
opcional. Se usa para
programar el llenado de
los catálogos de texto,
por si la información que
contienen las tablas se
actualiza.
Si pulsamos Nueva
programación...
130
MANUAL SQL SERVER 2000
131
MANUAL SQL SERVER 2000
Después realizar todos estos pasos, ya se habrán creado los catálogos de texto
132
MANUAL SQL SERVER 2000
Una vez creados y llenado los catálogos, debemos activarlos con procedimientos
almacenados del sistema. Todos los procedimientos almacenados del sistema empiezan
por SP
SP_FullText_Database: Activa / Desactiva todos los índices de todos los catálogos de
texto para poder realizar las búsquedas con Microsoft Search. Sintaxis
SP_FullText_Database ‘Enable’
SP_FullText_Database ‘Disable’
Argumentos
[@table_name =] 'table_name'
Es el nombre de tabla de una o dos partes para el que se solicita información de índice
de texto. El argumento table_name es de tipo nvarchar(517) y tiene el valor
predeterminado NULL. Si se omite table_name, se obtiene la información de columna
de índice de texto de todas las tablas con índice de texto.
[@column_name =] 'column_name'
Ejemplo:
133
MANUAL SQL SERVER 2000
Instrucción Contains
• Una palabra que sea una inflexión de otra, por ejemplo, las palabras controles,
controladores, controlando y controlado son inflexiones de control (solo
palabras en inglés).
134
MANUAL SQL SERVER 2000
135
MANUAL SQL SERVER 2000
Para eliminarla
136
MANUAL SQL SERVER 2000
Default
sintaxis parcial
CHECK
137
MANUAL SQL SERVER 2000
Sintaxis parcial
[Constraint nombrerestriccion)
chech ( Expresion )
Primary key
Sintaxis parcial
[ Constraint NombreRestic ]
primary key [Clustered | NonClustered ] columnas,…)
Unique
Sintaxis parcial
[Constraint nombreRestriccion ]
Unique [Clustered | non Clustered ] (Columnas,...)
138
MANUAL SQL SERVER 2000
Foreign key
Sintaxis parcial
[Constraint nombreRest ]
Foreign key (Columna,...)
References tablaRef (Columna,…)
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 Orders
PK ProductId 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
139
MANUAL SQL SERVER 2000
Deshabilitacion de restricciones
Sintaxis parcial
Alter Table
[WITH CHECK | WITH NOCHECK]
Add
Constrain restriccion
{ Foreign key (Columna,…)
References TablaRef (Columna,…)
{ CHECK (Condicion)
use northwind
alter table employees
with NOCHECK
add
Constraint Fk_employees_employees
Foreign Key (Reportstu)
References employees(EmployeeId)
Sintaxis parcial
Alter Table tabla
{CHECK | NOCHECK } CONSTRAINT
{ALL | Restricción 1, … } Para hacer la restriccion a todo , o a solo lo que
esta separado por comas “,”
use northwind
alter table employees
NOCHECK CONSTRAINT FK_Employees_Employees
140
MANUAL SQL SERVER 2000
141
MANUAL SQL SERVER 2000
Sintaxis
use northwind
GO
CREATE DEFAULT Telefono_default AS '(00)000-0000'
GO
use northwind
EXEC sp_helpconstraint products
Para eliminar varios objetos de la base de datos con una sola sentencia
142
MANUAL SQL SERVER 2000
REGLAS
Sintaxis
CREATE RULE NombreRegla
AS Condición
use Hospital
create rule Funcion_Rule as
@Funcion in('INTERINO','ENFERMERO','ENFERMERA')
GO
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'
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'
143
MANUAL SQL SERVER 2000
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'.
144
MANUAL SQL SERVER 2000
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
exec sp_addtype TNoNulo,'nvarchar(15)','Not null'
exec sp_addtype TNulo,'nvarchar(15)','Null'
Tipos de Datos
145
MANUAL SQL SERVER 2000
146
MANUAL SQL SERVER 2000
147
MANUAL SQL SERVER 2000
Crear un gráfico que muestre las relaciones que se han obtenido en la base de datos
hasta ahora.
148
MANUAL SQL SERVER 2000
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
Insert into Regiones (Regiones)
values('MADRID')
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
insert into Colegios
(nombre,localidad
,provincia,año_construccion
,coste_construccion,cod_region)
values
('PADRE POVEDA','MADRID','MADRID','01/01/65',1129876,1)
149
MANUAL SQL SERVER 2000
TABLA ALUMNOS
insert into alumnos
(dni,Nombre,Apellido1,Apellido2
,Fecha_nac,Localidad,Provincia,Cod_Colegio)
values
('54132456-R','Marta','Serrano','Lopez','15/03/93','MADRID','MADRID',13)
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.
150
MANUAL SQL SERVER 2000
Borrar todas las tablas, tipos de usuario y base de datos. Explicar en que orden
deben borrarse.
drop table alumnos
drop table profesores
drop table colegios
drop table colegios
Hay que quitar primero las relaciones de FK para luego quitar las
tablas siguientes.
151
MANUAL SQL SERVER 2000
--Creo las tablas y utilizo los valores Null y Not Null convenientemente.
use Emp
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)
152
MANUAL SQL SERVER 2000
--Creo una regla para que todos los empleados tengan asociado director
Create Rule Director_Rule as
@Director in(7566,7698,7782,7839)
GO
exec sp_bindrule Director_Rule,'Emp.Dir'
exec sp_unbindrule 'Emp.Dir',Director_Rule
153
MANUAL SQL SERVER 2000
Las demás inserciones debo hacerlas jerarquicamente con todas las reglas
y restricciones activadas, es decir, primero los directores y luego los demás
empleados.
154
MANUAL SQL SERVER 2000
PERMISOS Y USUARIOS
155
MANUAL SQL SERVER 2000
Tenemos los inicios de sesion, Funciones predefinidas por el sistema y tienen alcance
sobre toda las bases de datos del servidor.
Por ejemplo, Database Creator ofrece permisos sobre crear nuevas bases de datos en el
servidor.
156
MANUAL SQL SERVER 2000
Funciones del
Servidor
Poderes para los
usuarios, sus
funciones y sus
capacidades,
privilegios sobre
todas las bases o el
servidor. Nos
muestra una
pequeña
descripción de
cada una al pulsar
sobre ellas.
157
MANUAL SQL SERVER 2000
158
MANUAL SQL SERVER 2000
Seleccionamos al
usuario y pulsamos en
los permisos
Revocado
Con Acceso
Denegado
159
MANUAL SQL SERVER 2000
Escribimos el nombre de
nuestro nuevo usuario y su
contraseña para poder
concectar.
Intentar hacer un Select, en este caso me permite realizar la consulta, porque tengo
permisos de tipo Select.
Select * from Dept
160
MANUAL SQL SERVER 2000
Ahora vamos a
conceder más
permisos al
usuario Pepe, lo
vamos a incluir en
la función
db_datawriter para
que además pueda
realizar consultas
de acción sobre la
tabla (Insert,
Update y Delete)
(1 filas afectadas)
(1 filas afectadas)
161
MANUAL SQL SERVER 2000
Seleccionamos una
tabla, pulsamos sobre
Funciones con el
botón derecho y
seleccionamos: Nueva
función de base de
datos.
Escribimos el nombre de
nuestra nueva Función, no
le damos todavía los
usuarios ni los permisos,
esto es solamente para
crearla.
162
MANUAL SQL SERVER 2000
163
MANUAL SQL SERVER 2000
Los permisos que tiene el usuario siguen actuando, y además hereda los permisos que
tiene de la Función Becarios. Los permisos siguen funcionando a no ser que se le
deniegue explicitamente el acceso a un permiso sobre la función, entonces el usuario no
puede ejecutar la orden si está dentro de la función.
En este caso el usuario PEPE tiene los permisos de Select y consultas de acción sobre la
base de datos Hospital. Pero el usuario está dentro de la función Becarios y le hemos
denegado el acceso a realizar un Select sobre la tabla Plantilla.
Al realizar el Select sobre la tabla plantilla tiene los permisos denegados por ser
miembro de la función Becarios. Se le niega el acceso expresamente sobre acciones en
una tabla y no importa los permisos que tenga el propio usuario.
164
MANUAL SQL SERVER 2000
USUARIO PEPE
FUNCION BECARIOS
165
MANUAL SQL SERVER 2000
SEGURIDAD
Cuando un usuario se conecta a un servidor, lo hace a través de una cuenta facilitada por
el administrador de la base de datos. Esta cuenta tiene una serie de permisos que el
administrador da, estos permisos pueden ser de restricción a determinadas tablas, o por
ejemplo que un usuario pueda solo insertar, o seleccionar en determinadas tablas.
Existen dos formas de entrar a la base de datos, bien mediante el usuario de windows nt
ó 2000, ó mediante el usuario de la base de datos.
Mediante el usuario de windows, facilitamos al equipo desde el que nos conectamos, los
recursos del servidor de sql server, pudiendo incluso bloquear el equipo desde el que se
conecta el usuario.
Para que un usuario tenga acceso a una base de datos, después de crearle una cuenta de
inicio de sesión, y asociársela a una base de datos, hemos de darle permisos para que
pueda acceder a esa base de datos. Posteriormente, mediante funciones le indicaremos
que es lo que puede hacer en esa base de datos.
Puede tener permisos para una base de datos o para todo el servidor.
Funciones
Agrupamos usuarios y sobre estos usuarios daremos permisos a ese grupo de usuarios.
Las funciones de usuario, se usan para establecer los permisos que un grupo de usuario
tendrá sobre una determinada base de datos.
Una vez creado el usuario, y asignada la base de datos, podemos asociar este usuario a
la función que queramos para controlar los permisos que tiene sobre la base de datos
asignada.
Para crear un usuario y poder usarlo, hemos de establecer todos los pasos descritos en
los puntos anteriores.
Estos pasos, los realizaremos todos en el analizador de consultas:
166
MANUAL SQL SERVER 2000
SP_ADDLOGGIN
Crea una cuenta de inicio para un usuario y lo asigna a una base de datos.
Sintaxis:
SP_DROPLOGIN
Borra una cuenta de inicio de un usuario, siempre y cuando el usuario no
esté conectado y no tenga permisos sobre ninguna base de datos (si los tiene
hemos de revocarlos antes de borrar la cuenta de inicio y el usuario)Sintaxis:
SP_DROPLOGIN 'Usuario'
SP_GRANTDBACCESS
Use Hospital
GO
SP_GRANTDBACCESS 'Pepe'
Concedido a la base de datos acceso a 'Pepe'.
167
MANUAL SQL SERVER 2000
Para establecer los permisos de la función que hemos creado, usaremos el comando
GRANT. Sintaxis:
GRANT Permisos
ON Tabla / Objeto
To Función / Usuarios
168
MANUAL SQL SERVER 2000
DENY SELECT
ON Emp
TO Becarios
REVOKE Permisos
On Tabla
To Función
REVOKE UPDATE
On Emp
to Becarios
Si después de
ejecutar todos
estos comandos
hacemos doble
click sobre la
función y vemos
los permisos.
169
MANUAL SQL SERVER 2000
Una vez realizados estos pasos, si entramos en el analizador de consultas con el usuario
Pepe, si intentamos realizar una consulta no permitida, nos advertirá mediante un
mensaje que no podemos realizar la consulta:
Una vez tengamos la función sin usuarios asignados, podremos borrarla, para borrarla
usaremos el procedimiento almacenado de sistema SP_DROPROLE. Sintaxis:
SP_DROPROLE ‘Función’
En este caso sería:
EXEC SP_DROPROLE ‘Becarios’
Función quitada.
170
MANUAL SQL SERVER 2000
Otro método que tenemos para poder ofrecer permisos es con la opción
With Grant Option
Con esta opción después de la sentencia de conceder derechos, permito al usuario al que
estoy concediendo permisos pueda conceder permisos a su vez sobre los privilegios que
se le han otorgado.
Sintaxis:
Grant Select, Insert, Update, Delete
On Tabla / Vista
To Usuario / Funcion
With Grant Option
Ejemplo:
Un administrador concede permisos a Pepe para poder hacer selecciones sobre la tabla
Emp.
Usuario Administrador
Grant Select
On Emp
To Pepe
With Grant Option
Este usuario podrá a su vez conceder permisos a otro usuario sobre sus privilegios, es
decir, sobre la tabla emp y solamente con Select.
Usuario Pepe
Grant Select
On Emp
To Luisa
La cadena termina aquí, ya que Pepe no ha concedido permisos a Luisa para que pueda
conceder permisos a su vez.
Si el administrador revocase los permisos Select a Pepe, estos permisos se revocan a su
vez sobre el usuario Luisa, ya que no tiene permisos de nadie más para ver la Tabla.
Otra opción es que el usuario Pepe conceda permisos a Luisa pero solamente sobre unos
determinados campos.
Esto se puede utilizar también pero sería más conveniente utilizar una Vista.
171
MANUAL SQL SERVER 2000
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
Crea una vista. Sintaxis:
Create View NombreVista
As
Sentencia Sql
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.
172
MANUAL SQL SERVER 2000
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...
También se pueden realizar consultas usando campos de tablas mezclados con campos
de vistas.
Ejemplo:
También se puede realizar una vista con datos de una consulta de una tabla y una vista.
173
MANUAL SQL SERVER 2000
Drop View
Borra una Vista. Sintaxis:
Drop View NombreVista
Ejemplo:
Drop View todos
SP_HelpText
Muestra la consulta que realiza la vista. Sintaxis:
SP_HelpText Vista
Ejemplo
SP_HelpText VistaEmpleados
SP_Depends
Muestra las tablas, campos e incluso vistas de las que depende una vista. Sintaxis:
SP_Depends Vista
Ejemplo:
SP_Depends VistaEmpUnionHospital
174
MANUAL SQL SERVER 2000
Ejemplo:
sp_helptext apellidos
Los comentarios de objeto han sido cifrados.
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:
Create View NombreVista
As
Sentencia Sql
With Check Option
Ejemplo:
create view vendedores
as
select * from emp where oficio='ventas'
With Check Option
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.
175
MANUAL SQL SERVER 2000
With Recompile
Sintaxis:
Create Procedure Nombre With Recomplie As Instrucciones SQL
SP_AddMessage
Ejemplo:
@@Error
Esta variable de sistema, coge el valor del error provocado por la última sentencia
ejecutada, sino tiene error se introduce valor cero, si provoca error introduciría el
código del error.
RaiseError
Lanza el mensaje indicado. Sintaxis:
RaiseError(Código, Severidad,Línea)
Código: El código del mensaje que queremos lanzar.
Severidad: Nº que hace referencia a quién provoca el mensaje. A la hora de usar
código de mensaje, introduciremos intervalos entre 11 y 16 que son los provocados
por el usuario y que se pueden solucionar.
Estado: Estado del mensaje.
176
MANUAL SQL SERVER 2000
Ejemplo:
SP_dropMessage 50020,'Spanish'
Para ver los mensajes creados, debemos utilizar la tabla sysmessages de la base de datos
Master:
use master
go
select * from sysmessages
Transacciones
Para realizar una transacción seguimos la siguiente sintaxis:
Begin Transaction
Instrucciones
@@Error
RollBack Tran
Instrucciones
Commit Transaction
Creamos una nueva base de datos llamada Almacen, y en ella creamos las siguientes
tablas:
177
MANUAL SQL SERVER 2000
178
MANUAL SQL SERVER 2000
Creamos una regla check para que las unidades de almacen no puedan ser menor que
cero.
Provocaremos los errores creados, insertando mas unidades de las que se pueden vender
Exec NVentas '1','1','50'
179
MANUAL SQL SERVER 2000
Declare Table
Mediante esta sentencia, se pueden crear tablas temporales en memoria, y
posteriormente manipularlas como si fueran tablas normales. Sintaxis:
Declare @Tabla Table
(Campo1 tipo, Campo2 tipo, Campo3 tipo...)
Estas tablas temporales solamente sirven para el momento de la ejecución, si se intentan
utilizar en otro momento el sistema no las reconocerá.
FUNCIONES DE USUARIO
Una función de usuario, se crea con el fin de automatizar una consulta que se realiza
a menudo. Pueden usar uno o más parámetros de entrada y devuelven un valor o
varios resultados. Existen dos tipos de funciones:
Escalares
Devuelven un solo valor. Sintaxis:
Create Function NombreFunción (@Parámetro1 tipo, @Parámetro 2 tipo...)
Returns Tipo
As
Begin
Sentencias
End
Ejemplo:
180
MANUAL SQL SERVER 2000
181
MANUAL SQL SERVER 2000
Tabla
Ejemplo 1:
En este caso introducimos como valor Ventas, y vemos como obtenemos todos
los empleados del departamento indicado.
182
MANUAL SQL SERVER 2000
Ejemplo 2:
Drop Function
Ejemplo:
183
MANUAL SQL SERVER 2000
Como vemos en el ejemplo al crear las tablas con dependencias, hemos de indicar
cuál es su propietario.
Ejercicios:
1. Crear una función que pasándole una fecha y un separador a elegir nos debe
cambiar el separador de la fecha que le estamos pasando por el separador
elegido, ejemplo pasándole la fecha 01/12/2001 y el separador “:” obtendremos
01:12:2001. hemos de tener en cuenta que la fecha que le pasemos no tiene
porque tener el separador /.
Para probar que la función es correcta, seleccionaremos todas las fechas
de alta de la tabla Empleados y le pasaremos el separador “:”
Al declarar la función usamos convert para convertir el día, mes o año a caracter, ya
que si intentamos concatenar números con carácteres da error porque piensa que
intentamos sumar.
184
MANUAL SQL SERVER 2000
185
MANUAL SQL SERVER 2000
3. Crear una función que dependiendo de los datos que le enviemos, nos devolverá
un informe sobre los empleados. Los parámetros que le podemos enviar a la
función son: Nº Departamento, Nº Empleado, Fecha u Oficio. Dependiendo del
dato, mostraremos unos datos u otros.
186
MANUAL SQL SERVER 2000
+ ltrim(cast(oficio as nvarchar(15)))
+ ' se dió de alta el '
+ cast(day(fecha_alt) as char(2)) + ' de '
+ ltrim(cast(datename(month,fecha_alt) as nvarchar(15)))
+ ' de '
+ cast(year(fecha_alt) as char(4))
,'EMPLEADO SIN NOMBRE')
as [DATOS EMPLEADOS]
from emp
where apellido like @Param
END
end
Return
end
187
MANUAL SQL SERVER 2000
Trigger Instead Of
Es un tipo de trigger, que asociado a una vista, cuando se intenta realizar el tipo de
consulta que indica el trigger (insertar, modificar, o eliminar), una vez están los
registros en las tablas inserted o deleted, la consulta se interrumpe y salta el trigger, con
lo que podemos manejar los datos que hay en estas tablas temporales mediante el
trigger, esto es muy práctico cuando queremos insertar en varias tablas pertenecientes a
una vista, ya que con una simple consulta no podremos, tendremos que trabajar con un
trigger Instead Of y usar las filas incluidas en la tabla inserted.
Sintaxis:
Ejemplo:
188
MANUAL SQL SERVER 2000
Dentro de vistas,
seleccionamos la deseada, y
elegimos la opción Todas
las taréas -> Administrar
desencadenadores...
...posteriormente, ya en la pantalla de
desencadenadores, en nombre elegimos el
desencadenador que queramos.
Ejemplo2:
189
MANUAL SQL SERVER 2000
(1 filas afectadas)
190
MANUAL SQL SERVER 2000
191
MANUAL SQL SERVER 2000
INDICES
Es una estructura auxiliar que sirve para optimizar las consultas. Mediante esta
estructura, al realizar una consulta SQL Server realizará menos operaciones para
devolver los resultados y la consulta se realizará mas rápidamente ya que los datos están
estructurados de forma que sea mas sencillo localizarlos.
Algo muy similar a los Indices creados por Sql Server, es el índice de un libro, en una
página indica en que página del libro está cada capítulo, y además podemos saber
también, que apartados hay dentro de un capítulo y en que página están. En el caso de
una base de datos, todos los registros de esta, se almacenan en páginas, después se crean
unos índices que indican en que página de datos está cada registro y por encima de estos
índices, se crean otros subíndices que almacenan la cabecera de cada índice. Además se
crearía una cabecera principal que almacenaría a su vez la cabecera de estos subíndices.
o Cada registro de cada tabla, se almacena en una página de datos estas páginas tienen
un tamaño de 8 kb. A un grupo de ocho páginas de datos se le llama Extensión.
o Las filas no se almacenan en un orden concreto y no hay un orden detallado de la
secuencia de las páginas de datos.
o No existe una lista que almacene la estructura de las páginas de datos.
o Cada vez que se inserta un nuevo registro en una página de datos llena, esta se
fracciona creandose otra página de datos.
Los indices abrevian la recuperación de los datos, sin índices tendríamos que recorrer
todas las páginas de datos hasta encontrar las filas que cumplen la consulta, sobre todo
aceleran las consultas que combinen varias tablas y agrupen u ordenen datos.
192
MANUAL SQL SERVER 2000
193
MANUAL SQL SERVER 2000
194
MANUAL SQL SERVER 2000
195
MANUAL SQL SERVER 2000
Ejemplo para calcular de forma teorica el tamaño que puede ocupar un indice en una
tabla:
Queremos hacer un indice a partir de una tabla en la que cada tipo de dato en
la columna de tiene un tamaño fijo de 5 bytes. Por ejemplo varchar(5).
CREAR CLAVE AGRUPADA 5 BYTES LONGITUD FIJA
La Hoja del indice ocupará 12 bytes porque el índice incluye información adicional,
una clave interna y unica para cada dato que tiene el indice.
Dependiendo del dato, añade de 5 a 8 bytes más en cada página de indice.
Ahora sabemos cuantas filas ocupan y el tamaño de cada página.
8096 bytes / 12 bytes = 674 filas en cada indice, en el momento que pongamos 675
datos, la página se dividirá.
Cada una de las páginas va a generar una fila en las páginas de indice, habrá que
dividir las 10000 páginas por las 674 filas y sabremos cuantas páginas de indices
hay.
Se va a generar otro nivel que es nivel 2 que es raiz, porque el nivel raiz solamente
va a tener 15 filas, pero tiene espacio para 674.
196
MANUAL SQL SERVER 2000
- No Agrupados:
197
MANUAL SQL SERVER 2000
- Sirven para buscar valores en otras columnas que no estén agrupadas por ningún
tipo de indices.
- Se pueden crear tantos indices no agrupados como se deseen, pero solamente
puede haber un único indice agrupado.
198
MANUAL SQL SERVER 2000
199
MANUAL SQL SERVER 2000
Create Index
Crea índices igual que con el administrador corporativo de SQL Server. Para ejecutar
esta instrucción es imprescindible ser el propietario de la tabla. No se pueden crear
índices de vistas.
Para los indices agrupados se utilizará el Prefijo CL_ antes del nombre del indice.
Create Clustered
Index CL_Emp
On Emp(emp_no) asc
Para los indices no agrupados se usará el Prefijo NonCL_ antes del nombre del indice.
Create NonClustered
Index NonCL_Apellido
On Emp(Apellido)
FillFactor
Si no decimos nada, las hojas de indices se llenan completamente cada vez que
añadimos sobre la base de datos.
Si una hoja de indice está llena, la hoja de indice se fragmenta.
Fillfactor es una instrucción que nos permite dejar un espacio porcentual en cada página
para las posibles inserciones, de esta forma se evitan las fragmentaciones de página y de
indices. Solamente se fragmentarán cuando hayamos rellenado el espacio que hayamos
puesto con Fillfactor.
Si ponemos Fillfactor, dejamos un 70% de espacio libre en las hojas de indices.
Valor predeterminado es 0. (Si no se pone nada)
La fragmentación aumenta espacio y además aumentan los saltos entre hojas.
Sintaxis:
Create Clustered
Index CL_Emp
On Emp(emp_no)
With Fillfactor=70
Sp_helpindex Tabla
- Dice el nombre del indice, la descripción y la columna a la que está asociado.
Sp_helpindex emp
200
MANUAL SQL SERVER 2000
Las extensiones son las páginas que se han fragmentado después de crear el indice.
Drop Index
Borra índices
Drop Index Tabla.Nombre_Indice
201
MANUAL SQL SERVER 2000
202
MANUAL SQL SERVER 2000
... posteriormente
introducimos el login y la
password. Pulsamos siguiente.
Una vez tengamos acceso a este servidor, para acceder a una tabla, procedimiento
almacenado, vista etc. hemos de indicar primero el servidor, después la base de datos,
luego el propietario y posteriormente la tabla, vista o lo que sea, conectandonos desde el
servidor importado, para acceder al nuevo.
Para poder utilizarlo, tendremos que utilizar el procedimiento almacenado
Sp_addlinkedservers ‘SERVIDOR’
Select * from Servidor.BBDD.propietario.Tabla / PA / Vista etc.
Select * from serra.hospital.dbo.emp
Para ver nuestra lista de servidores:
use master
go
select * from sysservers
203
MANUAL SQL SERVER 2000
OpenRowSet
Accede a una vista, tabla, procedimiento almacenado de una base de datos perteneciente
a otro servidor, sin necesidad de que el servidor esté vinculado a nuestro servidor.
Sintaxis:
OpenRowSet (‘TipoProveedor’,Servidor, IdUsuario, Password, Base de datos,
“Consulta”)
Ejemplo:
use Northwind
GO
select s.* from
openrowset ('SQLOLEDB','A1S02';'sa'; ''
,'Select * from Northwind.Dbo.Orders') as s
use Hospital
GO
Select H.emp_no,H.apellido,H.Salario,H.Dept_no from
openRowset ('SQLOLEDB','SERRA';'sa';''
,'Select * from Hospital.dbo.emp') as H
204
MANUAL SQL SERVER 2000
<root>
<Elemento1A>
<subelemento1A>
<subelemento1B>
</subelemento1B atributo1 atributo2>
</subelemento1A>
</Elemento1A>
</root>
<ListaEmpleados>
<emp apellido="SANCHEZ"
salario="104000"
dept_no="20"/>
<emp apellido="ARROYO"
salario="208000"
dept_no="30"/>
<emp apellido="SALA"
salario="162500"
dept_no="30"/>
</ListaEmpleados>
205
MANUAL SQL SERVER 2000
PRECAUCIÓN
206
MANUAL SQL SERVER 2000
Select apellido, salario, dept_no from emp for xml auto, elements
XML_F52E2B61-18A1-11d1-B105-00805F49916B
----------------------------------------------------------------------------------------
------------------
<emp>
<apellido>SANCHEZ</apellido>
<salario>104000</salario>
<dept_no>20</dept_no>
</emp>
<emp>
<apellido>ARROYO</apellido>
<salario>208000</salario>
<dept_no>30</dept_no>
</emp>
<emp>
<apellido>SALA</apellido>
<salario>162500</salario>
<dept_no>30</dept_no>
</emp>
<emp>
<apellido>JIMENEZ</apellido>
<salario>386750</salario>
<dept_no>20</dept_no>
</emp>
............
Sin embargo, si la instrucción SELECT lee datos de más de una tabla hay una gran
diferencia entre cómo trabajan los modos RAW y AUTO.
select
emp_no as [Numero]
,apellido as Apellido
,salario as Salario
,Departamento.dnombre as [NombreDepartamento] from emp as Empleados
inner join dept as Departamento
on Empleados.dept_no = Departamento.dept_no
for xml auto
XML_F52E2B61-18A1-11d1-B105-00805F49916B
----------------------------------------------------------------------------------------
------------------
<Empleados Numero="7369" Apellido="SANCHEZ" Salario="104000">
<Departamento NombreDepartamento="INVESTIGACION"/>
</Empleados>
<Empleados Numero="7499" Apellido="ARROYO" Salario="208000">
<Departamento NombreDepartamento="Ventas"/>
</Empleados>
<Empleados Numero="7521" Apellido="SALA" Salario="162500">
<Departamento NombreDepartamento="Ventas"/>
</Empleados>
<Empleados Numero="7566" Apellido="JIMENEZ" Salario="386750">
<Departamento NombreDepartamento="INVESTIGACION"/>
</Empleados>
<Empleados Numero="7654" Apellido="MARTIN" Salario="182000">
<Departamento NombreDepartamento="Ventas"/>
</Empleados>
...................
207
MANUAL SQL SERVER 2000
select
emp_no as [Numero]
,apellido as Apellido
,salario as Salario
,Departamento.dnombre as [NombreDepartamento] from emp as Empleados
inner join dept as Departamento
on Empleados.dept_no = Departamento.dept_no
for xml raw
XML_F52E2B61-18A1-11d1-B105-00805F49916B
----------------------------------------------------------------------------------------
<row apellido="SANCHEZ" salario="104000" dept_no="20"/>
<row apellido="Nino" salario="454" dept_no="10"/>
<row apellido="ARROYO" salario="208000" dept_no="30"/>
<row apellido="SALA" salario="162500" dept_no="30"/>
<row apellido="JIMENEZ" salario="386750" dept_no="20"/>
<row apellido="MARTIN" salario="182000" dept_no="30"/>
<row apellido="NEGRO" salario="370500" dept_no="30"/>
<row apellido="CEREZO" salario="318500" dept_no="10"/>
<row apellido="GIL" salario="390000" dept_no="20"/>
<row apellido="REY" salario="650000" dept_no="10"/>
<row apellido="TOVAR" salario="195000" dept_no="30"/>
<row apellido="ALONSO" salario="143000" dept_no="20"/>
<row apellido="JIMENO" salario="123500" dept_no="30"/>
<row apellido="FERNANDEZ" salario="390000" dept_no="20"/>
<row apellido="MUÑOZ" salario="169000" dept_no="10"/>
La diferencia entre las dos sentencias es que auto crea el documento de forma
jerarquica, mientras que raw crea el documento con elementos unicos y resuelve todas
las columnas como atributos, independientemente de que sean de otra tabla.
208
MANUAL SQL SERVER 2000
XMLDATA
- Nos devuelve lo mismo que las otras sentencias normales, pero con la diferencia
que nos devuelve un informe de cómo está echo el esquema del documento XML
creado.
select
emp_no as [Numero]
,apellido as Apellido
,salario as Salario
,Departamento.dnombre as [Nombre] from emp as Empleados
inner join dept as Departamento
on Empleados.dept_no = Departamento.dept_no
for xml auto,xmldata
XML_F52E2B61-18A1-11d1-B105-00805F49916B
----------------------------------------------------------------------------------------
------------------
<Schema name="Schema2" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-
microsoft-com:datatypes">
<ElementType name="Empleados" content="eltOnly" model="closed" order="many">
<element type="Departamento" maxOccurs="*"/>
<AttributeType name="Numero" dt:type="i4"/>
<AttributeType name="Apellido" dt:type="string"/>
<AttributeType name="Salario" dt:type="i4"/>
<attribute type="Numero"/>
<attribute type="Apellido"/>
<attribute type="Salario"/>
</ElementType>
<ElementType name="Departamento" content="empty" model="closed">
<AttributeType name="Nombre" dt:type="string"/>
<attribute type="Nombre"/>
</ElementType>
</Schema>
209
MANUAL SQL SERVER 2000
Búsqueda:
Utilizamos WITH para sacar los datos dentro de la ruta XML que le hemos
proporcionado.El nombre de los elementos que voy a recuperar con With, es el nombre
de los elementos que voy a sacar del documento XML, deben coincidir mayúsculas y
minúsculas y en los tipos de datos declarados.
210
MANUAL SQL SERVER 2000
Recuperar los datos a partir de los elementos: Me posiciono en Clientes y recupero los
elementos ID y NOMBRE
Ejemplo2:
<emp apellido="ARROYO"
salario="208000"
dept_no="30"/>
<emp apellido="SALA"
salario="162500"
dept_no="30"/>
211
MANUAL SQL SERVER 2000
<emp apellido="REY"
salario="650000"
dept_no="10"/>
</ListaEmpleados>'
EXEC sp_xml_preparedocument @ixml output,@xml
SELECT *
FROM OPENXML (@iXML, '/ListaEmpleados/emp',1)
WITH (apellido nvarchar(30)
,salario int
,dept_no int)
exec sp_xml_removedocument @ixml output
EJEMPLO 3:
212
MANUAL SQL SERVER 2000
Ahora voy a buscar por atributos, solamente mostraré los que tengan un salario
mayor de 200000.
Realizar un documento XML que muestre los datos de los jugadores del Real
Madrid y del Barcelona, una vez realizada esta acción, distribuir los jugadores en
tablas, dependiendo de su posición.
213
MANUAL SQL SERVER 2000
Optimizador de Consultas
Microsoft SQL Server ofrece tres formas de presentar información acerca de cómo se
desplaza por las tablas y utiliza los índices para tener acceso a los datos de una consulta:
214
MANUAL SQL SERVER 2000
• SET SHOWPLAN_TEXT ON
• SET SHOWPLAN_ALL ON
Aserción
Contraer
Cálculo escalar
Concatenación
Exploración de constantes
Exploración de eliminados
Filtro
215
MANUAL SQL SERVER 2000
Eliminación de índice
Inserción de índice
Exploración de índice
Búsqueda de índice
Cola de índice
Actualización de índice
Exploración de insertados
Combinación de mezcla
Bucles anidados
Paralelismo
Eliminación remota
Inserción remota
Consulta remota
Exploración remota
Actualización remota
Secuencia
Ordenación
Agregado de secuencia
216
MANUAL SQL SERVER 2000
Eliminación de tabla
Inserción de tabla
Exploración de tabla
Cola de tabla
Actualización de tabla
Superior
Instantánea
217
MANUAL SQL SERVER 2000
218
MANUAL SQL SERVER 2000
Cuando realizamos una consulta se ponen en marcha una serie de procesos aun que sea
una consulta que pueda resultar muy sencilla:
219
MANUAL SQL SERVER 2000
2. Optimización:
220
MANUAL SQL SERVER 2000
221
MANUAL SQL SERVER 2000
Bucle:
Recorre la tabla departamentos mira todos los nºs de departamentos. Recorre emp y
mira que coincida nº de dpto con nº de dpto de emp.
Hash:
Es un calculo realizado sobre una columna indizada, por ej. un dni, divide cada dni
entre 13 y dependiendo del resto agrupa cada dni en un determinado grupo
dependiendo del resto. Se suele emplear hash cuando no hay un índice o los índices
que hay no son válidos para la consulta.
222
MANUAL SQL SERVER 2000
Trazas
Las trazas son unas herramientas que nos permiten guardar la actividad de las
bases de datos para luego poder sacar un informe del rendimiento que tienen. El
informe del rendimiento será utilizado más tarde para optimizar las consultas
Entraremos en el analizador de
SQL, desde dónde podremos
crear una nueva traza. Para
seleccionar las trazas debemos ir
a archivo, Nuevo Traza
223
MANUAL SQL SERVER 2000
Guardar en Tabla: El
archivo de traza
podremos vincularlo a
una tabla para poder
utilizarlo más tarde con
el optimizador de
indices.
Habilitar hora de detención de traza: Podemos dejar una traza trabajando sobre unas
determinadas operaciones dentro de la base de datos, con esta opción podemos
programar a que hora paramos la traza para evaluar el movimiento de la base de datos.
224
MANUAL SQL SERVER 2000
Guardar en archivo: Nos ofrece la posibilidad de guardar la traza que vamos a crear
en un archivo, que tendrá la extensión trc. Más tarde podremos recuperar este archivo
de traza por si no queremos utilizarlo en ese momento y solamente queremos grabar una
serie de movimientos dentro de nuestra base de datos.
Nos guardará la
traza dónde
nosotros
deseemos y con
la extensión .trc
Esta traza
podremos
recuperarla más
tarde.
En esta pantalla
podremos
seleccionar los
sucesos que
queramos que SQL
verifique con la
traza. En la parte
inferior nos
muestra la
definición de lo
que vamos a
Trazar.
Seleccionaremos
Rendimiento y
Bases de datos.
225
MANUAL SQL SERVER 2000
Esta pantalla muestra una traza en ejecución, que podremos parar en todo momento o
pausarla, una vez en ejecución ya podemos ir al analizador de consultas para escribir las
consultas más utilizadas y capturar su valor dentro de la traza.
226
MANUAL SQL SERVER 2000
Con la traza en ejecución probaremos unas cuantas consultas en la base de datos que
hemos seleccionado.
use futbol
GO
select * from jugadores
La traza
captura el texto
para después
comprobar si
necesitaríamos
mejorar la
estructura de la
base de datos a
partir de las
consultas
realizadas.
Una vez que he realizado las operaciones detengo la traza volviendo al Analizador de
227
MANUAL SQL SERVER 2000
Se abrirá un asistente
para la optimización
de indices, el cúal me
guiará hasta encontrar
la optimización de mi
tabla para sacar mayor
rendimiento a las
consultas.
Se abrirá una
ventana en la que
estará mi
servidor, la base
de datos a
optimizar y el
tipo de análisis
que quiero
realizar sobre mi
tabla.
Seleccionaré
exhaustivo.
228
MANUAL SQL SERVER 2000
Al pulsar en siguiente aparecerá otra ventana en la que podré seleccionar dónde está la
información para optimizar mi tabla, esta información deberé haberla escrito
previamente mediante una traza.
Tabla de traza SQL Server: Es una traza que he guardado en una tabla.
229
MANUAL SQL SERVER 2000
Pulsando sobre
opciones avanzadas
aparece una ventana
del asistente en el que
podremos seleccionar
algunos ajustes para
limitar el resultado
que queremos en la
configuración.
230
MANUAL SQL SERVER 2000
Si pulsamos sobre
análisis, veremos una
pantalla dónde nos
mostrará algunos datos
sobre el uso de la tabla a
partir de las consultas
que hemos realizado.
Podremos seleccionar
entre varias opciones
que nos mostrarán el
rendimiento actual de la
tabla y el óptimo.
231
MANUAL SQL SERVER 2000
232
MANUAL SQL SERVER 2000
233