Sei sulla pagina 1di 42

Implementacin y gestin

de base de datos
Prof. Carlos Takano
Semana 3

Joins

Joins

Los join permiten combinar las filas de dos o ms


tablas
En

base a valores de las columnas usadas para realizar la


combinacin
En forma horizontal (el resultado contiene las columnas de
todas las tablas involucradas)

Tipos
INNER

JOIN
OUTER JOIN (LEFT, RIGHT Y FULL)
CROSS JOIN (producto cartesiano)

Tipos de join

INNER JOIN

INNER JOIN

JOIN Ejemplo 1
/*
La condicin indica qu columnas se van a
comparar para hacer el JOIN
Los alias de tablas se usan para evitar
ambigedad cuando hay varias columnas
con el mismo nombre
JOIN e INNER JOIN son equivalentes
*/
SELECT e.employee_id, e.first_name,
e.last_name, d.department_name
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)

JOIN Ejemplo 2
/*
La condicin de JOIN tambin se puede
especificar en la clusula WHERE
Se recomienda utilizar la sintaxis del
ejemplo anterior (estndar ANSI)
*/
SELECT e.employee_id, e.first_name,
e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id

JOIN Ejemplo 3
/*
Los JOIN se realizan por pares de tablas
En el ejemplo, se une EMPLOYEES con
DEPARTMENTS y el resultado se une con
LOCATIONS
*/
SELECT e.employee_id, e.first_name,
e.last_name, d.department_name
FROM employees e JOIN departments d
ON (e.department_id=d.department_id)
JOIN locations l
ON (d.location_id = l.location_id)
WHERE l.city <> 'Seattle'

JOIN Ejemplo 4
/*
Para hacer join de una tabla consigo
misma, se debe incluir ms de una vez
en la clusula FROM
*/
SELECT e.first_name, e.last_name,
m.last_name manager
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id)

LEFT OUTER JOIN

LEFT OUTER JOIN

JOIN Ejemplo 5
/*
Si se usa LEFT JOIN, se incluye en el
resultado todas las filas de la tabla
que est a la izquierda de la clusula
JOIN (EMPLOYEES)
LEFT OUTER JOIN es equivalente a LEFT JOIN
*/
SELECT e.employee_id, e.first_name,
e.last_name, d.department_name
FROM employees e LEFT JOIN departments d
ON (e.department_id = d.department_id)

RIGHT OUTER JOIN

RIGHT OUTER JOIN

JOIN Ejemplo 6
/*
Si se usa RIGHT JOIN, se incluye en el
resultado todas las filas de la tabla
que est a la derecha de la clusula
JOIN (DEPARTMENTS)
RIGHT OUTER JOIN es equivalente a RIGHT
JOIN
*/
SELECT e.employee_id, e.first_name,
e.last_name, d.department_name
FROM employees e RIGHT JOIN departments d
ON (e.department_id = d.department_id)

FULL OUTER JOIN

FULL OUTER JOIN

JOIN Ejemplo 7
/*
Si se usa FULL JOIN, se incluye en el
resultado las filas de ambas tablas
involucradas
FULL OUTER JOIN es equivalente a FULL JOIN
*/
SELECT e.employee_id, e.first_name,
e.last_name, d.department_name
FROM employees e FULL JOIN departments d
ON (e.department_id = d.department_id)

La clusula ORDER BY

Clusula ORDER BY
Si no se especifica ORDER BY, no se
puede establecer con seguridad en qu
orden devolver las filas la base de datos
Cada criterio de ordenacin puede ser
una expresin, un alias de columna o la
posicin de una columna en la clusula
SELECT

ORDER BY Ejemplo 1
/*
Ordena por sueldo en forma ascendente
(valor por omisin o default)
*/
SELECT e.employee_id, e.first_name,
e.last_name, d.department_name
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
JOIN locations l
ON (d.location_id = l.location_id)
WHERE l.city <> 'Sydney'
ORDER BY e.salary

ORDER BY Ejemplo 2
/*
Especificar criterios para ordenar por
posicin de columna en la clusula SELECT
DESC ordena en forma descendente
*/
SELECT e.employee_id, e.first_name,
e.last_name, d.department_name
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
ORDER BY 4 DESC, 1

ORDER BY Ejemplo 3
/*
Permite ordenar segn el valor de una
expresin, incluso basada en columnas
que no aparecen en la clusula SELECT
*/
SELECT e.employee_id, e.first_name,
e.last_name, d.department_name
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
ORDER BY TO_CHAR(hire_date,'YYYY'),
e.employee_id

DISTINCT

DISTINCT Ejemplo 1
/*
DISTINCT elimina filas duplicadas
Devuelve una fila por cada cdigo de
puesto que ocupan los empleados
*/
SELECT DISTINCT job_id
FROM employees

DISTINCT Ejemplo 2
/*
DISTINCT elimina filas duplicadas
Devuelve una fila por cada combinacin de
cdigo de puesto y cdigo de departamento
*/
SELECT DISTINCT job_id, department_id
FROM employees

Funciones de grupo

Clusula GROUP BY
Permite aplicar funciones de totalizacin o
resumen, agrupando las filas segn lo
requerido
Devuelve una fila de informacin
totalizada por cada grupo, aplicando
funciones como SUM, COUNT, AVG, MIN,
MAX, entre otras

GROUP BY Ejemplo 1
/*
GROUP BY va despus de WHERE
Primero se aplica el filtro, despus se agrupa
En la clusula GROUP BY deben aparecer todas las
expresiones que aparecen en la clusula SELECT y
no son funciones de grupo
*/
SELECT
FROM
ON
WHERE
GROUP

d.location_id, d.department_id, SUM(e.salary)


employees e JOIN departments d
e.department_id = d.department_id
d.location_id = 1700
BY d.location_id, d.department_id

GROUP BY Ejemplo 2
/*
HAVING permite filtrar filas despus de agrupar
Es "El WHERE del GROUP BY"
*/
SELECT d.location_id, d.department_id, MAX(e.salary)
FROM employees e JOIN departments d
ON e.department_id = d.department_id
WHERE d.location_id = 1700
GROUP BY d.location_id, d.department_id
HAVING COUNT(*) > 5

Operadores de conjuntos

Operadores de conjuntos
UNION y UNION ALL
INTERSECT
DIFFERENCE

En

Oracle, se utiliza MINUS


En SQL Server, se utiliza EXCEPT

UNION
A

UNION

UNION Ejemplo 1
/*
UNION elimina duplicados
UNION ALL no elimina duplicados
*/
SELECT
FROM
WHERE
UNION
SELECT
FROM
WHERE

manager_id
departments
manager_id IS NOT NULL
manager_id
employees
manager_id IS NOT NULL;

INTERSECT
A

INTERSECT

INTERSECT Ejemplo 1
/*
INTERSECT devuelve las filas comunes
*/
SELECT
FROM
WHERE
INTERSECT
SELECT
FROM
WHERE

manager_id
departments
manager_id IS NOT NULL
manager_id
employees
manager_id IS NOT NULL

DIFFERENCE
A

B
BA

DIFFERENCE

A difference B

Atencin: (A B) (B A)

DIFFERENCE (MINUS) Ejemplo 1


/*
MINUS devuelve las filas presentes en
el primer SELECT que no lo estn en el segundo
*/
SELECT
FROM
WHERE
MINUS
SELECT
FROM
WHERE

manager_id
departments
manager_id IS NOT NULL
manager_id
employees
manager_id IS NOT NULL

Potrebbero piacerti anche