Está en la página 1de 16

Informe

Subconsultas
Una subconsulta es una sentencia SELECT que aparece dentro de otra
sentencia SELECT. Normalmente se utilizan para filtrar una clausula WHERE o
HAVING con el conjunto de resultados de la subconsulta, aunque tambin pueden
utilizarse en la lista de seleccin.
En el siguiente ejemplo se muestran los empleados que superan la media
salarial de la empresa, utilizando subconsultas:

Pueden ver cmo se ha encerrado la subconsulta entre parntesis.
CARACTERISTICAS:
Una subconsulta tiene la misma sintaxis que una sentencia SELECT
normal exceptuando que aparece encerrada entre parntesis.
La subconsulta se puede encontrar en la lista de seleccin, en la clusula
WHERE o en la clusula HAVING de la consulta principal.
Primero se resuelve la subconsulta mas interna, y la ltima consulta en
obtener respuesta es la consulta principal, es decir la ms externa.


REESTRICCIONES:
No puede contener la clusula ORDER BY
No puede ser la UNION de varias sentencias SELECT
Si la subconsulta aparece en la lista de seleccin, o est asociada a un
operador igual "=" solo puede devolver un nico registro.
Las consultas a unir deben tener el mismo nmero campos, y adems los
campos deben ser del mismo tipo.
Slo puede haber una nica clausula ORDER BY al final de la sentencia
SELECT principal.
REFERENCIAS EXTERNAS
A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer
referencia al valor de una columna de la fila actual en la consulta principal, ese
nombre de columna se denomina referencia externa.
Una referencia externa es un campo que aparece en la subconsulta pero se
refiere a la una de las tablas designadas en la consulta principal.
Cuando se ejecuta una consulta que contiene una subconsulta con referencias
externas, la subconsulta se ejecuta por cada fila de la consulta principal.
En este ejemplo la subconsulta aparece en la lista de seleccin, ejecutndose
una vez por cada fila que devuelve la consulta principal.



La funcin EXISTS
Las subconsultas con EXISTS realizan comprobaciones de existencias, no
devuelven ningn conjunto de resultados, nicamente devuelve TRUE o FALSE
en funcin de si la subconsulta encuentra algn resultado.
En el siguiente ejemplo mostramos los empleados que hayan realizado alguna
reserva de vehculos, en este caso, todos:

Subconsultas con IN
El resultado de una subconsulta con IN (o NOT IN) es una lista de varios
valores (o ninguno). Una vez que obtenemos estos valores, la consulta externa o
principal los utiliza.
En el siguiente ejemplo se muestra el nombre y apellidos de aquellos
empleados que no superen los 300 Kilmetros en sus reservas:

Utilizacin de subconsultas con UPDATE/DELETE/INSERT
Podemos utilizar subconsultas tambin en consultas de actualizacin
conjuntamente con UPDATE. Normalmente se utilizan para "copiar" el valor de
otra tabla, eliminar valores de una tabla mediante relaciones con otras y de igual
forma agregar valores de una tabla a otra.

INSERT


DELETE


UNION

El operador UNION sirve para obtener a partir de dos tablas con las mismas
columnas, una nueva tabla con las filas de la primera y las filas de la segunda.

La sintaxis es la siguiente:

SELECT Nombre_campo1, Nombre_campo2
FROM empleados
UNION SELECT Nombre_campo1, Nombre_campo2
FROM clientes;

Cuando realizamos una consulta con UNION internamente se realiza una
operacin DISTINCT sobre el conjunto de resultados final. Si queremos obtener
todos los valores debemos utilizar UNION ALL.





- La consulta puede ser un nombre de tabla, un nombre de consulta (en estos dos
casos el nombre debe estar precedido de la palabra TABLE), o una sentencia
SELECT completa (en este caso no se puede poner TABLE). La sentencia
SELECT puede ser cualquier sentencia SELECT con la nica restriccin de que
no puede contener la clusula ORDER BY.
Despus de la primera consulta viene la palabra UNION y a continuacin la
segunda consulta. La segunda consulta sigue las mismas reglas que la primera
consulta.

- Las dos consultas deben tener el mismo nmero de columnas pero las columnas
pueden llamarse de diferente forma y ser de tipos de datos distintos.

- Las columnas del resultado se llaman como las de la primera consulta.

- Por defecto la unin no incluye filas repetidas, si alguna fila est en las dos
tablas, slo aparece una vez en el resultado.
Si queremos que aparezcan todas las filas incluso las repeticiones de filas,
incluimos la palabra ALL (todo en ingls).
El empleo de ALL tienen una ventaja, la consulta se ejecutar ms rpidamente.
Puede que la diferencia no se note con tablas pequeas, pero si tenemos tablas
con muchos registros (filas) la diferencia puede ser notable.

- Se puede unir ms de dos tablas, para ello despus de la segunda consulta
repetimos la palabra UNION... y as sucesivamente.

- Tambin podemos indicar que queremos el resultado ordenado por algn criterio,
en este caso se incluye la clusula ORDER BY que ya vimos en el tema anterior.
La clusula ORDER BY se escribe despus de la ltima consulta, al final de la
sentencia; para indicar las columnas de ordenacin podemos utilizar su nmero de
orden o el nombre de la columna, en este ltimo caso se deben de utilizar los
nombres de columna de la primera consulta ya que son los que se van a utilizar
para nombrar las columnas del resultado.

Caso prctico de UNION:

Para ilustrar la operacin vamos a realizar un ejercicio, vamos a obtener los
cdigos de los productos que tienen existencias iguales a cero o que aparezcan
en pedidos de la fecha 02/01/90.





CREATE TABLE productos (
idfab varchar(20),
idproducto varchar(20),
descripcion varchar(20),
precio varchar(20),
existencias varchar(20),
primary key(idproducto));

CREATE table pedidos (
codigo varchar(20),
numpedido varchar(20),
clie varchar(20),
rep varchar(20),
fab varchar(20),
producto varchar(20),
cant varchar(20),
importe varchar(20),
primary key(codigo));


INSERT INTO productos (idfab, idproducto, descripcion, precio, existencias)
VALUES ('hp', '001', 'computadora', '1000', '10');

INSERT INTO productos (idfab, idproducto, descripcion, precio, existencias)
VALUES ('hp', '002', 'mouse', '200', '0');

INSERT INTO productos (idfab, idproducto, descripcion, precio, existencias)
VALUES ('apple', '003', 'computadora', '3000', '0');


INSERT INTO pedidos (codigo, numpedido, fechapedido, clie, rep, fab,
producto, cant, importe) VALUES ('1', '100', '02/01/97', '2107', '01', 'hp', '001',
'10', '1000');

INSERT INTO pedidos (codigo, numpedido, fechapedido, clie, rep, fab,
producto, cant, importe) VALUES ('2', '101', '02/01/90', '2108', '02', 'hp', '002',
'0', '200');

INSERT INTO pedidos (codigo, numpedido, fechapedido, clie, rep, fab,
producto, cant, importe) VALUES ('3', '102', '02/01/90', '2109', '02', 'apple',
'003', '0', '3000');



Colocamos la siguiente instruccin SQL:


SELECT idfab,idproducto
FROM productos
WHERE existencias = 0
UNION ALL
SELECT fab,producto
FROM pedidos
WHERE (fechapedido) = '02/01/90'
ORDER BY idproducto;

Resultado:



Se ha incluido la clusula ALL porque no nos importa que salgan filas
repetidas.
Si se quiere se puede remover el ALL para que no salgan valores repetidos y
quedara de la siguiente manera:

Se ha incluido ORDER BY para que el resultado salga ordenado por idproducto,
observar que hemos utilizado el nombre de la columna de la primera SELECT.
Intersect

Parecido al comando UNION, INTERSECT tambin opera en dos instrucciones
SQL. La diferencia es que, mientras UNION acta fundamentalmente como un
operador OR (O) (el valor se selecciona si aparece en la primera o la segunda
instruccin), el comando INTERSECT acta como un operador AND (Y) (el valor
se selecciona si aparece en ambas instrucciones).
Una consulta de tipo intersect nos devuelve la interseccin de dos consultas,
es decir, los valores comunes a las dos consultas, y nos es til para comprobar
que valores cumplen con dos condiciones distintas. En MySQL sta funcin no
existe, por lo que hemos tenido que buscar una solucin alternativa.
Devuelve la interseccin entre dos o ms conjuntos de resultados en uno. El
conjunto obtenido como resultado de INTERSECT tiene la misma estructura que
los conjuntos originales.
La sintaxis es la siguiente:
[Instruccin SQL 1]
INTERSECT
[Instruccin SQL 2];
El siguiente ejemplo muestra el uso de INTERSECT.



Primero se crea la base de datos

Luego se crea la tabla estudiantes que es para tener un registro de los estudiantes
de una seccin.


Ahora se crea la tabla aprobados en la que introducimos los datos de los
estudiantes aprobados.




Ahora queremos aplicar una consulta Intersect que nos de por medio de la
cedulas una lista de los registros que estn en la tabla estudiantes y en la tabla
aprobados (Las cedulas que aparezcan en esta lista sern las de los estudiantes
aprobados nicamente)
El cdigo para SQL Server seria as:
SELECT cedula FROM estudiantes
INTERSECT
SELECT cedula FROM aprobados;
Pero el mysql query browser no reconoce el comando Intersect, asi que se
sustituye por un Inner Join que tiene el mismo efecto:











Merge
Realiza operaciones de insercin, actualizacin o eliminacin en una tabla de
destino segn los resultados de una combinacin con una tabla de origen. Por
ejemplo, puede sincronizar dos tablas insertando, actualizando o eliminando las
filas de una tabla segn las diferencias que se encuentren en la otra.
Este comando lo que nos simplifica es el hecho de tener que realizar consultas
de insercin o de actualizacin por separado.
Un ejemplo:
Tenemos dos tablas Sucursal y Sucursal_2 con estructura igual

En cuanto a los registros tenemos, Sucursal:

Sucursal_2:

La diferencia est en los registros que tiene cada tabla.
Sucursal_2 tiene dos registros idnticos a los de sucursal. Pero an le faltan 5
para ser igual.
Queremos ingresar en Sucursal_2 todos aquellos registros que forman parte de
Sucursal y para los que ya estn se quiere hacer una actualizacin de datos.
Normalmente deberamos utilizar dos sentencias, realizar un insert y un update,
con el merge simplificamos este proceso.

Lo que obtenemos:



En SQL Server 2008, se pueden realizar operaciones de insercin,
actualizacin o eliminacin en una sola instruccin utilizando la instruccin
MERGE. La instruccin MERGE le permite combinar un origen de datos con una
tabla o vista de destino y, a continuacin, realizar varias acciones con el destino
segn los resultados de esa combinacin. Por ejemplo, puede utilizar la
instruccin MERGE para realizar las operaciones siguientes:
Condicionalmente insertar o actualizar filas en una tabla de destino.
Si la fila existe en la tabla de destino, actualizar una o varias columnas; de
lo contrario, insertar los datos en una fila nueva.
Sincronizar dos tablas.
Insertar, actualizar o eliminar filas en una tabla de destino segn las
diferencias con los datos de origen.

La sintaxis de MERGE est compuesta de cinco clusulas principales:

La clusula MERGE especifica la tabla o vista que es el destino de las
operaciones de insercin, actualizacin o eliminacin.
La clusula USING especifica el origen de datos que va a combinarse con
el destino.
La clusula ON especifica las condiciones de combinacin que determinan
las coincidencias entre el destino y el origen.
Las clusulas WHEN (WHEN MATCHED, WHEN NOT MATCHED BY
TARGET y WHEN NOT MATCHED BY SOURCE) especifican las acciones
que se van a llevar a cabo segn los resultados de la clusula ON y
cualquier criterio de bsqueda adicional especificado en las clusulas
WHEN.
La clusula OUTPUT devuelve una fila por cada fila del destino que se
inserta, actualiza o elimina.