Sean bienvenidos a esta secci贸n donde se revisa de como realizar consultas de datos de varias tablas utilizando uniones, recuerden estas sentencias estan siendo ejecutadas en SQL developer administrador de la Base de datos Oracle.
Objetivos de la publicaci贸n:Al finalizar esta lecci贸n, deber铆a estar capacitado para lo siguiente:
- Escribir sentencias SELECT para acceder a datos de m谩s de una tabla mediante uniones igualitarias y no igualitarias
- Unir una tabla consigo misma mediante autouni贸n
- Ver datos que normalmente no cumplen una condici贸n de uni贸n mediante uniones OUTER
- Generar un producto cartesiano de todas las filas de una o m谩s tablas
Esta lecci贸n explica c贸mo obtener datos de m谩s de una tabla. Una uni贸n se utiliza para ver informaci贸n de varias tablas. Por lo tanto, puede unir tablas para ver informaci贸n de m谩s de una tabla.
Nota: para obtener m谩s informaci贸n sobre las uniones, consulte la secci贸n sobre consultas y subconsultas SQL: uniones en Oracle Database SQL Language Reference (Referencia sobre Lenguaje SQL de Oracle Database).
Tipos de JOINS y sintaxis
Obtenci贸n de Datos de Varias Tablas
A veces necesita utilizar datos de m谩s de una tabla. En el ejemplo, el informe muestra datos de dos tablas independientes:
La tabla EMPLOYEES contiene los ID de empleado.
Las tablas EMPLOYEES y DEPARTMENTS contienen los ID de departamento.
La tabla DEPARTMENTS contiene los nombres de departamento.
Para producir el informe, necesita enlazar las tablas EMPLOYEES y DEPARTMENTS y acceder a los datos de ambas.
Tipos de Uniones
Las uniones compatibles con el est谩ndar SQL:1999 incluyen los siguientes elementos:
UnionesOUTER:
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
Para unir tablas, puede utilizar la sintaxis de uni贸n que cumpla con el est谩ndar SQL:1999.
Nota : En versiones anteriores a Oracle9i la sintaxis de uni贸n era diferente a los est谩ndares American National Standards Institute (ANSI). La sintaxis de uni贸n compatible con SQL:1999 no ofrece ninguna ventaja en el rendimiento respecto a la sintaxis de uni贸n propietaria de Oracle que exist铆a en las versiones anteriores. Para obtener m谩s informaci贸n sobre la sintaxis de uni贸n propiedad de Oracle, consulte el ap茅ndice F: Sintaxis de Uni贸n en Oracle.
Uni贸n de Tablas mediante la Sintaxis SQL:1999
Utilizar una uni贸n para consultar datos de m谩s de una tabla:
En la sintaxis:
table1.column indica la tabla y la columna desde las que se recuperan los datos
NATURAL JOIN une dos tablas bas谩ndose en el mismo nombre de la columna
JOIN table2 USING column_name realiza una uni贸n igualitaria bas谩ndose en el nombre de la columna
JOIN table2 ON table1.column_name = table2.column_name performs realiza una uni贸n igualitaria bas谩ndose en la condici贸n de la cl谩usula ON
LEFT/RIGHT/FULL OUTER se utiliza para realizar uniones OUTER
CROSS JOIN devuelve un producto cartesiano de las dos tablas
Para obtener m谩s informaci贸n, consulte la secci贸n sobre SELECT en Oracle Database SQL Language Reference (Referencia sobre Lenguaje SQL de Oracle Database).
Cualificaci贸n de Nombres de Columna Ambiguos
Utilizar prefijos de tabla para cualificar los nombres de columna que est谩n en varias tablas.
Utilizar prefijos de tabla para mejorar el rendimiento.
En lugar de prefijos de nombre de tabla completos, utilizar alias de tabla.
Los alias de tablas proporciona un nombre m谩s corto de una tabla:
Mantiene el c贸digo SQL m谩s peque帽o, utiliza menos memoria
Utilizar alias de columna para distinguir columnas que tienen nombres id茅nticos, pero que residen en diferentes tablas.
Al unir dos o m谩s tablas, debe cualificar los nombres de las columnas con el nombre de la tabla para evitar ambig眉edad. Sin los prefijos de tabla, la columna DEPARTMENT_ID de la lista SELECT puede provenir de la tabla DEPARTMENTS o de la tabla EMPLOYEES. Es necesario agregar el prefijo de tabla para ejecutar la consulta. Si no existen nombres de columna comunes entre las dos tablas, no es necesario cualificar las columnas. Sin embargo, el uso del prefijo de tabla mejora el rendimiento, ya que indica al servidor de Oracle d贸nde encontrar exactamente las columnas.
Sin embargo, la cualificaci贸n de nombres de columna con nombres de tabla puede llevar bastante tiempo, especialmente si los nombres de tabla son largos. En su lugar, puede utilizar alias de tabla. Igual que un alias de columna proporciona otro nombre a una columna, un alias de tabla proporciona otro nombre a una tabla. Los alias de tabla ayudan a mantener el c贸digo SQL m谩s peque帽o y, por lo tanto, menos uso de memoria
El nombre de tabla se especifica por completo, seguido de un espacio y del alias de tabla. Por ejemplo, a la tabla EMPLOYEES se le puede proporcionar el alias e y, a la tabla DEPARTMENTS el alias d.
Instrucciones
Los alias de tabla pueden tener hasta 30 caracteres de longitud, pero los alias m谩s cortos son mejores que los largos.
Si se utiliza un alias de tabla para un nombre de tabla determinado en la cl谩usula FROM, el alias de tabla se deber谩 sustituir por el nombre de tabla mediante la sentencia SELECT.
Los alias de tabla deben ser significativos.
El alias de tabla es v谩lido s贸lo para la sentencia actual SELECT.
Creaci贸n de Uniones Naturales
La cl谩usula NATURAL JOIN est谩 basada en todas las columnas de las dos tablas que tienen el mismo nombre.
Selecciona filas de las dos tablas que tienen valores iguales en todas las columnas coincidentes.
Si las columnas que tienen el mismo nombre tienen tipos de dato diferentes, se devolver谩 un error.
Puede unir tablas autom谩ticamente bas谩ndose en las columnas de las dos tablas que tienen el mismo nombre y los mismos tipos de dato. Puede realizar esta acci贸n utilizando las palabras clave NATURAL JOIN.
Nota: la uni贸n se puede producir 煤nicamente en las columnas que tienen los mismos nombres y los mismos tipos de dato en ambas tablas. Si las columnas tienen el mismo nombre pero tipos de dato diferentes, la sintaxis NATURAL JOIN produce un error.
Recuperaci贸n de Registros con Uniones Naturales
En el ejemplo, la tabla LOCATIONS est谩 unida a la tabla DEPARTMENT mediante la columna LOCATION_ID, que es la 煤nica con el mismo nombre en ambas. Si est谩n presentes otras columnas comunes, la uni贸n debe haberlas utilizado todas.
Uniones Naturales con la Cl谩usula WHERE
Las restricciones adicionales en una uni贸n natural se implantan utilizando una cl谩usula WHERE. El siguiente ejemplo limita las filas de salida a las que tienen un ID de departamento igual a 20 o a 50:
SELECT department_id, department_name, location_id, city
FROM departments
NATURAL JOIN locations
WHERE department_id IN (20, 50);
Creaci贸n de Uniones con la Cl谩usula USING
Si varias columnas tienen el mismo nombre pero los tipos de dato no coinciden, utilizar la cl谩usula USING para especificar las columnas para la uni贸n igualitaria.
Utilizar USING para que s贸lo coincida una columna en caso de que coincida m谩s de una.
Las cl谩usulas NATURAL JOIN y USING se excluyen mutuamente.
Las uniones naturales utilizan todas las columnas con tipos de dato y nombres coincidentes para unir las tablas. La cl谩usula USING se puede utilizar para especificar s贸lo las columnas que se deben utilizar para una uni贸n igualitaria.
Uni贸n de Nombres de Columna
Para determinar el nombre de departamento de un empleado, compare el valor de la columna DEPARTMENT_ID en la tabla EMPLOYEES con los valores de DEPARTMENT_ID de la tabla DEPARTMENTS. La relaci贸n entre las tablas EMPLOYEES y DEPARTMENTS es una uni贸n igualitaria; es decir, los valores de la columna DEPARTMENT_ID de ambas tablas deben ser iguales. Normalmente, este tipo de uni贸n implica complementos de clave primaria y ajena.
Nota: las uniones igualitarias tambi茅n se denominan uniones simples o uniones internas.
Recuperaci贸n de Registros con la Cl谩usula USING
En el ejemplo, las columnas DEPARTMENT_ID de las tablas EMPLOYEES y DEPARTMENTS se unen y, por lo tanto, se muestra el LOCATION_ID del departamento en el que trabaja el empleado.
Uso de Alias de Tabla con la Cl谩usula USING
No cualificar una columna que se utilice en la cl谩usula USING.
Si la misma columna se utiliza en otro lugar de la sentencia SQL, no se le puede agregar un alias.
Al realizar una uni贸n con la cl谩usula USING, no puede cualificar una columna que se utiliza en la cl谩usula USING en s铆. Adem谩s, si esa columna se utiliza en cualquier ubicaci贸n de la sentencia SQL, no se le puede agregar ning煤n alias. Por ejemplo, en la consulta mencionada, no debe agregar un alias a la columna location_id en la cl谩usula WHERE porque la columna se utiliza en la cl谩usula USING.
Las columnas a las que se hace referencia en la cl谩usula USING no deben tener un cualificador (nombre o alias de la tabla) en cualquier ubicaci贸n de la sentencia SQL. Por ejemplo, la siguiente sentencia es v谩lida:
SELECT l.city, d.department_name
FROM locations l JOIN departments d USING (location_id)
WHERE location_id = 1400;
Las columnas comunes en ambas tablas, pero que no se utilizan en la cl谩usula USING, se deben prefijar con un alias de tabla, de lo contrario aparecer谩 el error “column ambiguously defined”.
En la siguiente sentencia , manager_id est谩 presente tanto la tabla employees como en departments ; si no se prefija manager_id con un alias de tabla, se produce el error “column ambiguously defined”.
El siguiente ejemplo es v谩lido:
SELECT first_name, d.department_name, d.manager_id
FROM employees e JOIN departments d USING (department_id)
WHERE department_id = 50;
Creaci贸n de Uniones con la Cl谩usula ON
La condici贸n de uni贸n de la uni贸n natural es b谩sicamente una uni贸n igualitaria de todas las columnas con el mismo nombre.
Utilizar la cl谩usula ON para especificar condiciones arbitrarias o columnas que se van a unir.
La condici贸n de uni贸n est谩 separada de otras condiciones de b煤squeda.
La clausula ON facilita la comprensi贸n del c贸digo.
Utilice la sentencia ON para especificar una condici贸n de uni贸n. Esto permite especificar condiciones de uni贸n independientes de cualquier condici贸n de filtro o de b煤squeda en la cl谩usula WHERE.
Recuperaci贸n de Registros con la Cl谩usula ON
En este ejemplo, las columnas DEPARTMENT_ID en la tabla EMPLOYEES y DEPARTMENTS se unen con la cl谩usula ON. Cuando un ID de departamento de la tabla EMPLOYEES sea igual al ID de departamento de la tabla DEPARTMENTS, se devolver谩 una fila. El alias de tabla es necesario para cualificar los column_names coincidentes.
Tambi茅n puede utilizar la cl谩usula ON para unir columnas que tienen nombres diferentes. Los par茅ntesis de las columnas unidas, como se muestra en el ejemplo, (e.department_id = d.department_id) son opcionales. Incluso, ON e.department_id = d.department_id funcionar谩.
Nota: al utilizar el icono Execute Statement para ejecutar la consulta, SQL Developer agrega el sufijo “_1” para diferenciar entre los dos department_ids.
Creaci贸n de Uniones en 3 Direcciones con la Cl谩usula ON
Una uni贸n en tres direcciones es una uni贸n de tres tablas. En la sintaxis compatible con SQL:1999, las uniones se realizan de izquierda a derecha. Por lo tanto, la primera uni贸n que se realiza es EMPLOYEES JOIN DEPARTMENTS. La primera condici贸n de uni贸n puede hacer referencia a las columnas de EMPLOYEES y DEPARTMENTS, pero no puede hacer referencia a las columnas de LOCATIONS. La segunda condici贸n de uni贸n puede hacer referencia a las columnas de las tres tablas.
Nota: el ejemplo de c贸digo tambi茅n se puede realizar con la cl谩usula USING:
SELECT e.employee_id, l.city, d.department_name
FROM employees e
JOIN departments d
USING (department_id)
JOIN locations l
USING (location_id);
Aplicaci贸n de Condiciones Adicionales a una Uni贸n
Uso de la cl谩usula AND o la cl谩usula WHERE para aplicar condiciones adicionales:
Puede aplicar condiciones adicionales a la uni贸n.
El ejemplo realiza una uni贸n en las tablas EMPLOYEES y DEPARTMENTS y, adem谩s, muestra s贸lo los empleados que tienen un ID de gestor de 149. Para agregar condiciones adicionales a la cl谩usula ON, puede agregar cl谩usulas AND. Por otro lado, puede utilizar una cl谩usula WHERE para aplicar condiciones adicionales.
Autouni贸n
Uni贸n de una Tabla consigo Misma
Puede que a veces necesite unir una tabla consigo misma. Para buscar el nombre de cada gestor del empleado, necesita unir la tabla EMPLOYEES consigo misma o realizar una autouni贸n.
Por ejemplo, para buscar el nombre del gestor de Lorentz, necesita:
Buscar a Lorentz en la tabla EMPLOYEES buscando en la columna LAST_NAME.
Busque el n煤mero de gestor de Lorentz consultando la columna MANAGER_ID. El n煤mero de gestor de Lorentz es 103.
Busque el nombre del gestor con un EMPLOYEE_ID de 103 consultando la columna LAST_NAME. El n煤mero de empleado de Hunold es 103, por lo que Hunold en el gestor de Lorentz.
Durante este proceso, busca dos veces en la tabla. La primera vez, cuando consulta la tabla para buscar a Lorentz en la columna LAST_NAME y el valor de MANAGER_ID de 103. La segunda vez, cuando busca en la columna EMPLOYEE_ID para buscar 103 y en la columna LAST_NAME para buscar a Hunold.
Autouniones que Utilizan la Cl谩usula ON
La cl谩usula ON tambi茅n se puede utilizar para unir columnas con nombres diferentes, ya sea en la misma tabla o en otra diferente.
En el ejemplo se muestra una autouni贸n de la tabla EMPLOYEES basada en las columnas EMPLOYEE_ID y MANAGER_ID.
Nota: los par茅ntesis de las columnas unidas, como se muestra (e.manager_id = m.employee_id) son opcionales. Incluso ON e.manager_id = m.employee_id funcionar谩.
Uniones no igualitarias
Una uni贸n no igualitaria es una condici贸n de uni贸n que contiene alg煤n operador diferente del operador de igualdad.
La relaci贸n entre la tabla EMPLOYEES y JOB_GRADES es un ejemplo de uni贸n no igualitaria. Los rangos de la columna SALARY en la tabla EMPLOYEES entre los valores en las columnas LOWEST_SAL y HIGHEST_SAL de la tabla JOB_GRADES. Por lo tanto, se pueden agregar grados a cada empleado seg煤n el salario. La relaci贸n se obtiene mediante un operador distinto del de igualdad (=).
Recuperaci贸n de Registros con Uniones no Igualitarias El ejemplo crea una uni贸n no igualitaria para evaluar el grado de salario de un empleado. El salario debe estar entre cualquier par de los rangos de salario bajos y altos.
Es importante tener en cuenta que todos los empleados aparecer谩n s贸lo una vez al ejecutar esta consulta. No se repite ning煤n empleado en la lista. Existen dos motivos por los que se produce este hecho:
Ninguna de las filas de la tabla JOB_GRADES contiene grados que se solapen. Es decir, el valor de salario de un empleado s贸lo puede oscilar entre los valores de salario bajo y alto de una de las filas de la tabla de grados de salario.
Todos los salarios de los empleados oscilan entre los l铆mites proporcionados por la tabla de grados de cargo. Es decir, ning煤n empleado gana menos que el valor m谩s bajo de la columna LOWEST_SAL o m谩s que el valor m谩s alto de la columna HIGHEST_SAL.
Nota: se pueden utilizar otras condiciones (como <= y >=), pero BETWEEN es la m谩s simple. Recuerde especificar primero el valor bajo y, a continuaci贸n, el alto al utilizar BETWEEN. El servidor Oracle convierte la condici贸n BETWEEN en un par de condiciones AND. Por lo tanto, el uso de BETWEEN no proporciona ninguna ventaja, se recomienda s贸lo para la simplicidad l贸gica.
En el ejemplo se han especificado los alias de tabla por motivos de rendimiento, no por una posible ambig眉edad.
Uni贸n OUTER:
Cl谩usula LEFT OUTER
Uni贸n RIGHT OUTER
Uni贸n FULL OUTER
Devoluci贸n de Registros sin Coincidencia Directa con las uniones OUTER
Si una fila no cumple una condici贸n de uni贸n, la fila no aparece en el resultado de consultas.
En el ejemplo, se utiliza una condici贸n de uni贸n igualitaria en las tablas EMPLOYEES y DEPARTMENTS para devolver el resultado a la derecha. El juego de resultados no contiene lo siguiente:
El ID de departamento 190, porque no hay ning煤n empleado con dicho ID registrado en la tabla EMPLOYEES.
El empleado con apellido Grant, porque a este empleado no se ha asignado un ID departamento.
Para volver al registro de departamento que no tiene ning煤n empleado o empleados que no tienen un departamento asignado, puede utilizar la uni贸n OUTER.
Uniones INNER frente a Uniones OUTER
En SQL:1999, la uni贸n de dos tablas que devuelven s贸lo filas coincidentes se denomina uni贸n INNER.
Una uni贸n entre dos tablas que devuelve los resultados de la uni贸n INNER y las filas no coincidentes de las tablas izquierda (o derecha) se denomina una uni贸n OUTER.
Una uni贸n entre dos tablas que devuelve los resultados de una uni贸n INNER y los resultados de una uni贸n izquierda y derecha da como resultado una uni贸n OUTER completa.
La uni贸n de las tablas con cl谩usulas NATURAL JOIN, USING u ON da como resultado una uni贸n INNER. Cualquier fila no coincidente no aparece en la salida. Para devolver las filas no coincidentes, puede utilizar una uni贸n OUTER. Una uni贸n OUTER devuelve todas las filas que cumplen la condici贸n de uni贸n y tambi茅n algunas o todas las filas de una tabla para la que ninguna fila de la otra tabla cumple la condici贸n de uni贸n.
Hay tres tipos de uniones OUTER:
LEFT OUTER JOIN
Esta consulta recupera todas las filas de la tabla EMPLOYEES que es la tabla de la izquierda, incluso si no hay ninguna coincidencia en la tabla DEPARTMENTS.
RIGHT OUTER JOIN
Esta consulta recupera todas las filas de la tabla DEPARTMENTS que es la tabla de la izquierda, incluso si no hay ninguna coincidencia en la tabla EMPLOYEES.
Esta consulta recupera todas las filas de la tabla EMPLOYEES, incluso si no hay ninguna coincidencia en la tabla DEPARTMENTS. Tambi茅n recupera todas las filas de la tabla DEPARTMENTS, incluso si no hay ninguna coincidencia en la tabla EMPLOYEES.
Producto cartesiano
Uni贸n cruzada
- Un producto cartesiano se forma cuando:
- Se omite una condici贸n de uni贸n
- Una condici贸n de uni贸n no es v谩lida
- Todas las filas de la primera tabla se unen a todas las filas de la segunda tabla
- Se incluye siempre una condici贸n de uni贸n v谩lida si desea evitar un producto cartesiano.
Cuando una condici贸n de uni贸n no es v谩lida o se omite completamente, el resultado es un producto cartesiano, en el que se muestran todas las combinaciones de filas. Todas las filas de la primera tabla se unen a todas las filas de la segunda tabla.
Un producto cartesiano tiende a generar un gran n煤mero de filas y el resultado es poco 煤til. Debe incluir siempre una condici贸n de uni贸n v谩lida a menos que tenga necesidades espec铆ficas de combinar todas las filas de todas las tablas.
Los productos cartesianos son 煤tiles para algunas pruebas para las que necesite generar un gran n煤mero de filas para simular una cantidad razonable de datos.
Generaci贸n de un Producto Cartesiano
Se genera un producto cartesiano si se omite una condici贸n de uni贸n. En el ejemplo se muestra el apellido del empleado y el nombre del departamento de las tablas EMPLOYEES y DEPARTMENTS. Ya que no se ha especificado ninguna condici贸n de uni贸n, todas las filas (20 filas) de la tabla EMPLOYEES se unen con todas las filas (8 filas) de la tabla DEPARTMENTS por lo que se generan 160 filas en la salida.
Creaci贸n de Uniones Cruzadas
La cl谩usula CROSS JOIN produce el producto combinado de dos tablas.
Esto tambi茅n se denomina un producto cartesiano entre dos tablas.
El ejemplo produce un producto cartesiano de las tablas EMPLOYEES y DEPARTMENTS.
La t茅cnica CROSS JOIN se puede aplicar a muchas situaciones de forma 煤til. Por ejemplo, para devolver el costo de mano de obra total por oficina por mes, incluso si el mes X no tiene costo de mano de obra, puede realizar un uni贸n cruzada de oficinas con la tabla de todos los meses.
Es una pr谩ctica aconsejable declarar de forma expl铆cita CROSS JOIN en SELECT si desea crear un producto cartesiano. Por lo tanto, queda muy claro que desea que esto ocurra y que no se trata del resultado de las uniones que faltan
Resumen
En esta lecci贸n debe haber aprendido a utilizar uniones para mostrar los datos de varias tablas utilizando:
- Uniones igualitarias
- Uniones no igualitarias
- Uniones OUTER
- Autouniones
- Uniones cruzadas
- Uniones naturales
- Uni贸n OUTER completa (o de dos lados)
Hay varios modos de unir tablas.
Tipos de Uniones
- Uniones igualitarias
- Uniones no igualitarias
- Uniones OUTER
- Autouniones
- Uniones cruzadas
- Uniones naturales
- Uni贸n OUTER completa (o de dos lados)
Productos Cartesianos
Un producto cartesiano da como resultado una visualizaci贸n de todas las combinaciones de filas. Para ello debe omitir la cl谩usula WHERE o especificar la cl谩usula CROSS JOIN.
Alias de Tabla
Los alias de tabla aceleran el acceso a la base de datos.
Los alias pueden ayudar a mantener el c贸digo SQL m谩s peque帽o utilizando de esta forma menos memoria.
A veces los alias de tabla son obligatorios para evitar la ambig眉edad de columna.
No hay comentarios.:
Publicar un comentario