Bienvenido



Haz ingresado al Blog de los alumnos del 4to semestre de Ingenieria Informatica de la Universidad Tecnológica de chile INACAP.


viernes, 23 de noviembre de 2007

SELECT A MAS DE UNA TABLA

4 comentarios:

Nacho Coyhaique dijo...

INNER JOIN
Es un tipo de composicion de tablas, que permite emparejar filas de distintas tablas de forma eficiente cuando una de las columnas de emparejamiento esta indexada.
Para cada fila de una de las tablas busca directamente en la otra tabla las filas que cumplen la condicion, con lo cual se emparejan solo las filas que luego aparecen en el resultado.

Sintaxis:
FROM - tabla1 - INNER JOIN - tabla2 - ON - tabla.col1 -comp - tabla2.col2

tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no, nombre de consulta guardada), de las tablas cuyos registros se van a combinar.
Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un alias de tabla.

col1, col2 son las columnas de emparejamiento.

Las columnas de emparejamiento deben contener la misma clase de datos, las dos de tipo texto, de tipo fecha, los campos numericos deben ser de tipos similares. Por ejemplo, se puede combinar campos AutoNumerico y Long puesto que son tipos similares, sin embargo, no se puede combinar campos de tipo Simple y Doble. Ademas las columnas no pueden ser de tipo Memo ni OLE.

Dentro de la clausula ON los nombres de columna deben ser nombres cualificados (llevan delante el nombre de la tabla y un punto).

comp representa cualquier operador de comparaci�n ( =, <, >, <=, >=, o <> ) y se utiliza para establecer la condicion de emparejamiento.

EJ:

SELECT *
FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie
Se pueden definir varias condiciones de emparejamiento unidas por los operadores AND y OR poniendo cada condicion entre parentesis.

EJ:

SELECT *
FROM pedidos INNER JOIN productos ON (pedidos.fab = productos.idfab) AND (pedidos.producto = productos.idproducto)


Se pueden combinar mas de dos tablas. En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo.

EJ:

SELECT *
FROM (pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie) INNER JOIN empleados ON pedidos.rep = empleados.numemp

SELECT *
FROM clientes INNER JOIN (pedidos INNER JOIN empleados ON pedidos.rep = empleados.numemp) ON pedidos.clie = clientes.numclie


Erik A. Santander M.

Nacho Coyhaique dijo...

EJEMPLOS INNER JOIN:

1.- Se desea listar los pedidos mostrando su número, importe, nombre del cliente, y el límite de crédito del cliente correspondiente (todos los pedidos tienen cliente y representante).

SELECT numpedido, importe, clientes.nombre AS cliente, limitecredito
FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie

En este ejemplo no pueden haber pedidos sin cliente, y lo que interesa son los pedidos, tampoco tienen que aparecer los clientes que no tienen pedidos, por lo tanto utilizamos un INNER JOIN.


2.- Hallar los empleados que realizaron su primer pedido el mismo día en que fueron contratados.

SELECT empleados.*
FROM empleados INNER JOIN pedidos ON pedidos.rep = empleados.numemp
WHERE fechapedido = contrato

Los representantes que se buscan tienen un pedido con la misma fecha que la de su contrato, tenemos que añadir a los pedidos los datos del representante correspondiente para poder comparar los dos campos


3.- Listar los empleados con una cuota superior a la de su jefe, para cada empleado sacar sus datos y el número, nombre y cuota de su jefe.

SELECT empleados.*, jefes.numemp AS num_jefe, jefes.nombre AS nombre_jefe, jefes.cuota AS cuota_jefe
FROM empleados INNER JOIN empleados jefes ON empleados.jefe = jefes.numemp
WHERE empleados.cuota > jefes.cuota

En una misma línea se necesita los datos del empleado y los datos de su jefe, luego hay que combinar empleados con empleados. No interesan los empleados que no tienen jefe luego se utiliza INNER JOIN. El alias de tabla es obligatorio ya que combina empleados con la misma.


Erik A. Santander M.

Nacho Coyhaique dijo...

RIGHT JOIN
La sintaxis de RIGHT JOIN es la misma que la del INNER JOIN, lo unico que cambia es la palabra INNER por RIGHT (derecha en ingles).

Sintaxis:
FROM-tabla1-RIGHT JOIN-tabla2-ON-tabla1.col1-comp-tabla2.col2

Esta operacion consiste en añadir al resultado del INNER JOIN las filas de la tabla de la derecha que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos de la tabla de la izquierda con valores nulos.

EJ:

SELECT *
FROM empleados RIGHT JOIN oficinas ON empleados.oficina = oficinas.oficina

En el ejemplo obtenemos una lista de los empleados con los datos de su oficina, y ademas aparece una fila por cada oficina que no esta asignada a ningun empleado con los datos del empleado a nulos.



EJEMPLOS RIGHT JOIN:

Listar las oficinas con objetivo superior a 600.000 pts. indicando para cada una de ellas el nombre de su director

SELECT oficinas.*, nombre AS director
FROM empleados RIGHT JOIN oficinas ON empleados.oficina = oficinas.oficina
WHERE objetivo > 600000

Nos interesan las oficinas con objetivo superior a 600.000 pts. luego nos tenemos que asegurar que salgan todas incluso si no tienen director asignado por eso utilizamos RIGHT JOIN.
En los valores num�ricos no utilizar el punto para separar los miles (lo consideraria coma decimal y entenderia 600 en vez de 600000).


Erik A. Santander M.

Nacho Coyhaique dijo...

LEFT JOIN
El LEFT JOIN y RIGHT JOIN son otro tipo de composición de tablas, también denominada composición externa. Son una extensión del INNER JOIN.
Con una composición interna sólo se obtienen las filas que tienen al menos una fila de la otra tabla que cumpla la condición.

La descripción de la sintaxis de LEFT JOIN es la misma que la del INNER JOIN , lo único que cambia es la palabra INNER por LEFT (izquierda en inglés).

Sintaxis:
FROM—tabla1—LEFT JOIN—tabla2—ON—tabla1.col1—comp—tabla2.col2

Esta operación consiste en añadir al resultado del INNER JOIN las filas de la tabla de la izquierda que no tienen correspondencia en la otra tabla, y rellenar en esas filas los campos de la tabla de la derecha con valores nulos.

EJ:

SELECT*
FROM empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina

En el ejemplo obtenemos una lista de los empleados con los datos de su oficina, y el empleado 110 que no tiene oficina aparece con sus datos normales y los datos de su oficina a nulos

EJ:

SELECT *
FROM clientes INNER JOIN (empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina) ON clientes.repclie = empleados.numclie

Se combina empleados con oficinas para obtener los datos de la oficina de cada empleado, y luego añadimos los clientes de cada representante, así obtenemos los clientes que tienen un representante asignado y los datos de la oficina del representante asignado.

Una operación LEFT JOIN o RIGHT JOIN se puede anidar dentro de una operación INNER JOIN, pero una operación INNER JOIN no se puede anidar dentro de LEFT JOIN o RIGHT JOIN.


EJEMPLOS LEFT JOIN:

Listar los datos de cada uno de los empleados, la ciudad y región en donde trabaja.

SELECT empleados.*, ciudad, region
FROM empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina

Aquí hemos utilizado LEFT JOIN para que también salgan los empleados que no tienen oficina asignada. Como queremos todos los datos del empleado utilizamos empleados.* para acortar.


Erik A. Santander M.