Unirse siempre se utiliza con el operador on. Tipos de conexión admitidos por Oracle en SQL: JOIN y otros. Sintaxis del operador ÚNETE

Oracle admite varios tipos de uniones, que se diferencian en la forma en que se unen las filas de dos o más tablas o vistas. Esta publicación de blog describirá los tipos de conexión que se usan más comúnmente en Oracle.

Equiconexión

Una equi-unión une dos o más tablas basándose en la igualdad entre las columnas. En otras palabras, la misma columna tiene el mismo valor en todas las tablas unidas. A continuación se muestra un ejemplo del uso de una equiconexión:

SQL> SELECCIONE e.apellido, d.dept DESDE emp e, departamento d DONDE e.emp_id = d.emp_id;

El operador de unión que se muestra arriba también puede usar la siguiente sintaxis nueva:

SQL> SELECCIONE e.apellido, d.dept DESDE emp e ÚNASE al departamento d USANDO (emp_id);

Si desea conectar varias columnas, puede enumerar sus nombres como una lista separada por comas, por ejemplo: USING (dept_id, emp_name).

Conexión natural

Una unión natural es una unión equidistante en la que las columnas que deben coincidir para realizar la unión no se especifican específicamente. Oracle determina automáticamente qué columnas unir en función de las columnas coincidentes en las dos tablas. A continuación se muestra un ejemplo del uso de un compuesto natural:

SQL> SELECCIONE e.apellido, d.dept DESDE emp e NATURAL JOIN departamento d;

En este ejemplo, la condición de unión es que la columna apellido en las tablas emp y departamento debe tener valores idénticos.

Conexión reflexiva

Una unión reflexiva significa unir una tabla consigo misma mediante el uso de alias. El siguiente ejemplo une la tabla de empleados consigo misma mediante un alias y elimina todas las filas duplicadas.

SQL> ELIMINAR DE los empleados X DONDE ROWID > 2 (seleccione MIN(rowid) DE los empleados Y 3 donde X.key_values ​​​​= Y.key_values ​​​​);

Unir internamente

Una combinación interna, también denominada combinación simple, devuelve todas las filas que satisfacen una condición de combinación especificada. Anteriormente, la sintaxis de unión interna requería una cláusula WHERE para especificar cómo se debían unir las tablas, como esta:

SQL> SELECCIONE e.flast_name, d.dept DESDE emp e, departamento d DONDE e.emp_id = d.emp_id;

Oracle ahora le permite especificar criterios de unión en sintaxis de unión interna (o simple) utilizando una nueva construcción ON o USING, por ejemplo:

SQL> SELECCIONE DISTINCT NVL(dname, "No Dept"), COUNT(empno) nbr_emps FROM emp JOIN DEPT ON emp.deptno = dept.deptno DONDE emp.job IN ("GERENTE", "VENDEDOR", "ANALISTA") GRUPO POR nombre;

unión externa

Una combinación externa se utiliza para devolver todas las filas que satisfacen una condición de combinación especificada, además de algunas o todas las filas de una tabla que no tienen filas coincidentes que cumplan una condición de combinación especificada. Hay tres tipos de unión exterior: unión exterior izquierda, unión exterior derecha y unión exterior completa. En una declaración de unión externa completa, generalmente se omite la palabra OUTER.

Anteriormente, analizamos el uso de la instrucción SELECT para seleccionar datos de una única tabla de base de datos. Si Transact-SQL se limitara a admitir únicamente declaraciones SELECT tan simples, sería imposible unir dos o más tablas en una consulta para recuperar datos de ellas. En consecuencia, todos los datos de la base de datos deberían almacenarse en una tabla. Aunque este enfoque es bastante posible, tiene un inconveniente importante: los datos almacenados de esta forma se caracterizan por una alta redundancia.

Transact-SQL aborda esta deficiencia proporcionando UNIRSE al operador, que le permite recuperar datos de más de una tabla. Este operador es probablemente el operador más importante para los sistemas de bases de datos relacionales porque permite distribuir datos en múltiples tablas, proporcionando así una propiedad importante de los sistemas de bases de datos: la ausencia de redundancia de datos.

El operador UNION que vimos anteriormente también le permite consultar varias tablas. Pero este operador le permite unir múltiples declaraciones SELECT, mientras que el operador JOIN une múltiples tablas usando solo una declaración SELECT. Además, el operador UNION une filas de la tabla, mientras que el operador JOIN une columnas.

El operador de unión también se puede utilizar con tablas y vistas subyacentes. El operador JOIN tiene varias formas diferentes. Este artículo cubre las siguientes formas básicas de este operador:

    conexión natural;

    Producto cartesiano o unión cruzada;

    unión exterior;

    unión theta, autounión y semiunión.

Antes de ver las diferentes formas de uniones, en esta sección veremos las diferentes variaciones del operador JOIN.

Dos formas sintácticas para implementar conexiones.

Puede utilizar dos formas sintácticas diferentes del operador de unión para unir tablas:

    sintaxis de unión explícita (sintaxis de unión ANSI SQL:1992);

    sintaxis de unión implícita (sintaxis de unión de "estilo antiguo").

La sintaxis de unión ANSI SQL:1992 fue introducida por el estándar SQL92 y define las operaciones de unión explícitamente, es decir. utilizando el nombre apropiado para cada tipo de operación de unión. Al declarar explícitamente una conexión, se utilizan las siguientes palabras clave:

  • UNIRSE A LA IZQUIERDA;

    ÚNETE DERECHO;

    ÚNASE COMPLETAMENTE.

La palabra clave CROSS JOIN define el producto cartesiano de dos tablas. La palabra clave INNER JOIN define una unión natural entre dos tablas, y LEFT OUTER JOIN y RIGHT OUTER JOIN definen operaciones de unión del mismo nombre. Finalmente, la palabra clave FULL OUTER JOIN define una unión externa derecha e izquierda. Todas estas operaciones de unión se analizan en las siguientes secciones.

La sintaxis del operador de unión implícita es una sintaxis de "estilo antiguo", donde cada operación de unión se define implícitamente mediante una cláusula WHERE utilizando las llamadas columnas de unión.

Se recomienda utilizar una sintaxis explícita para las operaciones de unión porque esto mejora la confiabilidad de las consultas. Por esta razón, todos los ejemplos siguientes que involucran operaciones de unión utilizan formas de sintaxis explícita. Pero los primeros ejemplos también demostrarán la sintaxis del "estilo antiguo".

Conexión natural

Los términos unión natural y unión equi se utilizan a menudo como sinónimos, pero existe una ligera diferencia entre ellos. Una operación de unión de equivalencia siempre tiene uno o más pares de columnas con valores idénticos en cada fila. Una operación que elimina dichas columnas de los resultados de una operación de unión de equivalencia se denomina unión natural. La mejor forma de explicar una conexión natural es mediante un ejemplo:

UTILICE SampleDb; SELECCIONE Empleado.*, Departamento.* DESDE Empleado INNER JOIN Departamento ON Empleado.NúmeroDepartamento = Departamento.Número;

La consulta devuelve toda la información sobre todos los empleados: nombre y apellido, número de personal y nombre, número y ubicación del departamento, mientras que se muestran columnas duplicadas de diferentes tablas para el número de departamento.

En este ejemplo, la instrucción SELECT selecciona todas las columnas de las tablas para Empleado y Departamento. La clausula FROM de la declaracion SELECT define las tablas que se unirán y también especifica explícitamente el tipo de operación de unión: UNIR INTERNAMENTE. La cláusula ON es parte de la cláusula FROM y especifica las columnas de ambas tablas que se unirán. La expresión "Employee.DepartamentNumber = Department.Number" define la condición de unión y se llaman ambas columnas de la condición. unir columnas.

Una consulta equivalente que utilice sintaxis implícita ("estilo antiguo") tendría este aspecto:

Esta forma de sintaxis tiene dos diferencias significativas con respecto a la forma explícita: la lista de tablas que se unirán se especifica en la cláusula FROM y la condición de unión correspondiente se especifica en la cláusula WHERE mediante las columnas que se unen.

Los ejemplos anteriores ilustran cómo funciona la operación de unión. Pero hay que tener en cuenta que esto es sólo una idea del proceso de conexión, porque de hecho, el motor de base de datos selecciona una implementación de la operación de unión entre varias estrategias posibles. Imagine que cada fila de la tabla Empleado está conectada a cada fila de la tabla Departamento. El resultado es una tabla con siete columnas (4 columnas de la tabla Empleado y 3 de la tabla Departamento) y 21 filas.

A continuación, todas las filas que no cumplan la condición de unión "Empleado.Número = Departamento.Número" se eliminan de esta tabla. Las líneas restantes representan el resultado del primer ejemplo anterior. Las columnas unidas deben tener una semántica idéntica, es decir ambas columnas deben tener el mismo valor booleano. Las columnas que se unen no tienen que tener el mismo nombre (ni siquiera el mismo tipo de datos), aunque a menudo lo tienen.

El sistema de base de datos no puede determinar el valor lógico de la columna. Por ejemplo, no puede determinar que las columnas número de proyecto y número de personal del empleado no tengan nada en común, aunque ambas sean tipos de datos enteros. Por lo tanto, el sistema de base de datos solo puede verificar el tipo de datos y la longitud de la cadena. El motor de base de datos requiere que las columnas que se unen tengan tipos de datos compatibles, como INT y SMALLINT.

La base de datos SampleDb contiene tres pares de columnas, donde cada columna del par tiene el mismo valor booleano (así como el mismo nombre). Las tablas Empleado y Departamento se pueden unir utilizando las columnas Empleado.NúmeroDepartamento y Departamento.Número. Las columnas de combinación de las tablas Employee y Works_on son las columnas Employee.Id y Works_on.EmpId. Finalmente, las tablas Project y Works_on se pueden unir usando las columnas Project.Number y Works_on.ProjectNumber.

Puede refinar los nombres de las columnas en la instrucción SELECT. En este contexto, calificación significa que para evitar ambigüedades sobre a qué tabla pertenece una columna, el nombre de la columna incluye el nombre de su tabla (o alias de tabla), separado por un punto:

nombre_tabla.nombre_columna (nombre_tabla.nombre_columna)

La mayoría de las declaraciones SELECT no requieren calificación de columna, aunque generalmente se recomienda utilizar calificación de columna para mejorar la comprensión del código. Si los nombres de las columnas en la instrucción SELECT son ambiguos (como las columnas Número en las tablas Proyecto y Departamento), el uso de nombres de columnas calificados es obligatorio.

En una instrucción SELECT con una operación de unión, además de la condición de unión, la cláusula WHERE puede contener otras condiciones, como se muestra en el siguiente ejemplo:

UTILICE SampleDb; -- Sintaxis explícita SELECCIONE EmpId, Proyecto.Número, Trabajo, EnterDate, ProyectoNombre, Presupuesto FROM Works_on JOIN Proyecto ON Proyecto.Número = Works_on.ProjectNumber WHERE ProyectoNombre = "Gemini"; -- Estilo antiguo SELECT EmpId, Project.Number, Job, EnterDate, ProjectName, Budget FROM Works_on, Project WHERE Project.Number = Works_on.ProjectNumber AND ProjectName = "Gemini";

El uso del nombre de columna calificado Project.Number en el ejemplo anterior es opcional porque en este caso no hay ambigüedad sobre sus nombres. A continuación, todos los ejemplos utilizarán únicamente sintaxis de unión explícita.

El siguiente ejemplo muestra otro uso de una unión interna:

Unir más de dos mesas

Teóricamente, la cantidad de tablas que se pueden unir en una declaración SELECT es ilimitada. (¡Pero una condición de unión solo une dos tablas!) Sin embargo, el motor de base de datos limita el número de tablas que se pueden unir en una instrucción SELECT a 64 tablas.

El siguiente ejemplo muestra una unión entre tres tablas de base de datos SampleDb:

UTILICE SampleDb; -- Devuelve el único empleado "Vasily Frolov" SELECCIONE Nombre, Apellido FROM Works_on JOIN Empleado ON Works_on.EmpId = Empleado.Id JOIN Departamento ON Empleado.NúmeroDepartamento = Departamento.Número Y Ubicación = "San Petersburgo" Y Trabajo = "Analista" ;

En este ejemplo, se seleccionan los nombres y apellidos de todos los analistas (Trabajo = "Analista") cuyo departamento está ubicado en San Petersburgo (Ubicación = "San Petersburgo"). El resultado de la consulta dada en el ejemplo anterior sólo se puede obtener si unes al menos tres tablas: Trabaja_en, Empleado y Departamento. Estas tablas se pueden unir utilizando dos pares de columnas de unión:

(Works_on.EmpId, Empleado.Id) (Empleado.Número de departamento, Número.de departamento)

Tenga en cuenta que para realizar una unión natural entre tres tablas, se utilizan dos condiciones de unión, cada una de las cuales une dos tablas. Y al unir cuatro mesas, se requieren tres condiciones de unión. En general, para evitar obtener un producto cartesiano al unir n tablas, es necesario aplicar n - 1 condiciones de unión. Por supuesto, está permitido utilizar más de n - 1 condiciones de unión, así como otras condiciones, para reducir aún más el número de elementos en el conjunto de datos resultante.

producto cartesiano

En la sección anterior analizamos una posible forma de crear una conexión natural. El primer paso de este proceso une cada fila de la tabla Empleado con cada fila de la tabla Departamento. Esta operación se llama producto cartesiano. La consulta para crear una combinación entre las tablas Empleado y Departamento utilizando el producto cartesiano se muestra en el siguiente ejemplo:

UTILICE SampleDb; SELECCIONE Empleado.*, Departamento.* DESDE Empleado CRUZAR UNIR Departamento;

El producto cartesiano conecta cada fila de la primera tabla con cada fila de la segunda. En general, el producto cartesiano de una primera tabla con n filas y una segunda tabla con m filas dará como resultado una tabla con n*m filas. Entonces, el resultado de la consulta establecido en el ejemplo anterior tiene 7 x 3 = 21 filas (estas filas contienen valores duplicados).

En la práctica, el producto cartesiano se utiliza muy raramente. A veces los usuarios terminan con un producto cartesiano de dos tablas cuando se olvidan de incluir una condición de unión en la cláusula WHERE cuando utilizan la sintaxis de unión implícita de "estilo antiguo". En este caso, el resultado obtenido no corresponde al esperado, porque contiene líneas adicionales. La presencia de una cantidad inesperadamente grande de filas en el resultado es una señal de que se obtuvo un producto cartesiano en lugar de la unión natural requerida de dos tablas.

unión externa

En los ejemplos anteriores de unión natural, el conjunto de resultados contenía solo aquellas filas de una tabla que tenían filas correspondientes en la otra tabla. Pero a veces, además de hacer coincidir filas, es necesario extraer filas sin coincidencias de una o ambas tablas. Esta operación se llama unión externa.

El siguiente ejemplo muestra una selección de toda la información de los empleados que viven y trabajan en la misma ciudad. Esto utiliza la tabla EmployeeEnh que creamos en el artículo "Declaración SELECT avanzada" cuando analizamos el operador UNION.

UTILICE SampleDb; SELECCIONAR DISTINTO EmpleadoEnh.*, Departamento.Ubicación DESDE EmpleadoEnh UNIRSE Departamento ON Ciudad = Ubicación;

El resultado de esta consulta:

En este ejemplo, las filas requeridas se obtienen mediante una unión natural. Si este resultado fuera necesario incluir a los empleados que viven en otras ubicaciones, se tendría que aplicar una unión externa izquierda. Esta combinación externa se denomina combinación izquierda porque devuelve todas las filas de la tabla en el lado izquierdo del operador de comparación, independientemente de si hay filas coincidentes en la tabla del lado derecho. En otras palabras, esta combinación externa devolverá una fila de la tabla de la izquierda, incluso si no coincide en la tabla de la derecha, con el valor de columna correspondiente NULL para todas las filas con un valor de columna que no coincide en la otra tabla de la derecha. Para realizar una operación de unión externa izquierda, el motor de base de datos utiliza el operador IZQUIERDA COMBINACIÓN EXTERNA.

La operación de una combinación externa derecha es similar a una combinación izquierda, pero se devuelven todas las filas de la tabla en el lado derecho de la expresión. Para realizar una operación de unión externa derecha, el motor de base de datos utiliza el operador UNIÓN EXTERIOR DERECHA.

UTILICE SampleDb; SELECCIONE EmployeeEnh.*, Department.Location FROM EmployeeEnh LEFT OUTER JOIN Departamento ON Ciudad = Ubicación;

Este ejemplo selecciona empleados (incluida la información completa) para ciudades en las que los empleados solo viven (columna Ciudad en la tabla EmployeeEnh) o viven y trabajan. El resultado de esta consulta:

Como puede ver en el resultado de la consulta, cuando una fila de la tabla izquierda (en este caso EmployeeEnh) no tiene una fila coincidente en la tabla derecha (en este caso Departamento), la operación de combinación externa izquierda aún devuelve esa fila, llenando todas las celdas de la columna correspondiente con NULL para un valor de columna de la derecha de la tabla que no coincide. El uso de una unión exterior derecha se muestra en el siguiente ejemplo:

UTILICE SampleDb; SELECCIONE EmpleadoEnh.Ciudad, Departamento.* DESDE EmpleadoEnh DERECHA UNIÓN EXTERIOR Departamento ON Ciudad = Ubicación;

En este ejemplo, se seleccionan departamentos (incluida información completa sobre ellos) para ciudades en las que los empleados solo trabajan o viven y trabajan. El resultado de esta consulta:

Además de las uniones exteriores izquierda y derecha, también existe una unión exterior completa, que es la unión de las uniones exteriores izquierda y derecha. En otras palabras, el conjunto de resultados de dicha combinación consta de todas las filas de ambas tablas. Si una fila de una tabla no tiene una fila correspondiente en la otra tabla, todas las celdas de la fila de la segunda tabla se establecen en NULL. Para realizar una operación de unión externa completa, utilice el operador UNIÓN EXTERIOR COMPLETA.

Cualquier operación de unión externa se puede emular utilizando el operador UNION junto con la función NOT EXISTS. Por lo tanto, la consulta que se muestra en el siguiente ejemplo es equivalente a la consulta de unión externa izquierda que se mostró anteriormente. Esta consulta selecciona empleados (incluida la información completa) para las ciudades en las que los empleados solo viven o viven y trabajan:

La primera instrucción SELECT de la combinación define una combinación natural de las tablas EmployeeEnh y Department utilizando las columnas de combinación City y Location. Esta instrucción devuelve todas las ciudades de todos los empleados en las que viven y trabajan. Además, la segunda instrucción SELECT de la combinación devuelve todas las filas de la tabla EmployeeEnh que no cumplen la condición en la combinación natural.

Otras formas de operaciones conjuntas

En las secciones anteriores analizamos las formas de conexión más importantes. Pero existen otras formas de esta operación, que consideraremos en las siguientes subsecciones.

conexión theta

La condición de comparación de la columna de unión no tiene por qué ser igualdad, pero puede ser cualquier otra comparación. Una combinación que utiliza una condición general para comparar las columnas de combinación se llama conexión theta. El siguiente ejemplo muestra una operación de unión theta que utiliza la condición menor que. Esta consulta devuelve todas las combinaciones de información de empleado y departamento para los casos en los que la ubicación del domicilio del empleado aparece alfabéticamente antes de la ubicación de cualquier departamento en el que trabaja el empleado:

UTILICE SampleDb; SELECCIONE Nombre, Apellido, Ciudad, Ubicación DESDE EmpleadoEnh UNIRSE al Departamento EN Ciudad

El resultado de esta consulta:

Este ejemplo compara los valores correspondientes de las columnas Ciudad y Ubicación. Cada fila del resultado compara el valor de la columna Ciudad en orden alfabético con el valor correspondiente de la columna Ubicación.

Autounirse o unir una mesa a sí misma

Además de unir dos o más tablas diferentes, se puede aplicar una operación de unión natural a una sola tabla. En esta operación, una tabla se une a sí misma, donde se compara una columna de la tabla consigo misma. Comparar una columna consigo misma significa que el nombre de la tabla se usa dos veces en la cláusula FROM de la instrucción SELECT. Por lo tanto, es necesario poder hacer referencia al mismo nombre de tabla dos veces. Esto se puede hacer utilizando al menos un alias. Lo mismo se aplica a los nombres de columnas en una condición de unión en una instrucción SELECT. Para distinguir entre columnas con el mismo nombre, debe utilizar nombres calificados.

El siguiente ejemplo demuestra cómo unir una tabla consigo misma:

Este ejemplo selecciona todos los departamentos (con información completa) ubicados en la misma ubicación que al menos otro departamento. El resultado de esta consulta:

Aquí la cláusula FROM contiene dos alias para la tabla Departamento: t1 y t2. La primera condición en la cláusula WHERE definirá las columnas de unión y la segunda eliminará los duplicados innecesarios, asegurando que cada departamento se compare con otros departamentos.

Semiunión

Una semiunión es similar a una unión natural, pero devuelve solo el conjunto de todas las filas de una tabla que tienen una o más coincidencias en otra tabla. El uso de una semiunión se muestra en el siguiente ejemplo:

Resultado de la solicitud:

Como puede ver, la lista SELECT en la semiunión contiene solo columnas de la tabla Empleado. Este es un rasgo característico de la operación de semiunión. Esta operación se usa comúnmente en el procesamiento de consultas distribuidas para minimizar la cantidad de datos transferidos. El motor de base de datos utiliza la operación de semiunión para implementar una funcionalidad denominada unión en estrella.

Operador UNIRSE se utiliza para realizar la operación de unir datos de dos conjuntos en un conjunto de resultados. Se pueden utilizar varios tipos diferentes de operaciones de unión al realizar un SELECT. Las filas que se incluyen en el conjunto de resultados dependen del tipo de operación de unión y de la condición de unión definida explícitamente. La condición de conexión, es decir la condición para hacer coincidir las filas de la tabla entre sí es una expresión lógica.

Si necesita unir varias tablas, la operación de unión debe aplicarse secuencialmente varias veces.

Sintaxis del operador ÚNETE

Sintaxis para conectar una tabla adicional a una consulta utilizando el operador UNIRSE se puede representar de la siguiente forma:

SELECCIONE campo1, campo1, [,... n] DE Tabla1 t1 (INTERNO | (IZQUIERDA | DERECHA | COMPLETO) EXTERIOR | CRUZ ) UNIRSE a Tabla2 (ON | USANDO (nombre_campo [,... n]))

En la mayoría de los DBMS, cuando se utiliza el operador UNIRSE en combinación con las palabras clave IZQUIERDA, DERECHA, COMPLETA, se puede omitir el operando EXTERNO. Tampoco es necesario utilizar el operando INNER en la mayoría de los DBMS.

Si los nombres de las columnas por las que se unen las tablas son iguales, entonces en lugar de ON puedes usar USANDO. Para el operador UNIÓN CRUZADA la condición no está especificada.

Tablas de prueba para verificar JOIN

Para más ejemplos, crearemos dos tablas de prueba simples. Tablas de referencia para los usuarios y sus vehículos. La primera tabla almacenará la identificación del usuario y su nombre (nick). La segunda tabla contiene una lista de coches (identificador, nombre) y el identificador de sus propietarios/usuarios. Cabe señalar que el usuario puede tener varios coches o ninguno.

tabla de usuarios

CREATE TABLE usuarios (id int no nulo, nombre varchar(32) no nulo, clave principal (id)); -- Insertar varios registros en la tabla insertar en los valores de los usuarios (id, nombre) (1, "alex"); insertar en los valores de los usuarios (id, nombre) (2, "piter"); insertar en los valores de los usuarios (id, nombre) (3, "serg"); insertar en los valores de los usuarios (id, nombre) (4, "olga"); insertar en los valores de los usuarios (id, nombre) (5, "ostap");

mesa de coche

CREAR tabla autos (id int no nulo, - nombre de identificador automático varchar(32) no nulo, - nombre automático oid int no nulo, - clave primaria del identificador del propietario (id)); -- Insertar varios registros en la tabla insertar en valores de autos (id, oid, nombre) (1, 1, "toyota camry"); insertar en autos (id, oid, nombre) valores (2, 1, "toyota prado"); insertar en autos (id, oid, nombre) valores (3, 2, "renault megane"); insertar en autos (id, oid, nombre) valores (4, 3, "nissan x-trail"); insertar en autos (id, oid, nombre) valores (5, 4, "suzuki swift"); insertar en autos (id, oid, nombre) valores (6, 4, "suzuki vitara");

Unión interna, UNIÓN INTERNA

UNIR INTERNAMENTE es un operador de unión interna entre dos tablas. Es simétrico, por lo que el orden de las tablas no es importante para el operador.

Aplicable UNIR INTERNAMENTE para recuperar solo aquellas filas para las cuales existe una correspondencia entre los registros de las tablas principal y unida. Algoritmo para generar el resultado: cada fila de la tabla principal se compara con cada fila de la tabla unida. Después de esto, se verifica el estado de la conexión. Si la condición es verdadera, la fila "unida" correspondiente se agrega al conjunto de resultados.

Consulta con selección de columnas del conjunto de resultados seleccione u.name como propietario, a.name como auto de los usuarios u internal join autos a ON a.oid = u.id - Consulta resultado propietario auto alex toyota camry alex toyota prado piter renault megane serg nissan x-trail olga suzuki swift olga suzuki vitara - Consulta sin seleccionar columnas del conjunto de resultados seleccione * de los usuarios u unión interna autos a ON a.oid = u.id - Consulta resultado id nombre id1 nombre1 oid 1 alex 1 toyota camry 1 1 alex 2 toyota prado 1 2 piter 3 renault megane 2 3 serg 4 nissan x-trail 3 4 olga 5 suzuki swift 4 4 olga 6 suzuki vitara 4

Para obtener datos que no coincidan con la condición, debe utilizar una combinación externa: UNIÓN EXTERNA.

Unión externa, UNIÓN EXTERNA

Al unir dos tablas usando el operador UNIÓN EXTERNA el conjunto de resultados incluirá necesariamente filas de una de las tablas o de ambas tablas. La palabra clave OUTER se puede omitir. La notación LEFT JOIN es idéntica a LEFT OUTER JOIN.

Hay dos tipos de unión externa. Este IZQUIERDA COMBINACIÓN EXTERNA Y UNIÓN EXTERIOR DERECHA. Estos operadores funcionan de la misma manera. La diferencia es que cuando se utiliza LEFT JOIN, la tabla principal es la tabla especificada después de la cláusula FROM. Bajo condiciones específicas, los datos de la tabla unida se agregan a las filas de esta tabla. Para el operador RIGHT OUTER JOIN, todo es exactamente al revés.

Operador de unión externa UNIÓN EXTERNA no es simétrico, por lo que el orden en el que se establece la relación entre tablas es importante para el operador.

Ejemplo de uso del operador LEFT OUTER JOIN

Seleccione u.name como propietario, a.name como auto de los usuarios que dejó unirse a autos a ON a.oid = u.id - Resultado de la consulta propietario auto alex toyota camry alex toyota prado piter renault megane serg nissan x-trail olga suzuki swift olga suzuki vitara ostap

Gráficamente, el resultado del trabajo se puede representar de la siguiente manera:

Operador LEFT OUTER JOIN con filtrado

Agregando la condición "donde a.name es nulo" al código del ejemplo anterior. Sólo quedará un récord "ostap" en la selección, ya que es el único que no tiene auto definido.

Gráficamente, el resultado del trabajo se puede representar de la siguiente manera:

Operador de unión cruzada, CROSS JOIN

CROSS JOIN es un operador de unión cruzada (producto cartesiano). El operador es simétrico y el orden de las tablas no es importante para el operador.

El conjunto de resultados se forma de la siguiente manera: cada fila de una tabla se une con cada fila de la segunda tabla, lo que da como resultado todas las combinaciones posibles de filas de las dos tablas. Para nuestro ejemplo, esto da como resultado 30 filas del conjunto de resultados.

Seleccione * de los autos de combinación cruzada de usuarios - Resultado de la consulta ID nombre id1 nombre1 oid 1 alex 1 toyota camry 1 2 piter 1 toyota camry 1 3 serg 1 toyota camry 1 4 olga 1 toyota camry 1 5 ostap 1 toyota camry 1 1 alex 2 toyota prado 1 2 piter 2 toyota prado 1 3 serg 2 toyota prado 1 4 olga 2 toyota prado 1 5 ostap 2 toyota prado 1 . . .

Sólo las primeras 12 líneas se muestran en los resultados de escritura.

Este tutorial de Oracle explica cómo utilizar UNIONES(interno y externo) en Oracle con sintaxis, ilustraciones visuales y ejemplos.

Descripción

Oracle JOINS se utiliza para recuperar datos de varias tablas. Se realiza una JOIN de Oracle siempre que se unen dos o más tablas en una declaración SQL.

Hay 4 tipos diferentes de uniones de Oracle:

  • Oracle INNER JOIN (o a veces llamado unión simple)
  • Oracle LEFT OUTER JOIN (o a veces llamado LEFT JOIN)
  • Oracle DERECHA UNIÓN EXTERNA (o a veces llamada DERECHA UNIÓN)
  • Oracle FULL OUTER JOIN (o a veces llamado FULL JOIN)

Entonces, analicemos la sintaxis de Oracle JOIN, veamos ilustraciones visuales de Oracle JOINS y exploremos ejemplos de Oracle JOIN.

UNIÓN INTERNA (unión simple)

Lo más probable es que ya haya escrito una declaración que utilice Oracle INNER JOIN. Es el tipo de unión más común. Oracle INNER JOINS devuelve todas las filas de varias tablas donde se cumple la condición de unión.

Sintaxis

La sintaxis para INNER JOIN en Oracle/PLSQL es:

SELECCIONE columnas DE la tabla1 UNIÓN INTERNA tabla2 EN tabla1.columna = tabla2.columna;

Ilustración visual

En este diagrama visual, Oracle INNER JOIN devuelve el área sombreada:

Oracle INNER JOIN devolvería los registros donde tabla 1 y Tabla 2 intersecarse.

Ejemplo

Aquí hay un ejemplo de una UNIÓN INTERNA de Oracle:

Este ejemplo de Oracle INNER JOIN devolvería todas las filas de las tablas de proveedores y pedidos donde hay un valor de id_proveedor coincidente en las tablas de proveedores y pedidos.

Veamos algunos datos para explicar cómo funcionan las INNER JOINS:

Tenemos una mesa llamada proveedores

Identificación del proveedor Nombre del proveedor
10000 IBM
10001 Hewlett Packard
10002 microsoft
10003 Nvidia

Tenemos otra mesa llamada pedidos

Solicitar ID Identificación del proveedor fecha de orden
500125 10000 2003/05/12
500126 10001 2003/05/13
500127 10004 2003/05/14

Si ejecutamos la declaración SELECT de Oracle (que contiene una INNER JOIN) a continuación:

SELECCIONE proveedores.supplier_id, proveedores.supplier_name, pedidos.order_date DE proveedores INTERNO UNIR pedidos EN proveedores.supplier_id = pedidos.supplier_id;

Identificación del proveedor nombre fecha de orden
10000 IBM 2003/05/12
10001 Hewlett Packard 2003/05/13

las filas para microsoft y Nvidia de la tabla de proveedores se omitiría, ya que los id_proveedor 10002 y 10003 no existen en ambas tablas. La fila para 500127 (id_pedido) de la tabla de pedidos se omitiría, ya que el id_proveedor 10004 no existe en la tabla de proveedores.

Sintaxis antigua

Como nota final, vale la pena mencionar que el ejemplo anterior de Oracle INNER JOIN podría reescribirse usando la sintaxis implícita anterior de la siguiente manera (pero aún recomendamos usar la sintaxis de palabra clave INNER JOIN):

SELECCIONE proveedores.supplier_id, proveedores.supplier_name, pedidos.order_date DE proveedores, pedidos DONDE proveedores.supplier_id = pedidos.supplier_id;

IZQUIERDA COMBINACIÓN EXTERNA

Otro tipo de unión se llama UNIÓN EXTERNA IZQUIERDA de Oracle. Este tipo de combinación devuelve todas las filas de la tabla IZQUIERDA especificada en la condición ON y solo

Sintaxis

La sintaxis del Oráculo. IZQUIERDA COMBINACIÓN EXTERNA es:

SELECCIONE columnas DE la tabla1 ÚNASE A LA IZQUIERDA tabla2 EN tabla1.columna = tabla2.columna;

En algunas bases de datos, las palabras clave LEFT OUTER JOIN se reemplazan por LEFT JOIN.

Ilustración visual

En este diagrama visual, Oracle LEFT OUTER JOIN devuelve el área sombreada:

Oracle LEFT OUTER JOIN devolvería todos los registros de tabla 1 y sólo aquellos registros de Tabla 2 que se cruzan con tabla 1.

Ejemplo

A continuación se muestra un ejemplo de UNIÓN EXTERNA IZQUIERDA de Oracle:

Este ejemplo de LEFT OUTER JOIN devolvería todas las filas de la tabla de proveedores y solo aquellas filas de la tabla de pedidos donde los campos unidos son iguales.

> en el conjunto de resultados.

Veamos algunos datos para explicar cómo funcionan las UNIONES EXTERNAS IZQUIERDAS:

Tenemos una mesa llamada proveedores con dos campos (id_proveedor y nombre_proveedor). Contiene los siguientes datos:

Identificación del proveedor Nombre del proveedor
10000 IBM
10001 Hewlett Packard
10002 microsoft
10003 Nvidia

pedidos con tres campos (order_id, Supplier_id y order_date). Contiene los siguientes datos:

Solicitar ID Identificación del proveedor fecha de orden
500125 10000 2003/05/12
500126 10001 2003/05/13

Si ejecutamos la instrucción SELECT (que contiene una UNIÓN EXTERNA IZQUIERDA) a continuación:

SELECCIONE proveedores.supplier_id, proveedores.supplier_name, pedidos.order_date DE proveedores IZQUIERDOS UNIR pedidos EXTERNOS EN proveedores.supplier_id = pedidos.supplier_id;

Nuestro conjunto de resultados se vería así:

Identificación del proveedor Nombre del proveedor fecha de orden
10000 IBM 2003/05/12
10001 Hewlett Packard 2003/05/13
10002 microsoft
10003 Nvidia

las filas para microsoft y Nvidia se incluiría porque se utilizó una UNIÓN EXTERIOR IZQUIERDA. Sin embargo, notará que el campo fecha_pedido para esos registros contiene un valor.

Sintaxis antigua

Como nota final, vale la pena mencionar que el ejemplo anterior de LEFT OUTER JOIN podría reescribirse usando la sintaxis implícita más antigua que utiliza el operador de unión externa (+) de la siguiente manera (pero aun así recomendamos usar la sintaxis de la palabra clave LEFT OUTER JOIN):

SELECCIONE proveedores.supplier_id, proveedores.supplier_name, pedidos.order_date DE proveedores, pedidos DONDE proveedores.supplier_id = pedidos.supplier_id(+);

UNIÓN EXTERIOR DERECHA

Otro tipo de unión se llama UNIÓN EXTERIOR DERECHA de Oracle. Este tipo de combinación devuelve todas las filas de la tabla de la DERECHA especificada en la condición ON y solo aquellas filas de la otra tabla donde los campos unidos son iguales (se cumple la condición de unión).

Sintaxis

La sintaxis del Oráculo. UNIÓN EXTERIOR DERECHA es:

SELECCIONE columnas DE la tabla1 ÚNASE A LA DERECHA tabla2 EN tabla1.columna = tabla2.columna;

En algunas bases de datos, las palabras clave RIGHT OUTER JOIN se reemplazan por RIGHT JOIN.

Ilustración visual

En este diagrama visual, Oracle RIGHT OUTER JOIN devuelve el área sombreada:

Oracle RIGHT OUTER JOIN devolvería todos los registros de Tabla 2 y sólo aquellos registros de tabla 1 que se cruzan con Tabla 2.

Ejemplo

Aquí hay un ejemplo de una UNIÓN EXTERNA DERECHA de Oracle:

Este ejemplo de RIGHT OUTER JOIN devolvería todas las filas de la tabla de pedidos y solo aquellas filas de la tabla de proveedores donde los campos unidos son iguales.

Si un valor de id_proveedor en la tabla de pedidos no existe en la tabla de proveedores, todos los campos de la tabla de proveedores se mostrarán como > en el conjunto de resultados.

Veamos algunos datos para explicar cómo funcionan las UNIONES EXTERNAS DERECHAS:

Tenemos una mesa llamada proveedores con dos campos (id_proveedor y nombre_proveedor). Contiene los siguientes datos:

Identificación del proveedor Nombre del proveedor
10000 Manzana
10001 Google

Tenemos una segunda mesa llamada pedidos con tres campos (order_id, Supplier_id y order_date). Contiene los siguientes datos:

Solicitar ID Identificación del proveedor fecha de orden
500125 10000 2013/08/12
500126 10001 2013/08/13
500127 10002 2013/08/14

Si ejecutamos la instrucción SELECT (que contiene una UNIÓN EXTERNA DERECHA) a continuación:

SELECCIONE pedidos.order_id, pedidos.order_date, proveedores.supplier_name DE proveedores DERECHO EXTERIOR UNIR pedidos EN proveedores.supplier_id = pedidos.supplier_id;

Nuestro conjunto de resultados se vería así:

Solicitar ID fecha de orden Nombre del proveedor
500125 2013/08/12 Manzana
500126 2013/08/13 Google
500127 2013/08/14

la fila para 500127 (order_id) se incluiría porque se utilizó una UNIÓN EXTERIOR DERECHA. Sin embargo, notará que el campo nombre_proveedor para ese registro contiene un valor.

Sintaxis antigua

Como nota final, vale la pena mencionar que el ejemplo anterior de RIGHT OUTER JOIN podría reescribirse usando la sintaxis implícita más antigua que utiliza el operador de unión externa (+) de la siguiente manera (pero aun así recomendamos usar la sintaxis de palabra clave RIGHT OUTER JOIN):

SELECCIONE pedidos.order_id, pedidos.order_date, proveedores.supplier_name DE proveedores, pedidos DONDE proveedores.supplier_id(+) = pedidos.supplier_id;

UNIÓN EXTERIOR COMPLETA

Otro tipo de unión se llama UNIÓN EXTERIOR COMPLETA de Oracle. Este tipo de combinación devuelve todas las filas de la tabla IZQUIERDA y de la tabla DERECHA con valores nulos donde no se cumple la condición de combinación.

Sintaxis

La sintaxis del Oráculo. UNIÓN EXTERIOR COMPLETA es:

SELECCIONE columnas DE la tabla1 UNIRSE COMPLETAMENTE a la tabla2 EN tabla1.columna = tabla2.columna;

En algunas bases de datos, las palabras clave FULL OUTER JOIN se reemplazan por FULL JOIN.

Ilustración visual

En este diagrama visual, Oracle FULL OUTER JOIN devuelve el área sombreada:

Oracle FULL OUTER JOIN devolvería todos los registros de ambos tabla 1 y Tabla 2.

Ejemplo

Aquí hay un ejemplo de una UNIÓN EXTERNA COMPLETA de Oracle:

Este ejemplo de UNIÓN EXTERNA COMPLETA devolvería todas las filas de la tabla de proveedores y todas las filas de la tabla de pedidos y siempre que no se cumpla la condición de unión, se extendería a esos campos en el conjunto de resultados.

Si un valor de id_proveedor en la tabla de proveedores no existe en la tabla de pedidos, todos los campos en la tabla de pedidos se mostrarán como > en el conjunto de resultados. Si un valor de id_proveedor en la tabla de pedidos no existe en la tabla de proveedores, todos los campos de la tabla de proveedores se mostrarán como en el conjunto de resultados.

Veamos algunos datos para explicar cómo funcionan las UNIONES EXTERNAS COMPLETAS:

Tenemos una mesa llamada proveedores con dos campos (id_proveedor y nombre_proveedor). Contiene los siguientes datos:

Identificación del proveedor Nombre del proveedor
10000 IBM
10001 Hewlett Packard
10002 microsoft
10003 Nvidia

Tenemos una segunda mesa llamada pedidos con tres campos (order_id, Supplier_id y order_date). Contiene los siguientes datos:

Solicitar ID Identificación del proveedor fecha de orden
500125 10000 2013/08/12
500126 10001 2013/08/13
500127 10004 2013/08/14

Si ejecutamos la instrucción SELECT (que contiene una UNIÓN EXTERNA COMPLETA) a continuación:

SELECCIONE proveedores.supplier_id, proveedores.supplier_name, pedidos.order_date DE proveedores COMPLETO EXTERIOR UNIR pedidos EN proveedores.supplier_id = pedidos.supplier_id;

Nuestro conjunto de resultados se vería así:

Identificación del proveedor Nombre del proveedor fecha de orden
10000 IBM 2013/08/12
10001 Hewlett Packard 2013/08/13
10002 microsoft
10003 Nvidia
2013/08/14

las filas para microsoft y Nvidia se incluiría porque se utilizó una UNIÓN EXTERIOR COMPLETA. Sin embargo, notará que el campo fecha_pedido para esos registros contiene un valor.

La fila para id_proveedor 10004 también se incluiría porque se utilizó una UNIÓN EXTERNA COMPLETA. Sin embargo, notará que los campos id_proveedor y nombre_proveedor de esos registros contienen un valor.

Sintaxis antigua

Como nota final, vale la pena mencionar que el ejemplo de FULL OUTER JOIN anterior no podría haberse escrito en la sintaxis antigua sin usar un

Este tutorial de Oracle explica cómo utilizar JUNTAS (INTERNAS Y EXTERNAS) en Oracle con sintaxis y ejemplos.

Descripción

Oracle se une se utilizan para recuperar datos de varias tablas. UNIRSE ejecutado siempre que se unen dos o más tablas en una declaración SQL.

Hay 4 tipos diferentes de uniones de Oracle:

Veamos la sintaxis de Oracle JOIN y también estudiemos ejemplos de Oracle JOIN.

UNIÓN INTERNA (unión simple)

Lo más probable es que ya haya escrito consultas que utilizan Oracle INNER JOIN. Este es el tipo de conexión más común. Oracle INNER JOINS devuelve todas las filas de varias tablas donde se cumplen las condiciones de unión.

Sintaxis

Sintaxis de INNER JOIN en Oracle/PLSQL:

SELECCIONAR columnas
DE la tabla 1
UNIÓN INTERNA tabla2

En esta figura, Oracle INNER JOIN devuelve una región sombreada:

Oracle INNER JOIN devolverá registros donde la tabla1 y la tabla2 se cruzan.

Ejemplo

A continuación se muestra un ejemplo de Oracle INNER JOIN:

OraclePL/SQL

SELECCIONE proveedores.supplier_id,

proveedores.nombre_proveedor,

pedidos.order_date

DE proveedores

Órdenes de UNIÓN INTERNA

Este ejemplo de Oracle INNER JOIN devuelve todas las filas de las tablas de proveedores y pedidos donde hay valores coincidentes del campo id_proveedor en ambas tablas.

Veamos algunos datos para comprender cómo funciona INNER JOIN:

Si ejecutamos la instrucción SELECT de Oracle (que contiene un INNER JOIN) a continuación:

OraclePL/SQL

SELECCIONE proveedores.supplier_id, proveedores.supplier_name, pedidos.order_date DE proveedores INTERNO UNIR pedidos EN proveedores.supplier_id = pedidos.supplier_id;

Las filas de Microsoft y NVIDIA de la tabla de proveedores se omitirán porque los valores de id_proveedor 10002 y 10003 no existen en ambas tablas. La fila order_id 500127 de la tabla de pedidos se omitirá porque proveedor_id 10004 no existe en la tabla de proveedores.

Sintaxis antigua

Como nota final, vale la pena señalar que el ejemplo anterior de Oracle INNER JOIN se puede reescribir usando la antigua sintaxis implícita de la siguiente manera (pero se recomienda usar la sintaxis INNER JOIN):

Otro tipo de unión se llama Oracle LEFT OUTER JOIN. Este tipo de combinación devuelve todas las filas de tablas con una combinación izquierda especificada en la cláusula ON, y solo aquellas filas de otra tabla donde los campos que se unen son iguales.

Sintaxis

Sintaxis para Oracle IZQUIERDA UNIÓN EXTERNA:

SELECCIONAR columnas
DE la tabla 1
UNIRSE A LA IZQUIERDA tabla2
EN tabla1.columna = tabla2.columna;

En algunas bases de datos, LEFT OUTER JOIN se reemplaza por LEFT JOIN.

En esta figura, Oracle LEFT OUTER JOIN devuelve una región sombreada:

Oracle LEFT OUTER JOIN devolverá todos los registros de la tabla1 y solo aquellos registros de la tabla2 que se cruzan con la tabla1.

Ejemplo

OraclePL/SQL

SELECCIONE proveedores.supplier_id,

proveedores.nombre_proveedor,

pedidos.order_date

DE proveedores

Órdenes de UNIÓN EXTERNA IZQUIERDA

ON proveedores.supplier_id=pedidos.supplier_id;

Este ejemplo de LEFT OUTER JOIN devolverá todas las filas de la tabla de proveedores, y solo aquellas filas de la tabla de pedidos donde los campos que se unen son iguales.

Si el valor de id_proveedor en la tabla de proveedores no existe en la tabla de pedidos, todos los campos de la tabla de pedidos aparecerán como NULL en el conjunto de resultados.

Veamos algunos datos para comprender cómo funciona LEFT OUTER JOIN:

Disponemos de una tabla de proveedores con dos campos (id_proveedor y nombre_proveedor) que contiene los siguientes datos:

Si ejecutamos la instrucción SELECT de Oracle (que contiene una UNIÓN EXTERNA IZQUIERDA) a continuación:

OraclePL/SQL

SELECCIONE proveedores.supplier_id, proveedores.supplier_name, pedidos.order_date DE proveedores IZQUIERDOS UNIR pedidos EXTERNOS EN proveedores.supplier_id = pedidos.supplier_id;

Se incluirán filas para Microsoft y NVIDIA ya que se utilizó LEFT OUTER JOIN. Sin embargo, notará que el campo fecha_pedido para estos registros es NULL.

Otro tipo de unión se llama Oracle RIGHT OUTER JOIN. Este tipo de combinación devuelve todas las filas de tablas con una combinación a la derecha especificada en la cláusula ON, y solo aquellas filas de otra tabla donde los campos que se unen son iguales.

Sintaxis

Sintaxis de unión exterior derecha de Oracle:

SELECCIONAR columnas
DE la tabla 1
UNIRSE A LA DERECHA tabla2
EN tabla1.columna = tabla2.columna;

En algunas bases de datos, RIGHT OUTER JOIN se reemplaza por RIGHT JOIN.

En esta figura, Oracle RIGHT OUTER JOIN devuelve la región sombreada:

Oracle RIGHT OUTER JOIN devolverá todos los registros de la tabla2 y solo aquellos registros de la tabla1 que se cruzan con la tabla2.

Ejemplo

A continuación se muestra un ejemplo de UNIÓN EXTERNA DERECHA de Oracle:

OraclePL/SQL

SELECCIONE pedidos.order_id,

pedidos.order_date,

proveedores.nombre_proveedor

DE proveedores

Órdenes de UNIÓN EXTERIOR DERECHA

ON proveedores.supplier_id=pedidos.supplier_id;

Este ejemplo de RIGHT OUTER JOIN devuelve todas las filas de la tabla de pedidos y solo aquellas filas de la tabla de proveedores donde los campos que se unen son iguales.

Si el valor de id_proveedor en la tabla de pedidos no existe en la tabla de proveedores, todos los campos de la tabla de proveedores aparecerán como NULL en el conjunto de resultados.

Veamos algunos datos para comprender cómo funciona RIGHT OUTER JOIN:

Disponemos de una tabla de proveedores con dos campos (id_proveedor y nombre_proveedor) que contiene los siguientes datos:

Si ejecutamos la instrucción SELECT de Oracle (que contiene una JOIN EXTERNA DERECHA) a continuación:

OraclePL/SQL

SELECCIONE pedidos.order_id, pedidos.order_date, proveedores.supplier_name DE proveedores DERECHO EXTERIOR UNIR pedidos EN proveedores.supplier_id = pedidos.supplier_id;

La fila para order_id 500127 se incluirá porque se utilizó RIGHT OUTER JOINS. Sin embargo, notará que el campo nombre_proveedor para este registro es NULL.

Otro tipo de unión se llama Oracle FULL OUTER JOIN. Este tipo de combinación devuelve todas las filas de la tabla izquierda y de la tabla derecha con valores NULL en la ubicación donde no se cumple la condición de combinación.

Sintaxis

Sintaxis para Oracle FULL OUTER JOIN:

SELECCIONAR columnas
DE la tabla 1
UNIÓN COMPLETA tabla2
EN tabla1.columna = tabla2.columna;

En algunas bases de datos, las JOINS EXTERNAS COMPLETAS se reemplazan por JOINS COMPLETAS.

En esta imagen, FULL OUTER JOIN devuelve el área sombreada:

Oracle FULL OUTER JOIN devolverá todos los registros de las tablas tabla1 y tabla2.

Compartir: