El lenguaje SQL (II):

Publicado: julio 12, 2011 en Oracle

JOIN

Concepto de JOIN

  • Un JOIN se utiliza para consultar datos de más de una tabla
  • La condición de JOIN se escribe en la cláusula WHERE.
  • Si existen columnas con el mismo nombre en las tablas seleccionadas, se deberán nombrar los campos
  • Ejemplo:

S.Q.L.
Tipos de JOIN

  • Existen dos tipos principales de JOIN:
    • EQUIJOIN Join sobre dos o más tablas, por igualdad de campos.
    • NON-EQUIJOIN Por desigualdad, sin correspondencia directa entre campos de tablas. La relación se puede establecer mediante criterios de rango (<, >, BETWEEN, …)
  • Y dos más adicionales:
    • OUTER JOIN Para ver, también, las filas que no complen la condición de Join. El operador de un Outer Join es el signo más (+), en el “lado” del join que es deficiente en información.
    • SELF JOIN Combinación de una tabla consigo misma.

S.Q.L.
Ejemplo de Equijoin

  • Ya que la columna DEPTNO es igual en ambas tablas, ésta debe ir prefijada por el nombre de la tabla para evitar la ambigüedad.

S.Q.L.
Ejemplo de Non-Equijoins

  • En este ejemplo se han usado alias de tablas (e para la tabla emp y s para la tabla salgrade).

S.Q.L.
Ejemplo de Outer Join

  • En este ejemplo se muestran los números y nombres de todos los departamentos, incluidos aquellos que no tienen empleado.
  • Si se le añade: AND emp.deptno is null, sólo se mostrarían las no coincidencias.

S.Q.L.
Ejemplo de Self Join

  • En este ejemplo la cláusula WHERE contiene la combinación “dónde un jefe de un trabajador coincide con el número de empleado para el jefe”

SUBCONSULTAS

¿Cuándo subconsultas?

  • ¿Quién tiene un salario superior al de Jones

S.Q.L.
Sintaxis de una subconsulta

  • La subconsulta se ejecuta una vez y antes de la consulta principal.
  • El resultado de ella es usado por la consulta principal externa.

S.Q.L.
Guía Uso de Subconsultas

  • Encierre las subconsultas entre paréntesis.
  • No añada una cláusula ORDER BY a una subconsulta.
  • Utilice operadores a nivel de fila para subconsultas que devuelvan solo una fila MONOREGISTRO.
  • Utilice operadores que actúan sobre varios registros para subconsultas que devuelven más de una fila MULTIREGISTRO.

S.Q.L.
Subconsultas Mono-registro

  • Devuelven un único registro.
  • Se utilizan operadores de comparación (=, >, >=, <, <= y <>).
  • Ejemplo:

S.Q.L.
Subconsultas Multi-registro

  • Devuelven más de un registro
  • Se utilizan comparadores multiregistro:
    • IN TRUE si se encuentra en la lista.
    • ANY (y sinónimo SOME) TRUE si la condición se cumple con algún registro de la lista devuelta por la subconsulta.
    • ALL TRUE si la condición se cumple con todos los registros de la lista devuelta por la subconsulta.
  • El operador NOT puede ser utilizado con los operadores IN, ANY y ALL.

S.Q.L.
Ejemplo subc. Multi-registro

S.Q.L.
Subcons. en cláusula FROM

  • Puede utilizar una subconsulta en una cláusula FROM de una sentencia SELECT:

  • Este ejemplo muestra los nombres, salarios, núm. Departamentos y media de salarios, de todos los empleados que cobran más que la media de salarios de su departamento.

Exists y No Exists

Los operadores “exists” y “not exists” se emplean para determinar si hay o no datos en una lista de valores.

Estos operadores pueden emplearse con subconsultas correlacionadas para restringir el resultado de una consulta exterior a los registros que cumplen la subconsulta (consulta interior). Estos operadores retornan “true” (si las subconsultas retornan registros) o “false” (si las subconsultas no retornan registros).

Cuando se coloca en una subconsulta el operador “exists”, Oracle analiza si hay datos que coinciden con la subconsulta, no se devuelve ningún registro, es como un test de existencia; Oracle termina la recuperación de registros cuando por lo menos un registro cumple la condición “where” de la subconsulta.

La sintaxis básica es la siguiente:

… where exists (SUBCONSULTA);

En este ejemplo se usa una subconsulta correlacionada con un operador “exists” en la cláusula “where” para devolver una lista de clientes que compraron el artículo “lapiz”:

select cliente,numero
from facturas f
where exists
(select *from Detalles d
where f.numero=d.numerofactura
and d.articulo=’lapiz’);

Puede obtener el mismo resultado empleando una combinación.

Podemos buscar los clientes que no han adquirido el artículo “lapiz” empleando “if not exists”:

select cliente,numero
from facturas f
where not exists
(select *from Detalles d
where f.numero=d.numerofactura
and d.articulo=’lapiz’);

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s