MAXIMILIANO SALAZAR 3RO TELEMÁTICA
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 número campos, y además los campos deben ser del mismo tipo.
Sólo puede haber una única clausula ORDER BY al final de la sentencia SELECT.
UNION
UNION devuelve la suma de dos o más 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 Operación DISTINCT sobre el conjunto de resultados final. Si queremos obtener todos los valores debemos utiliza UNION ALL.
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento
FROM EMPLEADOS
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
UNION ALL
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento
FROM CLIENTES
EXCEPT
EXCEPT devuelve la diferencia (resta) de dos o más 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 más rápido que utilizar condiciones NOT IN o EXISTS en la cláusula WHERE.
INTERSECT
Devuelve la intersección entre dos o más 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
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento
FROM EMPLEADOS
INTERSECT
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
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 código y la "familia" de una tabla llamada familias (representaría familias de productos por ejemplo).
SELECT CO_FAMILIA, FAMILIA
FROM FAMILIAS
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
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 además de los datos de familias, los datos de las categorías 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 combinación se realiza a través de la cláusula INNER JOIN, que es una cláusula exclusiva, es decir las familias que no tengan categorías y productos asociados no se devolverán.
Si queremos realizar la consulta para que no sea exclusiva, tenemos que utilizar LEFT JOIN. El uso de la palabra reservada OUTER es opcional.
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
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
Los registros que no tengan datos relacionados en una consulta LEFT JOIN devolverán en valor null en los campos que correspondan a las tablas en las que no tienen dato.
También podemos forzar un producto cartesiano (todos con todos) a través de CROSS JOIN.
SELECT * FROM FAMILIAS
CROSS JOIN CATEGORIAS
LA CLÁUSULA WHERE
La cláusula WHERE es la instrucción que nos permite filtrar el resultado de una sentencia SELECT.
SELECT CO_FAMILIA, FAMILIA
FROM FAMILIAS
WHERE CO_FAMILIA = 1
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 condición en la cláusula IN:
SELECT *
FROM FAMILIAS
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
WHERE CO_FAMILIA IN ( 1 , 2)
La cláusula 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
Siempre que incluyamos un valor alfanumérico para un campo en la condición WHERE este debe ir entre comillas simples:
SELECT *
FROM FAMILIAS
WHERE FAMILIA = 'FAMILIA 1'
Para consultar campos alfanuméricos, 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:
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
% , representa cualquier cadena de texto de cero o más caracteres de cualquier longitud.
_ , representa un carácter. [a-d], representa cualquier carácter del intervalo a-d. [abcd], representa cualquier carácter del grupo abcd. [^a-d], representa cualquier carácter diferente del intervalo a-d. [^abcd], representa cualquier carácter distinto del grupo abcd.
También podemos obtener los valores distintos utilizando DISTINCT.
SELECT DISTINCT FAMILIA -- Devuelve los distintos valores de FAMILIA
FROM FAMILIAS
Podemos limitar el número de registros que devuelve la consulta a través de la cláusula TOP. La cláusula TOP admite como parámetros un valor numérico entero o un porcentaje (sólo a partir de la versión 2005)
SELECT TOP 10 * -- Devuelve 10 registros
FROM FAMILIAS
SELECT TOP 50 PERCENT * -- Devuelve el 50% de los registros
FROM FAMILIAS
La cláusula TOP se puede combinar con WITH TIES en consultas agregadas.
LA CLÁUSULA ORDER BY
Podemos especificar el orden en el que serán devueltos los datos a través de la cláusula ORDER BY.
SELECT CO_FAMILIA, FAMILIA
FROM FAMILIAS
ORDER BY FAMILIA DESC
También podemos indicar el índice del campo en la lista de selección en lugar de su nombre:
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
SELECT CO_FAMILIA, FAMILIA
FROM FAMILIAS
ORDER BY 2 DESC -- Ordena por FAMILIA
Actualizar datos en Transact SQL
UPDATE
Para la actualización de datos Transact SQL dispone de la sentencia UPDATE. La sentencia UPDATE permite la actualización 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 = 'Sánchez'
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 hacer de forma explícita con la instrucción BEGIN TRAN y que se verá en capítulos posteriores de este tutorial.
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
UPDATE INNER JOIN
En ocasiones queremos actualizar los datos de una tabla con los datos de otra (muy común para desnormalizar un modelo de datos).
Habitualmente, usamos subconsultas para este propósito, pero Transact SQL permite la utilización 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
A partir de la versión de SQL Server 2005 disponemos de la cláusula OUTPUT para recuperar los valores que hemos insertado. Al igual que en un trigger disponemos de las tablas lógicas INSERTED y DELETED.
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
Las columnas con prefijo DELETED reflejan el valor antes de que se complete la instrucción UPDATE oDELETE. Es decir, son una copia de los datos "antes" del cambio.
DELETED no se puede utilizar con la cláusula OUTPUT en la instrucción 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 = 'Sánchez'
OUTPUT DELETED.* INTO @FILAS_ACTUALIZADAS
WHERE CO_CLIENTE IN (10, 11, 12)
SELECT * FROM @FILAS_ACTUALIZADAS
Las columnas con prefijo INSERTED reflejan el valor después de que se complete la instrucción UPDATE o INSERT, pero antes de que se ejecuten los desencadenadores. Es decir, son una copia de los datos "después" del cambio.
INSERTED no se puede utilizar con la cláusula OUTPUT en la instrucción DELETE.
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
DECLARE @FILAS_ACTUALIZADAS TABLE
( CO_CLIENTE int ,
NOMBRE varchar(100),
APELLIDO1 varchar(100),
APELLIDO2 varchar(100)
)
UPDATE CLIENTES
SET
NOMBRE = 'Devjoker',
APELLIDO1 = 'Herrarte',
APELLIDO2 = 'Sánchez'
OUTPUT INSERTED.* INTO @FILAS_ACTUALIZADAS
WHERE CO_CLIENTE IN (10, 11, 12)
SELECT * FROM @FILAS_ACTUALIZADAS
EJEMPLOS
UNION
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
INTERSECT
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
EXCEPT
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
SELECT FROM
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
SELECT - RTRIM – ORDER BY
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
SELECT- CASE –WHEN - THEN
MAXIMILIANO SALAZAR 3RO TELEMÁTICA
DELETE FROM WHERE
Top Related