Base de Datos Bim II SQL Manipulacion de Datos

4,390 views
4,256 views

Published on

Manipulacion de Datos en SQL
Ponente: Juan Carlos Morocho

Published in: Education

Base de Datos Bim II SQL Manipulacion de Datos

  1. 1. ESCUELA : PONENTE: BIMESTRE: BASES DE DATOS I CICLO: CIENCIAS DE LA COMPUTACIÓN II BIMESTRE Ing. Juan Carlos Morocho Octubre 2009 – Febrero 2010
  2. 2. Capítulo 5 SQL: Manipulación de datos Transparencias © Pearson Education Limited 1995, 2005
  3. 3. Capítulo 5 - Objetivos <ul><li>El propósito y la importancia del lenguaje SQL ( Structured Query Languaje , Lenguaje estructurado de consulta). </li></ul><ul><li>Cómo extraer datos de una base de datos usando la instrucción SELECT y construir instrucciones que: </li></ul><ul><ul><li>utilicen la cláusula WHERE para extraer filas que satisfagan diversas condiciones. </li></ul></ul><ul><ul><li>ordenen los resultados de las consultas mediante ORDER BY. </li></ul></ul><ul><ul><li>utilicen las funciones de agregación de SQL </li></ul></ul><ul><ul><li>agrupen los datos mediante GROUP BY y HAVING. </li></ul></ul><ul><ul><li>utilicen subconsultas. </li></ul></ul>© Pearson Education Limited 1995, 2005
  4. 4. Capítulo 5 - Objetivos <ul><ul><li>Combinen tablas. </li></ul></ul><ul><ul><li>Realicen operaciones de conjunto (UNION, INTERSECT, EXCEPT). </li></ul></ul><ul><li>Cómo realizar actualizaciones en la base de datos mediante INSERT, UPDATE, y DELETE. </li></ul>© Pearson Education Limited 1995, 2005
  5. 5. Objetivos del SQL <ul><li>Idealmente, un lenguaje de datos debe permitir al usuario: </li></ul><ul><ul><li>Crear la bases de datos y las estructuras de relación; </li></ul></ul><ul><ul><li>Realizar tareas básicas de gestión de datos como la inserción, modificación y borrado de los datos de las relaciones; </li></ul></ul><ul><ul><li>Realizar consultas tanto simples como complejas. </li></ul></ul><ul><li>Debe realizar estas tareas requiriendo un esfuerzo mínimo por parte del usuario y su sintaxis y la estructura de los comandos deben ser relativamente fáciles de aprender. </li></ul><ul><li>Debe ser portable. </li></ul>© Pearson Education Limited 1995, 2005
  6. 6. Objetivos del SQL <ul><li>El SQL es un lenguaje orientado a la transformación con dos componentes principales: </li></ul><ul><ul><li>Un lenguaje de definición de datos (DLL, Data Definition Language ). </li></ul></ul><ul><ul><li>Un lenguaje de manipulación de datos (DML, Data Manipulation Language ). </li></ul></ul><ul><li>Hasta SQL:1999, el lenguaje SQL no contenía comandos para control de flujo. Estos comandos tenían que implementarse utilizando un lenguaje de programación o un lenguaje de control de tareas, o bien implementarlos de manera interactiva mediante las decisiones del usuario. </li></ul>© Pearson Education Limited 1995, 2005
  7. 7. Objetivos del SQL <ul><li>El lenguaje SQL es relativamente fácil de aprender. </li></ul><ul><ul><li>Se trata de un lenguaje no procedimental: lo que especificamos es qué información queremos, en lugar de especificar cómo obtenerla; </li></ul></ul><ul><ul><li>Es, esencialmente, un lenguaje de formato libre. </li></ul></ul>© Pearson Education Limited 1995, 2005
  8. 8. Objetivos del SQL <ul><li>Está compuesto por palabras inglesas normales: </li></ul><ul><li>1) CREATE TABLE Staff(staffNo VARCHAR(5), </li></ul><ul><ul><li>lName VARCHAR(15), </li></ul></ul><ul><ul><li>salary DECIMAL(7,2)); </li></ul></ul><ul><li>2) INSERT INTO Staff VALUES (‘SG16’, ‘Brown’, 8300); </li></ul><ul><li>3) SELECT staffNo, lName, salary </li></ul><ul><li>FROM Staff </li></ul><ul><li>WHERE salary > 10000; </li></ul>© Pearson Education Limited 1995, 2005
  9. 9. Objetivos del SQL <ul><li>Puede ser utilizado por diversos tipos de usuarios, incluyendo administradores de bases de datos (DBA) personal administrativo, desarrolladores de aplicaciones y muchos otros tipos de usuario final. </li></ul><ul><li>Actualmente existe una norma ISO internacional, lo que hace que sea tanto el lenguaje estándar formal como el estándar de facto para la definición y manipulación de bases de datos relacionales. </li></ul>© Pearson Education Limited 1995, 2005
  10. 10. Historia del SQL <ul><li>En 1974, el Dr. Chamberlain, del laboratorio de IBM en San José, definió un lenguaje denominado lenguaje de de consulta en inglés estructurado (SEQUEL, Structured English Query Language ). </li></ul><ul><li>Una versión revisada, SEQUEL/2, se definió en 1976, pero posteriormente se cambió el nombre a SQL por razones legales. </li></ul>© Pearson Education Limited 1995, 2005
  11. 11. Historia del SQL <ul><li>En el mundo anglosajón, muchas personas lo pronuncian todavía como « sicuel » . </li></ul><ul><li>Posteriormente, IBM desarrolló un prototipo DBMS denominado System R , basado en SEQUEL/2. </li></ul><ul><li>Las raíces de SQL, sin embargo, se encuentran en el lenguaje SQUARE ( Specifying Queries as Relational Expressions , especificación de consultas como expresiones relacionales), que es anterior al proyecto System R. </li></ul>© Pearson Education Limited 1995, 2005
  12. 12. Historia del SQL <ul><li>A finales de los 70, apareció ORACLE, probablemente la primera implementación comercial de un SGBD basado en SQL. </li></ul><ul><li>En 1987, ANSI e ISO publicaron un estándar para SQL. </li></ul><ul><li>En 1989, ISO publicó un anexo que definía una «característica de mejora de la integridad» . </li></ul><ul><li>En 1992, tuvo lugar la primera revisión principal del estándar ISO, conocida como SQL2 o SQL92. </li></ul><ul><li>En 1999, se publicó SQL:1999 que contenía características adicionales para soportar la gestión de datos orientada a objetos. </li></ul><ul><li>A finales de 2003 se publicó una nueva versión SQL:2003. </li></ul>© Pearson Education Limited 1995, 2005
  13. 13. Importancia de SQL <ul><li>SQL ha pasado a formar parte de arquitecturas de aplicación tales como SAA ( Systems Application Architecture ) de IBM. </li></ul><ul><li>Es la opción estratégica elegida por muchas organizaciones de gran tamaño y de considerable influencia (Ej. X/OPEN). </li></ul><ul><li>SQL también es un estándar FIPS ( Federal Information Processing Standard ), lo cual es obligatorio para todas las ventas de sistemas SGBD al gobierno de los Estados Unidos. </li></ul>© Pearson Education Limited 1995, 2005
  14. 14. Importancia de SQL <ul><li>Se utiliza en otros estándares e incluso influye sobre el desarrollo de otros estándares como herramienta de definición. Los ejemplos incluyen: </li></ul><ul><ul><li>El sistema IRDS ( Information Resource Dictionary System , sistema de diccionarios para recursos de información de ISO). </li></ul></ul><ul><ul><li>El estándar RDA ( Remote Data Access , acceso remoto a datos) </li></ul></ul>© Pearson Education Limited 1995, 2005
  15. 15. Escritura de los comandos SQL <ul><li>Una instrucción SQL está compuesta por palabras reservadas y palabras definidas por el usuario. </li></ul><ul><li>Las palabras reservadas son una parte fija del lenguaje SQL y tienen un significado también fijo. </li></ul><ul><li>Las palabras definidas por el usuario son compuestas por este y representan los nombres de diversos objetos de las bases de datos, como tablas columnas, vistas, índices... </li></ul>© Pearson Education Limited 1995, 2005
  16. 16. Escritura de comandos SQL <ul><li>La mayoría de los componentes de una instrucción SQL no distinguen entre mayúsculas y minúsculas excepto en los datos de caracteres literales. </li></ul><ul><li>Serán más legibles si se utilizan las técnicas de sangrado y alineación: </li></ul><ul><ul><li>Cada cláusula de una instrucción debe comenzar en una nueva línea. </li></ul></ul><ul><ul><li>El principio de cada cláusula debe estar alineado con el comienzo de las cláusulas restantes; </li></ul></ul><ul><ul><li>Si una cláusula tiene varias partes, cada una de ellas debe aparecer en una línea distinta y debe estar sangrada con respecto al comienzo de la cláusula. </li></ul></ul>© Pearson Education Limited 1995, 2005
  17. 17. Escritura de comandos SQL <ul><li>Se usará la forma ampliada de la notación BND ( Backus Naur Form ): </li></ul><ul><li>- Las letras mayúsculas representarán palabras reservadas . </li></ul><ul><li>- Las letras minúsculas representarán palabras definidas por el usuario. </li></ul><ul><li>- | indica una elección entre diversas alternativas. </li></ul><ul><li>- Las llaves {} indican un elemento obligatorio . </li></ul><ul><li>- Los corchetes indican un elemento opcional . </li></ul><ul><li>- … indica la repetición opcional de un elemento cero o más veces. </li></ul>© Pearson Education Limited 1995, 2005
  18. 18. Literales <ul><li>Los literales son constantes que se utilizan en las instrucciones SQL. </li></ul><ul><li>Todos los valores de datos no numéricos deben estar encerrados entre comillas simples (Ej. ‘ London’ ). </li></ul><ul><li>Todos los valores de datos numéricos no deben estar encerrados entre comillas simples (Ej. 650.00). </li></ul>© Pearson Education Limited 1995, 2005
  19. 19. Comando SELECT <ul><ul><li>SELECT [DISTINCT | ALL] </li></ul></ul><ul><ul><li>{* | [expresiónColumna [AS nuevoNombre]] [,...] } </li></ul></ul><ul><ul><li>FROM NombreTabla [alias] [, ...] </li></ul></ul><ul><ul><li>[WHERE condición] </li></ul></ul><ul><ul><li>[GROUP BY listaColumnas] [HAVING condición] </li></ul></ul><ul><ul><li>[ORDER BY listaColumnas] </li></ul></ul>© Pearson Education Limited 1995, 2005
  20. 20. Comando SELECT <ul><li>FROM Especifica la tabla o tablas que hay que usar. </li></ul><ul><li>WHERE Filtra las filas de acuerdo con alguna condición </li></ul><ul><li>GROUP BY Forma grupos de filas que tengan el mismo valor de columna. </li></ul><ul><li>HAVING Filtra los grupos de acuerdo con alguna condición. </li></ul><ul><li>SELECT Especifica qué columnas deben aparecer en la salida. </li></ul><ul><li>ORDER BY Especifica el orden de la salida. </li></ul>© Pearson Education Limited 1995, 2005
  21. 21. Comando SELECT <ul><li>El orden de las cláusulas no puede cambiarse. </li></ul><ul><li>La únicas cláusulas obligatorias son SELECT y FROM. </li></ul>© Pearson Education Limited 1995, 2005
  22. 22. Ejemplo 5.1 Extraer todas las columnas de todas las filas. <ul><li>Generar un listado con todos los detalles de todo el personal. </li></ul><ul><li>SELECT staffNo, fName, lName, address, </li></ul><ul><ul><li> position, sex, DOB, salary, branchNo </li></ul></ul><ul><ul><li>FROM Staff; </li></ul></ul><ul><li>Se puede utilizar un asterisco(*) como abreviatura de «todas las columnas» : </li></ul><ul><ul><li>SELECT * </li></ul></ul><ul><ul><li>FROM Staff; </li></ul></ul>© Pearson Education Limited 1995, 2005
  23. 23. Ejemplo 5.1 Extraer todas las columnas de todas las filas © Pearson Education Limited 1995, 2005 Tabla 5.1 Tabla de resultados para el ejemplo 5.1
  24. 24. Ejemplo 5.2 Extraer toda una serie de columnas específicas de todas las filas <ul><li>Generar una lista con los salarios de todos los empleados en la que sólo se muestre el número de empleado, el nombre, el apellido y los datos salariales. </li></ul><ul><ul><li>SELECT staffNo, fName, lName, salary </li></ul></ul><ul><ul><li>FROM Staff; </li></ul></ul>© Pearson Education Limited 1995, 2005
  25. 25. Ejemplo 5.2 Extraer toda una serie de columnas específicas de todas las filas © Pearson Education Limited 1995, 2005 Tabla 5.2 Tabla de resultados para el ejemplo 5.2
  26. 26. Ejemplo 5.3 Uso de DISTINCT <ul><li>Generar un listado con los números de inmueble de todos los inmuebles que hayan sido visitados. </li></ul><ul><li>SELECT propertyNo </li></ul><ul><ul><li>FROM Viewing; </li></ul></ul>© Pearson Education Limited 1995, 2005
  27. 27. Ejemplo 5.3 Uso de DISTINCT <ul><li>Uso de DISTINCT para eliminar duplicados: </li></ul><ul><li>SELECT DISTINCT propertyNo </li></ul><ul><ul><li>FROM Viewing; </li></ul></ul>© Pearson Education Limited 1995, 2005
  28. 28. Ejemplo 5.4 Campos calculados <ul><li>Generar una lista con el salario mensual de todos los empleados que muestre número de empleado, nombre, apellido y la información salarial. </li></ul><ul><li>SELECT staffNo, fName, lName, salary/12 </li></ul><ul><ul><li>FROM Staff; </li></ul></ul>© Pearson Education Limited 1995, 2005 Tabla 5.4 Tabla de resultados para el ejemplo 5.4
  29. 29. Ejemplo 5.4 Campos calculados <ul><li>Se puede dar un nombre a la columna mediante la cláusula AT: </li></ul><ul><li>SELECT staffNo, fName, lName, salary/12 </li></ul><ul><ul><li>AS monthlySalary </li></ul></ul><ul><ul><li>FROM Staff; </li></ul></ul>© Pearson Education Limited 1995, 2005
  30. 30. Ejemplo 5.5 Condición de búsqueda basada en comparación <ul><li>Generar una lista de todos los empleados con salario superior a 10.000 euros. </li></ul><ul><li> SELECT staffNo, fName, lName, position, salary </li></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE salary > 10000; </li></ul></ul>© Pearson Education Limited 1995, 2005 Tabla 5.5 Tabla de resultados para el ejemplo 5.5
  31. 31. Ejemplo 5.6 Condición de búsqueda basada en una comparación compuesta <ul><li>Genere una lista con la dirección de todas las sucursales de Londres y Glasgow </li></ul><ul><li>SELECT * </li></ul><ul><ul><li>FROM Branch </li></ul></ul><ul><ul><li>WHERE city = ‘London’ OR city = ‘Glasgow’; </li></ul></ul>© Pearson Education Limited 1995, 2005 Tabla 5.6 Tabla de resultados para el ejemplo 5.6
  32. 32. Ejemplo 5.7 Condición de búsqueda basada en rango <ul><li>Generar un listado con todos los empleados cuyo salario esté comprendido entre 20.000 y 30.000 euros. </li></ul><ul><li> SELECT staffNo, fName, lName, position, salary </li></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE salary BETWEEN 20000 y 30000; </li></ul></ul><ul><li>BETWEEN indica los puntos extremos del rango. </li></ul>© Pearson Education Limited 1995, 2005
  33. 33. Ejemplo 5.7 Condición de búsqueda basada en rango © Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.7 Tabla 5.7
  34. 34. Ejemplo 5.7 Condición de búsqueda basada en rango <ul><li>También existe una versión negada NOT BETWEEN. </li></ul><ul><li>BETWEEN no añade mucha potencia expresiva a SQL. También se puede escribir: </li></ul><ul><li> SELECT staffNo, fName, lName, position, salary </li></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE salary>=20000 y salary <= 30000; </li></ul></ul><ul><li>Sin embargo, es la forma más sencilla de expresar una condición de búsqueda cuando lo que estemos considerando sea un rango de valores. </li></ul>© Pearson Education Limited 1995, 2005
  35. 35. Ejemplo 5.8 Pertenencia a un conjunto <ul><li>Generar una lista de todos los gerentes y supervisores. </li></ul><ul><ul><li>SELECT staffNo, fName, lName, position </li></ul></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE position IN (‘Manager’, ‘Supervisor’); </li></ul></ul>© Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.8 Tabla 5.8
  36. 36. Ejemplo 5.8 Pertenencia a un conjunto <ul><li>Existe una versión negada (NOT IN). </li></ul><ul><li>IN no añade mucha potencia expresiva a SQL. Podríamos haber expresado la consulta anterior: </li></ul><ul><ul><li>SELECT staffNo, fName, lName, position </li></ul></ul><ul><ul><li> FROM Staff </li></ul></ul><ul><ul><li>WHERE position=‘Manager’ OR </li></ul></ul><ul><ul><li>position=‘Supervisor’; </li></ul></ul><ul><li>IN resulta más efectivo cuando el conjunto contiene múltiples valores. </li></ul>© Pearson Education Limited 1995, 2005
  37. 37. Ejemplo 5.9 Correspondencia de patrones <ul><li>Localizar todos los propietarios en cuya dirección aparezca la cadena de caracteres «Glasgow» . </li></ul><ul><li> SELECT ownerNo, fName, lName, address, telNo </li></ul><ul><ul><li>FROM PrivateOwner </li></ul></ul><ul><ul><li>WHERE address LIKE ‘%Glasgow%’; </li></ul></ul>© Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.9 Tabla 5.9
  38. 38. Ejemplo 5.9 Correspondencia de patrones <ul><li>SQL dispone de dos símbolos especiales para correspondencia de patrones: </li></ul><ul><ul><li>%: cualquier secuencia de cero o más caracteres; </li></ul></ul><ul><ul><li>_ (subrayado): cualquier carácter individual. </li></ul></ul><ul><li>LIKE ‘%Glasgow%’ quiere decir una secuencia de caracteres de cualquier longitud que contenga la palabra Glasgow . </li></ul>© Pearson Education Limited 1995, 2005
  39. 39. Ejemplo 5.10 Condición de búsqueda NULL <ul><li>Generar un listado con los detalles de todas las visitas al inmueble PG4 para las que no se haya introducido ningún comentario. </li></ul><ul><li>Se han producido dos visitas al inmueble PG4, una con comentario y otra sin el. </li></ul><ul><li>Tenemos que comprobar explícitamente la existencia de valores nulos, utilizando la palabra clave especial IS NULL: </li></ul><ul><li>SELECT clientNo, viewDate </li></ul><ul><ul><li>FROM Viewing </li></ul></ul><ul><ul><li>WHERE propertyNo = ‘PG4’ y </li></ul></ul><ul><ul><li>comment IS NULL; </li></ul></ul>© Pearson Education Limited 1995, 2005
  40. 40. Ejemplo 5.10 Condición de búsqueda NULL <ul><li>También puede emplearse la versión negada (IS NOT NULL) para buscar valores que no sean nulos. </li></ul>© Pearson Education Limited 1995, 2005
  41. 41. Ejemplo 5.11 Ordenación de los resultado en una sola columna <ul><li>Generar una lista con el salario de todos los empleados, en orden descendente. </li></ul><ul><li>SELECT staffNo, fName, lName, salary </li></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>ORDER BY salary DESC; </li></ul></ul>© Pearson Education Limited 1995, 2005
  42. 42. Ejemplo 5.11 Ordenación de resultado en una sola columna © Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.11 Tabla 5.11
  43. 43. Ejemplo 5.12 Ordenación multicolumna <ul><li>Generar una lista abreviada de inmuebles ordenada según el tipo de inmueble. </li></ul><ul><li>SELECT propertyNo, type, rooms, rent </li></ul><ul><ul><li>FROM PropertyForRent </li></ul></ul><ul><ul><li>ORDER BY type; </li></ul></ul>© Pearson Education Limited 1995, 2005
  44. 44. Ejemplo 5.12 Ordenación multicolumna © Pearson Education Limited 1995, 2005 Tabla 5.12(a) Tabla de resultados para el ejemplo 5.12 con una clave de ordenación
  45. 45. Ejemplo 5.12 Ordenación multicolumna <ul><li>Hay cuatro pisos en esta lista. Como no hemos especificado ninguna clave secundaria de ordenación, el sistema ordena estas filas de cualquier manera. </li></ul><ul><li>Para ordenar lo resultados según el importe del alquiler, podemos especificar un orden secundario: </li></ul><ul><li>SELECT propertyNo, type, rooms, rent </li></ul><ul><ul><li>FROM PropertyForRent </li></ul></ul><ul><ul><li>ORDER BY type, rent DESC; </li></ul></ul>© Pearson Education Limited 1995, 2005
  46. 46. Ejemplo 5.12 Ordenación multicolumna © Pearson Education Limited 1995, 2005 Tabla 5.12 (b) Tabla de resultados para el ejemplo 5.12 con dos claves de ordenación
  47. 47. Comando SELECT – Funciones de agregación <ul><li>El estándar ISO define cinco funciones de agregación: </li></ul><ul><li>COUNT devuelve el número de valores en una columna especificada. </li></ul><ul><li>SUM devuelve la suma de los valores contenidos en una columna especificada. </li></ul><ul><li>AVG devuelve la media de los valores contenidos en una columna especificada. </li></ul><ul><li>MIN devuelve el valor más pequeño contenido en una columna especificada. </li></ul><ul><li>MAX devuelve al valor más alto contenido en una columna especificada. </li></ul>© Pearson Education Limited 1995, 2005
  48. 48. Comando SELECT - Funciones de agregación <ul><li>Cada una opera sobre una única columna de una tabla y devuelve un único valor. </li></ul><ul><li>COUNT, MIN, y MAX se aplican a campos tanto numéricos como no numéricos, pero SUM y AVG sólo pueden emplearse con campos numéricos. </li></ul><ul><li>Dejando aparte COUNT(*), todas las funciones eliminan en primer lugar los valores nulos y utilizan para sus operaciones únicamente los restantes valores no nulos. </li></ul>© Pearson Education Limited 1995, 2005
  49. 49. Comando SELECT – Funciones de agregación <ul><li>COUNT(*) se emplea para contar todas las filas de una tabla, independientemente de si existen valores nulos o valores duplicados. </li></ul><ul><li>Se emplea DISTINCT antes de la columna a la que se aplica la función para eliminar los duplicados. </li></ul><ul><li>DISTINCT no tiene ningún efecto con las funciones MIN/MAX, pero sí que puede influir sobre el resultado de SUM/AVG. </li></ul>© Pearson Education Limited 1995, 2005
  50. 50. Comando SELECT – Funciones de agregación <ul><li>Las funciones de agregación sólo pueden duplicarse en la lista SELECT y en la cláusula HAVING. </li></ul><ul><li>Si la lista SELECT incluye una función de agregación y no se está empleando ninguna cláusula GROUP BY, entonces ningún elemento de la lista SELECT puede incluir ninguna referencia a una columna a menos que dicha columna sea el argumento de una función de agregación. Por ejemplo la siguiente consulta sería ilegal: </li></ul><ul><li> SELECT staffNo, COUNT(salary) </li></ul><ul><ul><li>FROM Staff; </li></ul></ul>© Pearson Education Limited 1995, 2005
  51. 51. Ejemplo 5.13 Utilización de COUNT(*) <ul><li>¿Cuántos inmuebles tienen un alquiler superior a 350 euros por mes? </li></ul><ul><li>SELECT COUNT(*) AS myCount </li></ul><ul><ul><li>FROM PropertyForRent </li></ul></ul><ul><ul><li>WHERE rent > 350; </li></ul></ul>© Pearson Education Limited 1995, 2005
  52. 52. Ejemplo 5.14 Utilización de COUNT (DISTINCT) <ul><li>¿Cuántos inmuebles distintos fueron visitados en mayo de 2004? </li></ul><ul><li> SELECT COUNT(DISTINCT propertyNo) AS myCount </li></ul><ul><ul><li>FROM Viewing </li></ul></ul><ul><ul><li>WHERE viewDate BETWEEN ‘1-May-04’ </li></ul></ul><ul><ul><li> y ‘31-May-04’; </li></ul></ul>© Pearson Education Limited 1995, 2005
  53. 53. Ejemplo 5.15 Utilización de COUNT y SUM <ul><li>Hallar el número total de gerentes y la suma de sus salarios. </li></ul><ul><li> SELECT COUNT(staffNo) AS myCount, </li></ul><ul><ul><li>SUM(salary) AS mySum </li></ul></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE position = ‘Manager’; </li></ul></ul>© Pearson Education Limited 1995, 2005
  54. 54. Ejemplo 5.16 Utilización de MIN, MAX, AVG <ul><li>Calcular el salario mínimo, máximo y medio de los empleados. </li></ul><ul><li> SELECT MIN(salary) AS myMin, </li></ul><ul><ul><li>MAX(salary) AS myMax, </li></ul></ul><ul><ul><li> AVG(salary) AS myAvg </li></ul></ul><ul><ul><li>FROM Staff; </li></ul></ul>© Pearson Education Limited 1995, 2005
  55. 55. Comando SELECT – Agrupación de resultados <ul><li>Se utiliza GROUP BY para agrupar los datos de las tablas. </li></ul><ul><li>SELECT y GROUP BY están estrechamente integradas: cada elemento de la lista SELECT debe tener un único valor para cada grupo , y la cláusula SELECT sólo puede contener: </li></ul><ul><ul><li>Nombres de columnas </li></ul></ul><ul><ul><li>Funciones de agregación </li></ul></ul><ul><ul><li>Constantes </li></ul></ul><ul><ul><li>Expresiones en las que se combinen algunos de los elementos anteriores. </li></ul></ul>© Pearson Education Limited 1995, 2005
  56. 56. Comando SELECT - Agrupación <ul><li>Todos los nombres de columna contenidos en la lista SELECT deben aparecer obligatoriamente en la cláusula GROUP BY, a menos que el nombre se esté usando únicamente dentro de una función de agregación. </li></ul><ul><li>Si la cláusula WHERE se emplea con GROUP BY, se aplica primero la cláusula WHERE y luego se forman los grupos a partir de las filas restantes que satisfacen la condición de búsqueda. </li></ul><ul><li>El estándar ISO considera que dos valores nulos son iguales en lo que respecta a la cláusula GROUP BY. </li></ul>© Pearson Education Limited 1995, 2005
  57. 57. Ejemplo 5.17 Utilización de GROUP BY <ul><li>Calcular el número de empleados que trabajan en cada sucursal y la suma de sus salarios. </li></ul><ul><ul><li>SELECT branchNo, </li></ul></ul><ul><ul><li>COUNT(staffNo) AS myCount, </li></ul></ul><ul><ul><ul><li>SUM(salary) AS mySum </li></ul></ul></ul><ul><ul><ul><li>FROM Staff </li></ul></ul></ul><ul><ul><ul><li>GROUP BY branchNo </li></ul></ul></ul><ul><ul><ul><li>ORDER BY branchNo; </li></ul></ul></ul>© Pearson Education Limited 1995, 2005
  58. 58. Ejemplo 5.17 Utilización de GROUP BY © Pearson Education Limited 1995, 2005
  59. 59. Restricción de los agrupamientos – Cláusula HAVING <ul><li>La cláusula HAVING está diseñada para ser utilizada con la cláusula GROUP BY con el fin de restringir los grupos que aparecen en la tabla final de resultados. </li></ul><ul><li>Parecida a WHERE, pero WHERE filtra las filas individuales que se encuentran en la tabla final de resultados, mientras que HAVING filtra los grupos. </li></ul><ul><li>Los nombres de las columnas utilizados en la cláusula HAVING tienen que aparecer también en la vista GROUP BY o estar contenidos dentro de una función de agregación. </li></ul>© Pearson Education Limited 1995, 2005
  60. 60. Ejemplo 5.18 Utilización de HAVING <ul><li>Para cada sucursal que tenga más de un empleado, averiguar el número de empleados que trabajan en cada sucursal y la suma de sus salarios . </li></ul><ul><ul><li> SELECT branchNo, </li></ul></ul><ul><ul><li>COUNT(staffNo) AS myCount, </li></ul></ul><ul><ul><ul><li> SUM(salary) AS mySum </li></ul></ul></ul><ul><ul><ul><li>FROM Staff </li></ul></ul></ul><ul><ul><ul><li>GROUP BY branchNo </li></ul></ul></ul><ul><ul><ul><li>HAVING COUNT(staffNo) > 1 </li></ul></ul></ul><ul><ul><ul><li>ORDER BY branchNo; </li></ul></ul></ul>© Pearson Education Limited 1995, 2005
  61. 61. Ejemplo 5.18 Utilización de HAVING © Pearson Education Limited 1995, 2005
  62. 62. Suconsultas <ul><li>Algunas instrucciones SQL pueden incluir una instrucción SELECT. </li></ul><ul><li>Puede utilizarse una subselección en las cláusulas WHERE y HAVING de una instrucción SELECT, en cuyo caso se denomina a esa instrucción subconsulta o consulta anidada. </li></ul><ul><li>Las subselecciones pueden aparecer también dentro de las instrucciones INSERT, UPDATE, y DELETE. </li></ul>© Pearson Education Limited 1995, 2005
  63. 63. Ejemplo 5.19 Utilización de una subconsulta con el operador de igualdad <ul><li>Generar un listado con todos los empleados de ka sucursal ubicada en « 163 Main St » . </li></ul><ul><li>SELECT staffNo, fName, lName, position </li></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE branchNo = </li></ul></ul><ul><ul><li>(SELECT branchNo </li></ul></ul><ul><ul><li> FROM Branch </li></ul></ul><ul><ul><li> WHERE street = ‘163 Main St’); </li></ul></ul>© Pearson Education Limited 1995, 2005
  64. 64. Ejemplo 5.19 Subconsulta con el operador de igualdad <ul><li>La instrucción SELECT interna extrae el número de sucursal correspondiente a la sucursal situada en la calle « 163 Main St » (‘B003’). </li></ul><ul><li>La instrucción SELECT externa extrae los detalles de todos los empleados que trabajan en esta sucursal. </li></ul><ul><li>La instrucción SELECT externa se convierte en: </li></ul><ul><ul><li>SELECT staffNo, fName, lName, position </li></ul></ul><ul><ul><ul><li>FROM Staff </li></ul></ul></ul><ul><ul><ul><li>WHERE branchNo = ‘B003’; </li></ul></ul></ul>© Pearson Education Limited 1995, 2005
  65. 65. Ejemplo 5.19 Subconsulta con el operador de igualdad © Pearson Education Limited 1995, 2005 Tabla 5.19 Tabla de resultados para el ejemplo 5.19
  66. 66. Ejemplo 5.20 Subconsulta con una función de agregación <ul><li>Generar un listado de todos los empleados cuyo salario sea superior al salario medio, indicando cuál es la diferencia en cada caso con respecto al salario medio. </li></ul><ul><ul><li>SELECT staffNo, fName, lName, position, </li></ul></ul><ul><ul><li>salary – (SELECT AVG(salary) FROM Staff) As SalDiff </li></ul></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE salary > </li></ul></ul><ul><ul><ul><li>(SELECT AVG(salary) </li></ul></ul></ul><ul><ul><ul><li> FROM Staff); </li></ul></ul></ul>© Pearson Education Limited 1995, 2005
  67. 67. Ejemplo 5.20 Subconsulta con función de agregación <ul><li>No podemos escribir « WHERE salary > AVG(salary) » </li></ul><ul><li>Sin embargo, utilizamos una subconsulta para hallar el salario medio y luego empleamos la instrucción SELECT externa para extraer los empleados que tengan un salario superior al salario medio calculado: </li></ul><ul><ul><li>SELECT staffNo, fName, lName, position, </li></ul></ul><ul><ul><li>salary – 17000 As salDiff </li></ul></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE salary > 17000; </li></ul></ul>© Pearson Education Limited 1995, 2005
  68. 68. Ejemplo 5.20 Subconsulta con función de agregación © Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.20 Tabla 5.20
  69. 69. Reglas de las subconsultas <ul><li>La cláusula ORDER BY no se puede utilizar dentro de una subconsulta (aunque sí puede emplearse en la instrucción SELECT más externa). </li></ul><ul><li>La lista SELECT de la subconsulta debe estar compuesta por un único nombre de columna o expresión, excepto en el caso de las subconsultas que utilicen la palabra EXISTS. </li></ul><ul><li>De manera predeterminada, los nombres de columna de una subconsulta hacen referencia al nombre de tabla incluso en la cláusula FROM de la subconsulta. También puede referirse a una tabla contenida en la cláusula FROM de una consulta externa cualificando el nombre de la columna. </li></ul>© Pearson Education Limited 1995, 2005
  70. 70. Reglas de las subconsultas <ul><li>Cuando una subconsulta actúa como uno de los operandos de una comparación, la subconsulta debe aparecer en el lado derecho de la comparación. </li></ul><ul><li>Una subconsulta no puede emplearse como operador en una expresión. </li></ul>© Pearson Education Limited 1995, 2005
  71. 71. Ejemplo 5.21 Subconsulta anidada: Utilización de IN <ul><li>Generar un listado con los inmuebles gestionados por los empleados que trabajan en la sucursal situada en « 163 Main St » . </li></ul><ul><ul><li>SELECT propertyNo, street, city, postcode, type, rooms, rent </li></ul></ul><ul><ul><li>FROM PropertyForRent </li></ul></ul><ul><ul><li>WHERE staffNo IN </li></ul></ul><ul><ul><ul><li>(SELECT staffNo </li></ul></ul></ul><ul><ul><ul><li>FROM Staff </li></ul></ul></ul><ul><ul><ul><li>WHERE branchNo = </li></ul></ul></ul><ul><ul><ul><li>(SELECT branchNo </li></ul></ul></ul><ul><ul><ul><li> FROM Branch </li></ul></ul></ul><ul><ul><ul><li> WHERE street = ‘163 Main St’)); </li></ul></ul></ul>© Pearson Education Limited 1995, 2005
  72. 72. Ejemplo 5.21 Subconsulta anidada: Utilización de IN © Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.21 Tabla 5.21
  73. 73. ANY y ALL <ul><li>ANY y ALL pueden utilizarse con aquellas subconsultas que generen una única columna de números. </li></ul><ul><li>Con ALL, la condición sólo será cierta si se se ve satisfecha por todos los valores generados por la subconsulta. </li></ul><ul><li>Con ANY, la condición sólo será cierta si se ve satisfecha por alguno (uno o más) de los valores generados por la subconsulta. </li></ul><ul><li>Si la subconsulta está vacía, la condición ALL devuelve un valor verdadero, mientras que la condición ANY devuelve un valor falso. </li></ul><ul><li>SOME puede utilizarse en lugar de ANY. </li></ul>© Pearson Education Limited 1995, 2005
  74. 74. Ejemplo 5.22 Utilización de ANY/SOME <ul><li>Determinar todos los empleados cuyo salario sea superior al salario de al menos uno de los empleados de la sucursal B003. </li></ul><ul><li> SELECT staffNo, fName, lName, position, salary </li></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE salary > SOME </li></ul></ul><ul><ul><li>(SELECT salary </li></ul></ul><ul><ul><li> FROM Staff </li></ul></ul><ul><ul><li> WHERE branchNo = ‘B003’); </li></ul></ul>© Pearson Education Limited 1995, 2005
  75. 75. Ejemplo 5.22 Utilización de ANY/SOME <ul><li>La consulta interna produce un conjunto {12000, 18000, 24000} y la subconsulta externa selecciona los empleados cuyos salarios sean superiores a alguno de los valores contenidos en el conjunto. </li></ul>© Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.22 Tabla 5.22
  76. 76. Ejemplo 5.23 Utilización de ALL <ul><li>Hallar todos los empleados cuyo salario sea superior al salario de todos los empleados que trabajan en la sucursal B003. </li></ul><ul><li> SELECT staffNo, fName, lName, position, salary </li></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE salary > ALL </li></ul></ul><ul><ul><li>(SELECT salary </li></ul></ul><ul><ul><li> FROM Staff </li></ul></ul><ul><ul><li> WHERE branchNo = ‘B003’); </li></ul></ul>© Pearson Education Limited 1995, 2005
  77. 77. Ejemplo 5.23 Utilización de ALL © Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.23 Tabla 5.23
  78. 78. Consultas multitabla <ul><li>Hasta ahora hemos podido utilizar las subconsulta siempre y cuando los resultados provinieran de la misma tabla. </li></ul><ul><li>Para combinar columnas de diversas tablas debemos utilizar una operación de combinación. </li></ul><ul><li>Para esta operación de combinación debemos incluir más de un nombre de tabla en la cláusula FROM. </li></ul><ul><li>Se utiliza una coma como separador, incluyendo una cláusula WHERE para especificar la columna o columnas con las que hay que realizar la combinación. </li></ul>© Pearson Education Limited 1995, 2005
  79. 79. Consultas multitabla <ul><li>También se puede utilizar un alias para las tablas incluidas en la cláusula FROM. </li></ul><ul><li>El alias se separa del nombre de la tabla mediante un espacio. </li></ul><ul><li>El alias puede emplearse para cualificar los nombres de columna en aquellos casos donde exista ambigüedad. </li></ul>© Pearson Education Limited 1995, 2005
  80. 80. Ejemplo 5.24 Combinación simple <ul><li>Generar un listado con los nombres de todos los clientes que hayan visitado un inmueble, incluyendo en el los comentarios realizados. </li></ul><ul><li> SELECT c.clientNo, fName, lName, </li></ul><ul><ul><li>propertyNo, comment </li></ul></ul><ul><ul><li>FROM Client c, Viewing v </li></ul></ul><ul><ul><li>WHERE c.clientNo = v.clientNo; </li></ul></ul>© Pearson Education Limited 1995, 2005
  81. 81. Ejemplo 5.24 Combinación simple <ul><li>Sólo se incluirán en el resultado aquellas columnas de ambas tablas que tengas valores idénticos en la columna del clientNo, utilizando la condición de búsqueda (c.clientNo = v.clientNo). </li></ul><ul><li>Equivalente a la operación de equicombinación del álgebra relacional. </li></ul>© Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.24 Tabla 5.24
  82. 82. Construcciones alternativas de combinación <ul><li>En SQL existen formas alternativas de especificar esta combinación: </li></ul><ul><li>FROM Client c JOIN Viewing v ON c.clientNo = v.clientNo </li></ul><ul><li>FROM Client JOIN Viewing USING clientNo </li></ul><ul><li>FROM Client NATURAL JOIN Viewing </li></ul><ul><li>En cada uno de los casos , la cláusula FROM sustituye a las cláusulas FROM y WHERE originales. Sin embargo, la primer alternativa produce una tabla con dos columnas clientNo idénticas. </li></ul>© Pearson Education Limited 1995, 2005
  83. 83. Ejemplo 5.25 Ordenación de una combinación <ul><li>Para cada sucursal, indicar los números y los nombres de los empledos que gestionan inmuebles, así como los inmuebles que gestionan. </li></ul><ul><li> SELECT s.branchNo, s.staffNo, fName, lName, </li></ul><ul><ul><li>propertyNo </li></ul></ul><ul><ul><li>FROM Staff s, PropertyForRent p </li></ul></ul><ul><ul><li>WHERE s.staffNo = p.staffNo </li></ul></ul><ul><ul><li>ORDER BY s.branchNo, s.staffNo, propertyNo; </li></ul></ul>© Pearson Education Limited 1995, 2005
  84. 84. Ejemplo 5.25 Ordenación de una combinación © Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.25 Tabla 5.25
  85. 85. Ejemplo 5.26 Combinación de tres tablas <ul><li>Para cada sucursal, indicar los números y los nombres de los empleados que gestionan inmuebles, así como los inmuebles que gestionan . </li></ul><ul><li> SELECT b.branchNo, b.city, s.staffNo, fName, lName, </li></ul><ul><ul><li>propertyNo </li></ul></ul><ul><ul><li>FROM Branch b, Staff s, PropertyForRent p </li></ul></ul><ul><ul><li>WHERE b.branchNo = s.branchNo y </li></ul></ul><ul><ul><li>s.staffNo = p.staffNo </li></ul></ul><ul><ul><li>ORDER BY b.branchNo, s.staffNo, propertyNo; </li></ul></ul>© Pearson Education Limited 1995, 2005
  86. 86. Ejemplo 5.26 Combinación de tres tablas <ul><li>El estándar SQL proporciona formulaciones alternativas para las cláusulas FROM y WHERE: </li></ul><ul><ul><li>FROM (Branch b JOIN Staff s USING branchNo) AS </li></ul></ul><ul><ul><li>bs JOIN PropertyForRent p USING staffNo </li></ul></ul>© Pearson Education Limited 1995, 2005 Tabla de resultados para el ejemplo 5.26 Tabla 5.26
  87. 87. Ejemplo 5.27 Múltiples columnas de agrupamiento <ul><li>Determinar el número de inmuebles gestionados por cada empleado. </li></ul><ul><li> SELECT s.branchNo, s.staffNo, COUNT(*) AS myCount </li></ul><ul><ul><li>FROM Staff s, PropertyForRent p </li></ul></ul><ul><ul><li>WHERE s.staffNo = p.staffNo </li></ul></ul><ul><ul><li>GROUP BY s.branchNo, s.staffNo </li></ul></ul><ul><ul><li>ORDER BY s.branchNo, s.staffNo; </li></ul></ul>© Pearson Education Limited 1995, 2005
  88. 88. Ejemplo 5.27 Múltiples columnas de agrupamiento © Pearson Education Limited 1995, 2005
  89. 89. Cálculo de una combinación <ul><li>El procedimiento para generar los resultados de una combinación son: </li></ul><ul><li>1. Formar el producto cartesiano de las tablas especificadas en las cláusulas FROM. </li></ul><ul><li>2. Su hay una cláusula WHERE aplicar la condición de búsqueda a cada fila de la tabla del producto, reteniendo únicamente aquellas filas que satisfagan la condición. </li></ul><ul><li>3. Para cada una de las filas restantes, determinar el valor de cada elemento de la lista SELECT para generar una fila de la tabla de resultados. </li></ul>© Pearson Education Limited 1995, 2005
  90. 90. Cálculo de una combinación <ul><li>4. Si se ha especificado DISTINCT, eliminar cualesquiera filas duplicadas de la tabla de resultados. </li></ul><ul><li>5. Si se ha especificado ORDER BY, ordenar la tabla de resultados según se requiera. </li></ul><ul><li>SQL proporciona una forma especial de la instrucción SELECT para calcular el producto cartesiano: </li></ul><ul><ul><li>SELECT [DISTINCT | ALL] {* | listaColumnas} </li></ul></ul><ul><ul><li>FROM Nombre Tabla1 CROSS JOIN Tabla2 </li></ul></ul>© Pearson Education Limited 1995, 2005
  91. 91. Combinaciones externas <ul><li>Si una fila de una tabla no tiene ninguna correspondencia en la otra, se omite dicha fila de la tabla de resultados. </li></ul><ul><li>La combinación externa retiene aquellas filas que no satisfagan la condición de combinación. </li></ul><ul><li>Consideremos las siguientes tablas: </li></ul>© Pearson Education Limited 1995, 2005
  92. 92. Combinaciones externas <ul><li>La combinación (interna) de estas dos tablas: </li></ul><ul><ul><li>SELECT b.*, p.* </li></ul></ul><ul><ul><ul><li>FROM Branch1 b, PropertyForRent1 p </li></ul></ul></ul><ul><ul><ul><li>WHERE b.bCity = p.pCity; </li></ul></ul></ul>© Pearson Education Limited 1995, 2005 Tabla 27(b). Tabla de resultados para la combinación interna de las tablas Branch1 y PropertyForRent1.
  93. 93. Combinaciones externas <ul><li>La tabla de resultados tiene dos filas en las que las ciudades son iguales. </li></ul><ul><li>No hay ninguna fila correspondiente a las sucursales de Bristol y Aberdeen. </li></ul><ul><li>Para incluir aquellas filas que no satisfagan la condición de la combinación. </li></ul>© Pearson Education Limited 1995, 2005
  94. 94. Ejemplo 5.28 Combinación externa izquierda <ul><li>Generar un listado con todas las sucursales y los inmuebles que estén en la misma ciudad que alguna sucursal. </li></ul><ul><li> SELECT b.*, p.* </li></ul><ul><ul><li>FROM Branch1 b LEFT JOIN </li></ul></ul><ul><ul><li> PropertyForRent1 p ON b.bCity = p.pCity; </li></ul></ul>© Pearson Education Limited 1995, 2005
  95. 95. Ejemplo 5.28 Combinación externa izquierda <ul><li>Incluye aquellas filas de la primera tabla (la de la izquierda) que no tienen ninguna fila correspondiente en la segunda tabla (la de la derecha). </li></ul><ul><li>Las columnas correspondientes a la segunda tabla se rellenan con valores NULL. </li></ul>© Pearson Education Limited 1995, 2005 Tabla 5.28 Tabla de resultados para el ejemplo 5.28
  96. 96. Ejemplo 5.29 Combinación externa derecha <ul><li>Generar un listado de todos los inmuebles y de las sucursales que estén en la misma ciudad. </li></ul><ul><li> SELECT b.*, p.* </li></ul><ul><ul><li>FROM Branch1 b RIGHT JOIN </li></ul></ul><ul><ul><li> PropertyForRent1 p ON b.bCity = p.pCity; </li></ul></ul>© Pearson Education Limited 1995, 2005
  97. 97. Ejemplo 5.29 Combinación exterior derecha <ul><li>Incluye aquellas filas de la segunda tabla (la de la derecha) que ni tienen ninguna fila correspondiente a la primera tabla (la de la izquierda). </li></ul><ul><li>Las columnas correspondientes a la primera tabla se rellenan con valores NULL. </li></ul>© Pearson Education Limited 1995, 2005 Tabla 5.29 Tabla de resultados para el ejemplo 5.29
  98. 98. Ejemplo 5.30 Combinación externa completa <ul><li>Generar un listado con las sucursales e inmuebles que estén en la misma ciudad, sino también aquellas tablas que no tienen ninguna correspondencia. </li></ul><ul><li> SELECT b.*, p.* </li></ul><ul><ul><li>FROM Branch1 b FULL JOIN </li></ul></ul><ul><ul><li>PropertyForRent1 p ON b.bCity = p.pCity; </li></ul></ul>© Pearson Education Limited 1995, 2005
  99. 99. Ejemplo 5.30 Combinación externa completa <ul><li>Incluye aquellas filas de ambas tablas que no tienen ninguna fila correspondiente. </li></ul><ul><li>En las columnas sin correspondencia aparece NULL. </li></ul>© Pearson Education Limited 1995, 2005 Tabla 5.30 Tabla de resultados para el ejemplo 5.30
  100. 100. EXISTS y NOT EXISTS <ul><li>EXISTS y NOT EXISTS están diseñadas para utilizarlas únicamente dentro de subconsultas. </li></ul><ul><li>Producen un resultado simple de tipo verdadero/falso. </li></ul><ul><li>Es verdadera si y sólo si existe al menos una fila en la tabla de resultados devuelta por la consulta. </li></ul><ul><li>Es falsa si la subconsulta devuelve una tabla de resultados vacía. </li></ul><ul><li>NOT EXISTS es la condición opuesta a EXISTS. </li></ul>© Pearson Education Limited 1995, 2005
  101. 101. EXISTS y NOT EXISTS <ul><li>Puesto que (NOT) EXISTS sólo comprueba la existencia o no existencia de filas en la tabla de resultados de la subconsulta, la subconsulta puede contener cualquier número de columnas. </li></ul><ul><li>Resulta habitual que las subconsultas situadas a continuación de una de estas palabras clave tengan la forma: </li></ul><ul><ul><li>(SELECT * ...) </li></ul></ul>© Pearson Education Limited 1995, 2005
  102. 102. Ejemplo 5.31 Consulta utilizando EXISTS <ul><li>Extraer todos los empleados que trabajen en una sucursal de Londres. </li></ul><ul><li> SELECT staffNo, fName, lName, position </li></ul><ul><ul><li>FROM Staff s </li></ul></ul><ul><ul><li>WHERE EXISTS </li></ul></ul><ul><ul><li>(SELECT * </li></ul></ul><ul><ul><li> FROM Branch b </li></ul></ul><ul><ul><li> WHERE s.branchNo = b.branchNo y </li></ul></ul><ul><ul><li> city = ‘London’); </li></ul></ul>© Pearson Education Limited 1995, 2005
  103. 103. Ejemplo 5.31 Consulta utilizando EXISTS © Pearson Education Limited 1995, 2005 Tabla 5.31 Tabla de resultados para el ejemplo 5.31
  104. 104. Ejemplo 5.31 Consulta utilizando EXISTS <ul><li>Observe que la primera parte de la condición de búsqueda s.branchNo = b.branchNo es necesaria para garantizar que estamos considerando la fila correcta de sucursal para cada empleado. </li></ul><ul><li>Si se omite esta parte de la consulta, todas las filas de empleados aparecerán en la tabla de resultados de la subconsulta: </li></ul><ul><ul><li>SELECT * FROM Branch WHERE city=‘London’ </li></ul></ul><ul><li>La subconsulta siempre sería cierta y la consulta quedaría: </li></ul><ul><ul><li>SELECT staffNo, fName, lName, position FROM Staff </li></ul></ul><ul><ul><li>WHERE true; </li></ul></ul>© Pearson Education Limited 1995, 2005
  105. 105. Ejemplo 5.31 Consulta utilizando EXISTS <ul><li>También podría reformularse por medio de la combinación: </li></ul><ul><ul><li>SELECT staffNo, fName, lName, position </li></ul></ul><ul><ul><li>FROM Staff s, Branch b </li></ul></ul><ul><ul><li>WHERE s.branchNo = b.branchNo y </li></ul></ul><ul><ul><li>city = ‘London’; </li></ul></ul>© Pearson Education Limited 1995, 2005
  106. 106. Unión, intersección y diferencia <ul><li>Se pueden emplear las operaciones normales de conjuntos, unión, intersección y diferencia para combinar los resultados de dos o más consultas en una única tabla de resultados. </li></ul><ul><li>La unión de dos tablas, A y B,es una tabla que contiene todas las filas que están incluidas en la primera tabla A o en la segunda tabla B o en ambas. </li></ul><ul><li>Las intersección es una tabla que contiene todas las filas que son comunes a A y B. </li></ul><ul><li>La diferencia es una tabla que contiene todas filas que están contenidas en la taba A pero no en B. </li></ul><ul><li>Las dos tablas deben ser compatibles con respecto a la unión . </li></ul>© Pearson Education Limited 1995, 2005
  107. 107. Unión, Intersección, y diferencia (Except) <ul><li>El formato de la cláusula del operador de conjuntos es, en todos los casos: </li></ul><ul><ul><li>op [ALL] [CORRESPONDING [BY {columna1 [, ...]}]] </li></ul></ul><ul><li>Si se especifica CORRESPONDING BY, la operación de conjuntos se realizará sobre las columnas designadas. </li></ul><ul><li>Si se especifica CORRESPONDING pero no la cláusula BY, la operación de conjuntos se realiza sobre todas las columnas que sean comunes a ambas tablas. </li></ul><ul><li>Si se especifica ALL el resultado puede incluir filas duplicadas. </li></ul>© Pearson Education Limited 1995, 2005
  108. 108. Unión, Intersección, y diferencia(Except) © Pearson Education Limited 1995, 2005 Unión Intersección Diferencia
  109. 109. Ejemplo 5.32 Utilización de UNIóN <ul><li>Construir una lista de todas las ciudades en las que exista una sucursal o un inmueble. </li></ul><ul><li>(SELECT city </li></ul><ul><ul><li>FROM Branch </li></ul></ul><ul><ul><li>WHERE city IS NOT NULL) UNION </li></ul></ul><ul><ul><li>(SELECT city </li></ul></ul><ul><ul><li>FROM PropertyForRent </li></ul></ul><ul><ul><li>WHERE city IS NOT NULL); </li></ul></ul>© Pearson Education Limited 1995, 2005
  110. 110. Ejemplo 5.32 Utilización de UNIóN <ul><li>O bien </li></ul><ul><ul><li>(SELECT * FROM Branch WHERE city IS NOT NULL) UNION CORRESPONDING BY city (SELECT * FROM PropertyForRent WHERE city IS NOT NULL); </li></ul></ul>© Pearson Education Limited 1995, 2005
  111. 111. Ejemplo 5.32 Utilización de UNIóN <ul><li>Genera una tabla de resultados a partir de la primera consulta y otra tabla de resultados a partir de la segunda y junta las dos tablas eliminando las filas duplicadas. </li></ul>© Pearson Education Limited 1995, 2005 Tabla 5.32 Tabla de resultados para el ejemplo 5.32
  112. 112. Ejemplo 5.33 Utilización de INTERSECT <ul><li>Construir una lista de todas las ciudades en las que haya tanto una sucursal como un inmueble. </li></ul><ul><li> (SELECT city FROM Branch) </li></ul><ul><ul><li>INTERSECT </li></ul></ul><ul><ul><li>(SELECT city FROM PropertyForRent); </li></ul></ul>© Pearson Education Limited 1995, 2005
  113. 113. Ejemplo 5.33 Utilización de INTERSECT <ul><li>O también </li></ul><ul><ul><li>(SELECT * FROM Branch) </li></ul></ul><ul><ul><li>INTERSECT CORRESPONDING BY city </li></ul></ul><ul><ul><li>(SELECT * FROM PropertyForRent); </li></ul></ul>© Pearson Education Limited 1995, 2005 Tabla 5.33 Tabla de resultados para el ejemplo 5.32
  114. 114. Ejemplo 5.33 Utilización de INTERSECT <ul><li>Podemos reescribir esta consulta sin el operador INTERSECT: </li></ul><ul><ul><li>SELECT b.city </li></ul></ul><ul><ul><li>FROM Branch b PropertyForRent p </li></ul></ul><ul><ul><li>WHERE b.city = p.city; </li></ul></ul><ul><li>O: </li></ul><ul><ul><li>SELECT DISTINCT city FROM Branch b </li></ul></ul><ul><ul><li>WHERE EXISTS </li></ul></ul><ul><ul><li>(SELECT * FROM PropertyForRent p </li></ul></ul><ul><ul><li>WHERE p.city = b.city); </li></ul></ul>© Pearson Education Limited 1995, 2005
  115. 115. Ejemplo 5.34 Utilización de EXCEPT <ul><li>Construir una lista de todas las ciudades en las que haya una sucursal pero no haya ningún inmueble. </li></ul><ul><li> (SELECT city FROM Branch) </li></ul><ul><ul><li>EXCEPT </li></ul></ul><ul><ul><li>(SELECT city FROM PropertyForRent); </li></ul></ul><ul><li>O </li></ul><ul><ul><li>(SELECT * FROM Branch) </li></ul></ul><ul><ul><li>EXCEPT CORRESPONDING BY city </li></ul></ul><ul><ul><li>(SELECT * FROM PropertyForRent); </li></ul></ul>© Pearson Education Limited 1995, 2005 Tabla 5.34 Tabla de resultados para el ejemplo 5.34
  116. 116. Ejemplo 5.34 Utilización de EXCEPT <ul><li>Esta consulta se puede reescribir sin EXCEPT: </li></ul><ul><ul><li>SELECT DISTINCT city FROM Branch </li></ul></ul><ul><ul><li>WHERE city NOT IN </li></ul></ul><ul><ul><li>(SELECT city FROM PropertyForRent); </li></ul></ul><ul><li>O bien </li></ul><ul><ul><li>SELECT DISTINCT city FROM Branch b </li></ul></ul><ul><ul><li>WHERE NOT EXISTS </li></ul></ul><ul><ul><li>(SELECT * FROM PropertyForRent p </li></ul></ul><ul><ul><li>WHERE p.city = b.city); </li></ul></ul>© Pearson Education Limited 1995, 2005
  117. 117. INSERT <ul><li> INSERT INTO NombreTabla [ (listaColumnas) ] </li></ul><ul><ul><li>VALUES (listaValoresDatos) </li></ul></ul><ul><li>La ListaColumnas es opcional; si se omite, SQL utilizará de forma predeterminada una lista de todas las columnas en su orden original especificado en CREATE TABLE. </li></ul><ul><li>Cualquier columna omitida debe haber sido declarada como NULL cuando se creo la tabla, a menos que se haya utilizado la opción DEFAULT al crear la columna. </li></ul>© Pearson Education Limited 1995, 2005
  118. 118. INSERT <ul><li>La ListaValoresDatos debe corresponderse con la ListaColumnas de la siguiente forma: </li></ul><ul><ul><li>el número de elementos de cada lista debe ser el mismo; </li></ul></ul><ul><ul><li>Debe haber una correspondencia directa entre las posiciones de los elementos de ambas listas; </li></ul></ul><ul><ul><li>El tipo de datos de cada elemento de ListaValoresDatos debe ser compatible con el tipo de datos de la correspondiente columna. </li></ul></ul>© Pearson Education Limited 1995, 2005
  119. 119. Ejemplo 5.35 INSERT … VALUES <ul><li> Insertar una nueva fila en la tabla Staff y suministrarle los datos para todas las columnas. </li></ul><ul><li> INSERT INTO Staff </li></ul><ul><ul><li>VALUES (‘SG16’, ‘Alan’, ‘Brown’, ‘Assistant’, ‘M’, Date‘1957-05-25’, 8300, ‘B003’); </li></ul></ul>© Pearson Education Limited 1995, 2005
  120. 120. Ejemplo 5.36 INSERT utilizando valores predeterminados <ul><li>Insertar una nueva fila en la tabla Staff y suministrarle datos para todas las columnas obligatorias. </li></ul><ul><li>INSERT INTO Staff (staffNo, fName, lName, </li></ul><ul><ul><li>position, salary, branchNo) </li></ul></ul><ul><ul><li>VALUES (‘SG44’, ‘Anne’, ‘Jones’, </li></ul></ul><ul><ul><li>‘ Assistant’, 8100, ‘B003’); </li></ul></ul><ul><li>O </li></ul><ul><ul><li>INSERT INTO Staff </li></ul></ul><ul><ul><li>VALUES (‘SG44’, ‘Anne’, ‘Jones’, ‘Assistant’, NULL, </li></ul></ul><ul><ul><li>NULL, 8100, ‘B003’); </li></ul></ul>© Pearson Education Limited 1995, 2005
  121. 121. INSERT … SELECT <ul><li>La segunda forma de la instrucción INSERT permite copiar múltiples filas de una o más tablas en otra tabla: </li></ul><ul><li>INSERT INTO NombreTabla [ (ListaColumnas) ] </li></ul><ul><ul><li>SELECT ... </li></ul></ul>© Pearson Education Limited 1995, 2005
  122. 122. Ejemplo 5.37 INSERT … SELECT <ul><li>Suponga que hay una tabla StaffPropCount que contiene los nombres de los empleados y el número de inmuebles que gestionan. </li></ul><ul><ul><li>StaffPropCount( staffNo , fName, lName, propCnt) </li></ul></ul><ul><li>Populate StaffPropCount using Staff y PropertyForRent tables. </li></ul>© Pearson Education Limited 1995, 2005
  123. 123. Ejemplo 5.37 INSERT … SELECT <ul><ul><li>INSERT INTO StaffPropCount </li></ul></ul><ul><ul><li>(SELECT s.staffNo, fName, lName, COUNT(*) </li></ul></ul><ul><ul><li>FROM Staff s, PropertyForRent p </li></ul></ul><ul><ul><li>WHERE s.staffNo = p.staffNo </li></ul></ul><ul><ul><li>GROUP BY s.staffNo, fName, lName) </li></ul></ul><ul><ul><li>UNION </li></ul></ul><ul><ul><li>(SELECT staffNo, fName, lName, 0 </li></ul></ul><ul><ul><li>FROM Staff </li></ul></ul><ul><ul><li>WHERE staffNo NOT IN </li></ul></ul><ul><ul><li>(SELECT DISTINCT staffNo </li></ul></ul><ul><ul><li> FROM PropertyForRent)); </li></ul></ul>© Pearson Education Limited 1995, 2005
  124. 124. Ejemplo 5.37 INSERT … SELECT <ul><li>Si omitimos la segunda parte de la operación UNION, excluye a aquellos empleados que no gestionan ningún inmueble en la actualidad. </li></ul>© Pearson Education Limited 1995, 2005
  125. 125. UPDATE <ul><ul><li>UPDATE NombreTabla </li></ul></ul><ul><ul><li>SET NombreColumna1 = valorDatos1 </li></ul></ul><ul><ul><li>[, NombreColumna2 = valorDatos2...] </li></ul></ul><ul><ul><li>[WHERE condiciónBúsqueda] </li></ul></ul><ul><li>NombreTabla puede ser el nombre de una tabla base o de una vista actualizable. </li></ul><ul><li>La cláusula SET especifica los nombres de una o más columnas que hay que actualizar. </li></ul>© Pearson Education Limited 1995, 2005
  126. 126. UPDATE <ul><li>La cláusula WHERE es opcional: </li></ul><ul><ul><li>Si se omite, las columnas especificadas se actualizarán para todas las filas de la tabla; </li></ul></ul><ul><ul><li>Si se especifica sólo se actualizarán aquellas filas que satisfagan la condiciónBúsqueda . </li></ul></ul><ul><li>Los nuevos valores valorDatos deben ser compatibles con ,os tipos de datos de las columnas correspondientes. </li></ul>© Pearson Education Limited 1995, 2005
  127. 127. Ejemplo 5.38/39 Actualización de todas las filas mediante UPDATE <ul><li>Incrementar en un 3% el salario de todos los empleados. </li></ul><ul><li> UPDATE Staff </li></ul><ul><ul><li>SET salary = salary*1.03; </li></ul></ul><ul><li>Incrementar un 5% el salario de todos los gerentes. </li></ul><ul><li>UPDATE Staff </li></ul><ul><ul><li>SET salary = salary*1.05 </li></ul></ul><ul><ul><li>WHERE position = ‘Manager’; </li></ul></ul>© Pearson Education Limited 1995, 2005
  128. 128. Ejemplo 5.40 Actualización de múltiples columnas mediante UPDATE <ul><li>Ascender a David Ford (staffNo=‘SG14’) a gerente e incrementar su salario a 18000 euros. </li></ul><ul><li>UPDATE Staff </li></ul><ul><ul><li>SET position = ‘Manager’, salary = 18000 </li></ul></ul><ul><ul><li>WHERE staffNo = ‘SG14’; </li></ul></ul>© Pearson Education Limited 1995, 2005
  129. 129. DELETE <ul><ul><li>DELETE FROM NombreTabla </li></ul></ul><ul><ul><li>[WHERE condiciónBúsqueda] </li></ul></ul><ul><li>NombreTabla puede ser el nombre de una base o de una vista actualizable. </li></ul><ul><li>condiciónBúsqueda es opcional; si se la omite, todas las filas serán borradas de la tabla. Esto no hace que se borre la propia tabla; Si se especifica condiciónBúsqueda , sólo se borrarán aquellas filas que satisfagan la condición indicada. </li></ul>© Pearson Education Limited 1995, 2005
  130. 130. Ejemplo 5.41/42 Borrado de filas específicas mediante DELETE <ul><li>Borrar todas las filas relativas al inmueble PG4. </li></ul><ul><li>DELETE FROM Viewing </li></ul><ul><ul><li>WHERE propertyNo = ‘PG4’; </li></ul></ul><ul><li>Borrar todas las filas de la tabla de búsqueda. </li></ul><ul><ul><li>DELETE FROM Viewing; </li></ul></ul>© Pearson Education Limited 1995, 2005

×