Manual SQL Server 2000 para Hospitales
Manual SQL Server 2000 para Hospitales
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.
7
MANUAL SQL SERVER 2000
8
MANUAL SQL SERVER 2000
NOMBRE:
CURSO:
EDICIÓN:
9
MANUAL SQL SERVER 2000
10
MANUAL SQL SERVER 2000
11
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.
12
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.
13
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
14
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.
15
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]%'
16
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]%'
17
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
18
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
19
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.
20
MANUAL SQL SERVER 2000
21
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.
22
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.
23
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 [Link], [Link]
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 [Link]
24
MANUAL SQL SERVER 2000
select apellido,oficio,dnombre
from emp
full join dept
on emp.dept_no=dept.dept_no
order by [Link]
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 [Link], [Link]
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.
25
MANUAL SQL SERVER 2000
select apellido,oficio,dnombre
from emp
left outer join dept
on emp.dept_no=dept.dept_no
order by [Link]
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 [Link]
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.
26
MANUAL SQL SERVER 2000
select apellido,oficio,dnombre
from emp
cross join dept
27
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.
28
MANUAL SQL SERVER 2000
29
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
[Link] = [Link]
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 [Link] as [TITULO]
,p.pub_name as [EDITOR]
,[Link] as [ANTICIPO]
from titles as t
inner join publishers as p
on
t.pub_id=p.pub_id
where
[Link]>7500
3) Seleccionar todos los titulos, nombre y apellidos del autor de todos los
libros de cocina tradicional.
(5 filas afectadas)
30
MANUAL SQL SERVER 2000
SOLUCION:
SOLUCION:
31
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:
32
MANUAL SQL SERVER 2000
SOLUCION:
33
MANUAL SQL SERVER 2000
34
MANUAL SQL SERVER 2000
35
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.
36
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 [Link]
,[Link]
,[Link]
,[Link]
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.
37
MANUAL SQL SERVER 2000
38
MANUAL SQL SERVER 2000
14. Averiguar la combinación de que salas podría haber por cada uno de los
hospitales.
39
MANUAL SQL SERVER 2000
OPERADOR UNION
Select Apellido,
Oficio as
'OFICIO/FUNCION'
,salario from emp
UNION
Select Apellido,
Funcion, Salario from
Plantilla
40
MANUAL SQL SERVER 2000
SUBCONSULTAS
Subconsulta correlacionada
41
MANUAL SQL SERVER 2000
42
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:
43
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)
44
MANUAL SQL SERVER 2000
45
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.
46
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.’)
47
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
48
MANUAL SQL SERVER 2000
49
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
50
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.
51
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.
52
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.
53
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.
54
MANUAL SQL SERVER 2000
ELSE
'HOMBRE'
END
FROM ENFERMO
ORDER BY FECHA_NAC,S
select [Link],[Link],[Link]
,DEPARTAMENTO =
ISNULL([Link],'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 [Link]
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.
55
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.
56
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.
57
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.
58
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.
59
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 [Link] un salario
base de 70000 pts/mes y no cobrara comision, ¿qué dificultad plantea el alta de
este empleado? ¿Cómo podria solucionarse ?
60
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.
61
MANUAL SQL SERVER 2000
62
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
63
MANUAL SQL SERVER 2000
Este ejemplo suma todas las cantidades, y mediante rollup, muestra una fila con la suma
de todas las cantidades de cada producto, y además, otra fila con la suma de todas las
cantidades de todos los productos. El resultado de este ejemplo, sería el que muestra la
imagen:
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.
64
MANUAL SQL SERVER 2000
Sum(Quantity) As Cantidad_Total
From [Order Details]
where orderid < 10250
Group by ProductID, OrderID
with Cube
Order by ProductID, OrderID
En este caso como vemos en la imagen, hace un resumen con la suma de la cantidad de
cada combinación posible entre el productid y el orderid
GROUPING
65
MANUAL SQL SERVER 2000
COMPUTE
Vemos que muestra la columna con la suma total de todas las cantidades.
66
MANUAL SQL SERVER 2000
67
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
68
MANUAL SQL SERVER 2000
69
MANUAL SQL SERVER 2000
70
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)
71
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
72
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
73
MANUAL SQL SERVER 2000
sum
=====================
54.9200
sum
=====================
25125.0000
sum
=====================
22.9800
sum
=====================
15000.0000
sum
=====================
42.9500
sum
=====================
15000.0000
74
MANUAL SQL SERVER 2000
sum
=====================
45.9300
sum
=====================
21.5900
(7 filas afectadas)
sum
=====================
45.9300
75
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)
76
MANUAL SQL SERVER 2000
sum
=====================
65.4900
sum
=====================
21000.0000
(5 filas afectadas)
sum
=====================
54.9200
max
====
1389
(6 filas afectadas)
77
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
78
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.
79
MANUAL SQL SERVER 2000
¿Qué filas son de resumen? ¿Cuáles el resumen por producto y cuáles por pedido?
80
MANUAL SQL SERVER 2000
TRANSACCIONES
81
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
82
MANUAL SQL SERVER 2000
FUNCIONES DE FECHA
GetDate
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
83
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
84
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
85
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
86
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.
87
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
88
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
89
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.
90
MANUAL SQL SERVER 2000
FUNCIONES DE SISTEMA
91
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()
92
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
93
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.
94
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 [Link] = 'La Paz'
--Notificamos la bajada
select 'Al empleado del Hospital '
+ [Link]
+ ', '
+ [Link]
+ ' con función de '
+ [Link]
+ ', 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 [Link] = '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.
95
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’.
96
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.
97
MANUAL SQL SERVER 2000
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)
98
MANUAL SQL SERVER 2000
Para realizar relaciones, teniendo el foco sobre Diagramas, botón derecho -> Nuevo
diagrama de base de datos.
99
MANUAL SQL SERVER 2000
100
MANUAL SQL SERVER 2000
Establecemos las claves principales. Para ello, nos posicionamos sobre el campo que
queramos y pulsamos el icono de la llave.
101
MANUAL SQL SERVER 2000
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.
102
MANUAL SQL SERVER 2000
103
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
104
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.
105
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)
106
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:
107
MANUAL SQL SERVER 2000
Ejemplo 2:
EJEMPLOS:
end
end
108
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.
109
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’
110
MANUAL SQL SERVER 2000
111
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 [Link] as [SALA]
,avg([Link]) as [Media]
,count(p.empleado_no) as [Nº Empleados]
,sum([Link]) as [Suma] from plantilla as p
inner join sala as s
on s.hospital_cod = p.hospital_cod
group by [Link]
having [Link] = @Valor
112
MANUAL SQL SERVER 2000
113
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).
114
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
115
MANUAL SQL SERVER 2000
116
MANUAL SQL SERVER 2000
117
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
118
MANUAL SQL SERVER 2000
119
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:
120
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
121
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
122
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.
123
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'
124
MANUAL SQL SERVER 2000
125
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.
126
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:
127
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
128
MANUAL SQL SERVER 2000
129
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
130
MANUAL SQL SERVER 2000
Con Add File, podemos añadir un nuevo archivo NDF al archivo secundario de
la base de datos elegido. Sintaxis:
131
MANUAL SQL SERVER 2000
Sintaxis:
Opciones:
ShrinkDataBase
Sintaxis:
Opciones:
Ejemplo:
132
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.
133
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.
134
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.
135
MANUAL SQL SERVER 2000
136
MANUAL SQL SERVER 2000
137
MANUAL SQL SERVER 2000
138
MANUAL SQL SERVER 2000
6. Seleccionamos las columnas de texto sobre las que se realizarán los catálogos
de búsqueda.
Pulsamos Siguiente.
139
MANUAL SQL SERVER 2000
140
MANUAL SQL SERVER 2000
p
rogram
ación...
9. ...nos saldrá una pantalla en la que podremos configurar la forma del llenado y la
frecuencia.
Si seleccionamos frecuencia periódica y posteriormente pulsamos el botón
Cambiar...
141
MANUAL SQL SERVER 2000
142
MANUAL SQL SERVER 2000
12. Aparecerá una pantalla en la que iremos viendo como se van realizando
los pasos para indizar el
tabla e introducirla en el
catálogo.
143
MANUAL SQL SERVER 2000
13. Posteriormente, dentro la base de datos con la que estamos trabajando, hacemos
click sobre Catálogos de Texto. Veremos que está el catálogo que acabamos de
crear. Debido a que no lo hemos llenado con el asistente, lo llenaremos mediante
la opción Iniciar llenado completo.
Después realizar todos estos pasos, ya se habrán creado los catálogos de texto
144
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:
145
MANUAL SQL SERVER 2000
Instrucción Contains
146
MANUAL SQL SERVER 2000
147
MANUAL SQL SERVER 2000
Para eliminarla
148
MANUAL SQL SERVER 2000
Default
sintaxis parcial
CHECK
149
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,...)
150
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
151
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
152
MANUAL SQL SERVER 2000
153
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
154
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,'[Link]'
use northwind
GO
CREATE RULE regioncode_rule
AS
@regioncode >=1000 and @regioncode <=100
GO
EXEC sp_bindrule regioncode_rule,'[Link]'
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,'[Link]'
155
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'.
156
MANUAL SQL SERVER 2000
use Escuela
GO
exec sp_addtype TNoNulo,'nvarchar(15)','Not null'
exec sp_addtype TNulo,'nvarchar(15)','Null'
Tipos de Datos
157
MANUAL SQL SERVER 2000
158
MANUAL SQL SERVER 2000
159
MANUAL SQL SERVER 2000
foreign key(cod_region)
references regiones(cod_region)
160
MANUAL SQL SERVER 2000
161
MANUAL SQL SERVER 2000
162
MANUAL SQL SERVER 2000
TABLA REGIONES
Insert into Regiones (Regiones)
values('MADRID')
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)
163
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)
164
MANUAL SQL SERVER 2000
165
MANUAL SQL SERVER 2000
Hay que quitar primero las relaciones de FK para luego quitar las
tablas siguientes.
166
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)
167
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,'[Link]'
exec sp_unbindrule '[Link]',Director_Rule
168
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.
169
MANUAL SQL SERVER 2000
PERMISOS Y USUARIOS
170
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.
171
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.
172
MANUAL SQL SERVER 2000
173
MANUAL SQL SERVER 2000
174
MANUAL SQL SERVER 2000
Seleccionamos al
usuario y pulsamos en
los permisos
Revocado
Con Acceso
Denegado
175
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
176
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)
177
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.
178
MANUAL SQL SERVER 2000
179
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.
180
MANUAL SQL SERVER 2000
USUARIO PEPE
FUNCION BECARIOS
181
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:
182
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'.
183
MANUAL SQL SERVER 2000
184
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
DENY SELECT
ON Emp
TO Becarios
REVOKE Permisos
On Tabla
To Función
REVOKE UPDATE
On Emp
to Becarios
185
MANUAL SQL SERVER 2000
Si después de
ejecutar todos
estos comandos
hacemos doble
click sobre la
función y vemos
los permisos.
186
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.
187
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.
188
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.
189
MANUAL SQL SERVER 2000
190
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:
191
MANUAL SQL SERVER 2000
También se puede realizar una vista con datos de una consulta de una tabla y una vista.
192
MANUAL SQL SERVER 2000
As
Select Emp_no, Apellido, Dnombre
From VistaEmpleados
Union
Select Empleado_no, Apellido, Hospital_Cod
From Plantilla
Si vamos a vistas y seleccionamos todas sus filas vemos que estan los datos de la vista
creada.
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
193
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'
194
MANUAL SQL SERVER 2000
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.
195
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.
196
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:
197
MANUAL SQL SERVER 2000
198
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'
199
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:
200
MANUAL SQL SERVER 2000
End
201
MANUAL SQL SERVER 2000
202
MANUAL SQL SERVER 2000
Tabla
Ejemplo 1:
En este caso introducimos como valor Ventas, y vemos como obtenemos todos
los empleados del departamento indicado.
203
MANUAL SQL SERVER 2000
204
MANUAL SQL SERVER 2000
Ejemplo 2:
Drop Function
Ejemplo:
205
MANUAL SQL SERVER 2000
On Dept.Dept_no = Emp.Dept_no
where DNombre = @NDept)
206
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
[Link]. 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.
207
MANUAL SQL SERVER 2000
208
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.
209
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
210
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:
211
MANUAL SQL SERVER 2000
Dentro de vistas, seleccionamos la deseada, y elegimos la opción Todas las taréas ->
Administrar desencadenadores...
212
MANUAL SQL SERVER 2000
Ejemplo2:
213
MANUAL SQL SERVER 2000
(1 filas afectadas)
214
MANUAL SQL SERVER 2000
215
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.
216
MANUAL SQL SERVER 2000
217
MANUAL SQL SERVER 2000
218
MANUAL SQL SERVER 2000
219
MANUAL SQL SERVER 2000
220
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.
221
MANUAL SQL SERVER 2000
- No Agrupados:
222
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.
223
MANUAL SQL SERVER 2000
224
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
225
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
226
MANUAL SQL SERVER 2000
227
MANUAL SQL SERVER 2000
...y nos saldrá una pantalla que indicará los servidores que podemos incorporar a nuestro
grupo de servidores, seleccionamos el / los que queramos y pulsamos agregar. Después
pulsamos siguiente.
Aparecerá una pantalla que nos preguntará el tipo de conexión que usaremos, en
este caso usaremos la segunda, porque trabajaremos con el usuario SA de Sql Server...
228
MANUAL SQL SERVER 2000
Nos indicará que esta completado el registro del servidor elegido. Pulsamos Finalizar.
229
MANUAL SQL SERVER 2000
Saldrá una pantalla en la que iremos viendo el proceso de registro del servidor elegido.
Una vez finalizado este proceso, pulsamos cerrar y ya tendremos acceso a todas las
bases de datos de ese servidor.
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 [Link] / PA / Vista etc.
Select * from [Link]
Para ver nuestra lista de servidores:
use master
go
select * from sysservers
230
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 [Link]') as s
use Hospital
GO
Select H.emp_no,[Link],[Link],H.Dept_no from
openRowset ('SQLOLEDB','SERRA';'sa';''
,'Select * from [Link]') as H
231
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>
232
MANUAL SQL SERVER 2000
PRECAUCIÓN
233
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
,[Link] 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>
...................
234
MANUAL SQL SERVER 2000
select
emp_no as [Numero]
,apellido as Apellido
,salario as Salario
,[Link] 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.
235
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
,[Link] 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>
236
MANUAL SQL SERVER 2000
Búsqueda:
Utilizamos WITH para sacar los datos dentro de la ruta XML que le hemos
[Link] 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.
237
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"/>
238
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:
239
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.
240
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:
241
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
242
MANUAL SQL SERVER 2000
Filtro
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
243
MANUAL SQL SERVER 2000
Secuencia
Ordenación
Agregado de secuencia
Eliminación de tabla
Inserción de tabla
Exploración de tabla
Cola de tabla
Actualización de tabla
Superior
Instantánea
244
MANUAL SQL SERVER 2000
Si la instrucción es un procedimiento
almacenado o una instrucción Transact-SQL, se
convertirá en la raíz de la estructura en árbol del
plan de ejecución gráfico. El procedimiento
Transact-SQL y procedimientos almacenados almacenado puede contener varios procesos
secundarios que representan las instrucciones a
las que llama el procedimiento almacenado.
Cada proceso secundario es un nodo o rama del
árbol.
245
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:
246
MANUAL SQL SERVER 2000
2. Optimización:
247
MANUAL SQL SERVER 2000
248
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.
249
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
250
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.
251
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.
252
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.
253
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
254
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.
255
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.
256
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.
257
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.
258
MANUAL SQL SERVER 2000
259
MANUAL SQL SERVER 2000
260
MANUAL SQL SERVER 2000
UTILIZANDO EL JOIN
Me ha parecido muy interesante el artículo escrito por Jeff Atwood titulado A Visual
Explanation of SQL Joins.
Pensé que el post de Ligaya Turmelle sobre SQL joins era una genial introducción para
los desarrolladores primerizos. Dado que los SQL joins están basados
fundamentalmente en conjuntos relacionados, el uso de diagramas de Venn para
explicarlo parece lo más acertado. De todas formas, igual que los comentaristas de su
post, opino que sus diagramas de Venn no encajaban con la sintaxis de SQL join en mis
pruebas.
Aún así me encanta el concepto, así que veamos si podemos hacerlo funcionar.
Supongamos que tenemos las dos siguientes tablas. La tabla A está a la izquierda, y la
tabla B está a la derecha. Las rellenaremos con cuatro registros cada una.
Ahora unamos estas dos tablas por el campo nombre de algunas formas distintas, y
veamos si podemos obtener unas representaciones conceptuales con los ingeniosos
diagramas de Venn.
Inner join sólo produce los registros que coinciden en las dos tablas A y B.
3. ON [Link] = [Link]
261
MANUAL SQL SERVER 2000
Full outer join produce el conjunto de todos los registros en las tablas A y B, con
registros coincidentes en ambos lados cuando sea posible. Si no hay coincidencia, el
lado que falta contendrá null.
3. ON [Link] = [Link]
Left outer join produce el conjunto completo de registros de la tabla A, con los
registros coincidentes (si están disponibles) en la tabla B. Si no hay coincidencia, el lado
derecho contendrá null.
3. ON [Link] = [Link]
262
MANUAL SQL SERVER 2000
3. ON [Link] = [Link]
3. ON [Link] = [Link]
5. OR [Link] IS NULL
También hay un cross join, el cuál no puede ser expresado con un diagrama de Venn:
263
MANUAL SQL SERVER 2000
Esto une “todo con todo”, dando como resultado 4 x 4 = 16 filas, muchas más de las que
teníamos en los conjuntos originales. Si haces unos simples cálculos, puedes ver por qué
es un Join muy peligroso de ejecutar en tablas grandes
1. Introducción
El
lenguaje de consulta estructurado (SQL)
es un lenguaje de base de datos normalizado, utilizado por el motor de base
de datos de Microsoft Jet. SQL
se utiliza para crear objetos QueryDef, como el argumento de origen del método
OpenRecordSet y como la propiedad RecordSource del control de datos. También
se puede utilizar con el método Execute para crear y manipular directamente
las bases de datos Jet y crear consultas SQL
de paso a través para manipular bases de datos remotas cliente – servidor.
El
lenguaje SQL está compuesto por comandos, cláusulas, operadores
y funciones de agregado. Estos elementos se combinan en las instrucciones para
crear, actualizar y manipular las bases de datos.
1.2
Comandos
Existen
dos tipos de comandos SQL:
• Los
DLL que permiten crear y definir nuevas bases de datos, campos e índices.
• Los DML que permiten generar consultas para ordenar, filtrar y extraer datos
de la base de datos.
Comandos DLL
Comando Descripción
Utilizado para crear nuevas tablas, campos
CREATE
e índices
DROP Empleado para eliminar tablas e índices
Utilizado para modificar las tablas agregando
ALTER
campos o cambiando la definición de los campos.
Comandos DML
Comando Descripción
SELECT Utilizado
para consultar registros de la base de datos que satisfagan un criterio
264
MANUAL SQL SERVER 2000
determinado
Utilizado
INSERT para cargar lotes de datos en la base de datos en una única
operación.
Utilizado
UPDATE
para modificar los valores de los campos y registros especificados
Utilizado
DELETE
para eliminar registros de una tabla de una base de datos
1.3 Cláusulas
Comando Descripción
Utilizada
FROM
para especificar la tabla de la cual se van a seleccionar los registros
Utilizada
WHERE para especificar las condiciones que deben reunir los registros que
se van a seleccionar
GROUP Utilizada
BY para separar los registros seleccionados en grupos específicos
Utilizada
HAVING
para expresar la condición que debe satisfacer cada grupo
ORDER Utilizada
BY para ordenar los registros seleccionados de acuerdo con un orden específico
1.4 Operadores Lógicos
Operador Uso
Es
AND el “y” lógico. Evalúa dos condiciones y devuelve un
valor de verdad sólo si ambas son ciertas.
Es
OR el “o” lógico. Evalúa dos condiciones y devuelve un
valor de verdad si alguna de las dos es cierta.
Negación
NOT
lógica. Devuelve el valor contrario de la expresión.
1.5
Operadores de Comparación
Operador Uso
Menor
<
que
Mayor
>
que
Distinto
<>
de
Menor
<=
ó Igual que
Mayor
>=
ó Igual que
265
MANUAL SQL SERVER 2000
Utilizado
BETWEEN
para especificar un intervalo de valores.
Utilizado
LIKE
en la comparación de un modelo
Utilizado
In
para especificar registros de una base de datos
1.6 Funciones de Agregado
Las
funciones de agregado se usan dentro de una cláusula SELECT
en grupos de registros para devolver un único valor que se aplica a un
grupo de registros.
Comando Descripción
Utilizada
AVG
para calcular el promedio de los valores de un campo determinado
Utilizada
COUNT
para devolver el número de registros de la selección
Utilizada
SUM
para devolver la suma de todos los valores de un campo determinado
Utilizada
MAX
para devolver el valor más alto de un campo especificado
Utilizada
MIN
para devolver el valor más bajo de un campo especificado
2. Consultas de Selección
266
MANUAL SQL SERVER 2000
Predicado Descripción
Devuelve todos
ALL
los campos de la tabla
Devuelve un determinado número
TOP
de registros de la tabla
Omite los registros cuyos
DISTINCT
campos seleccionados coincidan totalmente
Omite los registros duplicados
DISTINCROW basandose en la totalidad del registro y no sólo en los campos
seleccionados.
ALL:
Si no se incluye ninguno
de los predicados se asume ALL.
El Motor de base de datos selecciona todos los registros que cumplen las condiciones
de la instrucción SQL. No se conveniente abusar de este predicado ya
267
MANUAL SQL SERVER 2000
TOP:
DISTINCT:
Omite
los registros que contienen datos duplicados en los campos seleccionados. Para
que los valores de cada campo listado en la instrucción SELECT se incluyan en la
consulta deben ser únicos.
268
MANUAL SQL SERVER 2000
Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos campos
indicados en la cláusula SELECT
posean un contenido diferente. El resultado de una consulta que utiliza DISTINCT
no es actualizable y no refleja los cambios subsiguientes realizados por otros
usuarios.
DISTINCTROW:
2.4 Alias
269
MANUAL SQL SERVER 2000
En donde c:\databases\[Link] es la
base de datos que contiene la tabla Empleados.
3. Criterios de Selección
3.1
Operadores Lógicos
<expresión1> operador
<expresión2>
En donde expresión1
y expresión2 son las condiciones
a evaluar, el resultado de la operación varía en función
del operador lógico. La tabla adjunta muestra los diferentes posibles
resultados:
270
MANUAL SQL SERVER 2000
El último operador denominado Is se emplea para comparar dos variables de tipo objeto
<Objeto1> Is <Objeto2>. Este operador devuelve verdad
si los dos objetos son iguales.
(campo
[Not] Between valor1 And valor2 (la condición Not es opcional)
271
MANUAL SQL SERVER 2000
Se
utiliza para comparar una expresión de cadena con un modelo en una expresión
SQL. Su sintaxis es:
expresión
Like modelo
El
ejemplo siguiente devuelve los datos que comienzan con la letra P seguido de
cualquier letra entre A y F y de tres dígitos:
Like ‘P[A-F]###’
Este
ejemplo devuelve los campos cuyo contenido empiece con una letra de la A a la
D seguidas de cualquier cadena.
Like ‘[A-D]*’
272
MANUAL SQL SERVER 2000
Tipo Modelo No
Coincide
de coincidencia Planteado Coincide
Varios caracteres ‘a*a’ ‘aa’, ‘aBa’, ‘aBBBa’ ‘aBC’
Carácter especial ’a[*]a’ ‘a*a’ ‘aaa’
Varios caracteres ‘ab*’ ‘abcdefg’, ‘abc’ ‘cab’, ‘aab’
Un solo carácter ‘a?a’ ‘aaa’, ‘a3a’, ‘aBa’ ‘aBBBa’
Un solo dígito ‘a#a’ ‘a0a’, ‘a1a’, ‘a2a’ ‘aaa’, ‘a10a’
Rango de caracteres ‘[a-z]‘ ‘f’, ‘p’, ‘j’ ‘2′, ‘&’
Fuera de un rango ‘[!a-z]‘ ‘9′, ‘&’, ‘%’ ‘b’, ‘a’
Distinto de un dígito ‘[!0-9]‘ ‘A’, ‘a’, ‘&’, ‘~’ ‘0′, ‘1′, ‘9′
Combinada ‘a[!b-m]#’ ‘An9′, ‘az0′, ‘a99′ ‘abc’, ‘aj0′
3.4 El Operador In
expresión
[Not] In(valor1, valor2, . . .)
La cláusula WHERE puede usarse para determinar qué registros de las tablas
enumeradas en
la cláusula FROM aparecerán
en los resultados de la instrucción SELECT.
Después de escribir esta cláusula se deben especificar las condiciones
expuestas en los apartados 3.1 y 3.2. Si no se emplea esta cláusula,
la consulta devolverá todas las filas de la tabla. WHERE es opcional, pero cuando
aparece debe ir a continuación de FROM.
273
MANUAL SQL SERVER 2000
4. Agrupamiento de Registros
4.1 GROUP BY
Se utiliza la cláusula WHERE para excluir aquellas filas que no desea agrupar, y la
cláusula HAVING
para filtrar los registros una vez agrupados.
HAVING
es similar a WHERE, determina
qué registros se seleccionan. Una vez que los registros se han agrupado
utilizando GROUP BY, HAVING
determina cuales de ellos se van a mostrar.
274
MANUAL SQL SERVER 2000
Calcula
la media aritmética de un conjunto de valores contenidos en un campo
especificado de una consulta. Su sintaxis es la siguiente
Avg(expr)
En donde expr representa el campo que contiene los datos numéricos para los que se
desea calcular la media o una expresión que realiza un cálculo
utilizando los datos de dicho campo. La media calculada por Avg es la media aritmética
(la suma de los valores dividido por el número
de valores). La función Avg no incluye ningún campo Null en el cálculo.
Calcula
el número de registros devueltos por una consulta. Su sintaxis es la
siguiente
Count(expr)
En donde expr
contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir
el nombre de un campo de una tabla, una constante o una función
(la cual puede ser intrínseca o definida por el usuario pero no otras
de las funciones agregadas de SQL).
Puede contar cualquier tipo de datos incluso texto.
Aunque expr
puede realizar un cálculo sobre un campo, Count simplemente cuenta el número de
registros sin tener en cuenta qué
valores se almacenan en los registros. La función Count
no cuenta los registros que tienen campos null a menos que expr sea el carácter
comodín asterisco (*).
Si utiliza un asterisco, Count calcula el número total de registros, incluyendo aquellos
que contienen
campos null. Count(*) es considerablemente
más rápida que Count(Campo).
No se debe poner el asterisco entre dobles comillas (’*').
Si expr
identifica a múltiples campos, la función Count cuenta un registro sólo si al menos uno
de los campos no es Null.
275
MANUAL SQL SERVER 2000
Devuelven
el mínimo o el máximo de un conjunto de valores contenidos en
un campo especifico de una consulta. Su sintaxis es:
Min(expr)
Max(expr)
En donde expr es el campo sobre el que se desea realizar el cálculo. Expr pueden
incluir el nombre de un campo de una tabla, una constante o una función
(la cual puede ser intrínseca o definida por el usuario pero no otras
de las funciones agregadas de SQL).
Devuelve
estimaciones de la desviación estándar para la población
(el total de los registros de la tabla) o una muestra de la población
representada (muestra aleatoria) . Su sintaxis es:
StDev(expr)
StDevP(expr)
En donde
expr representa el nombre del campo que contiene los datos que
desean evaluarse o una expresión que realiza un cálculo utilizando
los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un
campo de una tabla, una constante o una función
(la cual puede ser intrínseca o definida por el usuario pero no otras
de las funciones agregadas de SQL)
276
MANUAL SQL SERVER 2000
4.6 Sum
Devuelve
la suma del conjunto de valores contenido en un campo especifico de una consulta.
Su sintaxis es:
SumP(expr)
En donde expr representa el nombre del campo que contiene los datos que desean
sumarse o una
expresión que realiza un cálculo utilizando los datos de dichos
campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla,
una constante o una función
(la cual puede ser intrínseca o definida por el usuario pero no otras
de las funciones agregadas de SQL).
Var(expr)
VarP(expr)
VarP evalúa una población, y Var evalúa una muestra de la población. Expr el nombre
del campo que
contiene los datos que desean evaluarse o una expresión que realiza un
cálculo utilizando los datos de dichos campos. Los operandos de expr
pueden incluir el nombre de un campo de una tabla, una constante o una función
(la cual puede ser intrínseca o definida por el usuario pero no otras
de las funciones agregadas de SQL)
277
MANUAL SQL SERVER 2000
5.1 DELETE
5.2.1
Para insertar un único Registro:
278
MANUAL SQL SERVER 2000
campoN)
VALUES (valor1, valor2, ..., valorN)
5.2.2
Para insertar Registros de otra Tabla:
Se puede utilizar la instrucción INSERT INTO para agregar un registro único a una
tabla, utilizando la sintaxis de la consulta de adición
de registro único tal y como se mostró anteriormente. En este
caso, su código específica el nombre y el valor de cada campo
del registro. Debe especificar cada uno de los campos del registro al que se
le va a asignar un valor así como el valor para dicho campo. Cuando no
se especifica dicho campo, se inserta el valor predeterminado o Null.
Los registros se agregan al final de la tabla.
279
MANUAL SQL SERVER 2000
La
tabla destino u origen puede especificar una tabla o una consulta.
280
MANUAL SQL SERVER 2000
6. Tipos de Datos
Tipo
Longitud Descripción
de Datos
Para consultas sobre tabla adjunta de productos
BINARY 1 byte de bases de datos que definen un tipo de datos
Binario.
BIT 1 byte Valores Si/No ó True/False
BYTE 1 byte Un valor entero entre 0 y 255.
Un número incrementado automáticamente
COUNTER 4 bytes
(de tipo Long)
Un entero escalable entre [Link].477,5808
CURRENCY 8 bytes
y [Link].477,5807.
Un valor de fecha u hora entre los años
DATETIME 8 bytes
100 y 9999.
Un valor en punto flotante de precisión
simple con un rango de -3.402823*1038 a
-1.401298*10-45
SINGLE 4 bytes
para valores negativos, 1.401298*10-45 a
3.402823*1038
para valores positivos, y 0.
281
MANUAL SQL SERVER 2000
En donde:
instrucción
sql : Es una instrucción
SELECT, que sigue el mismo formato y reglas que cualquier otra
instrucción SELECT. Debe
ir entre paréntesis.
282
MANUAL SQL SERVER 2000
283
MANUAL SQL SERVER 2000
Selecciona el nombre de
todos los empleados que han reservado al menos un pedido.
Recupera el Código
del Producto y la Cantidad pedida de la tabla pedidos, extrayendo el nombre
del producto de la tabla de productos.
284
MANUAL SQL SERVER 2000
Una consulta
de referencias cruzadas es aquella que nos permite visualizar los datos en filas
y en columnas, estilo tabla, por ejemplo:
Si tenemos
una tabla de productos y otra tabla de pedidos, podemos visualizar en total
de productos pedidos por año para un artículo determinado, tal
y como se visualiza en la tabla anterior.
En donde:
función
agregada: Es una función SQL
agregada que opera sobre los datos seleccionados.
instrucción
select: Es una instrucción SELECT.
campo pivot:
Es el campo o expresión que desea utilizar para crear las cabeceras de
la columna en el resultado de la consulta.
valor1,
valor2: Son valores fijos utilizados para crear las cabeceras
de la columna.
Para resumir
datos utilizando una consulta de referencia cruzada, se seleccionan los valores
de los campos o expresiones especificadas como cabeceras de columnas de tal
forma que pueden verse los datos en un formato más compacto que con una
consulta de selección.
285
MANUAL SQL SERVER 2000
También
puede incluir valores fijos, para los que no existen datos, para crear columnas
adicionales.
Ejemplos:
Un caso
práctico:
286
MANUAL SQL SERVER 2000
Estructura
y datos de las tablas:
1. Artículos:
ID Nombre
1 Zapatos
2 Pantalones
3 Blusas
2. Pedidos:
Id Fecha Cantidad
1 11/11/1996 250
2 11/11/1996 125
11/11/1996 520
1 12/10/1996 50
2 04/05/1996 250
05/08/1996 100
1 01/01/1997 40
2 02/08/1997 60
05/10/1997 70
1 12/12/1997 8
2 15/12/1997 520
17/10/1997 1250
Comentarios
a la consulta:
La cláusula TRANSFORM
indica el valor que deseamos visualizar en las columnas que realmente pertenecen
a la consulta, en este caso 1996
y 1997, puesto que las demás
columnas son opcionales.
287
MANUAL SQL SERVER 2000
SELECT
especifica el nombre de las columnas opcionales que deseamos visualizar, en
este caso Producto, Código, Total y Media,
indicando el nombre del campo que deseamos mostrar en cada columna o el valor
de la misma. Si incluimos una función de cálculo el resultado
se hará en base a los datos de la fila actual y no al total de los datos.
FROM especifica el origen de los datos. La primera tabla que debe figurar es aquella
de donde deseamos extraer los datos, esta tabla debe contener al menos tres
campos, uno para los títulos de la fila, otros para los títulos
de la columna y otro para calcular el valor de las celdas.
La cláusula GROUP
BY especifica el agrupamiento de los registros, contrariamente
a los manuales de instrucción esta cláusula no es opcional ya
que debe figurar siempre y debemos agrupar los registros por el campo del cual
extraemos la información. En este caso existen dos campos del cual extraemos
la información: [Link] y artí[Link], por ellos
agrupamos por los campos.
Otras posibilidades
de fecha de la cláusula pivot son las siguientes:
1. Para
agrupamiento por Trimestres
2. Para
agrupamiento por meses (sin tener en cuenta el año)
288
MANUAL SQL SERVER 2000
Las vinculaciones entre tablas se realizan mediante la cláusula INNER que combina
registros de dos tablas siempre
que haya concordancia de valores en un campo común. Su sintaxis es:
En donde:
tb1, tb2:
Son los nombres de las tablas desde las que se combinan los registros.
campo1,
campo2: Son los nombres de los campos que se combinan. Si no
son numéricos, los campos deben ser del mismo tipo de datos y contener
el mismo tipo de datos, pero no tienen que tener el mismo nombre.
comp: Es
cualquier operador de comparación relacional
: =, <, >, <=, >=, o <>.
Se puede utilizar una operación INNER JOIN en cualquier cláusula FROM. Esto crea
una combinación
por equivalencia, conocida también como unión interna. Las combinaciones
Equi son las más comunes; éstas combinan los registros de dos
tablas siempre que haya concordancia de valores en un campo común a ambas
tablas. Se puede utilizar INNER JOIN
con las tablas Departamentos y Empleados para seleccionar todos los
empleados de cada departamento. Por el contrario, para seleccionar todos los
departamentos (incluso si alguno de ellos no tiene ningún empleado asignado)
se emplea LEFT JOIN o todos los
empleados (incluso si alguno no está asignado
a ningún departamento), en este caso RIGHT
JOIN.
289
MANUAL SQL SERVER 2000
SELECT campos
FROM tabla1 INNER JOIN tabla2
ON tb1.campo1 comp tb2.campo1 AND
ON tb1.campo2 comp tb2.campo2) OR
ON tb1.campo3 comp tb2.campo3)];
SELECT campos
FROM tb1 INNER JOIN
(tb2 INNER JOIN [( ]tb3
[INNER JOIN [( ]tablax [INNER JOIN ...)]
ON tb3.campo3 comp [Link])]
ON tb2.campo2 comp tb3.campo3)
ON tb1.campo1 comp tb2.campo2;
Un LEFT
JOIN o un RIGHT JOIN
puede anidarse dentro de un INNER JOIN,
pero un INNER JOIN no puede anidarse
dentro de un LEFT JOIN o un RIGHT
JOIN.
Ejemplo:
290
MANUAL SQL SERVER 2000
Se utiliza la operación UNION para crear una consulta de unión, combinando los
resultados de dos o
más consultas o tablas independientes. Su sintaxis es:
En donde:
consulta1,
consulta2, consultan: Son instrucciones SELECT,
el nombre de una consulta almacenada o el nombre de una tabla almacenada precedido
por la palabra clave TABLE.
Se puede utilizar una cláusula GROUP BY y/o HAVING en cada argumento consulta
para agrupar los datos devueltos. Puede utilizar
291
MANUAL SQL SERVER 2000
En donde:
Parte Descripción
292
MANUAL SQL SERVER 2000
293
MANUAL SQL SERVER 2000
Parte Descripción
Es el nombre del índice que se va a
nombre
crear.
Es el nombre del campo o de los campos que
primarioN
forman el índice primario.
Es el nombre del campo o de los campos que
unicoN
forman el índice de clave única.
Es el nombre del campo o de los campos que
refN forman el índice externo (hacen referencia a campos de otra
tabla).
Es el nombre de la tabla que contiene el campo
tabla externa
o los campos referenciados en refN
Es el nombre del campo o de los campos de la
campos externos
tabla externa especificados por ref1, ref2, …, refN
294
MANUAL SQL SERVER 2000
En donde:
Parte Descripción
índice Es el nombre del índice a crear.
Es el nombre de una tabla existente en la que
tabla
se creará el índice.
Es el nombre del campo o lista de campos que
campo
constituyen el índice.
Indica el orden de los valores de los campos
ASC indica un orden ascendente (valor predeterminado) y DESC
ASC|DESC
un orden
descendente.
Indica que el índice no puede contener
UNIQUE
valores duplicados.
DISALLOW
Prohíbe valores nulos en el índice
NULL
295
MANUAL SQL SERVER 2000
En donde:
Parte Descripción
tabla Es el nombre de la tabla que se desea modificar.
Es el nombre del campo que se va a añadir
campo
o eliminar.
296
MANUAL SQL SERVER 2000
297
MANUAL SQL SERVER 2000
Parte Descripción
Es el nombre
nombre
del parámetro
Es el tipo de
tipo
datos del parámetro
Una consulta
consulta
SQL
Ejemplo:
298
MANUAL SQL SERVER 2000
En donde
[Link] es el nombre de una base de datos de Microsoft
Access que contiene la tabla Clientes.
299
MANUAL SQL SERVER 2000
Para recuperar datos de una tabla de Paradox versión 3.x, hay que sustituir
‘Paradox 4.x;’ por ‘Paradox 3.x;’.
Esta opción requiere que esté declarado el acceso al fichero de grupo de trabajo
(generalmente [Link]
ó system .mdw) de la base
de datos actual.
En donde:
Parte Descripción
Es el nombre con se guardará la consulta
NombreConsulta
en la base de datos.
Es el nombre de parámetro o de los parámetros
Parámetro
de dicha consulta.
tipo Es el tipo de datos del parámetro
ConsultaSQL Es la consulta que se desea grabar y ejecutar.
PROCEDURE Lista_Categorias; SELECT DISTINCTROW
Nombre_Categoria,
300
MANUAL SQL SERVER 2000
16 ANEXOS
16.1 Resolución
de Problemas
16.1.1 Buscar
Información duplicada en un campo de una tabla.
301
MANUAL SQL SERVER 2000
16.2 Utlizar
SQL desde Visual Basic
Si la consulta de selección se
encuentra almacenada en una consulta de la base de datos:
Set RS=[Link]("MiConsulta")
302
MANUAL SQL SERVER 2000
DatePart
Valor Descripción
yyyy Año
q Trimestre
m Mes
Día del
y
año
Día del
d
mes
Día de
w
la semana
ww Semana del año
h Hora
m Minutos
s Segundos
Valor Descripción
Utiliza el valor
0
pode efecto del sistema
Domingo (Valor
1
predeterminado)
2 Lunes
3 Martes
4 Miércoles
5 Jueves
6 Viernes
303
MANUAL SQL SERVER 2000
7 Sábado
ComienzoAño indica cual es la primera semana del año; los posibles valores son:
Valor Descripción
0 Valor del sistema
Comienza el año
1
el 1 de enero (valor predeterminado).
Empieza con la
2
semana que tenga al memos cuatro días en el nuevo año.
Empieza con la
3
semana que esté contenida completamente en el nuevo año.
16.4 Evaluar valores antes de ejecutar la Consuta.
iif(Expresion,Valor1,Valor2)
En donde Expresión es
la sentencia que evaluamos; si Expresión es verdadera entonces
se devuelve Valor1, si Expresión es falsa se devuelve
Valor2.
304
MANUAL SQL SERVER 2000
305