Igbd - 05 SQL DML Parte 3
Igbd - 05 SQL DML Parte 3
de base de datos
Prof. Carlos Takano
Semana 4
Subconsultas (subqueries)
Subconsultas o subqueries
Subquery Ejemplo 1
/*
Subquery en clusula WHERE
Este subquery debe devolver slo un valor
*/
SELECT employee_id, first_name, last_name,
department_id, salary
FROM employees
WHERE salary >= (SELECT salary FROM employees
WHERE first_name = 'Alexander'
AND last_name = 'Hunold')
Subquery Ejemplo 2
/*
Subquery en clusula WHERE
Este subquery debe devolver slo un valor
Condiciones en subqueries se pueden combinar
con otras
*/
SELECT employee_id, first_name, last_name,
department_id, salary
FROM employees
WHERE salary = (SELECT max(salary) FROM employees
WHERE department_id = 30)
AND department_id = 80
Subquery Ejemplo 3
/*
Subquery en clusula WHERE
Este subquery puede devolver ms de un valor
*/
SELECT d.department_id, d.department_name
FROM departments d
WHERE d.department_id IN (SELECT e.department_id
FROM employees e)
ORDER BY d. department_id
Subquery Ejemplo 4
/*
Subquery en clusula WHERE
Este subquery puede devolver ms de un valor
ALL significa TODOS
ANY significa POR LO MENOS UNO
*/
SELECT employee_id, first_name, last_name,
department_id, salary
FROM employees
WHERE salary > ALL (SELECT salary FROM employees
WHERE first_name='David')
Subquery Ejemplo 5
/*
Subquery en clusula FROM
Este subquery se utiliza como si fuera una tabla
o vista
*/
SELECT e.last_name, e.salary, e.department_id,
m.max_salary
FROM employees e JOIN
(SELECT department_id, max(salary) max_salary
FROM employees
GROUP BY department_id) m
ON e.department_id = m.department_id
WHERE e.salary < m.max_salary
Subquery Ejemplo 6
/*
Subquery en clusula SELECT
Este subquery est correlacionado, utiliza columnas
que pertenecen a la sentencia externa
*/
SELECT employee_id, first_name, last_name,
department_id, salary,
(SELECT max(salary)
FROM employees
WHERE department_id=e.department_id) dept_max
FROM employees e
Subquery Ejemplo 7
/*
Semijoin
Subquery correlacionado
*/
SELECT d.department_id, d.department_name
FROM departments d
WHERE EXISTS
(SELECT 1
FROM employees e
WHERE e.department_id = d.department_id)
ORDER BY d. department_id
Subquery Ejemplo 8
/*
Antijoin
Subquery correlacionado
*/
SELECT d.department_id, d.department_name
FROM departments d
WHERE NOT EXISTS
(SELECT 1
FROM employees e
WHERE e.department_id = d.department_id)
ORDER BY d. department_id
INSERT Ejemplo 1
/*
Inserta una fila
*/
INSERT INTO departments
(department_id, department_name,
manager_id, location_id)
VALUES
(280, 'Corporate Management',
NULL, 1700)
INSERT Ejemplo 2
/*
INSERT con subquery
*/
INSERT INTO departments_1700
SELECT * FROM departments
WHERE location_id = 1700
UPDATE Ejemplo 1
/*
UPDATE simple
*/
UPDATE departments
SET department_name='Treasury',
manager_id=205
WHERE department_id=100
UPDATE Ejemplo 2
/*
UPDATE con subquery
*/
UPDATE
SET
(
SELECT
WHERE
AND
)
WHERE
departments
manager_id =
employee_id FROM employees
first_name = 'Alexander'
last_name='Hunold'
department_id=100
UPDATE Ejemplo 3
/*
UPDATE con subquery correlacionado
*/
UPDATE
SET
(
SELECT
WHERE
)
employees e
manager_id =
manager_id FROM departments d
d.department_id = e.department_id
DELETE Ejemplo 1
/*
DELETE simple
Las filas a eliminar no deben tener
filas dependientes
*/
DELETE FROM departments
WHERE department_id=100
DELETE Ejemplo 2
/*
DELETE con subquery en la clusula WHERE
Las filas a eliminar no deben tener
filas dependientes
*/
DELETE FROM departments
WHERE department_id NOT IN
(SELECT department_id FROM employees)