SQL II
Base de Datos 2019
BD-2019
CONSULTAS EN SQL - OPERACIONES DE CONJUNTO
SQL provee las siguientes operaciones de
SELECT ...
conjunto: union, intersect y except.
UNION [ALL]
SELECT ... Todas:
SELECT ... - Operan sobre tablas.
INTERSECT [ALL] - Eliminan automaticamente los
SELECT ... duplicados.
- Para retener duplicados hay que usar
SELECT ... ALL
EXCEPT [ALL]
SELECT ...
BD-2019
CONSULTAS EN SQL - UNION
(
SELECT course_id
FROM section
WHERE semester = ’Fall’ AND year= 2009
)
UNION
(
SELECT course_id
FROM section
WHERE semester = ’Spring’ AND year= 2010
)
BD-2019
CONSULTAS EN SQL - INTERSECT
(
SELECT course_id
FROM section
WHERE semester = ’Fall’ AND year= 2009
)
INTERSECT
(
SELECT course_id
FROM section
WHERE semester = ’Spring’ AND year= 2010
)
BD-2019
CONSULTAS EN SQL - EXCEPT
(
SELECT course_id
FROM section
WHERE semester = ’Fall’ AND year= 2009
)
EXCEPT
(
SELECT course_id
FROM section
WHERE semester = ’Spring’ AND year= 2010
)
BD-2019
CONSULTAS EN SQL - NULL VALUES
- En una operación aritmética: - Si el predicado de un WHERE evalúa a
NULL (+ | - | * | /) X = NULL FALSE o NULL para una tupla, la misma
no forma parte del resultado.
- En operaciones booleanas:
- Para testear si un valor es NULL:
NULL AND TRUE = NULL
NULL AND FALSE = FALSE WHERE salary IS null;
NULL AND NULL = NULL WHERE salary IS NOT null;
NULL OR TRUE = TRUE
NULL OR FALSE = NULL - Todas las funciones de agregación,
NULL OR NULL = NULL excepto COUNT, ignoran los valores
NOT NULL = NULL nulos.
BD-2019
CONSULTAS EN SQL - CONSULTAS ANIDADAS
- Una subquery es una consulta anida en
SELECT ...
FROM ... ○ Un WHERE
○ Un FROM
WHERE [SUBQUERY]
○ Una COLUMNA
SELECT ... - Una subquery anidada en una columna
FROM [SUBQUERY] se denomina subquery escalar
WHERE ...
SELECT ... , [SUBQUERY], ...
FROM ...
WHERE ...
BD-2019
CONSULTAS ANIDADAS - SET MEMBERSHIP
SELECT DISTINCT course_id
SELECT ... FROM section
FROM ... WHERE semester = ’Fall’ AND year= 2009 AND
WHERE (columns) [IN | NOT IN] course_id IN (
[SUBQUERY] SELECT course_id
FROM section
WHERE semester = ’Spring’
SELECT ... AND year= 2010);
FROM ...
SELECT name
WHERE (columns) [IN | NOT IN]
FROM instructor
[ENUMERATION] WHERE name NOT IN (’Mozart’, ’Einstein’);
BD-2019
CONSULTAS ANIDADAS - SET COMPARISON
SELECT ... SELECT name
FROM instructor
FROM ...
WHERE salary > ALL (
WHERE (columns) SELECT salary
comp SOME [SUBQUERY] FROM instructor
WHERE dept_name = ’Biology’);
SELECT ... ● Para pensar:
FROM ... ○ = SOME == IN ??
WHERE (columns) ○ <> SOME == NOT IN ??
comp ALL [SUBQUERY] ○ <> ALL == NOT IN ??
○ = ALL == IN ??
comp := <,<=,>,>=, <>, =
BD-2019
CONSULTAS ANIDADAS - EMPTY RELATIONS
SELECT ... SELECT course
FROM section AS S
FROM ...
WHERE semester = ’Fall’
WHERE EXISTS [SUBQUERY] AND year= 2009
AND EXISTS (
SELECT ... SELECT *
FROM section AS T
FROM ... WHERE semester = ’Spring’
WHERE NOT EXISTS [SUBQUERY] AND year= 2010
AND S.course_id = T.course_id)
- “tabla A contiene a tabla B” == “not exists (B
except A).”
BD-2019
CONSULTAS ANIDADAS - CORRELATED SUBQUERIES
- Ya vimos que se pueden renombrar las - Una subquery que usa un nombre de
tablas en una consulta: correlación de una query externa es una
subquery correlacionada.
SELECT t.ID, i.ID
FROM instructor AS i, teaches t - Regla de Alcance: en una subquery se
pueden usar solo nombres de
- El alias se denomina nombre de correlación definidos en la propia
correlación. subquery o en cualquier query que la
contenga.
- SQL permite referenciar un nombre de
correlación introducido en una query - Si un nombre de correlación se define
externa en una subquery anidada en el localmente en una subquery y
WHERE. globalmente en la query que la contiene,
la definición local tiene precedencia.
BD-2019
CONSULTAS ANIDADAS - CORRELATED SUBQUERIES
SELECT ... SELECT dept name, avg_salary
FROM (
FROM [SUBQUERY]
SELECT dept_name,
WHERE ...
avg (salary) as avg salary
FROM instructor
GROUP BY dept_name
Concepto clave: Un query retorna una tabla ) WHERE avg_salary > 42000;
y por lo tanto puede aparecer en otra query
en cualquier lugar donde una tabla es Subqueries en un FROM no pueden usar
esperada. nombres de correlación de otras tablas en el
FROM.
SQL:2003 introduce el keyword LATERAL
para permitirlo.
BD-2019
CONSULTAS ANIDADAS - SCALAR SUBQUERIES
- Las consultas escalares pueden ocurrir
SELECT ... , [SUBQUERY], ...
en un SELECT, un WHERE, y un HAVING.
FROM ...
WHERE ...
SELECT d.dept_name
Concepto clave: Podemos utilizar una (SELECT count(*)
subconsulta donde se espera una expresión FROM instructor i
WHERE d.dept_name = i.dept_name
siempre que la consulta retorne una fila con
) AS num_instructors
una sola columna. Tales consultas se
FROM department d;
denominan consultas escalares.
BD-2019
COMMON TABLE EXPRESSIONS (CTE)
WITH
cte_name AS (SUBQUERY)
WITH
[,cte_name AS (SUBQUERY)]...
max_budget (value) AS (
QUERY SELECT max(budget)
FROM department
- WITH permite definir tablas temporarias )
SELECT budget
que están disponibles para la query
FROM department, max_budget
asociada al WITH. WHERE department.budget = max_budget.value
- Mejoran la legibilidad de las consultas.
- Mejoran la performance de la consulta *
BD-2019