Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Base de Datos Bim II SQL Manipulacion de Datos

4,545 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

×