You are on page 1of 100

Ejercicios unidad 1: El entorno grfico SSMS (I)

Ejercicio 1: Crear una base de datos


Se desea implementar una base de datos para el control de una biblioteca. Crea la base de datos con el nombre Biblioteca y las opciones por defecto. Puedes consultar aqu las soluciones propuestas.

Ejercicio 2: Crear y definir tablas


Crea las tablas Libros, Prstamos y Usuarios de forma que sigan el siguiente esquema: Tabla Libros NOMBRE CAMPO TIPO DE DATOS TAMAO Codigo Numrico Byte Nombre Editorial Autor Genero PaisAutor Paginas AnyEdicion Precio Dias Tabla Prstamos NOMBRE CAMPO Codigo Libro Usuario FSalida FMaxima FDevol Tabla Usuarios NOMBRE CAMPO Codigo Nombre Apellidos DNI TIPO DE DATOS Autonumrico Texto Texto Texto 15 25 12 TAMAO TIPO DE DATOS Autonumrico Numrico Numrico Fecha/Hora Fecha/Hora Fecha/Hora Byte Byte Fecha mediana Fecha mediana Fecha mediana TAMAO Texto Texto Texto Texto Texto Numrico Fecha/Hora Moneda Numrico Entero 60 25 25 20 20 Entero Fecha mediana

Domicilio Poblacion Provincia FNacim Maximo_permitido

Texto Texto Texto Fecha/Hora Numrico

50 30 20 Fecha mediana Entero

Puedes consultar aqu las soluciones propuestas.

Ayuda ejercicios unidad 1: El entorno grfico SSMS


Ejercicio 1: Crear una base de datos
Para crear la base de datos con el nombre Biblioteca y las opciones por defecto: 1. Abre el SQL Server Management Studio Express que instalaste. 2. Haz clic con el botn secundario datos del Explorador de objetos. 3. Selecciona Nueva base de datos... 4. Llmala Biblioteca y deja los nombres y caractersticas de los archivos con su definicin predeterminada. Pulsa Aceptar. 5. Despliega el contenido de la nueva carpeta Biblioteca pulsando sobre el signo + para comprobar que se ha creado correctamente. del ratn sobre la carpeta Bases de

Ejercicio 2: Crear y definir tablas


Para crear las tablas: 1. Despliega el contenido de la base de datos Biblioteca, en el Explorador de objetos. 2. Despliega el men contextual de Tablas y escoge la opcin Nueva tabla... 3. Escribe el nombre de cada columna y escoge el tipo de datos en el desplegable. En la zona inferior, en la pestaa Propiedades de columna, busca el campo que define el tamao del dato y cmbialo si es necesario. 4. Cuando hayas acabado, pulsa el botn Guardar o cierra la tabla y dale el nombre correspondiente. 5. Repite los pasos para cada una de las tres tablas.

Ejercicio 3: Insertar datos en las tablas


Para insertar los datos en las tablas. 1. Despliega el contenido de la carpeta Tablas de Biblioteca, en el Explorador de objetos. 2. Despliega el men contextual de una de las tablas y escoge la opcin Abrir tabla. Rellena los campos.

3. Repite la operacin para las otras dos tablas.

Ejercicio 4: Modificar la definicin de las tablas


Para modificar la definicin de las tablas: Ten en cuenta que las claves primarias sern los campos codigo de cada tabla. Adems, el campo Libro de la tabla Prestamos es clave ajena, hace referencia al Codigo de Libros. Y el campoUsuario tambin es clave ajena, hace referencia al Codigo de Usuarios 1. Despliega el contenido de la carpeta Tablas de Biblioteca, en el Explorador de objetos. 2. Despliega el men contextual de la tabla que quieras modificar y escoge la opcin Diseo (o Modificar). 3. Incluye la clave primaria seleccionando la columna Codigo y pulsando el botn en forma de llave de la barra de herramientas. 4. Si la tabla contiene una clave ajena, indcalo desplegando el men contextual del campo que quieres relacionar y seleccionando Relaciones... 5. No olvides marcar o desmarcar la casilla Permite valores nulos convenientemente. 6. Repite la operacin para las otras dos tablas.

Ejercicios unidad 1: El entorno grfico SSMS (I)


Ejercicio 1: Crear una base de datos
Se desea implementar una base de datos para el control de una biblioteca. Crea la base de datos con el nombre Biblioteca y las opciones por defecto. Puedes consultar aqu las soluciones propuestas.

Ejercicio 2: Crear y definir tablas


Crea las tablas Libros, Prstamos y Usuarios de forma que sigan el siguiente esquema: Tabla Libros NOMBRE CAMPO TIPO DE DATOS TAMAO Codigo Numrico Byte Nombre Editorial Autor Genero PaisAutor Paginas AnyEdicion Precio Texto Texto Texto Texto Texto Numrico Fecha/Hora Moneda 60 25 25 20 20 Entero Fecha mediana

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 Numrico Numrico Fecha/Hora Fecha/Hora Fecha/Hora

TAMAO Byte Byte Fecha mediana Fecha mediana Fecha mediana

TIPO DE DATOS Autonumrico Texto Texto Texto Texto Texto Texto Fecha/Hora Numrico

TAMAO 15 25 12 50 30 20 Fecha mediana Entero

Puedes consultar aqu las soluciones propuestas.

Prueba evaluativa unidad 1: El entorno grfico SSMS


Slo una respuesta es vlida por pregunta. Haz clic en la respuesta que consideres correcta. Contesta todas las preguntas y haz clic en el botn Corregir para ver la solucin. Si pulsas Restablecer podrs repetir la evaluacin.

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

categora. d) Todas son ciertas.

Prueba evaluativa unidad 2: Introduccin al SQL. Transact-SQL


Slo una respuesta es vlida por pregunta. Haz clic en la respuesta que consideres correcta. Contesta todas las preguntas y haz clic en el botn Corregir para ver la solucin. Si pulsas Restablecer podrs repetir la evaluacin.

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.

Ejercicios unidad 3: Consultas simples


Te aconsejamos que, para realizar consultas SQL ms fcilmente, te hagas estas preguntas: Dnde estn los datos necesarios? La respuesta dar la FROM. Qu columnas quiero que se visualicen en el listado? La respuesta dar la lista de seleccin (SELECT). Quiero que se ordenen por algn valor? Si la respuesta es s, necesitars utilizar ORDER BY. Tienen que aparecer todas las filas del resultado? Si la respuesta es NO, debers: o o o Utilizar TOP para quedarte con las N primeras. Utilizar DISTINCT si no quieres que se muestren las repetidas. O bien utilizar la clusula WHERE para expresar la condicin que deben cumplir para ser mostradas.

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.

Ejercicio 1: Listas de seleccin


1. Listar todos los empleados. Resultado:

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

Ana Bustama nte

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

2005-05NUL 10000, 01 L 00 00:00:00.0 00 2006-05NUL 10000, 01 L 00 00:00:00.0 00 2007-01NUL 10000, 01 L 00 00:00:00.0 00

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.

Ejercicio 2: Utilizando ORDER BY


1. Listar de cada regin las oficinas por orden de mejores ventas. Resultado:

Regin NULL NULL centro

Ciudad Elx Valencia Aranjuez

Ventas 0,00 NULL 15000,00 0,00 NULL 73500,00 69300,00

Centro Mstoles centro este este Madrid Alicante Valencia

este este este norte norte oeste oeste

Castellon Valencia Valencia

36800,00 2100,00 0,00

Pamplona 200000,00 pamplona NULL Badajoz A Corua 84400,00 18600,00

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 779c imm 775c imm 773c bic 41003

imm 887x qsa rei fea bic bic fea xk47 2a44g 114 41089 41672 112

rodamiento 2,25 plato cubo 1,80 1,48

qsa

xk48a

red

1,48

37

Puedes consultar aqu las soluciones propuestas.

Ejercicio 2: Utilizando WHERE


1. Listar los empleados que tienen ventas pero que no han alcanzado su cuota. Resultado:

Numemp 104 107

Nombre Jos Gonzlez

Ventas

cuota

14300,00 20000,00

Jorge Gutirrez 18600,00 30000,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

Ayuda ejercicios unidad 3: Consultas simples


Ejercicio 1: Listas de seleccin
Para listar todos los empleados: SELECT * FROM empleados; Para listar todos los empleados, cambiando el nombre de la columna contrato por Fecha de contrato: Utilizaremos un alias, y lo incluiremos entre corchetes para que no haya errores con el caracter de espacio en blanco: SELECT numemp, nombre, edad, oficina, titulo, contrato as [Fecha de contrato], jefe, cuota, ventas FROM empleados;

Ejercicio 2: Utilizando ORDER BY


Para listar de cada regin las oficinas por orden de mejores ventas: SELECT region, ciudad, ventas FROM oficinas ORDER BY region, ventas DESC;

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;

Ejercicio 2: Utilizando WHERE


Para listar los empleados que tienen ventas pero que no han alcanzado su cuota. SELECT numemp, nombre, ventas, cuota 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;

Prueba evaluativa unidad 3: Consultas simples


Slo una respuesta es vlida por pregunta. Haz clic en la respuesta que consideres correcta. Contesta todas las preguntas y haz clic en el botn Corregir para ver la solucin. Si pulsas Restablecer podrs repetir la evaluacin.

1. La clusula FROM indica el origen de datos para la consulta y puede constar de:

a) Una tabla. b) Una vista. c) A y B son ciertas. d) A y B son falsas.


2. Si queremos utilizar la tabla de una base de datos externa (Base2) en nuestra consulta...

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)...

6. Dnde utilizamos la palabra clave *?

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.

Unidad 3. Ejercicio paso a paso: Consultas con mltiples condiciones


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Aprender a utilizar ms de una condicin en el predicado de una consulta, mediante las operaciones lgicas.

Ejercicio paso a paso


Listar las oficinas que han alcanzado su objetivo. Es decir, que las ventas sean mayores o iguales que su objetivo, o bien que no tengo un objetivo mnimo y haya realizado alguna venta. SELECT * FROM oficinas WHERE ventas Resultado: Oficina 11 13 Ciudad Valencia Castellon Regin este este Dir 106 105 Objetivo 57500,00 35000,00 ventas 69300,00 36800,00 >= objetivo OR (ventas >0 AND objetivo IS NULL)

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

Unidad 4. Ejercicio paso a paso: La interseccin INTERSECT


Nota: Para realizar los ejercicios, utiliza la base de datos Gestion (el archivo fsico se llamaba GestionA) y GestionSimples.

Objetivo
Comparar dos tablas y crear un listado resultante de la comparacin. Los registros mostrados sern los que tengan en comn.

Ejercicio paso a paso


Obtener los empleados de GestionSimples que aparecen en Gestion con misma oficina. SELECT numemp, oficina FROM gestionsimples.dbo.empleados INTERSECT SELECT numemp, oficina FROM gestion.dbo.empleados; Resultado:

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

Unidad 4. Ejercicio paso a paso: El producto cartesiano CROSS JOIN


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Combinar datos de dos tablas en una nica tabla.

Ejercicio paso a paso


Listar los empleados que tienen una cuota superior al objetivo de al menos una oficina. La oficina puede ser cualquiera no tiene por que ser la del empleado. SELECT numemp, nombre, cuota, oficinas.oficina, objetivo FROM empleados, oficinas WHERE cuota > objetivo empleados.oficina AS [Su oficina],

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

Ana Bustamante Ana Bustamante

35000,00 35000,00

21 21

29 30

10000,00 20000,00

Unidad 4. Ejercicio paso a paso: La composicin interna INNER 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.

Ejercicio paso a paso


Listar los cdigos y nombres de los empleados de las oficinas del Este con su oficina y ciudad. Como la ciudad donde se encuentra la oficina no viene incluida en el listado de empleados, deberemos enlazar ambas tablas (oficinas y empleados) , utilizando como enlace el cdigo de la oficina, que s que est en las dos. SELECT numemp, nombre, empleados.oficina, ciudad JOIN empleados ON oficinas.oficina =

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

ciudad Alicante Alicante Alicante Castellon Valencia

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

113049 113051 113055 113057 113058 113062 113065 113069

7,76 14,20 1,50 NULL 14,80 24,30 21,30 313,50

Junpero Alvarez Junpero Alvarez Julia Antequera Cristbal Garca Julia Antequera Juan Bolto Juan Surez Alberto Juanes

600 600 550 500 550 4000 650 250

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.

Ejercicio paso a paso


Listar todos los empleados y la ciudad y regin donde trabaja. SELECT numemp, nombre, edad, titulo, CONVERT(CHAR(8),contrato,3)AS contrato, jefe, empleados.oficina,ciudad, region FROM oficinas RIGHT empleados.oficina; Resultado: Numemp 101 Nombre Antonio Viguer Alvaro Jaumes Edad 45 Titulo representante Contrato 20/10/86 Jefe Oficina 104 12 Ciudad Alicante Region este JOIN empleados ON oficinas.oficina =

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

representante dir ventas

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

director general representante

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

110 111 112

41 50 50

representante representante representante

13/01/90 01/05/05 01/05/06

104 110 NULL

NULL 21 NULL

NULL Badajoz NULL

NULL oeste 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

Jos Gonzlez Vicente Pantalla Ana Bustamante

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

Valencia Pamplona Mstoles Valencia Valencia pamplona Elx

NULL norte Centro este este norte NULL

NULL NULL NULL NULL NULL NULL NULL

NULL NULL NULL 90000,00 10000,00 20000,00 NULL

NULL 200000,00 0,00 0,00 2100,00 NULL 0,00

NULL NULL NULL NULL NULL NULL NULL

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

Ejercicios unidad 4: Consultas multitabla


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.

Ejercicio 1: La composicin de tablas

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

Puedes consultar aqu las soluciones propuestas.

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:

Numpedido Clie Rep 112987 113027 113045 113069

Cliente

Repclie 105 105 110 107

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

ciudad NULL NULL Badajoz Alicante

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

Contrato 1989-10-12 00:00:00.000 1989-10-12 00:00:00.000 1989-10-12 00:00:00.000

6. Hallar los empleados que realizaron su primer pedido el mismo da que fueron contratados. Resultado:

Numemp Nombre 108 Ana Bustamante

Contrato 1989-10-12 00:00:00.000

Numpedido Rep fechapedido 112979 108 1989-10-12 00:00:00.000

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

Oficina 12 21 12 12 13 11 22 21 NULL NULL NULL NULL NULL

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

Cuota 30000,00 27500,00 35000,00 35000,00

Jefe 104 104 104 106

Nombre jefe Jos Gonzlez Jos Gonzlez Jos Gonzlez Luis Antonio

Cuota jefe 20000,00 20000,00 20000,00 27500,00

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

Cuota 30000,00 27500,00 35000,00 35000,00 10000,00

Jefe 104 104 104 106 110

Nombre jefe Jos Gonzlez Jos Gonzlez Jos Gonzlez Luis Antonio Juan Victor

Cuota jefe 20000,00 20000,00 20000,00 27500,00 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 104 Jos Gonzlez 105 Vicente Pantalla 107 Jorge Gutirrez 108 Ana Bustamante

Oficina Jefe 12 106 13 104 22 108 21 106

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

Oficina 12 13 22 21 NULL NULL 21

Jefe 106 104 108 106 106 104 110

Nombre jefe Luis Antonio Jos Gonzlez Ana Bustamante Luis Antonio Luis Antonio Jos Gonzlez Juan Victor

Oficina jefe 11 12 21 11 11 12 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 Nombre p 104 Jos Gonzlez 105 Vicente Pantalla 107 Jorge Gutirrez 108 Ana Bustamant e Mara

Oficin Ciudad Jefe a 12 Alicante 10 6 13 Castello 10 n 4 22 A 10 Corua 8 21 Badajoz 10 6 10

Nombre jefe Luis Antonio Jos Gonzlez Ana Bustamant e Luis Antonio Luis

Oficin ciudad a jefe 11 Valenci a 12 Alicant e 21 Badajoz

11

Valenci a Valenci

109

NUL

NULL

11

110 111

Sunta Juan Victor Juan Gris

L NUL L 21

NULL Badajoz

6 10 4 11 0

Antonio Jos Gonzlez Juan Victor

12 NUL L

a Alicant e NULL

Puedes consultar aqu las soluciones propuestas.

Ejercicio 2: Comparar tablas


1. Obtener los empleados de GestionSimples que aparecen en Gestion con otra oficina. El resultado ser que no devuelve filas. Puedes consultar aqu las soluciones propuestas.

Ayuda ejercicios unidad 4: Consultas multitabla


Ejercicio 1: La composicin de tablas
1. Listar todos los pedidos, mostrando el precio y la descripcin del producto. 2. SELECT pedidos.*, precio, descripcion

FROM pedidos INNER JOIN productos ON = idproducto;

fab = idfab AND producto

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

INNER JOIN clientes ON clie

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. 8. SELECT pedidos.*, clientes.nombre AS cliente, empleados.nombre AS [vendedor asignado]

9. FROM (pedidos INNER JOIN clientes ON 10. numemp INNER JOIN

clie = numclie) ON repclie =

empleados

WHERE importe >

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

clie = numclie) ON repclie =

WHERE importe >

250;

16. Hallar los pedidos recibidos los das en que un nuevo empleado fue contratado. 17. 18. SELECT contrato numpedido, fechapedido, rep, numemp, nombre,

FROM pedidos, empleados

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,

FROM pedidos INNER JOIN empleados ON

WHERE fechapedido = contrato;

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,

FROM empleados LEFT JOIN empleados.oficina=oficinas.oficina;

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]

FROM empleados LEFT JOIN empleados jefes ON jefes.numemp;

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

WHERE empleados.cuota > jefes.cuota

(empleados.cuota IS NOT NULL AND jefes.cuota IS NULL)

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 =

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 OR e.oficina IS NULL OR j.oficina IS NULL;

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

38. 39. 40.

INNER JOIN (empleados j LEFT JOIN oficinas ofijefe ON j.oficina = ofijefe.oficina) ON e.jefe = j.numemp

WHERE e.oficina <> j.oficina OR e.oficina IS NULL OR j.oficina IS NULL;

Ejercicio 2: Comparar tablas


1. Obtener los empleados de GestionSimples que aparecen en GestionA con otra oficina. 2. SELECT numemp, oficina 3. FROM gestionsimples.dbo.empleados 4. EXCEPT 5. SELECT numemp, oficina

FROM gestionA.dbo.empleados;

Prueba evaluativa unidad 4: Consultas multitabla


Slo una respuesta es vlida por pregunta. Haz clic en la respuesta que consideres correcta. Contesta todas las preguntas y haz clic en el botn Corregir para ver la solucin. Si pulsas Restablecer podrs repetir la evaluacin.

1. Para unir dos tablas con la clusula UNION, stas debern:

a) Tener los datos de una o ms columnas en comn. Por ejemplo, que en

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.

Unidad 5. Ejercicio paso a paso: La funcin MAX


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Realizar consultas de resumen utilizando funciones de agregado. En este caso MAX.

Ejercicio paso a paso


Hallar el mejor supervit de todos los empleados.

SELECT MAX(ventas - cuota) AS [Mejor superavit] FROM empleados; Resultado: Mejor superavit 81000,00

Unidad 5. Ejercicio paso a paso: La funcin SUM


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Realizar consultas de resumen utilizando funciones de agregado. En este caso SUM.

Ejercicio paso a paso


Cul es el total de cuotas y total de ventas de todos los empleados? SELECT SUM(cuota) AS [Total cuotas], SUM(ventas) AS [Total ventas] FROM empleados; Resultado: Total cuotas Total ventas 273000,00 440000,00

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

Unidad 5. Ejercicio paso a paso: La funcin AVG


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Realizar consultas de resumen utilizando funciones de agregado. En este caso AVG.

Ejercicio paso a paso


Cul es la cuota media y las ventas medias de los empleados? SELECT AVG(cuota) AS [Cuota media], AVG(ventas) AS [Ventas medias] FROM empleados; Al ejecutar la consulta aparecer una advertencia: valor NULL eliminado por el agregado u otra operacin SET. Este mensaje es debido a que en las columnas hay valores nulos y nos advierte de que no se han tenido en cuenta, en lo sucesivo no se indicar la advertencia en el resultado a obtener aunque s aparezca cuando se ejecute la consulta. Resultado: Cuota media Ventas medias 22750,00 33846,1538

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

Unidad 5. Ejercicio paso a paso: Agrupar filas con GROUP BY


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Realizar consultas de resumen utilizando la clusula GROUP BY para agrupar filas.

Ejercicio paso a paso


Hallar el importe medio de pedidos realizados por cada empleado. SELECT rep, AVG(importe) AS [Importe medio] FROM pedidos GROUP BY rep;

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

109 110 111 112 113 114

35,525 159,6066 NULL NULL NULL NULL

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 =

GROUP BY oficinas.oficina; Resultado: oficina Empleados 11 12 13 21 22 23 24 25 26 27 28 29 30 31 1 3 2 3 1 0 0 0 0 0 0 0 0 0

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

GROUP BY rep; Resultado: rep Clientes atendidos 3 2 1 2 2 2 3 1 2

101 102 103 105 106 107 108 109 110

Unidad 5. Ejercicio paso a paso: Seleccin sobre agrupaciones con HAVING


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Filtrar los resultados de una consulta de resumen con GROUP BY, mediante la clusula HAVING.

Ejercicio paso a paso


Para cada empleado cuyos pedidos suman ms de 300 euros, hallar el importe medio vendido. SELECT rep, AVG(importe) AS [Importe medio] FROM pedidos GROUP BY rep HAVING SUM(importe) > 300; Resultado:

rep Importe medio 105 107 110 154,5492 114,7733 159,6066

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

Ejercicios unidad 5: Consultas de resumen


Para realizar los ejercicios, debers utilizar la base de datos GestionSimples.

Ejercicio 1: Funciones de agregado


1. Cuntas oficinas tenemos en Valencia? Resultado:

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:

Cuota mnima Cuota mxima 3000,00 35000,00


Puedes consultar aqu las soluciones propuestas.

Ejercicio 2: Agrupamiento de filas: GROUP BY


1. De cada vendedor (todos) queremos saber su nombre y el importe total vendido. En caso de que el importe sea NULL, cambiarlo por 0,00 con la funcin ISNULL(). Resultado:

numemp nombre 101 Antonio Viguer 102 Alvaro Jaumes 103 Juan Rovira 104 Jos Gonzlez 105 Vicente Pantalla

Importe vendido 266,28 77,76 21,00 0,00 772,746

106 107 108 109 110 111 112 113 114

Luis Antonio Jorge Gutirrez Ana Bustamante Mara Sunta Juan Victor Juan Gris Julin Martorell Juan Gris Pablo Moreno

46,08 344,32 286,33 71,05 478,82 0,00 0,00 0,00 0,00

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

Puedes consultar aqu las soluciones propuestas.

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)

Agrupa Agrupa clie numemp 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 ... ...

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

104 104 ...

NULL NULL NULL NULL .... ... (sigue)

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

Importe vendido 2364,386 266,28 39,78 1,50 225,00

... (sigue)

102 102 102 103 103 104 104 ...

Total empleado 2106 2120 Total empleado 2111 NULL Total empleado ....

77,76 40,26 37,50 21,00 21,00 NULL NULL ...

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:

numemp Total final ... ...

clie

Importe vendido 2364,386

... (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 .... ...

Puedes consultar aqu las soluciones propuestas.

Ayuda ejercicios unidad 5: Consultas de resumen


Ejercicio 1: Funciones de agregado
1. Cuntas oficinas tenemos en Valencia? SELECT COUNT(*) AS Valencianas FROM oficinas WHERE ciudad = 'Valencia'; 2. Hallar cuntos pedidos hay de ms de 250 euros. SELECT COUNT(*) AS [Superiores a 250] FROM pedidos WHERE importe > 250; 3. Cuntos ttulos (cargos) de empleados se usan? SELECT COUNT(DISTINCT titulo) AS [Cuntos ttulos] FROM empleados; 4. Entre qu cuotas se mueven los empleados? SELECT MIN(cuota) AS [Cuota mnima], MAX(cuota) AS [Cuota mxima]

FROM empleados;

Ejercicio 2: Agrupamiento de filas: GROUP BY


1. De cada vendedor (todos) queremos saber su nombre y el importe total vendido. En caso de que el importe sea NULL, cmbialo por 0,00 con la funcin ISNULL(). SELECT numemp, nombre, ISNULL(SUM(importe),0) AS [Importe vendido] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, nombre; 2. De cada empleado, obtener el importe vendido a cada cliente. SELECT rep, clie AS Cliente, SUM(importe) AS [Importe vendido] FROM pedidos GROUP BY rep, clie; 3. Repetir la consulta anterior pero ahora deben aparecer tambin los empleados que no han vendido nada. SELECT numemp, clie, SUM(importe) AS [Importe vendido] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, clie ORDER BY numemp,clie; 4. Repetir la consulta pero ahora debe aparecer tambin el total de cunto ha vendido cada empleado. SELECT 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; 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 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;

Prueba evaluativa unidad 5: Consultas de resumen


Slo una respuesta es vlida por pregunta. Haz clic en la respuesta que consideres correcta. Contesta todas las preguntas y haz clic en el botn Corregir para ver la solucin. Si pulsas Restablecer podrs repetir la evaluacin.

1. Las funciones de columna o de agregado:

a) Realizan un clculo, operacin o comprobacin sobre los valores de una

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].

c) A y B son ciertas. d) A y B son falsas.


7. CUBE y ROLLUP:

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.

Unidad 6. Ejercicio paso a paso: Subconsultas de resultado nico


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Realizar consultas que incluyan una subconsulta en la clusula WHERE. Se realizarn utilizando operadores de comparacin.

Ejercicio paso a paso

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 =

Unidad 6. Ejercicio paso a paso: El operador IN con subconsulta


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Realizar consultas que incluyan una subconsulta en la clusula WHERE, introducida por el operador IN.

Ejercicio paso a paso


Listar los clientes (nombre) que han remitido pedidos del fabricante ACI y nproducto que empiece por 4100, entre enero y el 15 de abril de 1990.

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

Unidad 6. Ejercicio paso a paso: Comparacin modificada ANY


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

Objetivo
Realizar una consulta que, en su WHERE, compare con el resultado de una subconsulta mediante el test ANY.

Ejercicio paso a paso

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

Esta consula tambin podra haberse realizado con el operador IN.

Unidad 6. Ejercicio paso a paso: Subconsultas con EXISTS


Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.

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.

Ejercicio paso a paso


Listar los empleados (numemp, nombre y oficina) que no trabajan en oficinas dirigidas por el empleado 108. SELECT numemp, nombre, oficina FROM empleados WHERE NOT EXISTS (SELECT * FROM oficinas WHERE oficinas.oficina); Resultado: numemp 101 103 104 105 106 109 110 112 113 114 nombre Antonio Viguer Juan Rovira Jos Gonzlez Vicente Pantalla Luis Antonio Mara Sunta Juan Victor Julin Martorell Juan Gris Pablo Moreno oficina 12 12 12 13 11 NULL NULL NULL NULL 13 dir = 108 and empleados.oficina =

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

AND idproducto = producto AND

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

Ejercicios unidad 6: Las subconsultas


Para realizar los ejercicios, debers utilizar la base de datos GestionSimples. 1. Listar los clientes (numclie, nombre) asignados a Juan que no han remitido un pedido superior a 300 euros. numclie 2107 2107 2121 nombre Julian Lpez Julian Lpez Vicente Ros

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

103 105 106 108 109 111 112 114

Juan Rovira Vicente Pantalla Luis Antonio Ana Bustamante Mara Sunta Juan Gris Julin Martorell Pablo Moreno

28600,00 36800,00 29900,00 36100,00 39200,00 60000,00 91000,00 37000,00

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

Puedes consultar aqu las soluciones propuestas.

Ayuda ejercicios unidad 6: Las subconsultas


1. Listar los clientes (numclie, nombre) asignados a Juan que no han remitido un pedido superior a 300 euros. SELECT numclie, nombre FROM clientes WHERE repclie IN (SELECT numemp FROM empleados

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

WHERE ventas >=

(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 oficinas.oficina); empleados WHERE empleados.oficina =

Prueba evaluativa unidad 6: Las subconsultas


Slo una respuesta es vlida por pregunta. Haz clic en la respuesta que consideres correcta. Contesta todas las preguntas y haz clic en el botn Corregir para ver la solucin. Si pulsas Restablecer podrs repetir la evaluacin.

1. Las subconsultas (o consulta interna)...

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) Se ejecuta al final, despus de recorrer todos los registros de la consulta

principal. b) Se ejecuta por cada una de las filas de la consulta principal.


4. La referencia externa en una subconsulta es:

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) WHERE y TOP. b) WHERE y FROM. c) WHERE y HAVING. d) WHERE y GROUP BY.


6. En las subconsultas introducidas por la clusula EXISTS...

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

la vez. d) Todas son falsas.


9. Una subconsulta puede contener una subconsulta dentro de ella.

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.

Ejercicio paso a paso


Crear una copia de empleados con el nombre Nuevaempleados, lo mismo para la tabla de oficinas (Nuevaoficinas), la de clientes (Nuevaclientes), la de productos (Nuevaproductos) y la de pedidos (Nuevapedidos). A partir de este momento estas tablas servirn para tener una copia original de las tablas que vamos a modificar. Las tablas creadas slo se utilizarn en el ltimo ejercicio del tema. SELECT * INTO Nuevaempleados FROM empleados; SELECT * INTO Nuevaoficinas FROM oficinas; SELECT * INTO Nuevaclientes FROM clientes; SELECT * INTO Nuevaproductos FROM productos; SELECT * INTO Nuevapedidos FROM pedidos; Crear una tabla (Oeste) con todas las oficinas del Oeste, la tabla tendr los mismos datos que oficinas. (3 filas afectadas) SELECT * INTO Oeste FROM oficinas WHERE region = 'Oeste';

Unidad 7. Ejercicio paso a paso: Insertar una fila de valores


Nota: Para realizar los ejercicios necesitars la base de datos Gestion8.

Objetivo
Insertar una fila de datos en una tabla ya existente.

Ejercicio paso a paso


Aadir una nueva oficina para la ciudad de Elx, con el nmero de oficina 40, con director 108 y con un objetivo de 100.000. INSERT INTO oficinas (oficina, ciudad, dir, objetivo) VALUES (40, 'Elx', 108, 100000); Aadir un nuevo empleado numemp: 115, nombre: Luis Garcia, oficina: 40, sin objetivo ni ventas ni director. INSERT INTO empleados (numemp, nombre, oficina) VALUES (115, 'Luis Garcia', 40); Aadir a la oficina 40 un empleado Antonio Garca Lpez, con nmero de empleado 435, contratado hoy sin ventas con cuota 1200,45 con ttulo Vendedor, de momento no le asignaremos jefe. INSERT INTO empleados cuota, oficina) VALUES (435, 1200.45, 40); 'Antonio (numemp, Garca nombre, titulo, contrato, ventas, 0,

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;

Unidad 7. Ejercicio paso a paso: Insertar varias filas


Nota: Para realizar los ejercicios necesitars la base de datos Gestion8.

Objetivo
Copiar un conjunto de filas de una tabla ya existente a otra.

Ejercicio paso a paso


Aadir a la tabla Oeste las oficinas del Este. (6 filas afectadas) INSERT INTO Oeste SELECT * FROM oficinas WHERE region = 'Este';

Unidad 7. Ejercicio paso a paso: Modificar datos con UPDATE


Nota: Para realizar los ejercicios necesitars la base de datos Gestion8.

Objetivo
Modificar los datos de una tabla.

Ejercicio paso a paso


Subir un 5% el precio de todos los productos del fabricante QSA. (3 filas afectadas) UPDATE productos SET precio = ROUND(precio * 1.05,2) WHERE idfab = 'qsa'; Resultado: idfab idproducto precio qsa qsa qsa xk47 xk48 xk48a 3,73 1,41 1,55

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

Unidad 7. Ejercicio paso a paso: Modificar filas con DELETE


Nota: Para realizar los ejercicios necesitars la base de datos Gestion8.

Objetivo
Eliminar registros de una tabla utilizando DELETE.

Ejercicio paso a paso


Eliminar el empleado 435. DELETE empleados WHERE numemp = 435; Eliminar los pedidos del representante 105. (5 filas afectadas) DELETE FROM pedidos WHERE rep = 105;

Ejercicios unidad 7: Actualizacin de datos (I)


Para realizar los ejercicios, debers utilizar la base de datos Gestion8. 1. 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). 2. Pasar los pedidos de octubre 1989 a diciembre 2008. (3 filas afectadas) 3. Queremos actualizar el importe de los pedidos del mes actual con el precio almacenado en la tabla productos. Ayuda: En un primer paso obtener los pedidos del mes actual obteniendo tambin el precio unitario dentro del pedido y el precio del producto de la tabla de productos. codigo numpedido 1 2 110036 110037 fechapedido 2008-12-12 00:00:00.000 2008-12-12 00:00:00.000 cant importe precio pedido precio 9 7 22,50 31,50 2,50 4,50 NULL 45,00

6 9 16

112979 112989 113013

2008-12-12 00:00:00.000 2008-12-10 00:00:00.000 2008-12-28 00:00:00.000

6 6 1

150,00 14,58 6,52

25,00 2,43 6,52

NULL 2,43 5,16

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.

Ayuda ejercicios unidad 7: Actualizacin de datos (I)


1. 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; 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

WHERE YEAR(fechapedido)=YEAR(GETDATE()) MONTH(fechapedido)=MONTH(GETDATE())

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

Prueba evaluativa unidad 7: Actualizacin de datos


Slo una respuesta es vlida por pregunta. Haz clic en la respuesta que consideres correcta. Contesta todas las preguntas y haz clic en el botn Corregir para ver la solucin. Si pulsas Restablecer podrs repetir la evaluacin.

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.

6. Para indicar qu filas queremos modificar, podemos aplicar la clusula...

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.

Unidad 8. Ejercicio paso a paso: ALTER DATABASE


Objetivo
Modificar las caractersticas de la base de datos, ms concretamente el tipo de intercalacin.

Ejercicio paso a paso


Cambiar la intercalacin de la base de datos Gestion para que el sistema sea sensible a las maysculas y minsculas. ALTER DATABASE Gestion COLLATE GO Para volver a dejarla como estaba. ALTER DATABASE Gestion COLLATE GO Modern_Spanish_CI_AI Modern_Spanish_CS_AI

Ejercicios unidad 8: El DDL, Lenguaje de Definicin de Datos


1. Crea una nueva base de datos Gestion2, los archivos fsicos se llamarn tambin Gestion2 y se crear en la misma carpeta que la base de datos Gestion. 2. En Gestion2, crea las mismas tablas que tenemos en Gestion con las mismas relaciones entre ellas. Este ejercicio se resuelve con varias sentencias. 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. 4. Qu se puede hacer para que no puedan existir en la tabla de clientes dos clientes con el mismo 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.

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.

Ayuda ejercicios unidad 8: El DDL, Lenguaje de Definicin de Datos


1. Crea una nueva base de datos Gestion2, los archivos fsicos se llamarn tambin Gestion2 y se crear en la misma carpeta que la base de datos Gestion. CREATE DATABASE SQL Server. Gestion2; -- La crea en la carpeta por defecto de ON (NAME='Gestion2' ,

CREATE DATABASE Gestion2 FILENAME='F:\SQL\Gestion2.mdf')

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

region dir INT

CHAR(20) NULL, NULL, NULL, CONSTRAINT d1 DEFAULT (0),

objetivo MONEY ventas

MONEY NULL

CONSTRAINT PK_oficinas PRIMARY CONSTRAINT empleados ) ALTER TABLE dbo.empleados FK_empleados_oficina FK_oficinas_dir

KEY (oficina), FOREIGN KEY (dir) REFERENCES

WITH

CHECK

ADD

CONSTRAINT

FOREIGN KEY(oficina) REFERENCES dbo.oficinas CREATE TABLE dbo.clientes( NULL,

(oficina)

numclie INT NOT nombre

CHAR(20) NULL, FK_clientes_repclie FOREIGN KEY CONSTRAINT PK_clientes PRIMARY

repclie INT NULL CONSTRAINT REFERENCES dbo.empleados, limitecredito INT KEY (numclie) ) CREATE TABLE dbo.productos( idfab idproducto NULL,

CHAR(5) NOT NULL, CHAR(10) NOT NULL,

descripcion CHAR(20) NULL, precio MONEY 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)

fechapedido DATETIME clie rep fab producto cant

INT NOT NULL, INT NOT NULL, CHAR(5) NOT NULL, CHAR(10) NOT NULL, SMALLINT NULL,

importe CONSTRAINT CONSTRAINT empleados, CONSTRAINT clientes,

MONEY NULL, PK_pedidos PRIMARY KEY FK_pedidos_rep FK_pedidos_clie (codigo), KEY KEY (rep) (clie) KEY REFERENCES REFERENCES

FOREIGN FOREIGN

CONSTRAINT FK_pedidos_productos REFERENCES productos)

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)

ALTER TABLE Clientes ADD

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

Prueba evaluativa unidad 8: El DDL, Lenguaje de Definicin de Datos


Slo una respuesta es vlida por pregunta. Haz clic en la respuesta que consideres correcta. Contesta todas las preguntas y haz clic en el botn Corregir para ver la solucin. Si pulsas Restablecer podrs repetir la evaluacin.

1. El DDL normalmente es una funcin propia de:

a) El programador. b) El analista. c) El usuario. d) El administrador.


2. Las sentencias propias del DDL son:

a) SELECT, INSERT, DELETE y UPDATE. b) ORDER BY y GROUP BY. c) CREATE, DROP y ALTER.

d) Todas son ciertas.


3. Podemos crear una base de datos mediante cdigo SQL, sin necesidad de utilizar los mens de SSMS.

a) Verdadero. b) Falso.
4. Para eliminar una base de datos, utilizamos:

a) DELETE DATABASE. b) DROP DATABASE. c) REMOVE DATABASE. d) Todas son ciertas.


5. Para establecer una clave primaria formada por varias columnas, al crear una tabla.

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.

Unidad 9. Ejercicio paso a paso: Procedimientos


Objetivo
Realizar procedimientos en que utilizaremos estructuras de control de flujo como BEGIN... END, IF y GO. Adems, se har un repaso a lo que ya hemos aprendido a lo largo del curso, puesto que los procedimientos, al fin y al cabo sirven para ejecutar sentencias SQL. Repasaremos cmo crear tablas e insertar datos en ellas.

Ejercicio paso a paso

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

error no har nada

ningn mensaje de error y seguir

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,

INT NULL, MONEY NULL, MONEY NULL

CHAR(20) NULL, NULL,

objetivo MONEY NULL, ventas MONEY NULL CONSTRAINT d1 DEFAULT (0),

CONSTRAINT )

PK_oficinas PRIMARY KEY (oficina),

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

CHAR(10) NOT NULL,

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

SELECT SELECT SELECT SELECT

* * * *

FROM FROM FROM FROM

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

CONSTRAINT (oficina) REFERENCES oficinas;

FK_empleados_oficinas

FOREIGN

ALTER TABLE '+@base+'.dbo.Oficinas

ADD CONSTRAINT REFERENCES empleados

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

CONSTRAINT FK_pedidos_productos (fab,producto) REFERENCES productos;') END

FOREIGN

GO Empezar: USE Gestion8 EXEC BorraBase 'Gestion10' GO EXEC CreaBase 'Gestion10' GO EXEC RellenaGestion 'Gestion10'

Ejercicios unidad 9: Programacin en TRANSACT SQL


Nota: Para realizar los ejercicios, utiliza Gestion10 que has creado en los ejercicios paso a paso de este tema. 1. Aadir a la tabla de productos un campo StockMinimo, y rellenarlo de tal forma que el stock mnimo valorado de cada artculo sea de 100. El stock mnimo valorado es el resultado de multiplicar el stock mnimo por el precio del producto. No hace falta incluir estas sentencias en un procedimiento ya que slo nos sirven para preparar la tabla productos pero redactarlas en Transact-SQL para repasar temas anteriores. 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. 2. Obtener un listado de las oficinas de una determinada regin con ventas superiores a un determinado importe.

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.

Ayuda ejercicios unidad 9: Programacin en TRANSACT SQL (I)


Consejo: Es recomedable copiar el cdigo en la consulta del SSMS y tratar de entenderlo desde ah, porque son consultas extensas y se ven ms claras con las palabras coloreadas. 1. Aadir a la tabla de productos un campo StockMinimo, y rellenarlo de tal forma que el stock mnimo valorado de cada artculo sea de 100. El stock mnimo valorado es el resultado de multiplicar el stock mnimo por el precio del producto. No hace falta incluir estas sentencias en un procedimiento ya que slo nos sirven para preparar la tabla productos pero redactarlas en Transact-SQL para repasar temas anteriores. PRINT 'Empieza el ejercicio 1' USE Gestion10; Alter TABLE Productos ADD GO UPDATE Productos SET StockMinimo= 100/(CASE WHEN Precio IS NULL OR Precio=0 THEN 100 ELSE Precio END); -- Utilizamos CASE para que si el producto no tiene precio o un precio igual a cero que asuma StockMinimo 1. StockMinimo INTEGER DEFAULT 0;

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

SELECT Idfab,Idproducto,Descripcion,existencias,StockMinimo+5-existencias FROM Productos WHERE existencias < Stockminimo * FROM

AND NOT EXISTS (SELECT ProductosAPedir WHERE idfab=Afab AND idproducto=Aproducto);

-- 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 >

Prueba evaluativa unidad 9: Programacin en TRANSACT SQL


Slo una respuesta es vlida por pregunta. Haz clic en la respuesta que consideres correcta. Contesta todas las preguntas y haz clic en el botn Corregir para ver la solucin. Si pulsas Restablecer podrs repetir la evaluacin.

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:

a) DROP PROC. b) DROP PROCEDURE. c) A y B son ciertas.

d) A y B son falsas.
4. Los procedimientos pueden contener:

a) Parmetros de entrada. b) Parmetros de salida. c) A y B son ciertas. d) A y B son falsas.


5. Un procedimiento puede contener bucles, condiciones y control de excepciones.

a) Verdadero. b) Falso.
6. Cul de las siguientes clusulas no es un tipo de desencadente:

a) FOR. b) WAITFOR. c) AFTER. d) INSTEAD OF.


7. Para evitar que se borren registros en una tabla al lanzar una sentencia DELETE, utilizamos:

a) FOR. b) WAITFOR. c) AFTER. d) INSTEAD OF.


8. Cuando lanzamos un trigger sobre una sentencia UPDATE:

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.

9. Cul de los triggers siguientes sera posible realizar:

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

You might also like