Professional Documents
Culture Documents
Dias Tabla Prstamos NOMBRE CAMPO Codigo Libro Usuario FSalida FMaxima FDevol Tabla Usuarios NOMBRE CAMPO Codigo Nombre Apellidos DNI Domicilio Poblacion Provincia FNacim Maximo_permitido
Numrico
Entero
TIPO DE DATOS Autonumrico Texto Texto Texto Texto Texto Texto Fecha/Hora Numrico
1. El Explorador de objetos... a) Es un panel que muestra el contenido de nuestro servidor: bases de datos, tablas, etc. ordenados jerrquicamente. b) Permite acceder a elementos de nuestro servidor rpidamente y efectuar acciones sobre ellos mediante el men contextual. c) A y B son ciertas. d) A y B son falsas.
2. En qu carpeta se deben, por lo general, crear las bases de datos? a) Bases de datos > Bases de datos del sistema. b) Bases de datos. c) Objetos del servidor. d) Administracin. 3. Como mnimo, una base de datos en SQL Server debe conener los archivos fsicos: a) mdf y ldf, es decir, el principal y el de registro. b) mdf, ndf y ldf: Principal, secundario y de registro. c) mdf y ndf: Principal y secundario. d) mdf: Principal. 4. Para copiar los archivos fsicos de una base de datos... a) Deberemos acceder a la carpeta donde est guardada, mediante el explorador de windows, y copiarlos. b) Deberemos desconectarla antes de intentar copiarla, si no el sistema no nos dejar hacerlo porque est en uso. c) Deberemos utilizar la herramienta de copias de seguridad, porque no se puede acceder a ella desde fuera del gestor SSMS. d) Todas son falsas. 5. Para incluir una base de datos en nuestro servidor... a) Es necesario crearlo desde el mismo servidor. b) Es necesario, por seguridad, crear la base de datos en un servidor diferente al que lo ejecutar. c) Podemos crear una nueva o adjuntar una ya existente. d) Deberemos hacerlo mediante instrucciones SQL, ya que el entorno grfico no lo permite. 6. Al definir las columnas de una tabla, qu informacin deberemos especificar? a) El rango de valores que soporta. b) El nombre, tipo y si admite nulos, para cada columna.
c) La longitud de la cadena. d) Las variables. 7. Si definimos una columna de identidad (IDENTITY)... a) SQL Server automticamente la define como clave principal. b) sta admitir nulos. c) sta deber ser de tipo nchar. d) El sistema generar su valor, que ser un nmero incrementado. 8. Para modificar los datos de una tabla: a) Desde el Explorador de objetos, desplegamos su men contextual y elegimos la opcin Modificar. b) Desde el Explorador de objetos, desplegamos su men contextual y elegimos la opcin Abrir tabla. c) A y B son ciertas. d) A y B son falsas. 9. Para relacionar dos tablas, por ejemplo empleados y oficinas. a) Deberemos llamar del mismo modo al campo que las relacionar y el gestor se encarga automticamente de crear la relacin. b) Deberemos seleccionar el campo de la tabla padre empleados y pulsar el botn definir hijos para aadir el campo de oficinas. c) Deberemos, necesariamente, escribir instrucciones SQL que se encarguen de establecer las relaciones. d) Deberemos desplegar el men contextual del campo que las relaciona y elegir Relaciones. 10. Si pulsamos el botn Nueva consulta... a) Se abrir una pestaa nueva en forma de editor, donde podremos escribir consultas SQL. b) Podremos utilizar la zona de edicin para escribir varias consultas, una detrs de otra. c) Dispondremos de un editor que colorear las palabras en funcin de su
1. El lenguaje SQL es: a) Propio de SQLServer. b) Propio de SQLServer y otros sistemas gestores de Microsoft, como Access. c) Universal, se puede utilizar en cualquier sistema gestor de base de datos relacional. d) Todas son falsas. 2. El DDL engloba las instrucciones SQL que permiten: a) Definir la estructura de una base de datos, como: crear una base de datos o crear y eliminar tablas. b) Realizar cambios en los datos contenidos en la base de datos: incluir registros, borrarlos, editarlos... c) Ejercer control sobre los procesos que ejecutan transacciones y los permisos de la base de datos. d) Todas son ciertas. 3. El DCL engloba las instrucciones SQL que permiten: a) Definir la estructura de una base de datos, como: crear una base de datos o crear y eliminar tablas. b) Realizar cambios en los datos contenidos en la base de datos: incluir registros, borrarlos, editarlos... c) Ejercer control sobre los procesos que ejecutan transacciones y los permisos de la base de datos. d) Todas son ciertas. 4. El DML engloba las instrucciones SQL que permiten:
a) Definir la estructura de una base de datos, como: crear una base de datos o crear y eliminar tablas. b) Realizar cambios en los datos contenidos en la base de datos: incluir registros, borrarlos, editarlos... c) Ejercer control sobre los procesos que ejecutan transacciones y los permisos de la base de datos. d) Todas son ciertas. 5. El lenguaje Transact-SQL es una variante del SQL estndar, que incluye caracersticas como: a) Herramientas para la creacin de interfaces para el usuario de la base de datos. b) La posibilidad de crear aplicaciones ejecutables. c) Estructuras de control de flujo. d) Todas son ciertas. 6. Deberemos cualificar un nombre cuando: a) Referenciemos un campo, tabla o vista que forme parte de una base de datos externa, es decir, que no forme parte de la base de datos que est activa. b) Si realizamos una consulta con varias tablas y necesitamos referenciar un campo que se encuentra en ms de una de ellas. c) A y B son ciertas. d) A y B son falsas. 7. Para llamar a un campo Fecha contrato deberemos... a) Escribir (Fecha contrato). Entre parntesis. b) Escribir [Fecha contrato]. Entre corchetes. c) No se puede escribir espacios en los nombres de los campos, deberemos escribir Fecha_contrato. d) Todas son falsas. 8. Seala cul es un comentario vlido para SQL. a) /* Esto es un comentario */
b) - Esto es un comentario. c) // Esto es un comentario. d) <!-- Esto es un comentario --> 9. Transact-SQL permite definir: a) Variables. b) Constantes. c) Funciones propias. d) Todas son ciertas.
Para realizar los ejercicios, debers utilizar la base de datos GestionSimples, en la carpeta Ejercicios del curso tienes el PDF Tablas_Gestion para consultar en qu tablas est cada campo.
Nume mp
Nombre
Eda Oficin d a
Titulo
Contrato
Jefe
Cuota
ventas
101
Antonio Viguer
45
12
representa nte
1986-10104 20 00:00:00.0 00 1986-12108 10 00:00:00.0 00 1987-03104 01 00:00:00.0 00 1987-05106 19 00:00:00.0 00 1988-02104 12 00:00:00.0 00
30000, 00
30500, 00
102
Alvaro Jaumes
48
21
representa nte
35000, 00
47400, 00
103
Juan Rovira
29
12
representa nte
27500, 00
28600, 00
104
Jos Gonzlez
33
12
dir ventas
20000, 00
14300, 00
105
Vicente Pantalla
37
13
representa nte
35000, 00
36800, 00
106
Luis Antonio
52
11
director general
1988-06NUL 27500, 14 L 00 00:00:00.0 00 1988-11108 14 00:00:00.0 00 1989-10106 12 00:00:00.0 00 1999-10106 12 00:00:00.0 00 30000, 00
29900, 00
107
Jorge Gutirrez
49
22
representa nte
18600, 00
108
62
21
dir ventas
35000, 00
36100, 00
109
Mara Sunta
31
NUL L
representa nte
3000,0 0
39200, 00
110
Juan Victor
41
NUL L
representa nte
1990-01104 13 00:00:00.0 00
NULL
7600,0 0
111
Juan Gris
50
NUL L
representa nte
60000, 00
112
Julin Martorell
50
NUL L
representa nte
91000, 00
113
Juan Gris
18
NUL L
representa nte
0,00
2. Listar todos los empleados, al igual que en el ejercicio anterior, pero cambiando el nombre de la columna contrato por Fecha de contrato. Puedes consultar aqu las soluciones propuestas.
2. Saber los productos que tienen un precio superior o igual al precio de la mitad de los productos. Resultado:
Idfab Idproducto Descripcin Precio existencias rei rei 2a44l 2a44r bomba l bomba r reostato 3 reostato 2 reostato manivela manivela red pas cubo 45,00 12 45,00 12 18,75 0 14,25 5 9,75 6,52 4,75 3,55 3,50 2,43 28 3 32 38 14 15 78 0 115
imm 887x qsa rei fea bic bic fea xk47 2a44g 114 41089 41672 112
qsa
xk48a
red
1,48
37
Ventas
cuota
14300,00 20000,00
2. Hallar los empleados que no estn a cargo del empleado 106. Resultado:
Numemp 101 102 103 105 106 107 110 111 112 113
nombre Antonio Viguer Alvaro Jaumes Juan Rovira Vicente Pantalla Luis Antonio Jorge Gutirrez Juan Victor Juan Gris Julin Martorell Juan Gris
3.
Listar de cada jefe su cdigo y el cdigo y nombre de sus subordinados ordenados por nombres. Resultado:
Jefe Numemp 104 101 104 103 104 110 104 105 106 108 106 104 106 109 108 102 108 107
nombre Antonio Viguer Juan Rovira Juan Victor Vicente Pantalla Ana Bustamante Jos Gonzlez Mara Sunta Alvaro Jaumes Jorge Gutirrez
Para saber los productos que tienen un precio superior o igual al precio de la mitad de los productos. SELECT TOP 50 PERCENT WITH TIES * FROM productos ORDER BY precio DESC;
1. La clusula FROM indica el origen de datos para la consulta y puede constar de:
a) Deberemos cualificarla, de la siguiente forma: FROM Base2.tabla. b) Podremos indicar el nombre de la tabla directamente : FROM tabla. c) No podemos utilizar ms de una base de datos en la misma consulta. d) Deberemos desconectar de la base de datos actual y conectar con la Base2.
3. El alias se puede aplicar en:
a) El origen, por ejemplo: tablaempleados as Empleados b) La lista de seleccin, por ejemplo: nomemp as [Nombre Empleado] c) A y B son ciertas. d) A y B son falsas.
4. Seala cul de los siguientes ejemplos es correcto:
a) SELECT nom as Nombre FROM empleados WHERE Nombre='Juan'. b) SELECT nom Nombre FROM empleados WHERE Nombre='Juan' c) SELECT nom Nombre FROM empleados ORDER BY Nombre d) SELECT nom Nombre FROM empleados ORDER BY Apellido='Garca'
5. Seala cul de los siguientes ejemplos es incorrecto:
a) SELECT precio_unidad = (importe/cantidad)... b) SELECT (importe/cantidad) AS precio_unidad... c) SELECT precio_unidad = ROUND(importe/cantidad)... d) SELECT precio_unidad = ROUND((importe/cantidad), 2)...
a) En la lista de seleccin, para indicar que queremos mostrar todas las columnas del origen indicado. b) En el origen de datos, para indicar que queremos utilizar como origen todas las tablas de la base de datos. c) A y B son ciertas. d) A y B son falsas.
7. Si a una consulta aplicamos una ordenacin mediante el ORDER BY...
a) Deberemos indicar si queremos ordenar de forma ascendente (ASC) o descendente (DESC) o dar error. b) Deberemos indicar si queremos ordenar de forma ascendente o descendente. Si no indicamos nada, se ordenar de forma ascendente por defecto. c) Deberemos indicar ASC o DESC, pero slo en caso de que se trate de un campo alfabtico. Para otros tipos de datos no funciona (como fechas o campos numricos). d) Todas son falsas.
8. La clusula DISTINCT...
a) Agiliza las consultas, porque debe mostrar menos resultados. b) Se utiliza para no mostrar las filas que repitan el mismo valor en un determinado campo (columna). c) Se utiliza para no mostrar las filas que se repitan en todos sus campos, es decir, que sea idnticas. Ralentiza la consulta porque debe evaluar al final si se repiten y eliminarlas del listado generado. d) Se ejecuta de forma predeterminada. Para que no sea as debemos indicar ALL, por ejemplo: SELECT ALL oficina FROM empleados.
9. La clusula TOP...
a) Tiene ms sentido en consultas con ORDER BY. Al ejecutarse, primero se ordenan segn un criterio y luego se extraen las N primeras. b) Puede ir acompaada de WITH TIES, si queremos mostrar todos los valores iguales al ltimo del ranking.
c) Puede ser porcentual, es decir, mostrar el 8% del total de registros, por ejemplo, para que el listado sea proporcional a su volumen. d) Todas son ciertas.
10. La clusula WHERE...
a) Permite indicar una condicin para filtrar los resultados. Por ejemplo: WHERE nombre='Juan'. b) Admite funciones. Por ejemplo: WHERE YEAR(contrato)=1985. c) Admite intervalos de valores. Por ejemplo: WHERE YEAR(contrato) BETWEEN 1985 AND 1995. d) Todas son ciertas.
Objetivo
Aprender a utilizar ms de una condicin en el predicado de una consulta, mediante las operaciones lgicas.
21 26
Badajoz Pamplona
oeste norte
108 NULL
72500,00 NULL
84400,00 200000,00
Listar las oficinas cuyas ventas no alcanzan el 50% de su objetivo. SELECT * FROM oficinas WHERE ventas < (.5 * objetivo) OR (ventas IS NULL AND objetivo IS NOT NULL); Resultado: Oficina 28 29 30 Ciudad Valencia Valencia pamplona Regin este este norte Dir NULL NULL NULL Objetivo 90000,00 10000,00 20000,00 ventas 0,00 2100,00 NULL
Objetivo
Comparar dos tablas y crear un listado resultante de la comparacin. Los registros mostrados sern los que tengan en comn.
Numemp oficina 101 102 103 104 105 106 107 108 109 110 111 112 113 12 21 12 12 13 11 22 21 NULL NULL NULL NULL NULL
Objetivo
Combinar datos de dos tablas en una nica tabla.
Recuerda que se puede utilizar la coma para separar las tablas, ya que esto equivale a escribir CROSS JOIN. Resultado: Numemp 101 101 101 102 102 102 102 103 103 103 104 105 105 105 105 106 106 106 107 107 107 108 108 Nombre Antonio Viguer Antonio Viguer Antonio Viguer Alvaro Jaumes Alvaro Jaumes Alvaro Jaumes Alvaro Jaumes Juan Rovira Juan Rovira Juan Rovira Jos Gonzlez Vicente Pantalla Vicente Pantalla Vicente Pantalla Vicente Pantalla Luis Antonio Luis Antonio Luis Antonio Jorge Gutirrez Jorge Gutirrez Jorge Gutirrez Ana Bustamante Ana Bustamante Cuota 30000,00 30000,00 30000,00 35000,00 35000,00 35000,00 35000,00 27500,00 27500,00 27500,00 20000,00 35000,00 35000,00 35000,00 35000,00 27500,00 27500,00 27500,00 30000,00 30000,00 30000,00 35000,00 35000,00 Su oficina Oficina Objetivo 12 12 12 21 21 21 21 12 12 12 12 13 13 13 13 11 11 11 22 22 22 21 21 24 29 30 22 24 29 30 24 29 30 29 22 24 29 30 24 29 30 24 29 30 22 24 25000,00 10000,00 20000,00 30000,00 25000,00 10000,00 20000,00 25000,00 10000,00 20000,00 10000,00 30000,00 25000,00 10000,00 20000,00 25000,00 10000,00 20000,00 25000,00 10000,00 20000,00 30000,00 25000,00
108 108
35000,00 35000,00
21 21
29 30
10000,00 20000,00
Objetivo
Combinar datos de dos tablas que tienen algn dato en comn, con la finalidad de ampliar la informacin en una nica tabla.
FROM oficinas INNER empleados.oficina WHERE region ='Este'; Resultado: Numemp 101 103 104 105 106 Nombre Antonio Viguer Juan Rovira Jos Gonzlez Vicente Pantalla Luis Antonio
Oficina 12 12 12 13 11
Listar todos los pedidos mostrando su nmero, importe, nombre de cliente, y el lmite de crdito del cliente correspondiente. Como la tabla de pedidos no contiene el nombre del cliente, enlazaremos ambas tablas por el dato en comn de referencia, su cdigo.
SELECT numpedido, importe, clientes.nombre AS Cliente, limitecredito FROM pedidos INNER JOIN clientes ON clie=numclie; Resultado: Numpedido Importe 110036 110037 112963 112968 112975 112979 112983 112987 112989 112992 112993 112997 113003 113007 113012 113013 113024 113027 113034 113042 113045 113048 22,50 31,50 3,276 39,78 21,00 150,00 7,02 275,00 14,58 7,60 18,96 6,52 56,25 29,25 37,45 6,52 71,00 450,00 6,32 225,00 450,00 37,50 Cliente Julian Lpez Carlos Tena Jaime Llorens Alvaro Rodrguez Cristbal Garca Cristina Bulini Jaime Llorens Jaime Llorens Luis Garca Antn Junpero Alvarez Juan Surez Juan Bolto Julia Antequera Mara Silva Cristbal Garca Junpero Alvarez Cristina Bulini Jaime Llorens Julian Lpez Luisa Maron Mara Silva Juan Malo limitecredito 3500 3500 5000 6500 500 2000 5000 5000 6500 600 650 4000 550 5000 500 600 2000 5000 3500 2000 5000 5000
Junpero Alvarez Junpero Alvarez Julia Antequera Cristbal Garca Julia Antequera Juan Bolto Juan Surez Alberto Juanes
Unidad 4. Ejercicio paso a paso: La composicin externa LEFT JOIN y RIGHT JOIN
Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.
Objetivo
Combinar datos de dos tablas que tienen algn dato en comn, con la finalidad de ampliar la informacin en una nica tabla. Tendremos en cuenta los nulos, de forma que el LEFT o el RIGHT indicarn qu tabla es la que deber aparecer, en caso de no tener correspondencia en la otra.
102
48
representante
10/12/86
108
21
Badajoz
oeste
103 104
Juan Rovira Jos Gonzlez Vicente Pantalla Luis Antonio Jorge Gutirrez Ana Bustamante Mara Sunta Juan Victor Juan Gris Julin Martorell Juan Gris
29 33
01/03/87 19/05/87
104 106
12 12
Alicante Alicante
este este
105
37
representante
12/02/88
104
13
Castellon
este
106
52
14/06/88
NULL
11
Valencia
este
107
49
14/11/88
108
22
A Corua Badajoz
oeste
108
62
dir ventas
12/10/89
106
21
oeste
109
31
representante
12/10/99
106
NULL
NULL
NULL
41 50 50
NULL 21 NULL
113
18
representante
01/01/07
NULL
NULL
NULL
NULL
Listar todas las oficinas y los nombres y ttulos de sus directores. SELECT oficinas.*, nombre AS director, titulo
FROM oficinas LEFT JOIN empleados ON dir = numemp; Resultado: Oficina 11 Ciudad Valencia Region este Dir 106 Objetivo 57500,00 Ventas 69300,00 Director Luis Antonio Titulo director general dir ventas
12
Alicante
este
104
80000,00
73500,00
13
Castellon
este
105
35000,00
36800,00
representante
21
Badajoz
oeste
108
72500,00
84400,00
dir ventas
22
A Corua
oeste
108
30000,00
18600,00
Ana Bustamante Ana Bustamante Ana Bustamante NULL NULL NULL NULL NULL NULL NULL
dir ventas
23
Madrid
centro
108
NULL
NULL
dir ventas
24
Aranjuez
centro
108
25000,00
15000,00
dir ventas
25 26 27 28 29 30 31
Listar las oficinas con objetivo superior a 60.000 euros indicando para cada una el nombre de su director. SELECT oficinas.*, nombre AS director
FROM oficinas LEFT JOIN empleados ON dir = numemp WHERE objetivo > 60000; Resultado: Oficina Ciudad Region 12 21 28 Alicante Badajoz Valencia este oeste este Dir 104 108 NULL Objetivo 80000,00 72500,00 90000,00 Ventas 73500,00 84400,00 0,00 Director Jos Gonzlez Ana Bustamante NULL
1. Listar todos los pedidos, mostrando el precio y la descripcin del producto. Resultado:
Codi Numped Fechaped go ido ido 1 110036 1989-1012 00:00:00 .000 2 110037 1989-1012 00:00:00 .000 3 112963 2008-0510 00:00:00 .000 4 112968 1990-0111 00:00:00 .000 5 112975 2008-0211 00:00:00 .000 6 112979 1989-1012 00:00:00 .000 7 112983 2008-0510 00:00:00 .000 8 112987 2008-0101 00:00:00 .000 9 112989 2008-1210 00:00:00 .000 10 112992 1990-0415
Clie Re Fab Produ Ca Impo Preci descripc p cto nt rte o ion 21 11 aci 4100 9 22,5 NU mont 07 0 z 0 LL
21 17
10 rei 6
2a44l 7
31,5 0
45,0 0
bomba l
21 03
10 aci 5
4100 4
28 3,27 6
NU LL
art t4
21 02
10 aci 1
4100 4
34 39,7 8
NU LL
art t4
21 11
10 rei 3
2a44 g
21,0 0
3,50
pas
21 14
10 aci 8
4100 z
150, 00
NU LL
mont
21 03
10 aci 5
4100 4
7,02
NU LL
art t4
21 03
10 aci 5
4100 y
11 275, 00
NU LL
extract or
21 01
10 fea 114 6
14,5 8
2,43
cubo
21 18
10 aci 8
4100 2
10 7,60
NU LL
bisagra
11
112993
12
112997
13
113003
14
113007
15
113012
16
113013
17
113024
18
113027
19
113034
20
113042
21
113045
00:00:00 .000 2008-0310 00:00:00 .000 2008-0404 00:00:00 .000 2008-0205 00:00:00 .000 2008-0101 00:00:00 .000 2008-0505 00:00:00 .000 2008-1228 00:00:00 .000 2008-0704 00:00:00 .000 2008-0205 00:00:00 .000 2008-1105 00:00:00 .000 2008-0101 00:00:00 .000 2008-07-
21 06
10 rei 2
2a45 c
24 18,9 6
0,79
junta
21 24
10 bic 4100 7 3
6,52
6,52
manive la
21 08
10 im 9 m
779c
56,2 5
18,7 5
reostat o3
21 12
10 im 8 m
773c
29,2 5
9,75
reostat o
21 11
10 aci 5
4100 3
35 37,4 5
NU LL
art t3
21 18
10 bic 4100 8 3
6,52
6,52
manive la
21 14
10 qs 8 a
xk47
20 71,0 0
3,55
red
21 03
10 aci 5
4100 2
54 450, 00
NU LL
bisagra
21 07
11 rei 0
2a45 c
6,32
0,79
junta
21 13
10 rei 1
2a44r 5
225, 00
45,0 0
bomba r
21
11 rei
2a44r 10 450,
45,0
bomba
22
113048
23
113049
24
113051
25
113055
26
113057
27
113058
28
113062
29
113065
30
113069
02 00:00:00 .000 2008-0202 00:00:00 .000 2008-0404 00:00:00 .000 2008-0706 00:00:00 .000 2009-0401 00:00:00 .000 2008-1101 00:00:00 .000 1989-0704 00:00:00 .000 2008-0704 00:00:00 .000 2008-0603 00:00:00 .000 2008-0801 00:00:00 .000
12
00
21 20
10 im 2 m
779c
37,5 0
18,7 5
reostat o3
21 18
10 qs 8 a
xk47
7,76
3,55
red
21 18
10 qs 8 a
xk47
14,2 0
3,55
red
21 08
10 aci 1
4100 x
1,50
NU LL
junta
21 11
10 aci 3
4100 x
24 NU LL
NU LL
junta
21 08
10 fea 112 9
10 14,8 0
1,48
cubo
21 24
10 bic 4100 7 3
10 24,3 0
6,52
manive la
21 06
10 qs 2 a
xk47
21,3 0
3,55
red
21 09
10 im 7 m
773c
22 313, 50
9,75
reostat o
2. Listar los pedidos superiores a 250 euros, incluyendo el nombre del vendedor que tom el pedido y el nombre del cliente que lo solicit. Resultado:
Numpedi Fechapedi Clie Rep Fab Produc Can Precio Cliente vendedo do do to t r 112987 01/01/08 210 10 aci 4100y 11 275, Jaime Vicent 3 5 00 Llore e ns Pantall a 113027 05/02/08 210 10 aci 41002 54 450, Jaime Vicent 3 5 00 Llore e ns Pantall a 113045 02/07/08 211 11 rei 2a44r 10 450, Mara Juan 2 0 00 Silva Victor 113069 01/08/08 210 10 im 773c 22 313, Alber Jorge 9 7 m 50 to Gutirr Juane ez s
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 Fechaped Clie Re Fab Produ Ca Impo Client Vendedo go dido ido p cto nt rte e r asignado 8 112987 200821 10 aci 4100 11 275, Jaim Juan 01-01 03 5 y 00 e Victor 00:00:00 Llor .000 ens 18 113027 200821 10 aci 4100 54 450, Jaim Juan 02-05 03 5 2 00 e Victor 00:00:00 Llor .000 ens 21 113045 200821 11 rei 2a44r 10 450, Mar Ana 07-02 12 0 00 a Bustam 00:00:00 Silva ante .000 30 113069 200821 10 im 773c 22 313, Albe Juan 08-01 09 7 m 50 rto Rovira 00:00:00 Juan
.000
es
Puedes consultar aqu las soluciones propuestas. 4. 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. Resultado:
Cliente
2103 105 Jaime Llorens 2103 105 Jaime Llorens 2112 110 Mara Silva 2109 107 Alberto Juanes
Vendedor asignado Juan Victor Juan Victor Ana Bustamante Juan Rovira
5. Hallar los pedidos recibidos los das en que un nuevo empleado fue contratado. Resultado:
Numpedido Fechapedido 110036 1989-10-12 00:00:00.000 110037 1989-10-12 00:00:00.000 112979 1989-10-12 00:00:00.000
Rep Numemp Nombre 110 108 Ana Bustamante 106 108 Ana Bustamante 108 108 Ana Bustamante
6. Hallar los empleados que realizaron su primer pedido el mismo da que fueron contratados. Resultado:
7. Mostrar de cada empleado su cdigo, nombre, ventas, oficina y ciudad en la que est ubicada su oficina. Resultado:
Numemp Nombre 101 Antonio Viguer 102 Alvaro Jaumes 103 Juan Rovira 104 Jos Gonzlez 105 Vicente Pantalla 106 Luis Antonio 107 Jorge Gutirrez 108 Ana Bustamante 109 Mara Sunta 110 Juan Victor 111 Juan Gris 112 Julin Martorell 113 Juan Gris
ventas 30500,00 47400,00 28600,00 14300,00 36800,00 29900,00 18600,00 36100,00 39200,00 7600,00 60000,00 91000,00 0,00
ciudad Alicante Badajoz Alicante Alicante Castellon Valencia A Corua Badajoz NULL NULL NULL NULL NULL
Puedes consultar aqu las soluciones propuestas. 8. 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. Resultado:
Numemp Nombre 101 Antonio Viguer 103 Juan Rovira 105 Vicente Pantalla 108 Ana Bustamante
Nombre jefe Jos Gonzlez Jos Gonzlez Jos Gonzlez Luis Antonio
9. 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. Resultado:
Numemp Nombre 101 Antonio Viguer 103 Juan Rovira 105 Vicente Pantalla 108 Ana Bustamante 111 Juan Gris
Nombre jefe Jos Gonzlez Jos Gonzlez Jos Gonzlez Luis Antonio Juan Victor
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 104 Jos Gonzlez 105 Vicente Pantalla 107 Jorge Gutirrez 108 Ana Bustamante
Nombre jefe Luis Antonio Jos Gonzlez Ana Bustamante Luis Antonio
Oficina jefe 11 12 21 11
11. En el punto anterior no salen los que no tienen oficina, cambiar la sentencia para que aparezcan. Resultado:
Numemp Nombre 104 Jos Gonzlez 105 Vicente Pantalla 107 Jorge Gutirrez 108 Ana Bustamante 109 Mara Sunta 110 Juan Victor 111 Juan Gris
Nombre jefe Luis Antonio Jos Gonzlez Ana Bustamante Luis Antonio Luis Antonio Jos Gonzlez Juan Victor
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 Nombre p 104 Jos Gonzlez 105 Vicente Pantalla 107 Jorge Gutirrez 108 Ana Bustamant e Mara
Nombre jefe Luis Antonio Jos Gonzlez Ana Bustamant e Luis Antonio Luis
11
Valenci a Valenci
109
NUL
NULL
11
110 111
L NUL L 21
NULL Badajoz
6 10 4 11 0
12 NUL L
a Alicant e NULL
3. Listar los pedidos superiores a 250 euros, incluyendo el nombre del vendedor que tom el pedido y el nombre del cliente que lo solicit. 4. SELECT numpedido, CONVERT(CHAR(8),fechapedido,3) AS fechapedido, clie, rep, fab, producto, cant, importe, clientes.nombre AS cliente, empleados.nombre AS vendedor 5. FROM (pedidos INNER JOIN empleados ON 6. rep = numemp) = numclie
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. 8. SELECT pedidos.*, clientes.nombre AS cliente, empleados.nombre AS [vendedor asignado]
empleados
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. 13. 14. numemp) 15. LEFT empleados.oficina=oficinas.oficina JOIN oficinas ON SELECT numpedido, clie, rep, clientes.nombre cliente, repclie, empleados.nombre AS vendedor, ciudad FROM ((pedidos INNER JOIN clientes ON INNER JOIN empleados AS
250;
16. Hallar los pedidos recibidos los das en que un nuevo empleado fue contratado. 17. 18. SELECT contrato numpedido, fechapedido, rep, numemp, nombre,
WHERE fechapedido=contrato;
19. Hallar los empleados que realizaron su primer pedido el mismo da que fueron contratados. 20. 21. SELECT fechapedido numemp, nombre, contrato, numpedido, rep = numemp rep,
22. Mostrar de cada empleado su cdigo, nombre, ventas, oficina y ciudad en la que est ubicada su oficina.
23.
SELECT nombre,empleados.ventas,empleados.oficina,ciudad
numemp,
oficinas
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]
empleados.jefe =
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. 28. 29. SELECT empleados.numemp, empleados.nombre, empleados.cuota, empleados.jefe, jefes.nombre, jefes.cuota FROM empleados INNER empleados.jefe = jefes.numemp JOIN empleados OR jefes ON
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. 32. SELECT e.numemp, e.nombre, e.oficina, e.jefe, j.nombre as [nombre jefe], j.oficina AS [oficina jefe] FROM empleados e INNER JOIN empleados j ON j.numemp e.jefe =
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.
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 FROM (oficinas ofiemp ofiemp.oficina= e.oficina) RIGHT JOIN empleados e ON
INNER JOIN (empleados j LEFT JOIN oficinas ofijefe ON j.oficina = ofijefe.oficina) ON e.jefe = j.numemp
FROM gestionA.dbo.empleados;
ambas tablas se referencie a un cdigo. b) Tener el mismo esquema de tabla, es decir, mismo nmero de columnas y mismo tipo de datos, en el mismo orden. c) Tener registros (filas) en comn. d) Estar en la misma base de datos.
2. Cuando utilizamos UNION con dos tablas, sin incluir una clusula ORDER BY, se muestra una nica tabla...
a) Situando los registros de la primera tabla de la sentencia SQL a la derecha. Se mantienen los encabezados de ambas. b) Situando los registros de la primera tabla de la sentencia SQL a la izquierda. Se mantienen los encabezados de ambas. c) Situando los registros de la primera tabla de la sentencia SQL encima de la segunda. Se utilizan los encabezados de la primera. d) Situando los registros de la segunda tabla de la sentencia SQL encima de la primera. Se utilizan los encabezados de la segunda.
3. Cuando utilizamos UNION...
a) Es una buena prctica escribir la clusula DISTINCT, para que se eliminen los registros repetidos. b) No necesitamos incluir un DINSTINCT, porque lo realiza automticamente, a menos que indiquemos lo contrario (ALL). c) No podremos utilizar las clusulas DISTINCT/ALL. d) La consulta se realiza ms rpidamente porque por defecto ejecuta la clusula DISTINCT.
4. Las clusulas INTERSECT y EXCEPT:
a) Tienen una sintaxis similar. b) Se basan en la comparacin de tablas. Una muestra los registros que tienen en comn y la otra los que estn en la primera tabla pero no en la segunda. c) A y B son ciertas. d) A y B son falsas.
5. UNION, INTERSECT y EXCEPT slo permiten comparar tablas que tienen el mismo esquema.
a) Verdadero. b) Falso.
6. Seala la afirmacin incorrecta. La composicin de tablas...
a) Amplia la informacin de una tabla con la de otra, emparejando filas. b) Muestra datos de dos tablas, que pueden tener un esquema diferente. c) Se consigue indicando ms de una tabla de origen en la FROM. d) Precisa obligatoriamente de la clusula ON, donde se indica la columna que tienen en comn ambas tablas.
7. Indica si la siguiente sentencia es correcta: SELECT * FROM empleados INNER JOIN oficinas ON oficina = oficina;
a) No, porque en las tablas compuestas no se puede utilizar la palabra clave *. b) No, porque si el campo se llama igual en ambas tablas hay que cualificarlo: empleados.oficina y oficinas.oficina. c) No, porque la sentencia correcta sera: SELECT * FROM empleados, oficinas WHERE empleados.oficina=oficinas.oficina;. d) S, es correcta.
8. Se pueden incluir varias combinaciones de tablas en una nica consulta.
a) Verdadero. b) Falso.
Objetivo
Realizar consultas de resumen utilizando funciones de agregado. En este caso MAX.
SELECT MAX(ventas - cuota) AS [Mejor superavit] FROM empleados; Resultado: Mejor superavit 81000,00
Objetivo
Realizar consultas de resumen utilizando funciones de agregado. En este caso SUM.
Cul es el importe total de los pedidos realizados por el empleado Luis Antonio? SELECT SUM(importe) AS [Importe vendido] FROM pedidos INNER JOIN empleados ON rep = numemp WHERE nombre = 'Luis Antonio'; Resultado: Importe vendido 46,08
Objetivo
Realizar consultas de resumen utilizando funciones de agregado. En este caso AVG.
Tambin podramos presentar los valores de una forma ms elegante si realizamos un redondeado a las ventas: SELECT AVG(cuota) AS [Cuota media], ROUND(AVG(ventas),2) AS [Ventas medias] FROM empleados;
De media, cunto supervit obtienen los empleados, considerando supervit la diferencia entre lo vendido y su cuota? SELECT AVG(ventas-cuota) AS [Supervit medio] FROM empleados; Resultado: Supervit medio
13283,3333
Hallar el precio medio de los productos del fabricante bic. SELECT AVG(precio) AS [Precio medio] FROM productos WHERE idfab = 'bic'; Resultado: Precio medio 3,5233
Calcular el importe medio de los pedidos realizados por el cliente 2103. SELECT AVG(importe) AS [importe medio] FROM pedidos WHERE clie = 2103; Resultado: importe medio 183,824
Objetivo
Realizar consultas de resumen utilizando la clusula GROUP BY para agrupar filas.
Resultado: rep Importe medio 101 102 103 105 106 107 108 109 110 88,76 25,92 21,00 154,5492 23,04 114,7733 40,9042 35,525 159,6066
Repetir la consulta pero para que tambin salgan los empleados que no han vendido nada. SELECT numemp, AVG(importe) AS [Importe medio] FROM pedidos RIGHT JOIN empleados ON rep = numemp GROUP BY numemp; Resultado: rep Importe medio 101 102 103 104 105 106 107 108 88,76 25,92 21,00 NULL 154,5492 23,04 114,7733 40,9042
Cul es en cada una de las oficinas, el rango de cuotas asignadas a sus vendedores? SELECT oficinas.oficina, MIN(cuota) AS [Cuota mnima], MAX(cuota) AS [Cuota mxima] FROM oficinas oficinas.oficina LEFT JOIN empleados ON empleados.oficina =
GROUP BY oficinas.oficina; Resultado: oficina Cuota mnima Cuota mxima 11 12 13 21 22 23 24 25 26 27 28 29 30 27500,00 20000,00 35000,00 10000,00 30000,00 NULL NULL NULL NULL NULL NULL NULL NULL 27500,00 30000,00 40000,00 35000,00 30000,00 NULL NULL NULL NULL NULL NULL NULL NULL
31
NULL
NULL
Listar cuntos empleados estn asignados a cada oficina, incluso las que no tienen. SELECT oficinas.oficina, COUNT(numemp) AS Empleados FROM oficinas oficinas.oficina LEFT JOIN empleados ON empleados.oficina =
Listar cuntos clientes son atendidos por cada empleado (el cliente ha realizado un pedido con l). SELECT rep, COUNT(DISTINCT clie) AS [Clientes atendidos] FROM pedidos
Objetivo
Filtrar los resultados de una consulta de resumen con GROUP BY, mediante la clusula HAVING.
Si quisiramos que adems aparezca el nombre del empleado: SELECT rep, nombre, AVG(importe) AS [Importe medio] FROM empleados INNER JOIN pedidos ON numemp = rep GROUP BY rep, nombre HAVING SUM(importe) > 300; rep 105 107 110 nombre Vicente Pantalla Jorge Gutirrez Juan Victor Importe medio 154,5492 114,7733 159,6066
Por cada oficina con 2 o ms personas, calcula la cuota total y las ventas totales de todos los empleados que trabajan en la oficina, de la oficina queremos el nmero y la ciudad. SELECT oficinas.oficina, ciudad, SUM(empleados.ventas) AS ventas FROM empleados oficinas.oficina INNER JOIN SUM(cuota) ON AS [Cuota total], =
oficinas
empleados.oficina
GROUP BY oficinas.oficina, ciudad HAVING COUNT(*) > 2; Resultado: oficina ciudad Cuota total 12 21 Alicante Badajoz 77500,00 80000,00 ventas 73400,00 143500,00
Valencianas 4
2. Hallar cuntos pedidos hay de ms de 250 euros. Resultado:
Superiores a 250 4
3. Cuntos ttulos (cargos) de empleados se usan? Resultado:
Cuntos ttulos 3
4. Entre qu cuotas se mueven los empleados? Resultado:
numemp nombre 101 Antonio Viguer 102 Alvaro Jaumes 103 Juan Rovira 104 Jos Gonzlez 105 Vicente Pantalla
Luis Antonio Jorge Gutirrez Ana Bustamante Mara Sunta Juan Victor Juan Gris Julin Martorell Juan Gris Pablo Moreno
Puedes consultar aqu las soluciones propuestas. 2. De cada empleado, obtener el importe vendido a cada cliente. Resultado:
rep 106 101 105 102 110 101 109 107 103 105 108 110 101 108 106 108 102 107
Cliente Importe vendido 2101 14,58 2102 39,78 2103 735,296 2106 40,26 2107 28,82 2108 1,50 2108 71,05 2109 313,50 2111 21,00 2111 37,45 2112 29,25 2112 450,00 2113 225,00 2114 221,00 2117 31,50 2118 36,08 2120 37,50 2124 30,82
3. Repetir la consulta anterior pero ahora deben aparecer tambin los empleados que no han vendido nada. Resultado:
rep 101 101 101 102 102 103 104 105 105 106 106 107 107 108 108 108 109 110 110 111 112 113 114
Cliente 2102 2108 2113 2106 2120 2111 NULL 2103 2111 2101 2117 2109 2124 2112 2114 2118 2108 2107 2112 NULL NULL NULL NULL
Importe vendido 39,78 1,50 225,00 40,26 37,50 21,00 NULL 735,296 37,45 14,58 31,50 313,50 30,82 29,25 221,00 36,08 71,05 28,82 450,00 NULL NULL NULL NULL
Puedes consultar aqu las soluciones propuestas. 4. Repetir la consulta pero ahora debe aparecer tambin el total de cunto ha vendido cada empleado. (Recuerda una opcin de la clusula GROUP BY) Resultado:
rep clie Importe vendido NULL NULL 2364,386 101 NULL 266,28 101 2102 39,78
101 101 102 102 102 103 103 104 104 105 105 105 106 106 106 107 107 107 108 108 108 108 109 109 110 110 110 111 111 112 112 113 113 114 114
2108 2113 NULL 2106 2120 NULL 2111 NULL NULL NULL 2103 2111 NULL 2101 2117 NULL 2109 2124 NULL 2112 2114 2118 NULL 2108 NULL 2107 2112 NULL NULL NULL NULL NULL NULL NULL NULL
1,50 225,00 77,76 40,26 37,50 21,00 21,00 NULL NULL 772,746 735,296 37,45 46,08 14,58 31,50 344,32 313,50 30,82 286,33 29,25 221,00 36,08 71,05 71,05 478,82 28,82 450,00 NULL NULL NULL NULL NULL NULL NULL NULL
Puedes consultar aqu las soluciones propuestas. 5. En los resultados anteriores no se distinguen bien las lneas que corresponden a totales. Modificar la consulta para obtener este resultado:
rep NULL 101 101 101 101 102 102 102 103 103 104 104 ...
6.
clie NULL NULL 2102 2108 2113 NULL 2106 2120 NULL 2111 NULL NULL ....
Importe vendido 2364,386 266,28 39,78 1,50 225,00 77,76 40,26 37,50 21,00 21,00 NULL NULL ... (sigue)
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 NULL 101 101 101 101 102 102 102 103 103
clie NULL NULL 2102 2108 2113 NULL 2106 2120 NULL 2111
Importe vendido 2364,386 266,28 39,78 1,50 225,00 77,76 40,26 37,50 21,00 21,00
Agrupa numemp Total empleado Total final Total empleado Agrupa clie
Total empleado
Total empleado
Puedes consultar aqu las soluciones propuestas. 8. Ahora coloca las columnas Agrupa delante de las dems columnas: Resultado:
Agrupa Agrupa clie rep clie numemp Total final Total empleado NULL NULL Total empleado 101 NULL 101 2102 101 2108 101 2113 Total empleado 102 NULL 102 2106 102 2120 Total empleado 103 NULL 103 2111 104 NULL Total empleado 104 NULL ... (sigue) ... ... ....
Importe vendido 2364,386 266,28 39,78 1,50 225,00 77,76 40,26 37,50 21,00 21,00 NULL NULL ...
Puedes consultar aqu las soluciones propuestas. 9. Ahora queremos que "Total empleado" aparezca en la columna clie. Piensa primero en cuntas columnas quieres y luego en cada columna que tiene que salir. Resultado:
Agrupa numemp clie numemp Total final NULL Total empleado 101 Total empleado 101 2102 101 2108 101 2113
... (sigue)
Total empleado 2106 2120 Total empleado 2111 NULL Total empleado ....
Puedes consultar aqu las soluciones propuestas. 10. 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. Resultado:
Agrupa numemp clie numemp Total final NULL Total empleado 101 2102 101 2108 101 2113 101 Total empleado 102 2106 102 2120 102 Total empleado 103 2111 103 Total empleado 104 104 Total empleado ... (sigue) ... ....
Importe vendido 2364,386 39,78 1,50 225,00 266,28 40,26 37,50 77,76 21,00 21,00 0,00 0,00 ...
Nota: Recuerda la funcin ISNULL() (para la columna importe vendido) y la funcin CASE con diferentes condiciones (para la columna clie). Puedes consultar aqu las soluciones propuestas. 11. Lo rematamos para que el resultado quede as:
clie
... (sigue)
101 101 101 101 102 102 102 103 103 104 104 ...
2102 2108 2113 Total empleado 2106 2120 Total empleado 2111 Total empleado
39,78 1,50 225,00 266,28 40,26 37,50 77,76 21,00 21,00 0,00 Total empleado 0,00 .... ...
FROM empleados;
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 empleado' END AS [Agrupa clie], 0 THEN ' ' WHEN 1 THEN 'Total
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) 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; WHEN 1
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 THEN 'Total empleado' WHEN clie IS NULL THEN ' ' ELSE CONVERT(CHAR(4),clie) END AS [Clie], ISNULL(SUM(importe),0) AS [Importe vendido] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, clie WITH ROLLUP ORDER BY numemp,clie; 10. Lo rematamos para que la fila del Total final no muestre los valores "NULL" ni "Total empleado". En cambio, los cambiaremos por tres puntos. Tampoco mostraremos el encabezado "Agrupa numemp". SELECT CASE GROUPING(numemp) WHEN 0 THEN ' ' ELSE 'Total Final' END AS [ ], ISNULL(CONVERT(CHAR(3),numemp),'... ') AS [numemp], CASE WHEN GROUPING(clie) = 1 AND GROUPING(numemp) = 0 THEN 'Total empleado' WHEN GROUPING(clie) = 1 AND GROUPING(numemp) = 1 THEN '...' WHEN clie IS NULL THEN ' ' ELSE CONVERT(CHAR(4),clie) END AS [Clie], ISNULL(SUM(importe),0) AS [Importe vendido] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, clie WITH ROLLUP ORDER BY numemp,clie;
columna. b) Hacen que se ejecute una consulta de resumen, de forma que es posible que no veamos los registros originales, sino el resultado del clculo que se ha realizado sobre ellos. c) A y B son ciertas. d) A y B son falsas.
2. DISTINCT no se puede utilizar en las consultas de resumen.
a) Verdadero. b) Falso.
3. Si aplicamos la clusula WHERE en una consulta cuya lista de seleccin contiene una funcin de columna, por ejemplo SUM()...
a) El WHERE se ejecuta antes de realizar el sumatorio. b) El WHERE se ejecuta despus de realizar el sumatorio. c) El WHERE no se ejecuta. d) La consulta dar error, porque debemos utilizar HAVING.
4. La funcin COUNT(numemp) incluye en su recuento los valores NULL.
a) Verdadero. b) Falso.
5. La funcin COUNT(*) incluye en su recuento las filas que contienen valores NULL.
a) Verdadero. b) Falso.
6. Si una consulta contiene en su lista de seleccin columnas y funciones a la vez, por ejemplo: SELECT oficina, COUNT(numemp) as [Num empleados]...
a) El GROUP BY deber contener obligatoriamente las columnas no calculadas, en este caso oficina. b) El GROUP BY deber contener obligatoriamente las columnas calculadas, en este caso COUNT(numemp) as [Num empleados].
a) Muestran filas de resumen. b) Se incluyen en la clusula GROUP BY. c) A y B son ciertas. d) A y B son falsas.
8. La funcin de agregado GROUPING...
a) Se indica en la lista de seleccin, y sirve para saber si se trata de una fila de resumen, resultado de un CUBE o un ROLLUP. b) Muestra una fila ms, que incluye el total final de la funcin de agregado. c) No se puede utilizar en consultas que incluyan un GROUP BY. d) Se escribe a continuacin del GROUP BY.
9. La clusula HAVING...
a) Acta sobre las filas resultantes de una consulta de resumen y funciona igual que la clusula WHERE. b) Acta igual que la clusula WHERE, sobre las filas origen. c) Se puede utilizar en consultas sin GROUP BY. d) Slo se puede utilizar en consultas con ORDER BY.
Objetivo
Realizar consultas que incluyan una subconsulta en la clusula WHERE. Se realizarn utilizando operadores de comparacin.
Listar todos los productos (cdigo, descripcin y stock) del fabricante ACI y cuyas existencias superan las existencias del producto ACI-41004. SELECT idfab, idproducto, descripcion, existencias FROM productos WHERE idfab = 'ACI' AND existencias > (SELECT existencias FROM productos WHERE idfab = 'ACI' AND idproducto = '41004'); Resultado: idfab idproducto descripcion existencias aci aci aci 41001 41002 41003 arandela bisagra art 13 277 167 207
Listar los empleados (numemp, nombre y edad) que tienen una cuota por encima de la media. SELECT numemp, nombre, edad FROM empleados WHERE cuota > (SELECT AVG(cuota) Resultado: numemp 101 102 103 105 106 107 108 nombre Antonio Viguer Alvaro Jaumes Juan Rovira Vicente Pantalla Luis Antonio Jorge Gutirrez Ana Bustamante edad 45 48 29 37 52 49 62 FROM empleados);
114
Pablo Moreno
45
Obtener cuntos empleados tienen una cuota por encima de la media, y la edad media de estos. SELECT count(*) AS Cuantos, AVG(edad) AS [Edad Media] FROM empleados WHERE cuota > (SELECT AVG(cuota) Resultado: Cuantos Edad Media 8 45 FROM empleados);
Listar todas las oficinas cuyos objetivos superan la suma de las cuotas de sus vendedores. SELECT oficina, ciudad FROM oficinas WHERE objetivo > (SELECT SUM(cuota) oficinas.oficina); Resultado: oficina ciudad 11 12 Valencia Alicante FROM empleados WHERE oficina =
Objetivo
Realizar consultas que incluyan una subconsulta en la clusula WHERE, introducida por el operador IN.
SELECT numclie,nombre FROM clientes WHERE numclie IN (SELECT clie FROM pedidos WHERE fab = 'ACI' AND producto LIKE '4100%' fechapedido <'16/04/90'); Resultado: numclie 2102 2118 nombre Alvaro Rodrguez Junpero Alvarez AND fechapedido >= '01/01/90' AND
Listar los empleados (numemp, nombre) que han realizado un pedido que represente ms del 1% de su cuota. SELECT numemp, nombre FROM empleados WHERE numemp IN (SELECT rep FROM pedidos WHERE importe > cuota* 0.01); Resultado: numemp 105 107 109 nombre Vicente Pantalla Jorge Gutirrez Mara Sunta
Objetivo
Realizar una consulta que, en su WHERE, compare con el resultado de una subconsulta mediante el test ANY.
Listar los numclie y nombres de los clientes que tienen asignado el representante Juan Gris. SELECT numclie, nombre FROM clientes WHERE repclie = ANY (SELECT numemp FROM empleados WHERE nombre = 'Juan Gris'); Resultado: numclie 2125 nombre Pepito Grillo
Esta consula tambin podra haberse realizado con el operador IN. Listar los empleados (numemp, nombre y oficina) que trabajan en oficinas "buenas" (las que han vendido ms que su objetivo). SELECT numemp, nombre, oficina FROM empleados WHERE oficina = ANY (SELECT oficina FROM oficinas WHERE ventas > objetivo); Resultado: numemp 102 105 106 108 111 114 nombre Alvaro Jaumes Vicente Pantalla Luis Antonio Ana Bustamante Juan Gris Pablo Moreno oficina 21 13 11 21 21 13
Objetivo
Realizar una consulta que, en su WHERE, compruebe si el registro en cuestin existe como resultado de otra consulta. Para ello, utilizaremos una subconsulta precedida de EXISTS o NOT EXISTS.
Listar los productos (clave y descripcion) para los cuales no se ha recibido ningn pedido de 10 euros o ms.
SELECT idfab, idproducto, descripcion FROM productos WHERE NOT EXISTS (SELECT * FROM pedidos WHERE importe >= 10); Resultado: idfab idproducto descripcion aci aci bic bic imm imm imm imm qsa qsa 41001 4100x 41089 41672 775c 887h 887p 887x xk48 xk8a arandela junta rodamiento plato reostato 2 caja clavos perno manivela red red idfab = fab
Listar las oficinas (oficina, ciudad) que tienen al menos un empleado cuya cuota represente ms del 55% del objetivo de la oficina. SELECT oficina, ciudad FROM oficinas WHERE EXISTS (SELECT * FROM empleados =
WHERE oficinas.oficina empleados.oficina AND cuota > (.55 * objetivo)); Resultado: oficina 13 ciudad Castelln
22
A Corua
Listar los empleados (numemp, nombre y edad) que no dirigen una oficina. SELECT numemp, nombre, edad FROM empleados WHERE NOT EXISTS (SELECT * FROM oficinas WHERE dir = numemp); Resultado: numemp 101 102 103 107 109 110 111 112 113 114 nombre Antonio Viguer Alvaro Jaumes Juan Rovira Jorge Gutirrez Mara Sunta Juan Victor Juan Gris Julin Martorell Juan Gris Pablo Moreno edad 45 48 29 49 31 41 50 50 18 45
2125
Pepito Grillo
2. Listar los empleados (numemp, nombre) mayores de 40 aos que dirigen a un vendedor con supervit (ha vendido ms que su cuota). numemp 106 108 110 nombre Luis Antonio Ana Bustamante Juan Victor
3. Listar los empleados (cdigo de empleado) cuyo importe de pedido medio para productos fabricados por ACI es superior al importe medio global (de todos los pedidos de todos los empleados). rep 105
Puedes consultar aqu las soluciones propuestas. 4. Listar los empleados (numemp, nombre, ventas) cuyas ventas son iguales o superiores al objetivo de las oficinas de una determinada ciudad (de todas las oficinas de esa ciudad). Las oficinas con objetivo nulo no se deben de tener en cuenta (como si no existiesen). Y si no hay oficinas en la ciudad no queremos que salga ningn empleado. Intentar primero resolver la consulta utilizando >=ALL. Probar primero con A Corua: numemp 102 111 112 nombre Alvaro Jaumes Juan Gris Julin Martorell ventas 47400,00 60000,00 91000,00
Ahora con Pamplona. Pamplona tiene una oficina con objetivo nulo, en este caso no queremos que esa oficina cuente. numemp 101 102 nombre Antonio Viguer Alvaro Jaumes ventas 30500,00 47400,00
Juan Rovira Vicente Pantalla Luis Antonio Ana Bustamante Mara Sunta Juan Gris Julin Martorell Pablo Moreno
Para Barcelona. En este caso no tenemos oficinas en Barcelona por lo que no tiene que salir ningn empleado. Ahora para Madrid. Como en Madrid slo hay una oficina y no tiene objetivo no tiene que salir ningn empleado. Intentar resolver la consulta sin utilizar ALL. 5. Listar las oficinas en donde todos los empleados tienen ventas que superan al 50% del objetivo de la oficina. oficina 11 13 22 ciudad Valencia Castellon A Corua
WHERE nombre LIKE 'Juan%') AND NOT EXISTS (SELECT * FROM pedidos
WHERE numclie = clie AND importe > 300); 2. Listar los empleados (numemp, nombre) mayores de 40 aos que dirigen a un vendedor con supervit (ha vendido ms que su cuota). SELECT numemp, nombre FROM empleados WHERE edad > 40 and numemp IN (SELECT jefe FROM empleados WHERE ventas > cuota ); 3. Listar los empleados (cdigo de empleado) cuyo importe de pedido medio para productos fabricados por ACI es superior al importe medio global (de todos los pedidos de todos los empleados). SELECT rep FROM pedidos WHERE fab = 'ACI'
GROUP BY rep HAVING AVG(importe) > (SELECT AVG(importe) FROM pedidos); 4. Listar los empleados (numemp, nombre, ventas) cuyas ventas son iguales o superiores al objetivo de las oficinas de una determinada ciudad (de todas las oficinas de esa ciudad). Las oficinas con objetivo nulo no se deben de tener en cuenta (como si no existiesen). Y si no hay oficinas en la ciudad no queremos que salga ningn empleado. Intentar primero resolver la consulta utilizando >=ALL. Probar primero con A Corua: SELECT numemp, nombre, ventas FROM empleados WHERE ventas >= ALL (SELECT objetivo FROM oficinas WHERE ciudad = 'A Corua'); Ahora con Pamplona. Pamplona tiene una oficina con objetivo nulo, en este caso no queremos que esa oficina cuente. SELECT numemp, nombre, ventas FROM empleados
WHERE ventas >= ALL (SELECT objetivo FROM oficinas WHERE ciudad = 'Pamplona' and objetivo is not null); Para Barcelona. En este caso no tenemos oficinas en Barcelona por lo que no tiene que salir ningn empleado. Si no queremos que salgan tendremos que aadir una condicin: SELECT numemp, nombre, ventas FROM empleados WHERE ventas >= ALL (SELECT objetivo FROM oficinas WHERE ciudad = 'Barcelona' and objetivo is not null) AND EXISTS (SELECT * FROM oficinas WHERE ciudad = 'Barcelona'); Ahora para Madrid. Como en Madrid slo hay una oficina y no tiene objetivo no tiene que salir ningn empleado. SELECT numemp, nombre, ventas FROM empleados WHERE ventas >= ALL (SELECT objetivo FROM oficinas WHERE null) AND EXISTS (SELECT * FROM oficinas WHERE null); Esta sera la consulta definitiva que nos servira para cualquier situacin. Pero como se ve el modificador ALL puede darnos problemas. Para solucionarlo, realizamos la siguiente consulta. Intentar resolver la consulta sin utilizar ALL. SELECT numemp, nombre, ventas FROM empleados ciudad = 'Madrid' and objetivo is not ciudad = 'Madrid' and objetivo is not
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 oficinas.oficina); empleados WHERE empleados.oficina =
a) Se escriben entre corchetes. b) Se escriben entre parntesis. c) Se escriben entre llaves. d) Se finalizan con un punto y coma (;).
2. Las subconsultas no pueden contener la clusula ORDER BY.
a) A menos que contengan, adems, la clusula TOP. b) Porque no tendra sentido, ya que la subconsulta sirve para realizar una comprobacin y no se va a visualizar. c) A y B son ciertas. d) A y B son falsas, ya que no hay problema en incluir un ORDER BY dentro de una subconsulta.
3. La subconsulta...
a) Un campo que no se encuentra en el origen de datos de la subconsulta, sino en el de la consulta principal. b) Un campo que no se encuentra en el origen de datos de la consulta principal, sino que es exclusivo de la propia subconsulta.
5. Las subconsultas normalmente se utilizan en las clusulas...
a) Normalmente ser necesario utilizar una referencia externa. b) Se utiliza la palabra clave * en la lista de seleccin, porque lo que se evala es si devuelve o no filas, y no nos interesa ningn campo en particular. c) A y B son ciertas. d) A y B son falsas.
7. Utilizar la expresin IN es equivalente a utilizar = ANY.
a) Verdadero. b) Falso.
8. La subconsulta necesariamente debe tener un origen (FROM) diferente al de la consulta principal (externa).
a) No, son independientes. Pueden ejecutar consultas tanto sobre la misma tabla o vista como sobre orgenes diferentes. b) No, porque las subconsultas no tienen origen de datos FROM. c) S, porque no se puede ejecutar dos consultas sobre la misma tabla o vista a
a) Verdadero. b) Falso.
Unidad 7. Ejercicio paso a paso: Insertar datos creando una nueva tabla
Nota: Para realizar los ejercicios necesitars la base de datos Gestion8.
Objetivo
Crear una tabla a partir de los datos de otra, con SELECT ... INTO.
Objetivo
Insertar una fila de datos en una tabla ya existente.
Lpez','Vendedor',
GETDATE(),
Aadir a la oficina 40 otro empleado, Luis Valverde, con nmero de empleado 436, con los mismos datos que el anterior pero su jefe ser el director de la oficina 40 (no sabemos qu nmero tiene). INSERT INTO empleados cuota, oficina, jefe) (numemp, nombre, titulo, contrato, ventas,
SELECT 436, 'Luis Valverde','Vendedor', GETDATE(), 0, 1200.45, 40, dir FROM oficinas WHERE oficina = 40;
Objetivo
Copiar un conjunto de filas de una tabla ya existente a otra.
Objetivo
Modificar los datos de una tabla.
Poner a cero las ventas y cuota del empleado Luis Garcia, si hay varios con el mismo nombre actualizarlos todos. (1 filas afectadas) UPDATE empleados set ventas=0, cuota=0 WHERE nombre = 'Luis Garcia'; Cambiar los empleados de la oficina 40 a la oficina 30. (3 filas afectadas) UPDATE empleados SET oficina = 30
WHERE oficina = 40; Actualizar los pedidos del fabricante rei dejando como representante el empleado asignado al cliente (2 filas afectadas). Lo ms cmodo es, primero sacar la consulta que obtiene los pedidos a actualizar, y despus convertirla a UPDATE. UPDATE pedidos SET rep=numemp FROM pedidos inner join (clientes repclie=numemp) ON clie=numclie WHERE rep <> numemp and fab ='rei' Estos son los pedidos afectados y cmo deben quedar, los pedidos en los que el representante ya es el correcto no se tienen que actualizar: codigo numpedido clie 20 21 113042 113045 2113 2112 rep fab 104 108 rei rei inner join empleados ON
Actualizar el campo objetivo de la oficina 30 con las cuotas de los empleados asignados a ella. UPDATE oficinas set oficinas.objetivo =(SELECT SUM (cuota) from empleados where oficinas.oficina= empleados.oficina) where oficina=30; Actualizar el precio de los productos de BIC obteniendo el nuevo valor del precio medio del artculo vendido en los pedidos (si hay pedidos). Primero sacamos la lista y despus redactar la UPDATE. Se puede hacer de dos formas, actualizando nicamente los productos de BIC que tienen pedidos, o actualizando todos los productos de BIC. En cualquiera de los dos casos los productos debern acabar con el precio que aparece en la columna Nuevo. UPDATE productos SET precio = round(ISNULL((SELECT avg(importe/cant) FROM pedidos WHERE fab=idfab and producto=idproducto),precio),2) WHERE idfab='bic'; Estos son los productos que tenemos de BIC, precio es el precio actual, media es el precio medio de pedidos, y nuevo el valor que deber quedar en precio despus de actualizar: idfab idproducto precio media nuevo bic 41003 6,52 5,1566 5,16
bic bic
41089 41672
2,25 1,80
NULL NULL
2,25 1,80
Objetivo
Eliminar registros de una tabla utilizando DELETE.
6 9 16
6 6 1
Actualizar despus la tabla de pedidos cambiando los importes para que el precio unitario corresponda con el precio del producto. Los pedidos de los productos que no tienen precio se quedarn como estaban. (3 filas afectadas) codigo numpedido 1 2 6 9 16 110036 110037 112979 112989 113013 fechapedido 2008-12-12 00:00:00.000 2008-12-12 00:00:00.000 2008-12-12 00:00:00.000 2008-12-10 00:00:00.000 2008-12-28 00:00:00.000 cant importe precio pedido precio 9 7 6 6 1 22,50 315,00 150,00 14,58 5,16 2,50 4,50 25,00 2,43 6,52 NULL 45,00 NULL 2,43 5,16
Puedes consultar aqu las soluciones propuestas. 4. Se ven algunos productos que no tienen precio, ahora vamos a actualizar el precio de estos productos con el precio medio utilizado en los pedidos donde aparecen. Ayuda: Primero sacamos los productos que queremos actualizar con los pedidos correspondientes: idfab idproducto precio codigo numpedido aci aci 41001 41002 NULL NULL NULL 10 NULL 112992 fechapedido NULL 1990-04-15 20:00:00.000 2008-02-05 00:00:00.000 2008-05-05 00:00:00.000 2008-05-10 00:00:00.000 1990-01-11 00:00:00.000 2008-05-10 importe NULL 7,60 precio pedido NULL 0,76
aci
41002
NULL
18
113027
450,00
8,3333
aci
41003
NULL
15
113012
37,45
1,07
aci
41004
NULL
112963
3,276
0,117
aci aci
41004 41004
NULL NULL
4 7
112968 112983
39,78 7,02
1,17 1,17
00:00:00.000 aci 4100x NULL 25 113055 2009-04-01 00:00:00.000 2008-11-01 00:00:00.000 2008-01-01 00:00:00.000 2008-12-12 00:00:00.000 2008-12-12 00:00:00.000 1,50 0,25
aci
4100x
NULL
26
113057
NULL
NULL
aci
4100y
NULL
112987
275,00
25,00
aci
4100z
NULL
110036
22,50
2,50
aci
4100z
NULL
112979
150,00
25,00
Vemos que el producto ACI 41001 no se podr actualizar porque no tiene pedidos. Pero los dems se actualizarn con el precio medio de sus pedidos, debern quedar as (7 filas afectadas): idfab idproducto precio aci aci aci aci aci aci aci 41001 41002 41003 41004 4100x 4100y 4100z NULL 4,55 1,07 0,82 0,25 * 25,00 13,75
* aci 4100x tiene 2 pedidos pero uno sin precio por lo que no cuenta Puedes consultar aqu las soluciones propuestas.
SELECT 436, 'Luis Valverde','Vendedor', GETDATE(), 0, 1200.45, 40, dir FROM oficinas WHERE oficina = 40; 2. Pasar los pedidos de octubre 1989 a diciembre 2008. (3 filas afectadas) UPDATE pedidos SET fechapedido=DATEADD(month,230,fechapedido) WHERE year(fechapedido)=1989 and month(fechapedido)=10; 3. Queremos actualizar el importe de los pedidos del mes actual con el precio almacenado en la tabla productos. SELECT codigo, numpedido,fechapedido,cant, [precio pedido],precio FROM pedidos idproducto inner join productos ON importe,importe/cant and producto AS =
fab=idfab
and
Actualizar despus la tabla de pedidos cambiando los importes para que el precio unitario corresponda con el precio del producto. Los pedidos de los productos que no tienen precio se quedarn como estaban. (3 filas afectadas) UPDATE pedidos SET importe=cant*precio FROM pedidos idproducto inner join productos ON fab=idfab and producto =
WHERE year(fechapedido)=2008 and month(fechapedido)=12 AND precio IS NOT NULL; 4. Se ven algunos productos que no tienen precio, ahora vamos a actualizar el precio de estos productos con el precio medio utilizado en los pedidos donde aparecen. La primera SELECT saca los productos que queremos actualizar con los pedidos correspondientes. SELECT idfab, idproducto, numpedido,fechapedido,importe, importe/cant precio, codigo,
FROM productos left join pedidos on idfab=fab AND idproducto=producto WHERE precio IS NULL;
UPDATE productos SET precio = (SELECT ROUND(AVG(importe/cant),2) FROM pedidos WHERE fab=idfab AND producto=idproducto) WHERE precio IS NULL
1. Podemos insertar datos en una tabla nueva mediante la clusula INSERT INTO.
a) Verdadero. b) Falso.
2. La clusula SELECT ... INTO requiere especificar una definicin para la nueva tabla.
a) Verdadero. b) Falso.
3. En las consultas INSERT ...
a) Es obligatorio utilizar la palabra INTO de la siguiente forma: INSERT INTO. b) No podemos utilizar vistas como origen de datos. c) No se puede introducir valores nulos (NULL). d) Todas son falsas.
4. El peligro de insertar datos con la clusula INSERT INTO es que no podemos saber si estamos infringiendo una regla de integridad.
a) Verdadero. b) Falso.
5. Se puede actualizar (UPDATE) una columna de identidad?
a) S, siempre que le asignemos un valor que no exista. b) S, siempre que asignemos el valor que debera tener: si estamos actualizando el registro con identidad 7 y el valor mximo de la tabla es 30, deberamos asignar el 31. c) No, porque este campo lo gestiona el sistema y dara error. d) Todas son falsas.
a) WHERE, para aplicar una condicin de filtro y modificar las que coincidan con el criterio. b) TOP, para indicar cuntas filas queremos modificar, aleatoriamente. c) A y B son ciertas. d) A y B son falsas.
7. Si una consulta UPDATE falla porque infringe una regla de integridad o hay un problema aritmtico...
a) El proceso de actualizacin continua, y se crea un listado con las filas que han sufrido algn error. b) El proceso de actualizacin continua y se aaden valores nulos a las columnas que generan errores. c) El proceso hace dos barridos: en el primero comprueba si podr ejecutar el UPDATE completo y si hay errores te pregunta si deseas continuar, a pesar de que es posible que la integridad de los datos se comprometa o que se pierda informacin. d) El proceso se interrumpe y muestra un error.
8. DELETE permite eliminar...
a) Una fila por cada consulta. b) Una fila o ms. c) Un campo en concreto de una fila en particular. d) Una columna completa.
9. Indica cul de las siguientes consultas no borrar todos los registros de tabla1:
a) DELETE * FROM tabla1; b) DELETE tabla1; c) DELETE FROM tabla1 ; d) DELETE TOP (100) PERCENT FROM tabla1;
10. Para borrar todos los datos de una tabla sin restricciones, lo ms rpido es:
a) Utilizar DELETE. b) Utilizar UPDATE y actualizar todos los registros a NULL. c) Utilizar TRUNCATE.
6. Elimina la tabla clientes dejando en pedidos el campo cliente a NULL. Este ejercicio se resuelve con varias sentencias y se puede resolver de varias maneras. Resulvelo de distintas formas. 7. Ahora queremos permitir que dos clientes tengan el mismo nombre. 8. Elimina la base de datos Gestion2, as podrs volver a hacer los ejercicios. Puedes consultar aqu las soluciones propuestas.
LOG ON (NAME='Gestion2_log' , FILENAME='F:\SQL\Gestion2.ldf')GO 2. En Gestion2, crea las mismas tablas que tenemos en Gestion con las mismas relaciones entre ellas. Este ejercicio se resuelve con varias sentencias. USE Gestion2 CREATE TABLE numemp CLUSTERED, nombre edad oficina titulo contrato jefe dbo.empleados, cuota ventas ) CREATE TABLE dbo.oficinas( oficina ciudad INT NOT NULL, CHAR(20) NULL, dbo.empleados( INT NOT NULL CONSTRAINT pk_empleados PRIMARY KEY
CHAR(20) NULL, INT NULL, INT NULL, CHAR(20) NULL, datetime NULL, INT NULL CONSTRAINT NULL, NULL FK_empleados_jefe REFERENCES
MONEY MONEY
MONEY NULL
CONSTRAINT PK_oficinas PRIMARY CONSTRAINT empleados ) ALTER TABLE dbo.empleados FK_empleados_oficina FK_oficinas_dir
WITH
CHECK
ADD
CONSTRAINT
(oficina)
repclie INT NULL CONSTRAINT REFERENCES dbo.empleados, limitecredito INT KEY (numclie) ) CREATE TABLE dbo.productos( idfab idproducto NULL,
existencias INT NULL, CONSTRAINT PK_productos PRIMARY ) CREATE TABLE dbo.pedidos( codigo numpedido INT IDENTITY NOT NULL, DEC(10,0) NOT NULL, NOT NULL, KEY (idfab,idproducto)
INT NOT NULL, INT NOT NULL, CHAR(5) NOT NULL, CHAR(10) NOT NULL, SMALLINT NULL,
MONEY NULL, PK_pedidos PRIMARY KEY FK_pedidos_rep FK_pedidos_clie (codigo), KEY KEY (rep) (clie) KEY REFERENCES REFERENCES
FOREIGN FOREIGN
FOREIGN
(fab,producto)
3. La tabla Productos de Gestion2 consideramos que sufre pocas operaciones de nuevos registros o eliminacin de registros y el nico campo que sufre actualizaciones frecuentes es el campo existencias; por otro lado es frecuente consultar los productos por el campo descripcion (aunque varios productos puedan tener la misma descripcin). Se podra mejorar la base de datos? Si es que s indica de qu forma y escribe la instruccin correspondiente; en cualquier caso justifica la respuesta. CREATE INDEX IX_descripcion ON Productos (descripcion);
4. Qu se puede hacer para que no puedan existir en la tabla de clientes dos clientes con el mismo nombre? CREATE UNIQUE INDEX -- o bien CONSTRAINT IX_nombre UNIQUE (nombre); IX_nombre ON Clientes (nombre)
5. En nuestro sistema vamos a efectuar muchas consultas recuperando a la vez los pedidos y los productos asociados a cada uno de ellos, por eso sera bueno. Completa la frase y escribe la sentencia SQL correspondiente. CREATE VIEW pedidos_productos AS (SELECT * FROM pedidos INNER JOIN productos ON fab=idfab AND producto=idproducto); 6. Elimina la tabla clientes dejando en pedidos el campo cliente a NULL. Este ejercicio se resuelve con varias sentencias y se puede resolver de varias maneras. Resulvelo de distintas formas. ALTER TABLE formas -- Opcion 1 ALTER TABLE pedidos DROP CONSTRAINT FK_pedidos_clie; FOREIGN KEY pedidos ALTER COLUMN clie INT NULL; -- Esto de todas
ALTER TABLE pedidos ADD CONSTRAINT FK_pedidos_clie (clie) REFERENCES Clientes ON DELETE SET NULL; DELETE Clientes;
SELECT * FROM pedidos -- Para -- Opcion 2 UPDATE pedidos SET DELETE Clientes SELECT * FROM pedidos;
comprobar el resultado;
clie = NULL;
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;
8. Elimina la base de datos Gestion2, as podrs volver a hacer los ejercicios. USE Gestion DROP DATABASE Gestion2; GO
a) SELECT, INSERT, DELETE y UPDATE. b) ORDER BY y GROUP BY. c) CREATE, DROP y ALTER.
a) Verdadero. b) Falso.
4. Para eliminar una base de datos, utilizamos:
a) Indicamos PRIMARY KEY en cada una de las columnas. b) Indicamos PRIMARY KEY y a continuacin, entre parntesis, las columnas que la forman. c) Debemos hacerlo con los mens de SSMS, porque no se puede a nivel de SQL simplemente. d) Todas son falsas.
6. Una vez hemos creado una tabla ya no podremos incluir ms columnas.
a) Deberemos crear una nueva tabla que incluya todas las columnas y volcar los datos de una a otra. Luego, borramos la original y modificamos el nombre de la nueva para que sea el mismo. b) A menos que se trate de una FOREIGN KEY. c) A menos que se trate de una columna IDENTITY o calculada, porque es el propio sistema el que inserta los valores. d) La afirmacin es falsa, porque podemos realizar un ALTER TABLE e incluir la clusula ADD para aadir nuevas columnas.
7. Una vista:
a) Es el resultado de una consulta que se guarda como si fuese una tabla ms y cuyo contenido siempre est actualizado con los datos de las tablas origen. b) Se escribe como una SELECT normal, pero indicamos CREATE VIEW nombre AS antes, para indicar que queremos que se cree una vista del resultado de esa consulta. c) A y B son ciertas. d) A y B son falsas.
8. Slo se puede crear vistas con una select que referencia a ms de una tabla, porque de otro modo no tendra sentido y sera informacin redundante.
a) Verdadero. b) Falso.
9. Si la tabla de pedidos tiene muchos registros, es recomendable crear un ndice en ella?
a) Probablemente no, porque es una tabla que normalmente se actualiza mucho y actualizar los ndices sera una carga. b) No, porque los ndices estn especialmente pensados para tablas con pocos registros. c) S. d) Ninguna es cierta.
10. Y si la tabla no se actualizara apenas?
a) No, porque no importa cunto se actualice, el problema es que tiene muchos registros y el ndice ocupara mucho. b) S, entonces s que podra ser recomendable.
Utilizar las sentencias desarrolladas en un ejercicio propuesto del tema anterior para crear la base de datos Gestion2 a partir de Gestion8 y crear otra base datos Gestion10 sobre la que realizars todos los ejercicios de esta unidad. Para ello vamos a definir tres procedimientos, CreaBase que permita crear una base de datos con el nombre que le indiquemos en la llamada, otro, BorrarBase que borre una determinada base de datos, y por ltimo RellenaBase para rellenar con las tablas de Gestion8 la base de datos que indiquemos en la llamada. Los procedimientos se crean en Gestion8. Como no se puede utilizar una variable en un CREATE DATABASE, utilizamos la funcin EXEC('cadena SQL') que ejecuta cualquier cadena SQL. PRINT 'Empieza el ejercicio de procedimientos' -- Para visualizar un mensaje que indique lo que realiza esta sentencia. USE Gestion8 Gestion8 -Para crear los proc. en
if object_id('BorraBase') IS NOT NULL DROP PROC BorraBase GO -- Necesario igual para delimitar el CREATE PROC CREATE PROCEDURE BorraBase @base sysname AS BEGIN TRY -- Para que si ningn mensaje no existe la base de datos no mande se pasa el valor que el siguiente GO
EXEC('DROP DATABASE ' + @base) -- Si en @base Gestion10, se ejecutar: DROP DATABASE Gestion10 END TRY BEGIN CATCH -- Si se produce un END CATCH GO -- no mandar
if object_id('CreaBase') IS NOT NULL DROP PROC CreaBase GO CREATE PROCEDURE CreaBase @base sysname AS BEGIN TRY -- Para que si ya mande ningn mensaje existe la base de datos la no bd con
EXEC('CREATE DATABASE '+ @base) -- Creamos la los parmetros por defecto para simplificar END TRY BEGIN CATCH
END CATCH -- Si se produce un error no har nada (por ej. si ya existe la base no mandar ningn mensaje de error y seguir GO
if object_id('RellenaGestion') IS NOT NULL DROP PROC RellenaGestion GO CREATE PROC RellenaGestion @base sysname AS BEGIN EXEC('CREATE TABLE '+ @base+'.dbo.empleados( numemp nombre edad INT NOT NULL PRIMARY KEY CLUSTERED, CHAR(20) NULL, INT NULL,
oficina INT NULL, titulo contrato jefe cuota ventas ) CREATE TABLE '+@base+'.dbo.oficinas( oficina ciudad region dir INT INT NOT NULL, CHAR(20) NULL, CHAR(20) NULL,
datetime NULL,
CONSTRAINT )
CREATE TABLE '+@base+'.dbo.clientes( numclie INT NOT NULL, nombre CHAR(20) NULL,
repclie INT NULL, limitecredito INT NULL, CONSTRAINT PK_clientes PRIMARY KEY ) CREATE TABLE '+@base+'.dbo.productos( idfab CHAR(5) NOT NULL, (numclie)
idproducto
descripcion CHAR(20) NULL, precio existencias CONSTRAINT ) CREATE TABLE '+@base+'.dbo.pedidos( codigo numpedido INT IDENTITY NOT NULL, DEC(10,0) NOT NULL, MONEY NULL, INT NULL, PK_productos PRIMARY KEY (idfab,idproducto)
fechapedido DATETIME NOT NULL, clie rep fab producto cant importe INT NOT NULL, INT NOT NULL, CHAR(5) NOT NULL, CHAR(10) NOT NULL, SMALLINT NULL, MONEY NULL, (codigo),
CONSTRAINT PK_pedidos PRIMARY KEY ) INSERT INTO '+@base+'.dbo.Productos Gestion8.dbo.Productos; INSERT INTO '+@base+'.dbo.Empleados Gestion8.dbo.Empleados; INSERT INTO Gestion8.dbo.Clientes; INSERT INTO Gestion8.dbo.Oficinas; '+@base+'.dbo.Clientes '+@base+'.dbo.Oficinas
* * * *
SET IDENTITY_INSERT '+@base+'.dbo.Pedidos ON; INSERT INTO '+@base+'.dbo.Pedidos (codigo,numpedido,fechapedido,clie,rep,fab,producto,cant,importe) SELECT * FROM Gestion8.dbo.Pedidos;
SET IDENTITY_INSERT '+@base+'.dbo.Pedidos OFF; ALTER TABLE '+@base+'.dbo.Empleados ADD CONSTRAINT REFERENCES empleados, FK_empleados_jefe FOREIGN KEY (jefe) KEY
FK_empleados_oficinas
FOREIGN
FK_oficinas_dir
FOREIGN
KEY
(dir)
ALTER TABLE '+@base+'.dbo.Clientes ADD CONSTRAINT FK_clientes_repclie REFERENCES empleados; ALTER TABLE '+@base+'.dbo.Pedidos ADD CONSTRAINT REFERENCES empleados, CONSTRAINT REFERENCES clientes, FK_pedidos_rep FK_pedidos_clie FOREIGN FOREIGN KEY (rep) (clie) KEY FOREIGN KEY (repclie)
KEY
FOREIGN
GO Empezar: USE Gestion8 EXEC BorraBase 'Gestion10' GO EXEC CreaBase 'Gestion10' GO EXEC RellenaGestion 'Gestion10'
3. Crea un nuevo procedimiento parecido al anterior pero que nos devuelva tambin el nmero de oficinas recuperadas. Utilizar un parmetro de salida. 4. Crea un nuevo procedimiento parecido al anterior pero que nos devuelva tambin el nmero de oficinas recuperadas. Sin utilizar parmetros de salida. 5. Crea un procedimiento que muestre los n productos ms caros, n es un valor que se indicar en la llamada. 6. Crea otro procedimiento que muestre los n productos ms caros con empates y nos devuelva cuntos hay. 7. No dejar eliminar productos que tengan existencias. 8. Hacer que no se pueda insertar un pedido si no hay suficiente stock. 9. Crea un procedimiento que impida eliminar varias oficinas en una sla operacin DELETE. Puedes consultar aqu las soluciones propuestas.
Seguidamente, escribir un procedimiento que se pueda ejecutar en cualquier momento y que actualice una lista de productos bajo stock. Esta lista se guarda en una tabla ProductosAPedir y contiene el cdigo completo del producto, su descripcin, existencias y cantidad a pedir (para que el producto supere en 5 unidades su stock mnimo). Si un producto bajo mnimo (cuyas existencias no llegan al stock mnimo) no est en esa tabla, insertarlo, si est actualizar el campo CantidadAPedir, y si ya no est bajo mnimo y est en la tabla, eliminar el registro de ProductosAPedir.
PRINT 'Empieza el ejercicio 1 bis' USE Gestion10 IF OBJECT_ID('ActualizaProductosAPedir','P') IS NOT NULL DROP PROC ActualizaProductosAPedir GO CREATE PROC ActualizaProductosAPedir AS BEGIN IF OBJECT_ID('ProductosAPedir','U') IS NULL CREATE TABLE ProductosAPedir ( Afab CHAR(5),
Aproducto CHAR(10), Adescripcion CHAR(20), Aexistencias INT, Apedir SMALLINT, PRIMARY KEY (Afab,Aproducto) )
DELETE FROM ProductosAPedir WHERE EXISTS (SELECT * Productos WHERE idfab=Afab AND idproducto=Aproducto existencias >= StockMinimo)
FROM AND
--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 SET Apedir=StockMinimo+5-existencias
FROM ProductosAPedir INNER JOIN Productos ON idfab=Afab AND idproducto=Aproducto WHERE existencias < -- Actualizamos llegan al stock mnimo INSERT INTO Stockminimo ProductosAPedir de productos que no
los
ProductosAPedir
-- Insertamos nuevos ProductosAPedir de productos que no llegan al stock mnimo y que no estn ya en ProductosAPedir (para no repetirlos). END; GO USE Gestion10 SELECT * FROM Productos WHERE existencias < Stockminimo
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') Listado_Oficinas1 GO CREATE PROCEDURE Listado_Oficinas1 @region CHAR(20),@ventas MONEY AS SELECT * FROM oficinas WHERE region= @region @ventas GO EXEC Listado_Oficinas1 Este, 1000 EXEC Listado_Oficinas1 Este, 100000 EXEC Listado_Oficinas1 Norte, 0 EXEC Listado_Oficinas1 Norte, 10000 AND ventas > IS NOT NULL DROP PROCEDURE
3. Crear un nuevo procedimiento parecido al anterior pero que nos devuelva tambin el nmero de oficinas recuperadas. Utilizar un parmetro de salida. PRINT 'Empieza el ejercicio 3' USE Gestion10 IF OBJECT_ID('Listado_Oficinas2','P') IS NOT NULL Listado_Oficinas2 GO CREATE PROCEDURE Listado_Oficinas2 @region CHAR(20),@ventas MONEY, @cuantas INT OUTPUT DROP PROCEDURE
AS SELECT * FROM oficinas WHERE region= @region @ventas SET @region AND GO DECLARE @resultado INT EXEC Listado_Oficinas2 Este, 1000 ,@resultado OUTPUT SELECT @resultado EXEC Listado_Oficinas2 Este, 100000 ,@resultado OUTPUT PRINT @resultado EXEC Listado_Oficinas2 Norte, 0 ,@resultado OUTPUT PRINT @resultado EXEC Listado_Oficinas2 Norte, 10000 ,@resultado OUTPUT PRINT @resultado @cuantas=(SELECT ventas > @ventas) COUNT(*) FROM oficinas WHERE region= AND ventas >
1. Existen dos tipos de procedimientos: los del sistema (que se encuentran en la base master) y los del usuario (los que creamos).
a) Verdadero. b) Falso.
2. El mbito de un procedimiento puede ser local o global.
a) Verdadero. b) Falso.
3. Para eliminar un procedimiento utilizaremos:
d) A y B son falsas.
4. Los procedimientos pueden contener:
a) Verdadero. b) Falso.
6. Cul de las siguientes clusulas no es un tipo de desencadente:
a) Deberemos trabajar con los datos de la tabla Updated. b) Deberemos trabajar con los datos de las tablas Deleted e Inserted. c) A y B son ciertas. d) A y B son falsas.
a) Sobre una clusula ALTER DATABASE. b) Sobre una clusula CREATE INDEX. c) Sobre un ALTER TABLE que pretenda insertar una columna (ADD). d) Sobre un ALTER TABLE que pretenda cambiar el nombre de una columna.
10. En un trigger, DROP y DISABLE se distinguen en que:
a) DROP lo elimina permanentemente y DISABLE lo desactiva temporalmente. b) DISABLE lo elimina permanentemente y DROP lo desactiva temporalmente