21
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.

Tarea SQL Server 2005

Embed Size (px)

DESCRIPTION

trabajo de sql

Citation preview

Page 1: Tarea SQL Server 2005

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

Page 2: Tarea SQL Server 2005

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

Page 3: Tarea SQL Server 2005

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

Page 4: Tarea SQL Server 2005

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

Page 5: Tarea SQL Server 2005

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

Page 6: Tarea SQL Server 2005

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:

Page 7: Tarea SQL Server 2005

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:

Page 8: Tarea SQL Server 2005

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.

Page 9: Tarea SQL Server 2005

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.

Page 10: Tarea SQL Server 2005

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.

Page 11: Tarea SQL Server 2005

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

Page 12: Tarea SQL Server 2005

MAXIMILIANO SALAZAR 3RO TELEMÁTICA

INTERSECT

Page 13: Tarea SQL Server 2005

MAXIMILIANO SALAZAR 3RO TELEMÁTICA

EXCEPT

Page 14: Tarea SQL Server 2005

MAXIMILIANO SALAZAR 3RO TELEMÁTICA

SELECT FROM

Page 15: Tarea SQL Server 2005

MAXIMILIANO SALAZAR 3RO TELEMÁTICA

Page 16: Tarea SQL Server 2005

MAXIMILIANO SALAZAR 3RO TELEMÁTICA

Page 17: Tarea SQL Server 2005

MAXIMILIANO SALAZAR 3RO TELEMÁTICA

SELECT - RTRIM – ORDER BY

Page 18: Tarea SQL Server 2005

MAXIMILIANO SALAZAR 3RO TELEMÁTICA

SELECT- CASE –WHEN - THEN

Page 19: Tarea SQL Server 2005

MAXIMILIANO SALAZAR 3RO TELEMÁTICA

DELETE FROM WHERE