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
| ID | NAME | DEPT | JOB | YEARS | SALARY | COMM |
|---|---|---|---|---|---|---|
| 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
| DEPTNUMB | DEPTNAME | MANAGER_ID | MANAGER |
|---|---|---|---|
| 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(oLEFT JOIN) en la cláusulaFROM. - 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(oRIGHT JOIN) en la cláusulaFROM. - 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(oFULL JOIN) en la cláusulaFROM.
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
UNIONgenera una tabla de resultados al combinar dos o más tablas de otros resultados. - El conjunto
EXCEPTgenera 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
INTERSECTgenera 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
| YEAR | REGION | TOT_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
VALUESpara 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' |
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.
|
