Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. Nueva consulta
2. Consulta de motor
Base de datos
3. Consulta MDX
Analysis Services
4. Consulta DMX
Analysis Services
5. Consulta MXLA
Analysis Services
de
de
de
de
7. Abrir archivo
8. Guardar
9. Guardar todo
11. Resumen
12. Explorador
Objetos
13. Explorador
Plantillas
14.
Ventana
Propiedades
10.
Servidores
registrados
de
de
de
Archivos
de
datos
secundarios
Los archivos de datos secundarios son todos los archivos de datos menos el
archivo de datos principal. Puede que algunas bases de datos no tengan
archivos de datos secundarios, mientras que otras pueden tener varios
archivos de datos secundarios. La extensin de nombre de archivo
recomendada para los archivos de datos secundarios es .ndf.
Adems los archivos de datos se pueden agrupar en grupos de archivos.
Para cada base de datos pueden especificarse hasta 32.767 archivos y
32.767 grupos de archivos.
Archivos
de
registro
Los archivos de registro (archivos de log) almacenan toda la informacin de
registro que se utiliza para recuperar la base de datos, el tambin
denominado registro de transacciones. Como mnimo, tiene que haber un
archivo de registro por cada base de datos, aunque puede haber varios. La
extensin recomendada para los nombres de archivos de registro es .ldf.
Para crear una nueva tabla primero nos tenemos que posicionar en la
base de datos donde queremos que se almacene la tabla, desplegar el
men contextual y seleccionar la opcin Nueva tabla.
Algunos tipos no necesitan ms, como por ejemplo el tipo entero (int), y
otros se pueden completar con una longitud, como los tipos
alfanumricos:
En la mayora de los
sistemas gestores de bases de datos tenemos un tipo de datos de tipo
contador, autonumrico, autoincremental, etc. Este tipo hace que el propio
sistema es el encargado de rellenar el campo con un valor que va
incrementando conforme se crean ms filas de datos en la tabla.
Las columnas de este tipo se utilizan normalmente para numerar las
filas de la tabla, como no habrn dos filas con el mismo valor (el sistema
se encarga de incrementar el valor cada vez que se crea una nueva fila),
estos campos se suelen utilizar como claves primarias.
En SQL Server 2005 no existe el tipo de datos Contador pero se
consigue el mismo funcionamiento asignando a la columna un tipo de
datos numrico y definiendo la columna como columna de identidad.
En las propiedades de la columna marcamos S en la propiedad
(Identidad) y a continuacin podemos indicar en qu valor queremos que
empiece el contador (Inicializacin de identidad) y en cunto incrementar
cada vez que se cree un nuevo registro (Incremento de identidad).
Aunque este tipo de columnas se utiliza frecuentemente como clave
primaria, SQL Server no le asigna automticamente esta funcin, la
tenemos que definir nosotros mismos, pero s fuerza a que sea una
columna sin valores nulos. No se puede definir ms de una columna de
identidad por tabla.
nos indica que la fila se ha modificado y tiene nuevos datos por guardar.
Al salir de la fila sta se guardar automticamente a no ser que el nuevo
valor infrinja alguna regla de integridad. Si queremos salir de la fila sin
guardar los cambios, tenemos que cancelar la actualizacin pulsando la
tecla ESC.
Eliminar.
En cualquiera de los dos casos nos aparece un mensaje de
confirmacin.
De esta forma hemos definido una relacin entre las tablas Facturas y
Clientes. Para ver las relaciones existentes entre las diferentes tablas
tenemos los diagramas.
Primero debemos definir el diagrama, para ello seleccionamos la opcin
correspondiente:
Hemos aprendido hasta ahora lo bsico para poder crear una base de
datos y rellenarla con tablas relacionadas entre s y con datos, ahora
veamos cmo recuperar esos datos.
Para ello debemos abrir la zona de trabajo de tipo Query, abriendo una
nueva consulta, seleccionando previamente el servidor y pulsando el
botn
de la barra de botones o si queremos realizar la
consulta sobre un servidor con el cual todava no hemos establecido
conexin, seleccionando de la barra de mens la opcin Nuevo >
Consulta de motor de base de datos:
datos por defecto, esto lo podemos hacer cambiando la base de datos por
defecto en el id de sesin.
Para ello, cuando vamos a conectar con el servidor:
Categora
Rojo
Cadena de caracteres
Verde oscuro
Comentario
Comando SQLCMD
Fucsia
Verde
Azul
Palabra clave
Verde azulado
Rojo oscuro
Gris oscuro
Operadores
Las consultas que hemos visto hasta ahora son trozos de cdigo SQL
que podemos guardar en un archivo de texto y abrir y ejecutar cuando
queramos, pero si queremos que nuestra consulta de recuperacin de
datos se guarde en la propia base de datos y se comporte como una tabla
(algo parecido a una consulta almacenada de Access), la tenemos que
definir como una vista. Esta vista tiene la ventaja entre otras de poder ser
utilizada como si fuese una tabla en otras consultas. Realmente al
ejecutarla obtenemos una tabla lgica almacenada en memoria y lo que
se guarda en la base de datos es su definicin, la instruccin SQL que
permite recuperar los datos.
En cada fila de la rejilla se define una columna del resultado o una columna
que se utiliza para obtener el resultado.
En Columna tenemos el nombre de la columna de la se obtienen los datos o
la expresin cuando se trata de una columna calculada.
En Alias escribimos el nombre que tendr la columna en la vista, tambin
corresponde con el encabezado de la columna en la rejilla de resultado. Si
se deja el campo en blanco, por defecto se asume el mismo nombre que hay
en Columna.
En Tabla tenemos el nombre de la tabla del origen de la consulta a la que
pertenece la Columna, por ejemplo la primera columna del resultado se saca
de la columna Codigo de la tabla LIBROS y se llamar CodLibro. La cuarta
columna de la vista coger sus datos de la columna Usuario de la tabla
Prestamos y se llamar Usuario (Alias se ha dejado en blanco por lo que
asume el nombre que hay en Columna.
En la columna Resultados indicamos si queremos que la columna se
visualice o no, las columnas con la casilla marcada se visualizan.
Las columnas Criterio de ordenacin y Tipo de orden permiten ordenar las
filas del resultado segn una o ms columnas. Se ordena por las columnas
que tienen algo en Tipo de orden y cuando se ordena por varias columnas
Criterio de ordenacin indica que primero se ordena por la columna que
lleva el n 1 y despus por la columna que lleva el n 2 y as sucesivamente.
En el ejemplo las filas del resultado se ordenarn primero por cdigo de libro
y despus por cdigo de prstamo, todas las filas dentro del mismo libro se
ordenarn por cdigo de prstamo.
TAMAO
Codigo
Numrico
Byte
Nombre
Texto
60
Editorial
Texto
25
Autor
Texto
25
Genero
Texto
20
PaisAutor
Texto
20
Paginas
Numrico
Entero
AnyEdicion
Fecha/Hora
Fecha mediana
Precio
Moneda
Dias
Numrico
Entero
Tabla Prstamos
NOMBRE CAMPO
TIPO DE DATOS
TAMAO
Codigo
Autonumrico
Libro
Numrico
Byte
Usuario
Numrico
Byte
FSalida
Fecha/Hora
Fecha mediana
FMaxima
Fecha/Hora
Fecha mediana
FDevol
Fecha/Hora
Fecha mediana
TIPO DE DATOS
TAMAO
Tabla Usuarios
NOMBRE CAMPO
Codigo
Autonumrico
Nombre
Texto
15
Apellidos
Texto
25
DNI
Texto
12
Domicilio
Texto
50
Poblacion
Texto
30
Provincia
Texto
20
FNacim
Fecha/Hora
Fecha mediana
Maximo_permitido
Numrico
Entero
Claves ajenas
Valores no nulos (supondremos que una columna no admite nulos si en los
datos sumnistrados no hay ningn nulo en esa columna).
Resultado:
Nume Nombre Eda Ofici
mp
d
na
Titulo
101
Antonio
Viguer
4
5
12
represen
tante
198610-20
00:00:0
0.000
10
4
3000
0,00
3050
0,00
102
Alvaro
Jaume
s
4
8
21
represen
tante
198612-10
00:00:0
0.000
10
8
3500
0,00
4740
0,00
103
Juan
Rovira
2
9
12
represen
tante
198703-01
00:00:0
0.000
10
4
2750
0,00
2860
0,00
104
Jos
Gonzl
ez
3
3
12
dir
ventas
198705-19
00:00:0
0.000
10
6
2000
0,00
1430
0,00
105
Vicente
Pantall
a
3
7
13
represen
tante
198802-12
00:00:0
10
4
3500
0,00
3680
0,00
0.000
106
Luis
Antonio
5
2
11
director
general
198806-14
00:00:0
0.000
NU
LL
2750
0,00
2990
0,00
107
Jorge
Gutirr
ez
4
9
22
represen
tante
198811-14
00:00:0
0.000
10
8
3000
0,00
1860
0,00
108
Ana
Bustam
ante
6
2
21
dir
ventas
198910-12
00:00:0
0.000
10
6
3500
0,00
3610
0,00
109
Mara
Sunta
3
1
NU
LL
represen
tante
199910-12
00:00:0
0.000
10
6
3000,
00
3920
0,00
110
Juan
Victor
4
1
NU
LL
represen
tante
199001-13
00:00:0
0.000
10
4
NULL
7600,
00
111
Juan
Gris
5
0
NU
LL
represen
tante
200505-01
00:00:0
0.000
NU
LL
1000
0,00
6000
0,00
112
Julin
Martore
ll
5
0
NU
LL
represen
tante
200605-01
00:00:0
0.000
NU
LL
1000
0,00
9100
0,00
113
Juan
Gris
1
8
NU
LL
represen
tante
200701-01
00:00:0
0.000
NU
LL
1000
0,00
0,00
Resultado:
Regin
Ciudad
Ventas
NULL
Elx
0,00
NULL
Valencia
NULL
centro
Aranjuez
15000,00
Centro
Mstoles
0,00
centro
Madrid
NULL
este
Alicante
73500,00
este
Valencia
69300,00
este
Castellon
36800,00
este
Valencia
2100,00
este
Valencia
0,00
norte
Pamplona
200000,00
norte
pamplona
NULL
oeste
Badajoz
84400,00
oeste
A Corua
18600,00
Resultado:
Idfab Idproducto Descripcin Precio existencias
rei
2a44l
bomba l
45,00
12
rei
2a44r
bomba r
45,00
12
imm
779c
reostato 3
18,75
imm
775c
reostato 2
14,25
imm
773c
reostato
9,75
28
bic
41003
manivela
6,52
imm
887x
manivela
4,75
32
qsa
xk47
red
3,55
38
rei
2a44g
pas
3,50
14
fea
114
cubo
2,43
15
bic
41089
rodamiento
2,25
78
bic
41672
plato
1,80
fea
112
cubo
1,48
115
qsa
xk48a
red
1,48
37
Resultado:
Numemp
Nombre
Ventas
cuota
104
Jos Gonzlez
14300,00
20000,00
107
Jorge Gutirrez
18600,00
30000,00
Resultado:
Numemp
101
nombre
Antonio Viguer
3.
102
Alvaro Jaumes
103
Juan Rovira
105
Vicente Pantalla
106
Luis Antonio
107
Jorge Gutirrez
110
Juan Victor
111
Juan Gris
112
Julin Martorell
113
Juan Gris
Resultado:
Jefe Numemp
nombre
104
101
Antonio Viguer
104
103
Juan Rovira
104
110
Juan Victor
104
105
Vicente Pantalla
106
108
Ana Bustamante
106
104
Jos Gonzlez
106
109
Mara Sunta
108
102
Alvaro Jaumes
108
107
Jorge Gutirrez
FROM empleados
WHERE ventas < cuota AND ventas >0;
Para hallar los empleados que no estn a cargo del empleado 106.
SELECT numemp, nombre
FROM empleados
WHERE jefe <> 106 OR jefe IS NULL;
Si no aadimos la segunda parte de la pregunta (OR jefe IS NULL) los
empleados que no tienen jefe no salen.
Para listar de cada jefe su cdigo y el cdigo y nombre de sus
subordinados ordenados por nombres.
SELECT jefe, numemp, nombre
FROM empleados
WHERE jefe IS NOT NULL
ORDER BY jefe, nombre;
Resultado:
Codi Numpe Fechape Clie Re Fab Produ Ca Impo Prec descrip
go
dido
dido
p
cto nt rte
io
cion
1
11003
6
198910-12
00:00:0
0.000
21
07
1
1
0
ac
i
410
0z
22,
50
NU
LL
mont
11003
7
198910-12
00:00:0
0.000
21
17
1
0
6
rei
2a4
4l
31,
50
45,
00
bomb
al
11296
3
200805-10
00:00:0
0.000
21
03
1
0
5
ac
i
410
04
2
8
3,2
76
NU
LL
art t4
11296
8
199001-11
00:00:0
0.000
21
02
1
0
1
ac
i
410
04
3
4
39,
78
NU
LL
art t4
11297
5
200802-11
00:00:0
0.000
21
11
1
0
3
rei
2a4
4g
21,
00
3,5
0
pas
11297
9
198910-12
00:00:0
0.000
21
14
1
0
8
ac
i
410
0z
150
,00
NU
LL
mont
11298
3
200805-10
00:00:0
0.000
21
03
1
0
5
ac
i
410
04
7,0
2
NU
LL
art t4
11298
7
200801-01
00:00:0
0.000
21
03
1
0
5
ac
i
410
0y
1
1
275
,00
NU
LL
extrac
tor
11298
9
200812-10
00:00:0
0.000
21
01
1
0
6
fe
a
114
14,
58
2,4
3
cubo
10
11299
2
199004-15
00:00:0
0.000
21
18
1
0
8
ac
i
410
02
1
0
7,6
0
NU
LL
bisagr
a
11
11299
3
200803-10
00:00:0
21
06
1
0
rei
2a4
5c
2
4
18,
96
0,7
9
junta
0.000
12
11299
7
200804-04
00:00:0
0.000
21
24
1
0
7
bi
c
410
03
6,5
2
6,5
2
maniv
ela
13
11300
3
200802-05
00:00:0
0.000
21
08
1
0
9
im
m
779c
56,
25
18,
75
reosta
to 3
14
11300
7
200801-01
00:00:0
0.000
21
12
1
0
8
im
m
773c
29,
25
9,7
5
reosta
to
15
11301
2
200805-05
00:00:0
0.000
21
11
1
0
5
ac
i
410
03
3
5
37,
45
NU
LL
art t3
16
11301
3
200812-28
00:00:0
0.000
21
18
1
0
8
bi
c
410
03
6,5
2
6,5
2
maniv
ela
17
11302
4
200807-04
00:00:0
0.000
21
14
1
0
8
qs
a
xk47
2
0
71,
00
3,5
5
red
18
11302
7
200802-05
00:00:0
0.000
21
03
1
0
5
ac
i
410
02
5
4
450
,00
NU
LL
bisagr
a
19
11303
4
200811-05
00:00:0
0.000
21
07
1
1
0
rei
2a4
5c
6,3
2
0,7
9
junta
20
11304
2
200801-01
00:00:0
0.000
21
13
1
0
1
rei
2a4
4r
225
,00
45,
00
bomb
ar
21
11304
5
200807-02
00:00:0
0.000
21
12
1
1
0
rei
2a4
4r
1
0
450
,00
45,
00
bomb
ar
22
11304
8
200802-02
00:00:0
0.000
21
20
1
0
2
im
m
779c
37,
50
18,
75
reosta
to 3
23
11304
9
200804-04
00:00:0
0.000
21
18
1
0
8
qs
a
xk47
7,7
6
3,5
5
red
24
11305
1
200807-06
00:00:0
0.000
21
18
1
0
8
qs
a
xk47
14,
20
3,5
5
red
25
11305
5
200904-01
00:00:0
0.000
21
08
1
0
1
ac
i
410
0x
1,5
0
NU
LL
junta
26
11305
7
200811-01
00:00:0
0.000
21
11
1
0
3
ac
i
410
0x
2
4
NU
LL
NU
LL
junta
27
11305
8
198907-04
00:00:0
0.000
21
08
1
0
9
fe
a
112
1
0
14,
80
1,4
8
cubo
28
11306
2
200807-04
00:00:0
0.000
21
24
1
0
7
bi
c
410
03
1
0
24,
30
6,5
2
maniv
ela
29
11306
5
200806-03
00:00:0
0.000
21
06
1
0
2
qs
a
xk47
21,
30
3,5
5
red
30
11306
9
200808-01
00:00:0
21
09
1
0
im
m
773c
2
2
313
,50
9,7
5
reosta
to
0.000
Resultado:
Numped Fechape Clie Rep Fab Produ Ca Preci Client vended
ido
dido
cto
nt
o
e
or
11298
7
01/01/0
8
21
03
10
5
aci
4100
y
1
1
275,
00
Jaim
e
Llore
ns
Vicent
e
Pantal
la
11302
7
05/02/0
8
21
03
10
5
aci
4100
2
5
4
450,
00
Jaim
e
Llore
ns
Vicent
e
Pantal
la
11304
5
02/07/0
8
21
12
11
0
rei
2a44
r
1
0
450,
00
Mar
a
Silva
Juan
Victor
11306
9
01/08/0
8
21
09
10
7
im
m
773c
2
2
313,
50
Alber
to
Juan
es
Jorge
Gutir
rez
3. Listar los pedidos superiores a 250 euros, mostrando el nombre del cliente
que solicit el pedido y el nombre del vendedor asignado a ese cliente.
Resultado:
Codi Numpe Fechape Clie Re Fab Produ Ca Impo Clien Vended
go
dido
dido
p
cto nt rte
te
or
asignad
o
8
1129
87
200801-01
00:00:0
0.000
21
03
1
0
5
ac
i
410
0y
1
1
275
,00
Jai
me
Llor
ens
Juan
Victor
18
1130
27
200802-05
00:00:0
0.000
21
03
1
0
5
ac
i
410
02
5
4
450
,00
Jai
me
Llor
ens
Juan
Victor
21
1130
45
200807-02
00:00:0
0.000
21
12
1
1
0
rei
2a4
4r
1
0
450
,00
Mar
a
Silv
a
Ana
Busta
mante
30
1130
69
200808-01
00:00:0
0.000
21
09
1
0
7
im
m
773
c
2
2
313
,50
Alb
erto
Jua
nes
Juan
Rovira
Resultado:
Numpedido Clie
Rep
Cliente
Repclie
Vendedor
asignado
ciudad
112987
2103
105
Jaime
Llorens
105
Juan Victor
NULL
113027
2103
105
Jaime
Llorens
105
Juan Victor
NULL
113045
2112
110
Mara
Silva
110
Ana
Bustamante
Badajoz
113069
2109
107
Alberto
Juanes
107
Juan Rovira
Alicante
5. Hallar los pedidos recibidos los das en que un nuevo empleado fue
contratado.
Resultado:
Numpedid Fechapedido Rep Numem
o
p
Nombre
Contrato
110036
1989-10-12
00:00:00.00
0
11
0
108
Ana
Bustamant
e
1989-10-12
00:00:00.00
0
110037
1989-10-12
00:00:00.00
0
10
6
108
Ana
Bustamant
e
1989-10-12
00:00:00.00
0
112979
1989-10-12
00:00:00.00
0
10
8
108
Ana
Bustamant
e
1989-10-12
00:00:00.00
0
Resultado:
Numem
p
108
Nombre
Contrato
Ana
Bustamant
e
1989-10-12
00:00:00.00
0
10
8
1989-10-12
00:00:00.00
0
Resultado:
Numemp
Nombre
ventas
Oficina
ciudad
101
Antonio Viguer
30500,00
12
Alicante
102
Alvaro Jaumes
47400,00
21
Badajoz
103
Juan Rovira
28600,00
12
Alicante
104
Jos Gonzlez
14300,00
12
Alicante
105
Vicente Pantalla
36800,00
13
Castellon
106
Luis Antonio
29900,00
11
Valencia
107
Jorge Gutirrez
18600,00
22
A Corua
108
Ana Bustamante
36100,00
21
Badajoz
109
Mara Sunta
39200,00
NULL
NULL
110
Juan Victor
7600,00
NULL
NULL
111
Juan Gris
60000,00
NULL
NULL
112
Julin Martorell
91000,00
NULL
NULL
113
Juan Gris
0,00
NULL
NULL
Resultado:
Numemp
Nombre
Cuota
Jefe
101
Antonio Viguer
30000,00
104
Jos
Gonzlez
20000,00
103
Juan Rovira
27500,00
104
Jos
Gonzlez
20000,00
105
Vicente
Pantalla
35000,00
104
Jos
Gonzlez
20000,00
108
Ana
Bustamante
35000,00
106
Luis Antonio
27500,00
Resultado:
Numemp
Nombre
Cuota
Jefe
101
Antonio Viguer
30000,00
104
Jos
Gonzlez
20000,00
103
Juan Rovira
27500,00
104
Jos
Gonzlez
20000,00
105
Vicente
Pantalla
35000,00
104
Jos
Gonzlez
20000,00
108
Ana
Bustamante
35000,00
106
Luis Antonio
27500,00
111
Juan Gris
10000,00
110
Juan Victor
NULL
10. Listar los empleados que no estn asignados a la misma oficina que su jefe,
queremos nmero, nombre y nmero de oficina tanto del empleado como de
su jefe.
Resultado:
Numemp
Nombre
Oficina Jefe
Nombre jefe
Oficina
jefe
104
Jos Gonzlez
12
106
Luis Antonio
11
105
Vicente Pantalla
13
104
Jos Gonzlez
12
107
Jorge Gutirrez
22
108
Ana
Bustamante
21
108
Ana
Bustamante
21
106
Luis Antonio
11
11. En el punto anterior no salen los que no tienen oficina, cambiar la sentencia
para que aparezcan.
Resultado:
Numemp
Nombre
Oficina Jefe
Nombre jefe
Oficina
jefe
104
Jos Gonzlez
12
106
Luis Antonio
11
105
Vicente Pantalla
13
104
Jos Gonzlez
12
107
Jorge Gutirrez
22
108
Ana
Bustamante
21
108
Ana
Bustamante
21
106
Luis Antonio
11
109
Mara Sunta
NULL
106
Luis Antonio
11
110
Juan Victor
NULL
104
Jos Gonzlez
12
111
Juan Gris
21
110
Juan Victor
NULL
12. Lo mismo que la anterior pero queremos que aparezca tambin la ciudad de
las oficinas (tanto del empleado como de su jefe).
Resultado:
Numem
p
Nombre
Nombre
jefe
Oficin ciudad
a jefe
104
Jos
Gonzlez
12
Alicant
e
10
6
Luis
Antonio
11
Valenc
ia
105
Vicente
Pantalla
13
Castell
on
10
4
Jos
Gonzlez
12
Alicant
e
107
Jorge
Gutirrez
22
A
Corua
10
8
Ana
Bustaman
te
21
Badajo
z
108
Ana
Bustaman
te
21
Badajo
z
10
6
Luis
Antonio
11
Valenc
ia
109
Mara
Sunta
NUL
L
NULL
10
6
Luis
Antonio
11
Valenc
ia
110
Juan
Victor
NUL
L
NULL
10
4
Jos
Gonzlez
12
Alicant
e
111
Juan Gris
21
Badajo
z
11
0
Juan
Victor
NUL
L
NULL
fab =
INNER
JOIN
clientes
ON
rep =
clie
numclie
WHERE importe >
250;
7. Listar los pedidos superiores a 250 euros, mostrando el nombre del cliente
que solicit el pedido y el nombre del vendedor asignado a ese cliente.
INNER
JOIN
clie =
empleados
ON
250;
11. Listar los pedidos superiores a 250 euros, mostrando adems el nombre del
cliente que solicit el pedido y el nombre del vendedor asignado a ese
cliente y la ciudad de la oficina donde el vendedor trabaja.
12.
SELECT
numpedido,
clie,
clientes.nombre
AS
cliente,
empleados.nombre AS vendedor, ciudad
13.
FROM ((pedidos
clie = numclie)
INNER
14.
repclie = numemp)
INNER
JOIN
JOIN
15.
LEFT
JOIN
empleados.oficina=oficinas.oficina
rep,
repclie,
clientes
ON
empleados
ON
oficinas
ON
250;
16. Hallar los pedidos recibidos los das en que un nuevo empleado fue
contratado.
17.
SELECT
numpedido,
numemp, nombre, contrato
18.
fechapedido,
rep,
WHERE fechapedido=contrato;
19. Hallar los empleados que realizaron su primer pedido el mismo da que
fueron contratados.
20.
SELECT
numemp,
nombre,
numpedido, rep, fechapedido
contrato,
21.
FROM pedidos INNER JOIN empleados ON
= numemp
rep
23.
SELECT
numemp,
nombre,empleados.ventas,empleados.oficina,ciudad
FROM
empleados
LEFT
JOIN
oficinas
empleados.oficina=oficinas.oficina;
ON
24. Listar los empleados con una cuota superior a la de su jefe, los campos a
obtener son el nmero, nombre y cuota del empleado y nmero, nombre y
cuota de su jefe.
25.
SELECT empleados.numemp, empleados.nombre,
empleados.cuota, empleados.jefe, jefes.nombre AS
[Nombre jefe], jefes.cuota AS [Cuota jefe]
FROM empleados LEFT JOIN empleados
empleados.jefe = jefes.numemp;
jefes
ON
26. Desde el entorno grfico cambia el empleado 111, asgnale el jefe 110 y la
oficina 21. Despus cambia la sentencia anterior para que salgan tambin
los empleados cuyo jefe no tenga cuota.
27.
SELECT empleados.numemp, empleados.nombre,
empleados.cuota, empleados.jefe, jefes.nombre,
jefes.cuota
28.
ON
29.
(empleados.cuota
jefes.cuota IS NULL)
IS
NOT
NULL
OR
AND
30. Listar los empleados que no estn asignados a la misma oficina que su jefe,
queremos nmero, nombre y nmero de oficina tanto del empleado como de
su jefe.
31.
SELECT
e.numemp,
e.nombre,
e.oficina,
e.jefe, j.nombre as [nombre
jefe], j.oficina
AS [oficina jefe]
32.
FROM empleados e INNER JOIN empleados j ON
e.jefe = j.numemp
WHERE e.oficina <> j.oficina;
33. En el punto anterior no salen los que no tienen oficina, cambiar la sentencia
para que aparezcan.
34.
SELECT
e.numemp, e.nombre, e.oficina,
e.jefe, j.nombre as [nombre jefe], j.oficina AS
[oficina jefe]
35.
FROM empleados e INNER JOIN empleados j ON
e.jefe = j.numemp
WHERE e.oficina <> j.oficina
NULL OR j.oficina IS NULL;
OR
e.oficina
IS
36. Lo mismo que la anterior pero queremos que aparezca tambin la ciudad de
las oficinas (tanto del empleado como de su jefe).
37.
SELECT
e.numemp,
e.nombre,
e.oficina,
ofiemp.ciudad,
e.jefe,
j.nombre
as
[nombre
jefe],
j.oficina
AS
[oficina
jefe],
ofijefe.ciudad
38.
FROM (oficinas ofiemp RIGHT JOIN empleados
e ON ofiemp.oficina= e.oficina)
39.
INNER JOIN
JOIN
oficinas
ofijefe
ofijefe.oficina)
40.
j.numemp
(empleados j LEFT
ON
j.oficina
=
ON
e.jefe
OR
e.oficina
IS
Resultado:
Valencianas
4
Resultado:
Superiores a 250
4
Resultado:
Cuntos ttulos
3
Resultado:
Cuota mnima Cuota mxima
3000,00
35000,00
Resultado:
numemp
nombre
Importe vendido
101
Antonio Viguer
266,28
102
Alvaro Jaumes
77,76
103
Juan Rovira
21,00
104
Jos Gonzlez
0,00
105
Vicente Pantalla
772,746
106
Luis Antonio
46,08
107
Jorge Gutirrez
344,32
108
Ana Bustamante
286,33
109
Mara Sunta
71,05
110
Juan Victor
478,82
111
Juan Gris
0,00
112
Julin Martorell
0,00
113
Juan Gris
0,00
114
Pablo Moreno
0,00
Resultado:
rep Cliente Importe vendido
106
2101
14,58
101
2102
39,78
105
2103
735,296
102
2106
40,26
110
2107
28,82
101
2108
1,50
109
2108
71,05
107
2109
313,50
103
2111
21,00
105
2111
37,45
108
2112
29,25
110
2112
450,00
101
2113
225,00
108
2114
221,00
106
2117
31,50
108
2118
36,08
102
2120
37,50
107
2124
30,82
Resultado:
rep Cliente Importe vendido
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
2106
40,26
102
2120
37,50
103
2111
21,00
104
NULL
NULL
105
2103
735,296
105
2111
37,45
106
2101
14,58
106
2117
31,50
107
2109
313,50
107
2124
30,82
108
2112
29,25
108
2114
221,00
108
2118
36,08
109
2108
71,05
110
2107
28,82
110
2112
450,00
111
NULL
NULL
112
NULL
NULL
113
NULL
NULL
114
NULL
NULL
Resultado:
rep
clie
Importe vendido
NULL
NULL
2364,386
101
NULL
266,28
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
NULL
77,76
102
2106
40,26
102
2120
37,50
103
NULL
21,00
103
2111
21,00
104
NULL
NULL
104
NULL
NULL
105
NULL
772,746
105
2103
735,296
105
2111
37,45
106
NULL
46,08
106
2101
14,58
106
2117
31,50
107
NULL
344,32
107
2109
313,50
107
2124
30,82
108
NULL
286,33
108
2112
29,25
108
2114
221,00
108
2118
36,08
109
NULL
71,05
109
2108
71,05
110
NULL
478,82
110
2107
28,82
110
2112
450,00
111
NULL
NULL
111
NULL
NULL
112
NULL
NULL
112
NULL
NULL
113
NULL
NULL
113
NULL
NULL
114
NULL
NULL
114
NULL
NULL
Agrupa Agrupa
clie numemp
NULL
2364,386
101
NULL
266,28
101
2102
39,78
101
2108
1,50
rep
clie
NULL
101
2113
225,00
102
NULL
77,76
102
2106
40,26
102
2120
37,50
103
NULL
21,00
103
2111
21,00
104
NULL
NULL
104
NULL
NULL
...
....
... (sigue)
...
...
6.
Puedes consultar aqu las soluciones propuestas.
7. Ahora modifica la consulta para que las filas de totales aparezcan ms
claras. (Recuerda la funcin CASE)
Resultado:
rep
clie
Importe vendido
Agrupa clie
NULL
NULL
2364,386
Total empleado
101
NULL
266,28
Total empleado
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
NULL
77,76
102
2106
40,26
102
2120
37,50
103
NULL
21,00
103
2111
21,00
Total empleado
Total empleado
Agrupa
numemp
Total final
104
NULL
NULL
104
NULL
NULL
Total empleado
...
....
... (sigue)
...
...
Resultado:
Agrupa
numemp
Total final
Agrupa clie
rep
clie
Total empleado
NULL
NULL
2364,386
Total empleado
101
NULL
266,28
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
NULL
77,76
102
2106
40,26
102
2120
37,50
103
NULL
21,00
103
2111
21,00
104
NULL
NULL
Total empleado
104
NULL
NULL
...
...
....
...
Total empleado
Total empleado
... (sigue)
Importe vendido
Resultado:
Agrupa
numemp
numemp
Total final
... (sigue)
clie
Importe vendido
NULL
Total empleado
2364,386
101
Total empleado
266,28
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
Total empleado
77,76
102
2106
40,26
102
2120
37,50
103
Total empleado
21,00
103
2111
21,00
104
NULL
NULL
104
Total empleado
NULL
...
....
...
Resultado:
Agrupa
numemp
numemp
clie
Importe vendido
Total final
NULL
Total empleado
2364,386
101
2102
39,78
101
2108
1,50
101
2113
225,00
101
Total empleado
266,28
102
2106
40,26
102
2120
37,50
102
Total empleado
77,76
103
2111
21,00
103
Total empleado
21,00
104
... (sigue)
0,00
104
Total empleado
0,00
...
....
...
clie
Importe vendido
...
...
2364,386
101
2102
39,78
101
2108
1,50
101
2113
225,00
101
Total empleado
266,28
102
2106
40,26
102
2120
37,50
102
Total empleado
77,76
103
2111
21,00
103
Total empleado
21,00
104
... (sigue)
0,00
104
Total empleado
0,00
...
....
...
SELECT MIN(cuota)
[Cuota mxima]
AS
[Cuota
mnima],
MAX(cuota)
AS
FROM empleados;
ISNULL(SUM(importe),0)
AS
ORDER BY numemp,clie;
5. En los resultados anteriores no se distinguen bien las lneas que
corresponden a totales. Modificar la consulta para indicar con un 1 si es
una fila de totales y con un 0 si no lo es.
SELECT numemp, clie, SUM(importe) AS [Importe vendido],
GROUPING(clie) AS [Agrupa clie], GROUPING(numemp) AS
[Agrupa numemp]
FROM empleados LEFT JOIN pedidos ON numemp = rep
GROUP BY numemp, clie WITH ROLLUP
ORDER BY numemp,clie;
6. Ahora modifica la consulta para que las filas de totales aparezcan
ms claras, substituyendo el 1 de Agrupa clie por "Total empleado", el 1
de Agrupa numemp por Total final y el valor 0 por espacio en blanco.
SELECT numemp, clie, SUM(importe) AS [Importe vendido],
CASE GROUPING(clie) WHEN 0 THEN ' ' WHEN 1 THEN
'Total empleado' END AS [Agrupa clie],
CASE GROUPING(numemp) WHEN 0 THEN ' ' ELSE 'Total
Final' END AS [Agrupa numemp]
FROM empleados LEFT JOIN pedidos ON numemp = rep
GROUP BY numemp, clie WITH ROLLUP
ORDER BY numemp,clie;
7. Ahora coloca las columnas Agrupa delante de las dems
columnas.
SELECT
CASE GROUPING(numemp) WHEN 0 THEN ' ' ELSE
'Total Final' END AS [Agrupa numemp],
CASE GROUPING(clie) WHEN 0 THEN ' ' WHEN 1 THEN
'Total empleado' END AS [Agrupa clie],
numemp, clie, SUM(importe) AS [Importe vendido]
FROM empleados LEFT JOIN pedidos ON numemp = rep
GROUP BY numemp, clie WITH ROLLUP
ORDER BY numemp,clie;
8. Ahora queremos que "Total empleado" aparezca en la columna
clie.
SELECT
CASE GROUPING(numemp) WHEN 0 THEN ' ' ELSE
'Total Final' END AS [Agrupa numemp],
numemp,
CASE
GROUPING(clie)
WHEN
0
THEN
CONVERT(CHAR(4),clie) WHEN 1 THEN 'Total empleado' END
AS [Clie],
SUM(importe) AS [Importe vendido]
FROM empleados LEFT JOIN pedidos ON numemp = rep
GROUP BY numemp, clie WITH ROLLUP
ORDER BY numemp,clie;
9. El empleado 104 (y otros) no ha vendido a nadie y por eso sale en
la columna clie la palabra NULL, queremos que en estos casos no
aparezca nada (se deje en blanco), y el importe si es NULL que salga un
cero.
SELECT
CASE GROUPING(numemp) WHEN 0 THEN ' ' ELSE
'Total Final' END AS [Agrupa numemp],
numemp,
CASE WHEN GROUPING(clie) = 1
empleado'
WHEN
clie
IS
NULL
THEN
CONVERT(CHAR(4),clie) END AS [Clie],
THEN 'Total
'
'
ELSE
WHEN
THEN
'
'
ELSE
ISNULL(CONVERT(CHAR(3),numemp),'...
[numemp],
')
CASE
WHEN
GROUPING(numemp) = 0
THEN
GROUPING(clie)
'Total
empleado'
AS
AND
WHEN
GROUPING(clie) = 1
AND GROUPING(numemp) = 1 THEN '...'
WHEN
clie
IS
NULL
THEN
CONVERT(CHAR(4),clie) END AS [Clie],
'
'
ELSE
nombre
2107
Julian Lpez
2107
Julian Lpez
2121
Vicente Ros
2125
Pepito Grillo
nombre
106
Luis Antonio
108
Ana Bustamante
110
Juan Victor
nombre
ventas
102
Alvaro Jaumes
47400,00
111
Juan Gris
60000,00
112
Julin Martorell
91000,00
Ahora con Pamplona. Pamplona tiene una oficina con objetivo nulo,
en este caso no queremos que esa oficina cuente.
numemp
nombre
ventas
101
Antonio Viguer
30500,00
102
Alvaro Jaumes
47400,00
103
Juan Rovira
28600,00
105
Vicente Pantalla
36800,00
106
Luis Antonio
29900,00
108
Ana Bustamante
36100,00
109
Mara Sunta
39200,00
111
Juan Gris
60000,00
112
Julin Martorell
91000,00
114
Pablo Moreno
37000,00
ciudad
11
Valencia
13
Castellon
22
A Corua
FROM empleados
numclie
fab = 'ACI'
GROUP BY rep
HAVING
AVG(importe)
pedidos);
>
(SELECT
AVG(importe)
FROM
ciudad
'Barcelona'
and
(SELECT MAX(objetivo)
FROM oficinas
WHERE ciudad = 'Madrid');
5. Listar las oficinas en donde todos los empleados tienen ventas que
superan al 50% del objetivo de la oficina.
SELECT oficina, ciudad
FROM oficinas
WHERE (objetivo * .5) < = (SELECT MIN(ventas)
FROM
empleados
empleados.oficina = oficinas.oficina);
WHERE
fechapedido
cant importe
precio
pedido
precio
110036
2008-12-12
00:00:00.000
22,50
2,50
NULL
110037
2008-12-12
00:00:00.000
31,50
4,50
45,00
112979
2008-12-12
00:00:00.000
150,00
25,00
NULL
112989
2008-12-10
00:00:00.000
14,58
2,43
2,43
16
113013
2008-12-28
00:00:00.000
6,52
6,52
5,16
fechapedido
cant importe
precio
pedido
precio
110036
2008-12-12
00:00:00.000
22,50
2,50
NULL
110037
2008-12-12
00:00:00.000
315,00
4,50
45,00
112979
2008-12-12
00:00:00.000
150,00
25,00
NULL
112989
2008-12-10
00:00:00.000
14,58
2,43
2,43
16
113013
2008-12-28
00:00:00.000
5,16
6,52
5,16
precio
pedido
aci
41001
NULL
NULL
NULL
NULL
NULL
NULL
aci
41002
NULL
10
112992
1990-04-15
20:00:00.000
7,60
0,76
aci
41002
NULL
18
113027
2008-02-05
00:00:00.000
450,00
8,3333
aci
41003
NULL
15
113012
2008-05-05
00:00:00.000
37,45
1,07
aci
41004
NULL
112963
2008-05-10
00:00:00.000
3,276
0,117
aci
41004
NULL
112968
1990-01-11
00:00:00.000
39,78
1,17
aci
41004
NULL
112983
2008-05-10
00:00:00.000
7,02
1,17
aci
4100x
NULL
25
113055
2009-04-01
00:00:00.000
1,50
0,25
aci
4100x
NULL
26
113057
2008-11-01
00:00:00.000
NULL
NULL
aci
4100y
NULL
112987
2008-01-01
00:00:00.000
275,00
25,00
aci
4100z
NULL
110036
2008-12-12
00:00:00.000
22,50
2,50
aci
4100z
NULL
112979
2008-12-12
00:00:00.000
150,00
25,00
41001
NULL
aci
41002
4,55
aci
41003
1,07
aci
41004
0,82
aci
4100x
0,25 *
aci
4100y
25,00
aci
4100z
13,75
* aci 4100x tiene 2 pedidos pero uno sin precio por lo que no cuenta
Puedes consultar aqu las soluciones propuestas.
titulo,
SET
productos
ON
fab=idfab
and
WHERE
YEAR(fechapedido)=YEAR(GETDATE())
MONTH(fechapedido)=MONTH(GETDATE())
and
productos
ON
fab=idfab
and
join
pedidos
on
codigo,
idfab=fab
AND
UPDATE
productos
SET
precio
=
(SELECT
ROUND(AVG(importe/cant),2) FROM pedidos WHERE fab=idfab
AND producto=idproducto)
WHERE precio IS NULL
WHERE
(oficina,
ciudad,
oficina,
ciudad,
FROM Nuevaoficinas;
No podemos rellenar todava la columna Dir ya que no tenemos los
empleados dado de alta.
INSERT
INTO
empleados
(numemp,
oficina,titulo,contrato,cuota,ventas)
nombre,
SELECT
numemp,
nombre,
oficina,titulo,contrato,cuota,ventas
edad,
edad,
FROM NuevaEmpleados;
Lo mismo pasa con la columna jefe.
UPDATE empleados SET jefe=nueva.jefe
FROM empleados INNER JOIN NuevaEmpleados
empleados.numemp=nueva.numemp
nueva
ON
FROM NuevaEmpleados;
Las hemos dejado en dos porque con otros SQLs no se podra hacer
en un slo paso.
UPDATE
oficinas
SET
Nuevaoficinas nueva
dir
(SELECT
dir
FROM
WHERE
oficinas.oficina=nueva.oficina)
INSERT
INTO
(numclie,nombre,repclie,limitecredito)
clientes
SELECT numclie,nombre,repclie,limitecredito
FROM Nuevaclientes;
INSERT
INTO
pedidos
(numpedido,fechapedido,clie,rep,fab,producto,cant,impor
te)
SELECT
numpedido,fechapedido,clie,rep,fab,producto,cant,import
e
FROM Nuevapedidos;
-- La crea en la carpeta
CREATE
DATABASE
Gestion2
ON
FILENAME='F:\SQL\Gestion2.mdf')
(NAME='Gestion2'
LOG
ON
(NAME='Gestion2_log'
FILENAME='F:\SQL\Gestion2.ldf')GO
,
,
CREATE TABLE
dbo.empleados(
numemp
INT NOT NULL CONSTRAINT pk_empleados
PRIMARY KEY CLUSTERED,
nombre
edad
CHAR(20) NULL,
INT NULL,
oficina
titulo
contrato
INT NULL,
CHAR(20) NULL,
datetime NULL,
jefe
INT NULL CONSTRAINT
REFERENCES dbo.empleados,
cuota
ventas
MONEY
MONEY
FK_empleados_jefe
NULL,
NULL
)
CREATE TABLE dbo.oficinas(
oficina
ciudad
CHAR(20) NULL,
region
CHAR(20) NULL,
dir INT
NULL,
objetivo MONEY
ventas
NULL,
MONEY NULL
CONSTRAINT d1
DEFAULT
(0),
CONSTRAINT PK_oficinas PRIMARY
CONSTRAINT
FK_oficinas_dir
REFERENCES empleados
KEY (oficina),
FOREIGN
KEY
(dir)
)
ALTER TABLE dbo.empleados
FK_empleados_oficina
dbo.clientes(
(oficina)
NULL,
CHAR(20) NULL,
limitecredito
INT
NULL,
PK_clientes PRIMARY KEY (numclie)
CONSTRAINT
)
CREATE TABLE dbo.productos(
idfab
idproducto
MONEY NULL,
PK_productos
PRIMARY
KEY
)
CREATE TABLE dbo.pedidos(
codigo
numpedido
fechapedido DATETIME
NOT NULL,
clie
rep
fab
producto
cant
importe
CONSTRAINT
(codigo),
CONSTRAINT
FK_pedidos_rep FOREIGN KEY
REFERENCES empleados,
CONSTRAINT FK_pedidos_clie FOREIGN
REFERENCES clientes,
CONSTRAINT
FK_pedidos_productos
(fab,producto) REFERENCES productos)
(rep)
KEY (clie)
FOREIGN
KEY
IX_descripcion
ON
Productos
bien
--
-- Opcion 1
ALTER TABLE
FK_pedidos_clie;
comprobar el resultado;
-- Opcion 2
UPDATE pedidos SET
clie = NULL;
DELETE Clientes
SELECT * FROM pedidos;
7. Ahora queremos permitir que dos clientes tengan el mismo nombre.
DROP INDEX IX_nombre ON
--o bien (segn se haya
ALTER TABLE Clientes DROP
Clientes;
resuelto el apartado 5
CONSTRAINT IX_nombre;
GO
UPDATE Productos SET StockMinimo= 100/(CASE WHEN Precio
IS NULL OR Precio=0 THEN 100 ELSE Precio END);
TABLE ProductosAPedir (
Afab
CHAR(5),
Aproducto CHAR(10),
Adescripcion CHAR(20),
Aexistencias INT,
Apedir SMALLINT,
PRIMARY KEY (Afab,Aproducto)
)
--Borramos
los
ProductosAPedir
de
los
productos que rebasan el stock mnimo, si rebasa el
stock el producto ya no tiene que estar en la tabla
UPDATE
ProductosAPedir
Apedir=StockMinimo+5-existencias
SET
Stockminimo
-Actualizamos
los
ProductosAPedir
productos que no llegan al stock mnimo
INSERT INTO
de
ProductosAPedir
SELECT
Idfab,Idproducto,Descripcion,existencias,StockMinimo+5existencias
FROM Productos
WHERE
FROM
ProductosAPedir
idproducto=Aproducto);
NOT
WHERE
EXISTS (SELECT *
idfab=Afab
AND
FROM
Productos
WHERE
existencias
<
EXEC ActualizaProductosAPedir
SELECT * FROM ProductosAPedir
2. Obtener un listado de las oficinas de una determinada regin con
ventas superiores a un determinado importe.
PRINT 'Empieza el ejercicio 2'
USE Gestion10
IF OBJECT_ID('Listado_Oficinas1','P') IS NOT NULL DROP
PROCEDURE Listado_Oficinas1
GO
CREATE
PROCEDURE
CHAR(20),@ventas MONEY
Listado_Oficinas1
@region
AS
SELECT * FROM oficinas WHERE region= @region
ventas > @ventas
AND
GO
EXEC Listado_Oficinas1 Este, 1000
EXEC Listado_Oficinas1 Este, 100000
EXEC Listado_Oficinas1 Norte, 0
EXEC Listado_Oficinas1 Norte,
10000
IS
NOT
NULL
GO
CREATE
PROCEDURE
Listado_Oficinas2
CHAR(20),@ventas MONEY, @cuantas INT OUTPUT
@region
AS
SELECT * FROM oficinas WHERE region= @region
AND ventas > @ventas
WHERE
SET
@cuantas=(SELECT
COUNT(*) FROM oficinas
region= @region AND ventas > @ventas)
GO
DECLARE @resultado INT
EXEC Listado_Oficinas2 Este, 1000 ,@resultado OUTPUT
SELECT @resultado
EXEC
OUTPUT
Listado_Oficinas2
PRINT @resultado
Este,
100000
,@resultado
Listado_Oficinas2
Norte,
10000
,@resultado
PRINT @resultado
IS
NOT
NULL
GO
CREATE
PROCEDURE
CHAR(20),@ventas MONEY
Listado_Oficinas3
@region
AS
SELECT * FROM oficinas WHERE region= @region
AND ventas > @ventas
RETURN (SELECT COUNT(*) FROM
region= @region AND ventas > @ventas)
oficinas
WHERE
GO
DECLARE @resultado INT
EXEC @resultado=Listado_Oficinas3 Este, 1000
SELECT @resultado
EXEC @resultado=Listado_Oficinas3 Este, 100000
PRINT @resultado
EXEC @resultado=Listado_Oficinas3 Norte, 0
PRINT @resultado
EXEC @resultado=Listado_Oficinas3 Norte, 10000
PRINT @resultado
5. Crea un procedimiento que muestre los n productos ms caros, n es
un valor que se indicar en la llamada.
IS
NOT
NULL
GO
CREATE PROCEDURE
AS
SELECT
TOP
Idproducto,idfab,descripcion,precio
FROM
(@num)
Productos
IS
NOT
NULL
GO
CREATE PROCEDURE
AS
SELECT
TOP
(@num)
Idproducto,idfab,descripcion,precio
FROM
ORDER
WITH
TIES
Productos
BY Precio DESC;
Resultado
IS
NOT
NULL
GO
CREATE TRIGGER
Controlexistencias
ON Productos INSTEAD
OF DELETE -- Tenemos que
comprobar el stock antes de que se realice el borrado
AS
BEGIN
DELETE
Productos
FROM
Productos P INNER JOIN
Deleted D
P.idfab=D.idfab AND P.idproducto=D.idproducto
ON
tiene stock, no se
END;
GO
SELECT 'Antes',* FROM productos WHERE idfab='bic' AND
idproducto=41003; -- Para comprobar las existencias del
producto
DELETE
Productos
WHERE
idfab='bic'
AND
idproducto=41003; -- un producto que tenga existencias
-- Intentamos borrar el producto.
SELECT 'Despus
DELETE',* FROM
idfab='bic' AND idproducto=41003;
productos
WHERE
productos
WHERE
IS
NOT
NULL
DROP
GO
CREATE TRIGGER
ON pedidos
comprobar el
insercin
ControlStock
INSTEAD
OF INSERT -- Tenemos
stock antes de que se realice
que
la
AS
BEGIN
INSERT
INTO
Pedidos
(numpedido,fechapedido,rep,clie,fab,producto,cant,impor
te)
SELECT
numpedido,fechapedido,rep,clie,fab,producto,cant,import
e
FROM Productos INNER JOIN Inserted
idfab=fab AND idproducto=producto
WHERE existencias-cant
>= 0
ON
suficiente
pedido.
END;
GO
SELECT 'Antes',* FROM productos WHERE idfab='bic' AND
idproducto=41003; -- Para comprobar las existencias del
producto
INSERT
INTO
Pedidos
(numpedido,fechapedido,rep,fab,producto,clie,cant,impor
te)
VALUES
(010101123,GETDATE(),108,'bic',41003,2103,10,1000);
del
SELECT 'Despus
INSERT',* FROM
WHERE idfab='bic' AND idproducto=41003;
-- Comprobamos que el campo
ha reducido
productos
existencia no se
Comprobamos
que
el
pedido
no
se
ha
INSERT
INTO
Pedidos
(numpedido,fechapedido,rep,fab,producto,clie,cant,impor
te)
VALUES
(010101123,GETDATE(),108,'bic',41003,2103,2,1000);
-- Intentamos insertar un pedido de 2 unidades
del producto en cuestion (hay suficiente stock).
SELECT 'Despus
INSERT',* FROM
WHERE idfab='bic' AND idproducto=41003;
productos
IS
NOT
NULL
DROP
GO
CREATE TRIGGER Borrarvarias
ON Oficinas INSTEAD OF
DELETE
AS
BEGIN
IF (SELECT COUNT(*) FROM Deleted)
(SELECT oficina
DELETE
Oficinas
FROM Deleted)
= 1
WHERE
oficina
IN
ELSE
PRINT 'ERROR,
varias oficinas a la vez'
no
se
pueden
eliminar
END;
GO
DELETE Oficinas WHERE
oficina
intentamos eliminar 2 oficinas
SELECT 'Despus
DELETE',* FROM
IN
(31,32)
--
Oficinas;
oficina = 31
DELETE',* FROM
-- intentamos
Oficinas;
Por ejemplo:
SELECT
codigo,
nombre
localidad=Valencia;
FROM
Clientes
WHERE
mibase;
nombre
Clientes
El nombre debe tener entre 1 y 128 caracteres, excepto para algunos tipos
de objetos en los que el nmero es ms limitado.
El nombre debe empezar por:
o
Para indicar valores negativos y positivos aadimos el prefijo + o segn sea el valor positivo o negativo. Sin prefijo se entiende que el valor
es positivo.
Si quieres ver cmo definir constantes para otros tipos de datos, visita
el siguiente avanzado
.
Tipos de operadores:
- Operadores numricos:
suma
resta
multiplicacin
divisin
mdulo
(resto de una divisin)
&
OR
OR exclusivo
- Operadores de comparacin:
Igual a
Mayor que
>
Menor que
<
>=
<=
Distinto de
<>
No es igual a
!=
No menor que
!<
No mayor que
!>
- Operadores lgicos:
IN
AND
LIKE
ANY
NOT
BETWEEN
OR
EXISTS
SOME
- Operadores de cadenas:
Concatenacin
Resultados de la expresin
- Si se combinan dos expresiones mediante operadores de
comparacin o lgicos, el tipo de datos resultante es booleano y el valor
es uno de los siguientes: TRUE, FALSE o UNKNOWN.
- Cuando dos expresiones se combinan mediante operadores
aritmticos, bit a bit o de cadena, el operador determina el tipo de datos
resultante.
Las expresiones complejas formadas por varios smbolos y operadores
se evalan como un resultado formado por un solo valor. El tipo de datos,
intercalacin, precisin y valor de la expresin resultante se determina al
combinar las expresiones componentes de dos en dos, hasta que se
alcanza un resultado final. La prioridad de los operadores de la expresin
define la secuencia en que se combinan las expresiones.
2.8. Funciones
SQL Server 2005 proporciona numerosas funciones integradas y
permite crear funciones definidas por el usuario.
Existen diferentes tipos de funciones:
Funciones de conjuntos de filas: devuelven un objeto que se puede utilizar,
en instrucciones Transact-SQL, en lugar de una referencia a una tabla.
Las variables
En Transact-SQL podemos definir variables, que sern de un tipo de
datos determinado, como tipos de datos podemos utilizar los propios de la
base de datos SQL-SERVER, pero tambin podemos utilizar tipos propios
del lenguaje que no pueden ser utilizados en DDL. El tipo Cursor y el tipo
Table son dos de estos tipos.
Las variables se definen utilizando la instruccin DECLARE con el
siguiente formato:
DECLARE @nbvariable tipo
El nombre de la variable debe empezar por el smbolo @, este smbolo
hace que SQL interprete el nombre como un nombre de variable y no un
nombre de objeto de la base de datos.
Por ejemplo: DECLARE @empleados INT
Con esto hemos definido la variable @empleados de tipo entero.
Para asignar un valor a una variable, la asignacin se realiza con la
palabra SELECT y el signo igual con el formato:
SELECT @nbvariable = valor
El valor puede ser cualquier valor constante, otro nombre de variable,
una expresin vlida o algo ms potente, parte de una sentencia SELECT
de
SQL.
Por ejemplo:
SELECT @empleados = 0;
SELECT @empleados = @otra * 100;
SELECT @EMPLEADOS = COUNT(numemp) FROM empleados;
Varias lneas
--
Una
lnea
nica
/*
Esto
es
en varias lneas */
-- Esto
un
comentario
lnea.
BEGIN...END
Encierra un conjunto de instrucciones Transact-SQL de forma que estas
instrucciones formen un bloque de instrucciones.
<expresion_tabla_comun>
<expresion_consulta>
[ORDER
BY
{expression_columna|posicion_columna [ASC|DESC] }
[ ,...n ]]
[COMPUTE
{{AVG|COUNT|MAX|MIN|SUM}
,...n ] [BY expression[ ,...n ]]
(expression)}[
]
[<FOR clausula_for>]
[OPTION (<query_hint>[ ,...n ])]
<expresion_consulta> ::=
{<especificacion_consulta>
expresion_consulta > ) }
<
[ {UNION
[ALL]|EXCEPT|INTERSECT}
<especificacion_consulta>
(<expresion_consulta>) [...n ]
]
<especificacion_consulta> ::=
SELECT [ALL|DISTINCT]
[TOP expresion [PERCENT] [WITH TIES] ]
<lista_seleccion>
[INTO nueva_tabla]
[FROM { <origen> } [ ,...n ] ]
[WHERE <condicion_busqueda> ]
[GROUP BY [ ALL ] expresion_agrupacion
[ ,...n ]
[WITH { CUBE | ROLLUP } ]
]
[HAVING < condicion_busqueda > ]
Debido a la complejidad de la sentencia (en la sintaxis anterior
no se han detallado algunos elementos), la iremos viendo poco a
poco, empezaremos por ver consultas bsicas para luego ir
aadiendo ms clusulas.
Empezaremos por ver las consultas ms simples, basadas en
una sola tabla y nos limitaremos a la siguiente sintaxis:
SELECT [ALL|DISTINCT]
[TOP expresion [PERCENT] [WITH TIES]]
<lista_seleccion>
FROM
[WHERE
<origen>
<condicion_busqueda> ]
[ORDER
{expression_columna|posicion_columna
[ ,...n ]]
BY
[ASC|DESC]}
SELECT ...
FROM tabla1 t1
Sacamos
los datos de la
tabla tabla1 y le asignamos un alias de tabla: t1
SELECT ...
FROM tabla1 AS t1
sentencia anterior.
Es
equivalente
la
|
{nombre_tabla|nombre_vista|alias_tabla}.*
|
[{nombre_tabla|nombre_vista|alias_tabla}.]
{nb_columna|$IDENTITY|$ROWGUID}
|<expresion>
}[[AS] alias_columna]
| alias_columna = <expresion>
} [ ,...n ]
una constante
El resultado sera:
nombre
oficina
contrato
Antonio Viguer
12
1986-10-20
Alvaro Jaumes
21
1986-12-10
Juan Rovira
12
1987-03-01
Jos Gonzlez
12
1987-05-19
Vicente Pantalla
13
1988-02-12
Luis Antonio
11
1988-06-14
Jorge Gutirrez
22
1988-11-14
Ana Bustamante
21
1989-10-12
Mara Sunta
11
1999-10-12
Juan Victor
NULL
1990-01-13
idproducto,
descripcion,
productos;
idproducto
descripcion
precio
aci
41001
arandela
0,58
aci
41002
bisagra
0,80
aci
41003
art t3
1,12
aci
41004
art t4
1,23
aci
4100x
junta
0,26
aci
4100y
extractor
28,88
aci
4100z
mont
26,25
bic
41003
manivela
6,52
bic
41089
rodamiento
2,25
Luis Garca
Antn
2102
Alvaro
Rodrguez
2103
Jaime
Llorens
en vez de:
Numclie
nombre
2101
Luis Garca
Antn
2102
Alvaro
nombrecliente
Rodrguez
2103
Jaime
Llorens
La palabra AS es opcional.
SELECT numclie,nombre nombrecliente
FROM clientes;
Sera equivalente a la consulta anterior
Si queremos incluir espacios en blanco en el nombre lo
debemos encerrar entre corchetes.
SELECT numclie,nombre AS [nombre cliente]
FROM clientes;
Nota importante: Este nombre de alias se podr utilizar en la
lista de seleccin y en la clusula ORDER BY pero no en la
clusula WHERE.
3.6. Funciones
Existen funciones que podemos utilizar en la lista de seleccin,
e incluso en otras clusulas que veremos ms adelante, como el
WHERE. Las principales funciones son las siguientes:
Funciones de fecha:
Funcin
Descripcin
GETDATE
GETUTCDATE
DATEPART
solicitada.
DAY
MONTH
YEAR
DATENAME
DATEADD
DATEDIFF
@@DATEFIRST
SET
DATEFIRST
Descripcin
ASCII
CHAR
NCHAR
UNICODE
LEN
LTRIM
RTRIM
LEFT
RIGHT
SUBSTRING
LOWER
UPPER
REPLACE
STUFF
QUOTENAME
SPACE
STR
REPLICATE
REVERSE
CHARINDEX
PATINDEX
Descripcin
ROUND
CAST
CONVERT
CASE
ISNULL
COALESCE
region,
(ventas-objetivo)
AS
FROM
oficinas;
El resultado ser:
ciudad
region
superavit
Valencia
este
11800,00
Alicante
este
-6500,00
Castellon
este
1800,00
Badajoz
oeste
11100,00
A Corua
oeste
-11400,00
Madrid
centro
NULL
Madrid
centro
-10000,00
Pamplona
norte
NULL
Valencia
este
-90000,00
descripcion
valoracion
aci
41001
arandela
160,66
aci
41002
bisagra
133,60
aci
41003
art t3
231,84
aci
41004
art t4
170,97
aci
4100x
junta
9,62
aci
4100y
extractor
722,00
aci
4100z
mont
735,00
bic
41003
manivela
19,56
bic
41089
rodamiento
175,50
Objetivo
Mostrar una columna que sea el resultado de un clculo
aritmtico.
aci
4100z
2,50
110037
rei
2a44l
4,50
112963
aci
41004
0,117
112968
aci
41004
1,17
112975
rei
2a44g
3,50
112979
aci
4100z
25,00
112983
aci
41004
1,17
112987
aci
4100y
25,00
112989
fea
114
2,43
112992
aci
41002
0,76
112993
rei
2a45c
0,79
112997
bic
41003
6,52
113003
imm
779c
18,75
113007
imm
773c
9,75
113012
aci
41003
1,07
113013
bic
41003
6,52
113024
qsa
xk47
3,55
113027
aci
41002
8,3333
113034
rei
2a45c
0,79
113042
rei
2a44r
45,00
113045
rei
2a44r
45,00
113048
imm
779c
18,75
113049
qsa
xk47
3,88
113051
qsa
xk47
3,55
113055
aci
4100x
0,25
113057
aci
4100x
NULL
113058
fea
112
1,48
113062
bic
41003
2,43
113065
qsa
xk47
3,55
113069
imm
773c
14,25
FROM productos;
Resultado:
Idfab Idproducto Descripcin Valoracion
aci
41001
arandela
NULL
aci
41002
bisagra
NULL
aci
41003
art t3
NULL
aci
41004
art t4
NULL
aci
4100x
junta
NULL
aci
4100y
extractor
NULL
aci
4100z
mont
NULL
bic
41003
manivela
19,56
bic
41089
rodamiento
175,50
bic
41672
plato
0,00
fea
112
cubo
170,20
fea
114
cubo
36,45
imm 773c
reostato
273,00
imm 775c
reostato 2
71,25
imm 779c
reostato 3
0,00
imm 887h
caja clavos
120,42
imm 887p
perno
6,00
imm 887x
manivela
152,00
qsa
xk47
red
134,90
qsa
xk48
red
272,02
qsa
xk48a
red
54,76
rei
2a44g
pas
49,00
rei
2a44l
bomba l
540,00
rei
2a44r
bomba r
540,00
rei
2a45c
junta
165,90