Bases de Datos Cap-V SQL: Manipulación de datos

3,710 views

Published on

SQL: Manipulación de datos
Ponente: Juan Carlos Morocho

Published in: Education, Technology

Bases de Datos Cap-V SQL: Manipulación de datos

  1. 1. ESCUELA : NOMBRES: BASE DE DATOS I CICLO Ciencias de la Computación Ing. Juan Carlos Morocho OCTUBRE 2009 – FEBRERO 2010 BIMESTRE: I BIMESTRE
  2. 2. Capítulo 5 SQL: Manipulación de datos © 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>
  4. 4. Capítulo 5 - Objetivos <ul><ul><li>Utilicen subconsultas </li></ul></ul><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. 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
  6. 6. 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
  7. 7. 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
  8. 8. 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
  9. 9. 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
  10. 10. 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
  11. 11. 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
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. Ejemplo 5.4 Campos calculados <ul><li>Se puede dar un nombre a la columna mediante la cláusula AS: </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
  16. 16. 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
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. 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
  21. 21. 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
  22. 22. 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
  23. 23. 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>
  24. 24. 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
  25. 25. 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
  26. 26. 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
  27. 27. 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
  28. 28. 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
  29. 29. 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
  30. 30. 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
  31. 31. 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>
  32. 32. 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
  33. 33. 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
  34. 34. 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
  35. 35. 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
  36. 36. 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
  37. 37. 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>
  38. 38. 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>
  39. 39. 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>
  40. 40. 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
  41. 41. 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
  42. 42. Ejemplo 5.17 Utilización de GROUP BY © Pearson Education Limited 1995, 2005
  43. 43. 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>
  44. 44. 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>
  45. 45. Ejemplo 5.18 Utilización de HAVING © Pearson Education Limited 1995, 2005
  46. 46. 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
  47. 47. 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
  48. 48. 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
  49. 49. 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
  50. 50. 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>
  51. 51. 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>
  52. 52. 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
  53. 53. 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>
  54. 54. 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>
  55. 55. 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
  56. 56. 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>Tabla de resultados para el ejemplo 5.24 Tabla 5.24
  57. 57. 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
  58. 58. 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>
  59. 59. 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
  60. 60. 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>
  61. 61. 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 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
  62. 62. 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
  63. 63. Ejemplo 5.27 Múltiples columnas de agrupamiento © Pearson Education Limited 1995, 2005
  64. 64. 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
  65. 65. 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>Tabla 27(b). Tabla de resultados para la combinación interna de las tablas Branch1 y PropertyForRent1.
  66. 66. 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
  67. 67. 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
  68. 68. 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
  69. 69. 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
  70. 70. 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
  71. 71. 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
  72. 72. 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
  73. 73. 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>
  74. 74. 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>
  75. 75. Unión, Intersección, y diferencia(Except) © Pearson Education Limited 1995, 2005 Unión Intersección Diferencia
  76. 76. 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
  77. 77. 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
  78. 78. 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
  79. 79. 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>
  80. 80. 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>
  81. 81. 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
  82. 82. 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>
  83. 83. 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
  84. 84. 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>
  85. 85. 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>
  86. 86. 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>
  87. 87. 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>
  88. 88. 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>
  89. 89. 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>
  90. 90. 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>
  91. 91. 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
  92. 92. 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>

×