You are on page 1of 20

MAXIMILIANO SALAZAR

3RO TELEMTICA

SQL SERVER 2005


Operaciones con Conjuntos
SQL Server 2005 permite tres tipos de operaciones con conjuntos:

UNION, disponible en todas las versiones de SQL Server.

EXCEPT, nuevo en SQL Server 2005.

INTERSECT, nuevo en SQL Server 2005.


Para utilizar operaciones de conjuntos debemos cumplir una serie de normas.

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.
UNION
UNION devuelve la suma de dos o ms conjuntos de resultados. El conjunto
obtenido como resultado de UNION tiene la misma estructura que los conjuntos
originales.

El siguiente ejemplo muestra el uso de UNION

SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento


FROM EMPLEADOS
UNION
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento
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 utiliza UNION ALL.

MAXIMILIANO SALAZAR

3RO TELEMTICA

SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento


FROM EMPLEADOS
UNION ALL
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento
FROM CLIENTES

EXCEPT
EXCEPT devuelve la diferencia (resta) de dos o ms conjuntos de resultados. El
conjunto obtenido como resultado de EXCEPT tiene la misma estructura que los
conjuntos originales.
El siguiente ejemplo muestra el uso de EXCEPT

SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento


FROM EMPLEADOS
EXCEPT
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento
FROM CLIENTES

El uso de EXCEPT, como norma general, es mucho ms rpido que


utilizar condiciones NOT IN o EXISTS en la clusula WHERE.
INTERSECT
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.
El siguiente ejemplo muestra el uso de INTERSECT

MAXIMILIANO SALAZAR

3RO TELEMTICA

SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento


FROM EMPLEADOS
INTERSECT
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento
FROM CLIENTES

CONSULTAR DATOS EN TRANSACT SQL


LA SENTENCIA SELECT
La sentencia SELECT nos permite consultar los datos almacenados en una tabla
de la base de datos.
El formato de la sentencia select es:

SELECT [ALL | DISTINCT ][ TOP expression [ PERCENT ] [ WITH TIES ] ]


<nombre_campos>
FROM <nombre_tabla>
[ INNER | LEFT [OUTER]| RIGHT [OUTER] | CROSS]
[JOIN ] <nombre_tabla> ON <condicion_join>[ AND|OR <condicion>]
[WHERE <condicion> [ AND|OR <condicion>]]
[GROUP BY <nombre_campos>]
[HAVING <condicion>[ AND|OR <condicion>]]
[ORDER BY <nombre_campo> [ASC | DESC]

El siguiente ejemplo muestra una consulta sencilla que obtiene el cdigo y la


"familia" de una tabla llamada familias (representara familias de productos por
ejemplo).

MAXIMILIANO SALAZAR

3RO TELEMTICA

SELECT CO_FAMILIA, FAMILIA


FROM FAMILIAS

El uso del asterisco indica que queremos que la consulta devuelva todos los
campos que existen en la tabla.

SELECT *
FROM FAMILIAS

Ahora vamos a realizar una consulta obteniendo adems de los datos de familias,
los datos de las categoras y los productos.

SELECT *
FROM FAMILIAS
INNER JOIN CATEGORIAS
ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA
INNER JOIN PRODUCTOS
ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA

La combinacin se realiza a travs de la clusula INNER JOIN, que es una


clusula exclusiva, es decir las familias que no tengan categoras y productos
asociados no se devolvern.
Si queremos realizar la consulta para que no sea exclusiva, tenemos que
utilizar LEFT JOIN. El uso de la palabra reservada OUTER es opcional.

MAXIMILIANO SALAZAR

3RO TELEMTICA

SELECT *
FROM FAMILIAS
LEFT OUTER JOIN CATEGORIAS
ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA
LEFT OUTER JOIN PRODUCTOS
ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA

Los registros que no tengan datos relacionados en una consulta LEFT


JOIN devolvern en valor null en los campos que correspondan a las tablas en las
que no tienen dato.
Tambin podemos forzar un producto cartesiano (todos con todos) a travs
de CROSS JOIN.

SELECT * FROM FAMILIAS


CROSS JOIN CATEGORIAS

LA CLUSULA WHERE
La clusula WHERE es la instruccin que nos permite filtrar el resultado de una
sentencia SELECT.

SELECT CO_FAMILIA, FAMILIA


FROM FAMILIAS
WHERE CO_FAMILIA = 1

MAXIMILIANO SALAZAR

3RO TELEMTICA

Por supuesto, podemos especificar varias condiciones para el WHERE:

SELECT *
FROM FAMILIAS
WHERE CO_FAMILIA = 1
OR CO_FAMILIA = 2

Podemos agrupar varios valores para una condicin en la clusula IN:

SELECT *
FROM FAMILIAS
WHERE CO_FAMILIA IN ( 1 , 2)

La clusula WHERE se puede utilizar conjuntamente con INNER JOIN, LEFT


JOIN ...

SELECT FAMILIAS.CO_FAMILIA,
FAMILIAS.FAMILIA
FROM FAMILIAS
INNER JOIN CATEGORIAS
ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA
WHERE FAMILIAS.CO_FAMILIA > 1

MAXIMILIANO SALAZAR

3RO TELEMTICA

Siempre que incluyamos un valor alfanumrico para un campo en la


condicin WHERE este debe ir entre comillas simples:

SELECT *
FROM FAMILIAS
WHERE FAMILIA = 'FAMILIA 1'

Para consultar campos alfanumricos, es decir, campos de texto podemos utilizar


el operador LIKE conjuntamente con comodines.

SELECT *
FROM FAMILIAS
WHERE FAMILIA LIKE 'FAM%'

Los comodines que podemos utilizar en son los siguientes:

% , representa cualquier cadena de texto de cero o ms caracteres de


cualquier longitud.

_ , representa un carcter.

[a-d], representa cualquier carcter del intervalo a-d.

[abcd], representa cualquier carcter del grupo abcd.

[^a-d], representa cualquier carcter diferente del intervalo a-d.

[^abcd], representa cualquier carcter distinto del grupo abcd.


Tambin podemos obtener los valores distintos utilizando DISTINCT.

MAXIMILIANO SALAZAR

3RO TELEMTICA

SELECT DISTINCT FAMILIA -- Devuelve los distintos valores de FAMILIA


FROM FAMILIAS

Podemos limitar el nmero de registros que devuelve la consulta a travs de la


clusula TOP. La clusula TOP admite como parmetros un valor numrico entero
o un porcentaje (slo a partir de la versin 2005)

SELECT TOP 10 * -- Devuelve 10 registros


FROM FAMILIAS

SELECT TOP 50 PERCENT * -- Devuelve el 50% de los registros


FROM FAMILIAS

La clusula TOP se puede combinar con WITH TIES en consultas agregadas.


LA CLUSULA ORDER BY
Podemos especificar el orden en el que sern devueltos los datos a travs de la
clusula ORDER BY.

SELECT CO_FAMILIA, FAMILIA


FROM FAMILIAS
ORDER BY FAMILIA DESC

Tambin podemos indicar el ndice del campo en la lista de seleccin en lugar


de su nombre:

MAXIMILIANO SALAZAR

3RO TELEMTICA

SELECT CO_FAMILIA, FAMILIA


FROM FAMILIAS
ORDER BY 2 DESC -- Ordena por FAMILIA

Actualizar datos en Transact SQL


UPDATE
Para la actualizacin de datos Transact SQL dispone de la sentencia UPDATE.
La sentencia UPDATE permite la actualizacin de uno o varios registros de una
nica tabla. La sintaxis de la sentencia UPDATE es la siguiente

UPDATE <nombre_tabla>
SET <campo1> = <valor1>
{[,<campo2> = <valor2>,...,<campoN> = <valorN>]}
[ WHERE <condicion>];
El siguiente ejemplo muestra el uso de UPDATE.

UPDATE CLIENTES
SET
NOMBRE = 'Devjoker',
APELLIDO1 = 'Herrarte',
APELLIDO2 = 'Snchez'
WHERE CO_CLIENTE = 10
Un aspecto a tener en cuenta, sobre todo si has trabajado con ORACLE, es que
SQL graba los cambios inmediatamente sin necesidad de hacer COMMIT. Por
supuesto podemos gestionar nosotros las transacciones pero es algo que hay que

MAXIMILIANO SALAZAR

3RO TELEMTICA

hacer de forma explcita con la instruccin BEGIN TRAN y que se ver en


captulos posteriores de este tutorial.
UPDATE INNER JOIN
En ocasiones queremos actualizar los datos de una tabla con los datos de otra
(muy comn para desnormalizar un modelo de datos).
Habitualmente, usamos subconsultas para este propsito, pero Transact SQL
permite la utilizacin de la sentencia UPDATE INNER JOIN.

UPDATE CLIENTES
SET
NOMBRE = FICHERO_CLIENTES.NOMBRE,
APELLIDO1 = FICHERO_CLIENTES.APELLIDO1,
APELLIDO2 = FICHERO_CLIENTES.APELLIDO2
FROM CLIENTES
INNER JOIN FICHERO_CLIENTES
ON FICHERO_CLIENTES.CO_CLIENTE = CLIENTES.CO_CLIENTE

CLAUSULA OUTPUT

MAXIMILIANO SALAZAR

3RO TELEMTICA

A partir de la versin de SQL Server 2005 disponemos de la


clusula OUTPUT para recuperar los valores que hemos insertado. Al igual que en
un trigger disponemos de las tablas lgicas INSERTED y DELETED.
Las columnas con prefijo DELETED reflejan el valor antes de que se complete la
instruccin UPDATE oDELETE. Es decir, son una copia de los datos "antes" del
cambio.
DELETED no se puede utilizar con la clusula OUTPUT en la instruccin INSERT.

DECLARE @FILAS_ACTUALIZADAS TABLE


( CO_CLIENTE int ,
NOMBRE varchar(100),
APELLIDO1 varchar(100),
APELLIDO2 varchar(100)
)

UPDATE CLIENTES
SET
NOMBRE = 'Devjoker',
APELLIDO1 = 'Herrarte',
APELLIDO2 = 'Snchez'
OUTPUT DELETED.* INTO @FILAS_ACTUALIZADAS
WHERE CO_CLIENTE IN (10, 11, 12)

SELECT * FROM @FILAS_ACTUALIZADAS

MAXIMILIANO SALAZAR

3RO TELEMTICA

Las columnas con prefijo INSERTED reflejan el valor despus de que se complete
la instruccin UPDATE o INSERT, pero antes de que se ejecuten los
desencadenadores. Es decir, son una copia de los datos "despus" del cambio.
INSERTED no se puede utilizar con la clusula OUTPUT en la
instruccin DELETE.

DECLARE @FILAS_ACTUALIZADAS TABLE


( CO_CLIENTE int ,
NOMBRE varchar(100),
APELLIDO1 varchar(100),
APELLIDO2 varchar(100)
)

UPDATE CLIENTES
SET
NOMBRE = 'Devjoker',
APELLIDO1 = 'Herrarte',
APELLIDO2 = 'Snchez'
OUTPUT INSERTED.* INTO @FILAS_ACTUALIZADAS
WHERE CO_CLIENTE IN (10, 11, 12)

SELECT * FROM @FILAS_ACTUALIZADAS

MAXIMILIANO SALAZAR

3RO TELEMTICA

EJEMPLOS
UNION

MAXIMILIANO SALAZAR

INTERSECT

3RO TELEMTICA

MAXIMILIANO SALAZAR

EXCEPT

3RO TELEMTICA

MAXIMILIANO SALAZAR

SELECT FROM

3RO TELEMTICA

MAXIMILIANO SALAZAR

3RO TELEMTICA

MAXIMILIANO SALAZAR

SELECT - RTRIM ORDER BY

3RO TELEMTICA

MAXIMILIANO SALAZAR

SELECT- CASE WHEN - THEN

3RO TELEMTICA

MAXIMILIANO SALAZAR

DELETE FROM WHERE

3RO TELEMTICA

You might also like