Ir a contenido principal

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

La primera vez que se registra en developerWorks, se crea un perfil para usted. Información sobre su perfil (nombre, país/región y compañia) estará disponible al público y acompañará cualquiera de sus publicaciones. Puede actualizar su cuenta IBM en cualquier momento.

Toda la información enviada es segura.

  • Cerrar [x]

La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

Toda la información enviada es segura.

  • Cerrar [x]

Preparación para el examen 730 Fundamentos DB2 9, Parte 4: Trabajando con datos DB2

Roman Melnyk, Staff Information Development, IBM Toronto
Roman B. Melnyk , Ph.D., es miembro sénior del equipo DB2 Information Development, especializado en administración de base de datos, herramientas DB2 y en SQL. Durante más de once años en IBM, Roman ha escrito numerosos libros DB2, artículos y otros materiales relacionados. Roman fue co-autor de DB2 Version 8: The Official Guide, DB2: The Complete Reference, DB2 Fundamentals Certification for Dummies y DB2 for Dummies. Recientemente Roman editó Apache Derby -- Off to the Races.

Resumen:  Este tutorial le introduce al Structured Query Language (SQL) y pretende ofrecerle una buena comprensión de cómo el DB2® 9 usa SQL para manipular datos en una base de datos relacional. Este tutorial es el cuarto de una serie de siete tutoriales que usted puede utilizar para prepararse para la Certificación en Fundamentos DB2 9 (Examen 730).

Ver más contenido de esta serie

Fecha:  13-02-2012
Nivel:  Introductoria

Actividad:  3867 vistas

Data Manipulation Language (DML)

Usando el enunciado SELECT para recuperar datos de tablas de bases de datos

El enunciado SELECT se utiliza para recuperar datos de tabla o de vista. En su forma más simple, el enunciado SELECT puede usarse para recuperar todos los datos de una tabla. Por ejemplo, para recuperar todos los datos STAFF de una base de datos SAMPLE, emita el siguiente comando:

SELECT * FROM staff

Este es un conjunto parcial de resultados retornados por esta consulta:


Conjunto de resultados parciales
IDNAMEDEPTJOBYEARSSALARYCOMM
10 Sanders 20 Mgr 7 18357.50 -
20 Pernal 20 Sales 8 18171.25 612.45
30 Marenghi 38 Mgr 5 17506.75 -

Para restringir el número de filas de un conjunto de resultados, use la cláusula FETCH FIRST . Por ejemplo:

SELECT * FROM staff FETCH FIRST 10 ROWS ONLY

Recupere columnas específicas de una tabla especificando una lista seleccionada de nombres de columna separados por comas. Por ejemplo:

SELECT name, salary FROM staff

Use la cláusula DISTINCT para eliminar filas duplicadas de un conjunto de resultados. Por ejemplo:

SELECT DISTINCT dept, job FROM staff

Use la cláusula AS para asignar un nombre significativo a una expresión o a un elemento de la lista seleccionada. Por ejemplo:

SELECT name, salary + comm AS pay FROM staff

Sin la cláusula AS , la columna derivada habría sido llamada 2, indicando que es la segunda columna del conjunto de resultados.


Usando la cláusula WHERE y predicados para limitar la cantidad de datos retornados por una consulta

Use la cláusula WHERE para seleccionar filas especificar de una tabla o vista, al especificar uno o más criterios de selección o condiciones de búsqueda. Una condición de búsqueda consiste en uno o más predicados. Un predicado especifica algo sobre una fila que es o verdadera o falsa (vea Las partes del enunciado SQL) ). Cuando esté construyendo condiciones de búsqueda, asegúrese de:

  • Aplicar operaciones aritméticas solo a tipos de datos numéricos
  • Hacer comparaciones únicamente entre tipos de datos comparables
  • Encerrar valores de caracteres dentro de comillas individuales
  • Especificar valores de caracteres exactamente como aparecen en la base de datos

Observemos algunos ejemplos.

  • Halle los miembros del personal cuyos salarios sean superiores a $20.000:
    "SELECT name, salary FROM staff
      WHERE salary > 20000"
    

    Encerrar el enunciado en comillas dobles evita que si sistema operativo malinterprete caracteres especiales, como * o >; el símbolo mayor-que podría ser interpretado como una solicitud de redireccionamiento de resultado.
  • Haga una lista con el nombre, el cargo y el salario de los miembros que no son gerentes y cuyo salario sea superior a $20.000:
    "SELECT name, job, salary FROM staff
      WHERE job <> 'Mgr'
      AND salary > 20000"
    

  • Encuentre todos los miembros que inicien con la letra S:
    SELECT name FROM staff
      WHERE name LIKE 'S%'
    

    En este ejemplo, el signo de porcentaje (%) es el caracter comodín que representa una cadena de caracteres de cero o más caracteres.

Una sub-consulta es un enunciado SELECT que aparece dentro de la cláusula WHERE de una consulta principal y que alimenta su conjunto de resultados a esa cláusula WHERE . Por ejemplo:

"SELECT lastname FROM employee
  WHERE lastname IN
  (SELECT sales_person FROM sales
    WHERE sales_date < '01/01/1996')"

Un nombre de correlación se define en la cláusula FROM de una consulta y puede servir como un nombre corto conveniente para una tabla. Los nombres de correlación también eliminan referencias ambiguas a nombres de columna idénticos de tablas diferentes. Por ejemplo:

"SELECT e.salary FROM employee e
  WHERE e.salary <
  (SELECT AVG(s.salary) FROM staff s)"


Usando la cláusula ORDER BY para organizar resultados

Use la cláusula ORDER BY para ordenar el conjunto de resultados por valores, en una o más columnas. Los nombres de columna que se especifican en la cláusula ORDER BY no necesitan ser especificadas en la lista seleccionada. Por ejemplo:

"SELECT name, salary FROM staff
  WHERE salary > 20000
  ORDER BY salary"

Ordene el conjunto de resultados en orden descendente especificando DESC en la cláusula ORDER BY :

ORDER BY salary DESC


Usando enlaces para recuperar datos de más de una tabla

Un enlace es una consulta que combina datos de dos o más tablas. A menudo es necesario para seleccionar información proveniente de dos o más tablas porque los datos requeridos a menudo están distribuidos. Un enlace añade columnas al conjunto de resultados. Por ejemplo, un enlace completo de dos tablas de tres columnas produce un conjunto de resultados con seis columnas.

La unión más simple es aquella en la que no hay condiciones especificadas. Por ejemplo:

SELECT deptnumb, deptname, manager, id, name, dept, job 
  FROM org, staff

Este enunciado retorna todas las combinaciones de filas de la tabla ORG y de la tabla STAFF. Las primeras tres columnas provienen de la tabla ORG, y las cuatro últimas columnas provienen de la tabla STAFF. Dicho conjunto de resultados (el producto cruzado entre las dos tablas) no es muy útil. lo que se necesita es una condición de enlace para refinar el conjunto de resultados. Por ejemplo, esta es una consulta que está diseñada para identificar miembros del personal que son gerentes:

SELECT deptnumb, deptname, id AS manager_id, name AS manager 
  FROM org, staff 
  WHERE manager = id 
  ORDER BY deptnumb

Y este es un conjunto de resultados parcial retornado por esta consulta:


Identificando miembros del personal
DEPTNUMBDEPTNAMEMANAGER_IDMANAGER
10 Head Office 160 Molinare
15 New England 50 Hanes
20 Mid Atlantic 10 Sanders

El enunciado al que usted observó en la última sección es un ejemplo de un enlace interno. Los enlaces internos solo retornan filas del producto cruzado que cumplan con la condición de enlace. Si una fila existe en una tabla pero no en la otra, esto no se incluye en el conjunto de resultados. Para especificar explícitamente un enlace interno, reescriba la anterior consulta con un operador INNER JOIN en la cláusula FROM :

...
  FROM org INNER JOIN staff
  ON manager = id
...

La palabra clave ON especifica las condiciones de enlace para las tablas que se están enlazando. DeptNumb y DeptName son columnas de la tabla ORG, y Manager_ID y Manager están basadas en las columnas (ID y Name) de la tabla STAFF. El conjunto de resultados para el enlace interno consiste en filas que tienen valores que coinciden para las columnas Manager e ID de la tabla izquierda (ORG) y la tabla derecha (STAFF), respectivamente. (Cuando usted efectúa un enlace sobre dos tablas, usted designa de forma arbitraria una tabla para que sea la tabla izquierda y otra para que sea la derecha).

Los enlaces externos retornan filas que son generadas por una operación de enlace interno, además de filas que no habrían sido retornadas por la operación de enlace interno. Existen tres tipos de enlaces externos:

  • Un left outer join incluye el enlace interno y las filas de la tabla izquierda que no son retornadas por el enlace interno. Este tipo de enlace usa el operador LEFT OUTER JOIN (o LEFT JOIN) en la cláusula FROM .
  • Un right outer join incluye el enlace interno más las filas de la tabla derecha que no son retornadas por el enlace interno. Este tipo de enlace usa el operador RIGHT OUTER JOIN (o RIGHT JOIN) en la cláusula FROM .
  • Un full outer join incluye el enlace interno más las filas de ambas tablas, la derecha y la izquierda que no son retornadas por el enlace interno. Este tipo de enlace usa el operador FULL OUTER JOIN (o FULL JOIN) en la cláusula FROM .

Construya consultas más complejas para responder a preguntas más difíciles. La siguiente consulta está diseñada para generar una lista de empleados que sean responsables por proyectos, identificando aquellos empleados que también sean gerentes, haciendo una lista de los departamentos que pueden gerenciar:

SELECT empno, deptname, projname 
  FROM (employee 
  LEFT OUTER JOIN project 
  ON respemp = empno) 
  LEFT OUTER JOIN department 
  ON mgrno = empno

El primer enlace externo obtiene el nombre de cualquier proyecto del cual el empleado sea responsable; este enlace externo está encerrado entre paréntesis y se resuelve primero. El segundo enlace externo obtiene su nombre del departamento del empleado, si ese empleado es un gestor.


Usando un conjunto de operadores para combinar dos o más consultas en una sola consulta

Combine dos o más consultas en una sola consulta usando los operadores de conjunto UNION, EXCEPT, o INTERSECT . Los operadores de conjunto procesan el resultado de las consultas, eliminan duplicados y retornan el conjunto final de resultados.

  • El conjunto UNION genera una tabla de resultados al combinar dos o más tablas de otros resultados.
  • El conjunto EXCEPT genera una tabla de resultados incluyendo todas las filas que son retornadas por la primera consulta, pero no por la segunda consulta ni por las subsiguientes.
  • El conjunto INTERSECT genera una tabla de resultados incluyendo solo las filas que son retornadas por todas las consultas.

El siguiente es un ejemplo de una consulta que utiliza el operador de conjunto UNION . La misma consulta puede usar el operador de conjunto EXCEPT o INTERSECT , sustituyendo la palabra clave apropiada por UNION.

"SELECT sales_person FROM sales 
  WHERE region = 'Ontario-South' 
UNION 
SELECT sales_person FROM sales 
  WHERE sales > 3"


Usando la cláusula GROUP BY para resumir resultados

Use la cláusula GROUP BY para organizar las filas de un conjunto de resultados. Cada grupo es representado por una sola fila del conjunto de resultados. Por ejemplo:

SELECT sales_date, MAX(sales) AS max_sales FROM sales 
  GROUP BY sales_date

Este enunciado retorna una lista de las fechas de venta de la tabla SALES. La tabla SALES de la base de datos de muestra SAMPLE contiene datos de ventas, incluyendo el número de transacciones exitosas de un vendedor particular, en una fecha en particular. Normalmente hay más de un registro por fecha. La cláusula GROUP BY agrupa los datos por fecha de venta, y la función MAX en este ejemplo retorna el número máximo de ventas registradas para cada fecha de ventas.

Un sabor diferente de la cláusula GROUP BY incluye la especificación de la cláusula GROUPING SETS . Los grouping sets pueden utilizarse para analizar datos a diferentes niveles de agregación en una sola pasada. Por ejemplo:

SELECT YEAR(sales_date) AS year, region, SUM(sales) AS tot_sales 
  FROM sales
  GROUP BY GROUPING SETS (YEAR(sales_date), region, () )

Aquí, la función YEAR es usada para retornar la porción de año de los valores de datos, y la función SUM se utiliza para retornar el total de cada conjunto de cifras de ventas agrupadas. La lista de conjuntos de agrupación especifica cómo serán agrupados los datos, o agregados. Un para de paréntesis desocupados es añadido a la lista de conjuntos agrupados para obtener un gran total en el conjunto de resultados. El enunciado retorna los siguiente:


Resultado del comando de conjuntos de agrupación
YEARREGIONTOT_SALES
- - 155
- Manitoba 41
- Ontario-North 9
- Ontario-South 52
- Quebec 53
1995 - 8
1996 - 147

Un enunciado que es casi idéntico al anterior, pero que especifica la cláusula ROLLUP o la cláusula CUBE en lugar de la cláusula GROUPING SETS , retorna un conjunto de resultados que proporciona una perspectiva más detallada sobre los datos. Esta puede proporcionar resúmenes por ubicación u hora.

La cláusula HAVING a menudo es usada con la cláusula GROUP BY para recuperar resultados que solo satisfagan una condición específica. Una cláusula HAVING puede contener uno o más predicados que comparan algunas propiedades del grupo con otras propiedades del grupo o con una constante. Por ejemplo:

"SELECT sales_person, SUM(sales) AS total_sales FROM sales 
  GROUP BY sales_person 
  HAVING SUM(sales) > 25"

Este enunciado retorna una lista de los vendedores cuyos totales de ventas excedan 25.


Usando el enunciado INSERT para añadir nuevas filas a tablas o vistas

El enunciado INSERT se utiliza para añadir nuevas filas a una tabla o a una vista. Insertar una fila en una vista también inserta la fila en la que se basa la lista.

  • Use una clausula VALUES para especificar datos de columna para una o más filas. Por ejemplo:
    INSERT INTO staff VALUES (1212,'Cerny',20,'Sales',3,90000.00,30000.00)
    
    INSERT INTO staff VALUES (1213,'Wolfrum',20,'Sales',2,90000.00,10000.00)
    

    O el equivalente:
    INSERT INTO staff (id, name, dept, job, years, salary, comm)
      VALUES
      (1212,'Cerny',20,'Sales',3,90000.00,30000.00),
      (1213,'Wolfrum',20,'Sales',2,90000.00,10000.00)
    

  • Especifique un fullselect para identificar datos que se copiarán desde otras tablas o vistas. Un fullselect es un enunciado que genera una tabla de resultados. Por ejemplo:
    CREATE TABLE pers LIKE staff
    
    INSERT INTO pers
      SELECT id, name, dept, job, years, salary, comm
        FROM staff
        WHERE dept = 38
    


Usando el enunciado UPDATE para cambiar datos de tablas o vistas

El enunciado UPDATE se utiliza para cambiar los datos de una tabla o una vista. Cambie el valor de una o más columnas de cada fila que satisfaga las condiciones especificadas por la cláusula WHERE . Por ejemplo:

UPDATE staff
  SET dept = 51, salary = 70000
    WHERE id = 750

O el equivalente:

UPDATE staff
  SET (dept, salary) = (51, 70000)
    WHERE id = 750

Si usted no especifica una cláusula WHERE , ¡DB2 actualizará cada fila de la tabla o vista!


Usando el enunciado DELETE para eliminar datos

El enunciado DELETE se utiliza para eliminar filas enteras de datos de una tabla. Elimine cada fila que satisfaga las condiciones especificadas por una cláusula WHERE . Por ejemplo:

DELETE FROM staff
  WHERE id IN (1212, 1213)

Si usted no especifica una cláusula WHERE , ¡DB2 eliminará todas las filas de la tabla o vista!


Usar el enunciado MERGE para combinar operaciones condicionales de actualizar, insertar o eliminar

El enunciado MERGE actualiza una tabla objetivo o una vista actualizable usando datos desde una tabla fuente. Durante una operación individual las filas en el objetivo que coinciden con la fuente pueden ser actualizadas o eliminadas, y las filas que no existen en el objetivo pueden ser insertadas.

Por ejemplo, considere que la tabla EMPLOYEE sea la tabla objetivo que contiene información actualizada sobre los empleados de una compañía grande. Las sucursales manejan actualizaciones de los registros de los empleados locales, manteniendo su propia versión de la tabla EMPLOYEE llamada MY_EMP. El enunciadoMERGE puede usarse para actualizar la tabla EMPLOYEE con información que esté contenida en la tabla MY_EMP, que es la tabla fuente para la operación de fusión.

El siguiente enunciado inserta una fila para número de nuevo empleado 000015 en la tabla MY_EMP.

INSERT INTO my_emp (empno, firstnme, midinit, lastname, workdept,
  phoneno, hiredate, job, edlevel, sex, birthdate, salary)
  VALUES ('000015', 'MARIO', 'M', 'MALFA', 'A00',
  '6669', '05/05/2000', 'ANALYST', 15, 'M', '04/02/1973', 59000.00)

Y el siguiente enunciado inserta datos de salario actualizados para el número del empleado existente 000010 en la tabla MY_EMP.

INSERT INTO my_emp (empno, firstnme, midinit, lastname, edlevel, salary)
  VALUES ('000010', 'CHRISTINE', 'I', 'HAAS', 18, 66600.00)

En este punto, los datos insertados solo existen en la tabla MY_EMP porque todavía no ha sido fusionada con la tabla EMPLOYEE. A continuación está el enunciado MERGE que toma el contenido de la tabla MY_EMP y lo integra con la tabla EMPLOYEE.

MERGE INTO employee AS e
  USING (SELECT
   empno, firstnme, midinit, lastname, workdept, phoneno,
   hiredate, job, edlevel, sex, birthdate, salary
   FROM my_emp) AS m
  ON e.empno = m.empno
  WHEN MATCHED THEN
    UPDATE SET (salary) = (m.salary)
  WHEN NOT MATCHED THEN
    INSERT (empno, firstnme, midinit, lastname, workdept, phoneno,
     hiredate, job, edlevel, sex, birthdate, salary)
      VALUES (m.empno, m.firstnme, m.midinit, m.lastname,
       m.workdept, m.phoneno, m.hiredate, m.job, m.edlevel,
       m.sex, m.birthdate, m.salary)

Se han asignado nombres de correlación tanto a la tabla fuente como a la tabla objetivo, para evitar referencias de tabla ambiguas en la condición de búsqueda. El enunciado identifica las columnas en la tabla MY_EMP que se considerarán. El enunciado también especifica las acciones que se deben tomar cuando se encuentra que la tabla MY_EMP debe tener una coincidencia en la tabla EMPLOYEE, o cuando una fila no tiene una coincidencia.

La siguiente consulta ejecutada contra la tabla EMPLOYEE ahora retorna un registro para el empleado 000015:

SELECT * FROM employee WHERE empno = '000015'

Y la siguiente consulta retorna el registro para el empleado 000010 con un valor actualizad o para la columna SALARY.

SELECT * FROM employee WHERE empno = '000010'


Usando la cláusula data-change-table-reference para recuperar conjuntos de resultados inmediatos en la misma unidad de trabajo

Suponga que desea dar al empleado 000220 un aumento del 7% y recuperar su antiguo salario, ambos en la misma unidad de trabajo (UOW). Usted podría lograr esto usando una cláusula data-change-table-reference , la cual es parte de la cláusula FROM de un enunciado SQL.

SELECT salary FROM OLD TABLE (
  UPDATE employee SET salary = salary * 1.07
  WHERE empno = '000220'
);

SALARY
-----------
   29840.00

  1 record(s) selected.

Las columnas en el objetivo de la operación data-change (inser, update o delete) se convierten en las columnas de la tabla de resultados intermedia, y pueden ser referenciados por nombre (en este caso, Salary) en la lista seleccionada de la consulta. Las palabras clave OLD TABLE especifican que la tabla intermedia de resultados contendrá valores que preceden a la operación data-change. Las palabras clave NEW TABLE especifican que la tabla intermedia de resultados contendrá valores que siguen inmediatamente la operación data-change (antes que de la evaluación de integridad referencial y de la activación de los disparadores posteriores se haya presentado). Las palabras clave FINAL TABLE especifican que la tabla intermedia de resultados contendrá valores que siguen a la operación data-change, la evaluación de integridad referencial y a la activación de los disparadores posteriores.

Suponga que usted tiene una tabla CUSTOMERS que se define así:

CREATE TABLE customers (
  cust_id INTEGER GENERATED ALWAYS AS IDENTITY (
   START WITH 10001
  ),
  cust_name VARCHAR(12),
  PRIMARY KEY (cust_id)
);

La clave primaria de esta tabla, Cust_ID, es una columna de identidad generada automáticamente. Usted puede usar una cláusula data-change-table-reference para recuperar el valor de la columna de identidad generado, que está siendo usado como número de cliente.

SELECT * FROM FINAL TABLE (
  INSERT INTO customers (cust_name) VALUES ('Lamarr')
);

CUST_ID     CUST_NAME
----------- ------------
      10001 Lamarr

  1 record(s) selected.

3 de 8 | Anterior | Siguiente

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Information mgmt
ArticleID=792292
TutorialTitle=Preparación para el examen 730 Fundamentos DB2 9, Parte 4: Trabajando con datos DB2
publish-date=02132012
author1-email=roman_b_melnyk@hotmail.com
author1-email-cc=