Base de Datos Avanzado I
Base de Datos Avanzado I
Base de Datos Avanzado I
server_name.[database_name].[schema_name].object_name
database_name.[schema_name].object_name
schema_name.object_name
object_name
server_name: Especifica un nombre de servidor vinculado o un nombre de servidor
remoto.
database_name: Especifica el nombre de una base de datos de SQL Server si el
objeto reside en una instancia local de SQL Server. Cuando el objeto est en un
servidor vinculado, database_name especifica un catlogo de OLE DB.
schema_name: Especifica el nombre del esquema que contiene el objeto si dicho
objeto se encuentra en una base de datos de SQL Server. Si el objeto se encuentra en
un servidor vinculado, schema_name especifica un nombre de esquema OLE DB.
object_name: Cuando se hace referencia a un objeto especfico, no siempre hay que
especificar el servidor, la base de datos y el esquema del SQL Server Database
Engine (Motor de base de datos de SQL Server) para identificar el objeto. No obstante,
si no se encuentra el objeto, se muestra un error.
1.1.3 Manejo de Esquemas
Todos los objetos dentro de una base de datos, se crean dentro de un esquema. Los
esquemas permiten agrupar objetos y ofrecer seguridad.
La definicin de un esquema es simple, slo se necesita identificar el comienzo de la
definicin con la instruccin CREATE SCHEMA y una clusula adicional
AUTHORIZATION y a continuacin definir cada dominio, tabla, vista y dems en el
esquema. Para crear los esquemas que se implementarn en la base de datos
Negocios2011 autorizado por el propietario dbo:
USE NEGOCI OS2011
GO
BASE DE DATOS AVANZADO I I 17
CIBERTEC CARRERAS PROFESIONALES
- - CREAR LOS ESQUEMAS DE LA BASE DE DATOS
CREATE SCHEMA VENTA AUTHORI ZATI ON DBO
GO
CREATE SCHEMA COMPRA AUTHORI ZATI ON DBO
GO
CREATE SCHEMA RRHH AUTHORI ZATI ON DBO
GO
Para listar los esquemas creados por el
propietario de la base de datos (el
database owner - dbo) se invoca a la
tabla sys.schemas, tal como se
muestra:
1.2 LENGUAJE DE MANIPULACION DE DATOS
1.2.1. Operadores
Un operador es un smbolo que especifica una accin que se realiza en una o ms
expresiones. A continuacin, detallamos las categoras de operadores que utilizan
SQL Server.
1.2.1.1. Operadores aritmticos
Son aquellos que realizan operaciones matemticas entre dos expresiones numricas.
18
CARRERAS PROFESIONALES CIBERTEC
Operador Significado
+(sumar) Suma
- (restar) Resta
* (multiplicar) Multiplicacin
/ (dividir) Divisin
% (Mdulo) Devuelve el resto entero de una divisin. Por ejemplo, 12 % 5 =2
porque el resto de 12 dividido entre 5 es 2.
Los operadores de suma (+) y resta (-) son utilizados para realizar operaciones
aritmticas sobre valores datetime y smalldatetime.
1.2.1.2. Operadores de Asignacin
El operador (=) es slo el operador de asignacin del SQL Server. En el siguiente
ejemplo, definimos la variable @num, asigne un valor a dicha variable.
El operador de asignacin se utiliza para establecer encabezados de una columna. En
el siguiente ejemplo, mostrar los encabezados de las columnas a la tabla Distritos.
1.2.1.3. Operadores de comparacin
Los operadores de comparacin permiten comprobar dos expresiones retornando un
valor verdadero o falso, es decir, un dato Boolean. Se pueden utilizar en todas las
expresiones excepto en las de los tipos de datos text, ntext o image. En la siguiente
tabla, se presentan los operadores de comparacin Transact-SQL.
Operador de Comparacin Significado
= Igual a
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
DECLARE @NUM I NT
SET @NUM=15
PRI NT ' EL NUMERO I NGRESADO ES: ' + STR( @NUM)
BASE DE DATOS AVANZADO I I 19
CIBERTEC CARRERAS PROFESIONALES
<> No es igual a
!= No es igual a (no es del estndar ISO)
!< No es menor que (no es del estndar ISO)
!> No es mayor que (no es del estndar ISO)
1.2.1.4. Operadores lgicos
Los operadores lgicos comprueban la veracidad de alguna condicin. stos, como los
operadores de comparacin, devuelven el tipo de datos Boolean con el valor TRUE,
FALSE o UNKNOWN.
Operador Significado
ALL TRUE si el conjunto completo de comparaciones es TRUE.
AND TRUE si ambas expresiones booleanas son TRUE.
ANY TRUE si cualquier miembro del conjunto de comparaciones es TRUE.
BETWEEN TRUE si el operando est dentro de un intervalo.
EXISTS TRUE si una subconsulta contiene cualquiera de las filas.
IN TRUE si el operando es igual a uno de la lista de expresiones.
LIKE TRUE si el operando coincide con un patrn.
NOT Invierte el valor de cualquier otro operador booleano.
OR TRUE si cualquiera de las dos expresiones booleanas es TRUE.
SOME TRUE si alguna de las comparaciones de un conjunto es TRUE.
1.2.1.5. Operador BETWEEN
Especifica un intervalo que se va a evaluar, retorna un valor boolean; retorna TRUE si
el valor de la expresin a evaluar es mayor o igual que el valor de inicio expresin y
menor o igual que el valor de fin expresin.
NOT BETWEEN devuelve TRUE si el valor de expresin a evaluar es menor que el
valor de inicio expresin y mayor que el valor de fin expresin.
Sintaxis:
20
CARRERAS PROFESIONALES CIBERTEC
EXPRESI N_A_EVALUAR [ NOT] BETWEEN I NI CI O_EXPRESI N AND
FI N_EXPRESI N
Ejemplo: Mostrar todos los productos donde el valor del precioUnidad se encuentre
entre 27 a 30
USE NEGOCI OS2011
GO
SELECT P. NOMPRODUCTO ' PRODUCTO' ,
C. NOMCATEGORI A ' CATEGORI A'
FROM COMPRA. PRODUCTOS P
J OI N COMPRA. CATEGORI AS C ON P. I DCATEGORI A = C. I DCATEGORI A
WHERE P. PRECI OUNI DAD BETWEEN 27 AND 30
ORDER BY P. NOMPRODUCTO
GO
1.2.1.6. Operador LIKE
Determina si una cadena de caracteres especfica coincide con un patrn
determinado. Un patrn puede contener caracteres normales y caracteres comodn.
Durante la operacin de bsqueda de coincidencias de patrn, los caracteres
normales deben coincidir exactamente con los caracteres especificados en la cadena
de caracteres. Sin embargo, los caracteres comodn pueden coincidir con fragmentos
arbitrarios de la cadena. La utilizacin de caracteres comodn hace que el operador
LIKE sea ms flexible que los operadores de comparacin de cadenas =y !=.
Sintaxis
MATCH_EXPRESSI ON [ NOT] LI KE PATTERN [ ESCAPE ESCAPE_CHARACTER]
Argumentos:
match_expression: Es cualquier expresin vlida de tipo de datos de caracteres.
Pattern: Es la cadena de caracteres especfica que se busca en match_expression;
puede incluir los siguientes caracteres comodn vlidos. pattern puede tener 8.000
bytes como mximo.
BASE DE DATOS AVANZADO I I 21
CIBERTEC CARRERAS PROFESIONALES
Carcter
comodn
Descripcin Ejemplo
% Cualquier cadena de
cero o ms caracteres.
WHERE title LIKE '%computer%' busca todos los ttulos de
libros que contengan la palabra 'computer' en el ttulo.
_ (carcter de
subrayado)
Cualquier carcter. WHERE au_fname LIKE _ean busca todos los nombres de
cuatro letras que terminen en ean (Dean, Sean, etc.)
[ ] Cualquier carcter del
intervalo ([a-f]) o conjunto
([abcdef]) que se ha
especificado.
WHERE au_lname LIKE [C-P]arsen busca apellidos de
autores que terminen en arsen y empiecen por cualquier
carcter individual entre C y P, como Carsen, Larsen,
Karsen, etc.
[^] Cualquier carcter que
no se encuentre en el
intervalo ([^a-f]) o
conjunto ([^abcdef]) que
se ha especificado.
WHERE au_lname LIKE de[^l]% busca todos los apellidos
de autores que empiecen por de y en los que la siguiente
letra no sea l.
escape_character: Es un carcter que se coloca delante de un carcter comodn para
indicar que el comodn no debe interpretarse como un comodn, sino como un carcter
normal. escape_character es una expresin de caracteres que no tiene ningn valor
predeterminado y se debe evaluar como un nico carcter.
Ejercicio:
USE NEGOCI OS2011
GO
- - RETORNA LOS REGI STROS DE EMPLEADOS DONDE SU APELLI DO TERMI NE
EN KI NG
SELECT * FROM RRHH. EMPLEADOS
WHERE APEEMPLEADO LI KE ' %KI NG'
GO
- - RETORNA LOS REGI STROS DE EMPLEADOS DONDE SU APELLI DO I NI CI E
CON KI NG
SELECT * FROM RRHH. EMPLEADOS
WHERE APEEMPLEADO LI KE ' KI NG%'
GO
22
CARRERAS PROFESIONALES CIBERTEC
- - RETORNA LOS REGI STROS DE EMPLEADOS DONDE SU APELLI DO
CONTENGA LA EXPRESI ON KI NG
SELECT * FROM RRHH. EMPLEADOS
WHERE APEEMPLEADO LI KE ' %KI NG%'
GO
1.2.2. Funciones para el manejo de datos
1.2.2.1. Funciones para el manejo de fechas
Funcin Descripcin
DATEADD Devuelve un valor date con el intervalo number especificado,
agregado a un valor datepart especificado de ese valor date.
DATEADD (datepart , number , date )
DECLARE @FECHA DATE = ' 1- 8- 2011'
SELECT ' YEAR' ' PERI ODO ' , DATEADD( YEAR, 1, @FECHA) ' NUEVA
FECHA'
UNI ON ALL
SELECT ' QUARTER' , DATEADD( QUARTER, 1, @FECHA)
UNI ON ALL
SELECT ' MONTH' , DATEADD( MONTH, 1, @FECHA)
UNI ON ALL
SELECT ' DAY' , DATEADD( DAY, 1, @FECHA)
UNI ON ALL
SELECT ' WEEK' , DATEADD( WEEK, 1, @FECHA)
GO
DATEDIFF Devuelve el nmero de lmites datepart de fecha y hora entre dos
fechas especificadas.
DATEDIFF ( datepart , startdate , enddate )
SET DATEFORMAT DMY
DECLARE @FECHAI NI CI AL DATE = ' 01- 08- 2011' ;
DECLARE @FECHAFI NAL DATE = ' 01- 09- 2011' ;
SELECT DATEDI FF( DAY, @FECHAI NI CI AL, @FECHAFI NAL) AS
' DURACI ON'
BASE DE DATOS AVANZADO I I 23
CIBERTEC CARRERAS PROFESIONALES
DATENAME Devuelve una cadena de caracteres que representa el datepart
especificado de la fecha especificada.
DATENAME ( datepart , date )
SELECT DATENAME( MONTH, GETDATE( ) ) AS ' MES' ;
DATEPART Devuelve un entero que representa el datepart especificado del
date especificado.
DATEPART ( datepart , date )
SELECT DATEPART( MONTH, GETDATE( ) ) AS ' MES' ;
DAY Devuelve un entero que representa la parte del da datepart de la
fecha especificada.
SELECT DAY( ' 01/ 9/ 2011' ) AS ' D A DEL MES' ;
GETDATE Devuelve la fecha del sistema
SELECT GETDATE( ) ' FECHA DEL SI STEMA' ;
MONTH Devuelve un entero que representa el mes de date especificado.
MONTH devuelve el mismo valor que DATEPART (month, date).
SELECT MONTH( GETDATE( ) ) AS ' MES DE LA FECHA DE
SI STEMA' ;
YEAR Devuelve un entero que representa el ao de date especificado.
YEAR devuelve el mismo valor que DATEPART (year, date).
SELECT YEAR( GETDATE( ) ) AS ' AO DE LA FECHA DE SI STEMA' ;
1.2.2.2. Funciones para el manejo de cadenas
Funcin Descripcin
LEFT Devuelve la parte izquierda de una cadena de caracteres con el
nmero de caracteres especificado.
LEFT ( character_expression , integer_expression )
24
CARRERAS PROFESIONALES CIBERTEC
LEN Devuelve el nmero de caracteres de la expresin de cadena
especificad, excluidos los espacios en blanco finales.
LEN ( string_expression )
LOWER Devuelve una expresin de caracteres despus de convertir en
minsculas los datos de caracteres en maysculas.
LOWER ( character_expression )
LTRIM Devuelve una expresin de caracteres tras quitar todos los espacios
iniciales en blanco.
LTRIM ( character_expression )
RTRIM Devuelve una cadena de caracteres despus de truncar todos los
espacios en blanco finales.
RTRIM ( character_expression )
SUBSTRING Devuelve parte de una expresin de caracteres, binaria, de texto o
de imagen. Para obtener ms informacin acerca de los tipos de
datos vlidos de SQL Server que se pueden usar con esta funcin.
SUBSTRING (value_expression, start_expression,
length_expression)
UPPER Devuelve una expresin de caracteres con datos de caracteres en
minsculas convertidos a maysculas.
UPPER ( character_expression )
Ejercicio
- - MANEJ O DE CADENAS: RETORNA LA EXPRESI ON BASE CONVERTI DA EN
MAYSCULAS
DECLARE @CADENA VARCHAR( 30)
SELECT @CADENA = ' BASE DE DATOS AVANZADO ' ;
SELECT LEFT( UPPER( LTRI M( @CADENA) ) , 4) AS ' CADENA RESULTANTE'
GO
BASE DE DATOS AVANZADO I I 25
CIBERTEC CARRERAS PROFESIONALES
1.2.2.3. Funciones de conversin
Convierte una expresin de un tipo de datos en otro tipo de dato definido en SQL
Server 2008.
Funcin Descripcin
CAST Convierte una expresin a un tipo de datos
CAST ( expr esi n AS t i po_dat o[ ( l ongi t ud) ] )
CONVERT Convierte una expresin a un tipo de datos indicando un estilo.
CONVERT ( t i po_dat o [ ( l ongi t ud) ] , expr esi n [ , est i l o] )
Ejemplo
USE NEGOCI OS2011
GO
SELECT DI STI NCT CAST( P. NOMPRODUCTO AS CHAR( 15) ) AS NOMBRE,
CONVERT( DECI MAL( 10, 2) , P. PRECI OUNI DAD) AS ' PRECI O UNI TARI O'
FROM COMPRA. PRODUCTOS
WHERE P. NOMPRODUCTO LI KE ' PAN%' ;
GO
1.2.3. Comandos de LMD (Lenguaje de Manipulacin de Datos)
1.2.3.1. Insertar registros: INSERT
Agrega una o varias filas nuevas a una tabla o una vista en SQL Server 2008.
26
CARRERAS PROFESIONALES CIBERTEC
Sintaxis:
I NSERT
{ [ TOP ( expr esi n) [ PERCENT ] ] [ I NTO ] { <OBJ ETO> }
{
{ VALUES ( { DEFAULT | NULL | expr essi on } [ , . . . n ] )
[ , . . . n ]
| t abl e_der i vada
| sent enci a_ej ecut ar
| <t abl e_or i gen>
| DEFAULT VALUES
}
}
}
El formato bsico de la sentencia es:
INSERT INTO tabla [(columna1, columna2, columnan)] VALUES (expr1, expr2, exprn)
Tabla es el nombre de la tabla donde se desea ingresar los nuevos datos.
Columna es una lista opcional de nombres de campo en los que se insertarn
valores en el mismo nmero y orden que se especificarn en la clusula VALUES.
Si no se especifica la lista de campos, los valores de expr en la clusula VALUES
deben ser tantos como campos tenga la tabla y en el mismo orden que se
definieron al crear la tabla.
Expr es una lista de expresiones o valores constantes, separados por comas,
para dar valor a los distintos campos del registro que se aadir a la tabla. Las
cadenas de caracteres debern estar encerradas entre apstrofes.
1.2.3.1.1. Insertar un nico registro
A. Especificando todos los campos a ingresar.
Cada sentencia INSERT aade un nico registro a la tabla.
En el ejemplo, se han especificado todos los campos con sus respectivos valores. Si
no se ingresara valores a un campo, este se cargar con el valor DEFAULT o NULL
(siempre y cuando haya sido especificado en la estructura de la tabla). Un valor nulo
NULL- no significa blancos o ceros, sino que el campo nunca ha tenido un valor.
BASE DE DATOS AVANZADO I I 27
CIBERTEC CARRERAS PROFESIONALES
USE NEGOCI OS2011
GO
I NSERT I NTO VENTA. CLI ENTES( I DCLI ENTE, NOMCLI ENTE, DI RCLI ENTE,
I DPAI S, FONOCLI ENTE)
VALUES ( ' DRATR' , ' DARI O TRAGODARA' , ' CALLE LUI S MI RO 123' ,
' 003' , ' 3245566' ) ;
GO
SELECT * FROM VENTA. CLI ENTES
GO
B. Especificando nicamente los valores de los campos.
Si no se especifica la lista de campos, los valores en la clusula VALUES deben ser
tantos como campos tenga la tabla y en el mismo orden que se definieron al crear la
tabla. Si se va a ingresar parcialmente los valores en una tabla, se debe especificar el
nombre de los campos a ingresar, como en el ejemplo A.
USE NEGOCI OS2011
GO
I NSERT I NTO VENTA. CLI ENTES
VALUES ( ' DRAPR' , ' DARI O PRADO' , ' CALLE 32' , ' 001' , ' 3245566' ) ;
GO
SELECT * FROM VENTA. CLI ENTES
GO
1.2.3.1.2. Insertar varias filas de datos
En el siguiente ejemplo, se usa el constructor de valores de tabla para insertar tres
filas en la tabla Venta.Paises en una instruccin INSERT. Dado que los valores para
todas las columnas se suministran e incluyen en el mismo orden que las columnas de
la tabla, no es necesario especificar los nombres de columna en la lista de columnas.
28
CARRERAS PROFESIONALES CIBERTEC
USE NEGOCI OS2011
GO
I NSERT I NTO VENTA. PAI SES
VALUES ( ' 095' , ' NORUEGA' ) , ( ' 096' , ' I SLANDI A' ) , ( ' 097' ,
' GRECI A' ) ;
GO
SELECT * FROM VENTA. PAI SES P
WHERE P. I DPAI S I N ( ' 095' , ' 096' , ' 097' )
GO
A. Insertar Mltiples Registros
Utilizando el comando SELECT, podemos agregar mltiples registros. Veamos un
ejemplo:
USE NEGOCI OS2011
GO
CREATE TABLE RRHH. EMPLEADOS2011(
I DEMPLEADO I NT NOT NULL,
NOMEMPLEADO VARCHAR( 50) NOT NULL,
APEEMPLEADO VARCHAR( 50) NOT NULL,
FONOEMPLEADO VARCHAR( 15) NULL,
DI REMPLEADO VARCHAR( 100) NOT NULL,
I DDI STRI TO I NT NOT NULL
)
GO
I NSERT I NTO RRHH. EMPLEADOS2011
SELECT A. I DEMPLEADO, A. NOMEMPLEADO, A. APEEMPLEADO,
A. FONOEMPLEADO,
A. DI REMPLEADO, A. I DDI STRI TO
FROM RRHH. EMPLEADOS AS A
WHERE YEAR( A. FECCONTRATA) = ' 2011
GO
BASE DE DATOS AVANZADO I I 29
CIBERTEC CARRERAS PROFESIONALES
SELECT * FROM RRHH. EMPLEADOS2011
GO
B. Insertar datos en una variable de tabla
En el siguiente ejemplo, se especifica una variable de tabla como el objeto de destino.
USE NEGOCI OS2011;
GO
- - CREA UNA VARI ABLE TI PO TABLA
DECLARE @PRODUCTO TABLE(
PRODUCTOI D I NT NOT NULL,
PRODUCTONOMBRE VARCHAR( 100) NOT NULL,
PRODUCTOPRE AS DECI MAL,
PRODUCTOCAN I NT) ;
GO
- - I NSERTA VALORES DENTRO DE LA VARI ABLE TI PO TABLA
I NSERT I NTO @PRODUCTO ( PRODUCTOI D, PRODUCTONOMBRE, PRODUCTOPRE,
PRODUCTOCAN)
SELECT I DPRODUCTO, NOMPRODUCTO, PRECI OUNI DAD,
UNI DADESENEXI STENCI A
FROM COMPRA. PRODUCTOS
WHERE PRECI OUNI DAD > 100;
- - VER EL CONJ UNTO DE VALORES DE LA VARI ABLE TI PO TABLA
SELECT * FROM @PRODUCTO;
GO
30
CARRERAS PROFESIONALES CIBERTEC
C. Insertar datos en una tabla con columnas que tienen valores
predeterminados
USE NEGOCI OS2011;
GO
CREATE TABLE DBO. PRUEBA
(
COLUMNA_1 AS ' COLUMNA CALCULADA ' + COLUMNA_2,
COLUMNA_2 VARCHAR( 30) DEFAULT ( ' COLUMNA POR DEFECTO' ) ,
COLUMNA_3 ROWVERSI ON,
COLUMNA_4 VARCHAR( 40) NULL
)
GO
I NSERT I NTO DBO. PRUEBA ( COLUMN_4) VALUES ( ' VALOR' ) ;
I NSERT I NTO DBO. PRUEBA ( COLUMN_2, COLUMN_4) VALUES ( ' VALOR' ,
' VAL' ) ;
I NSERT I NTO DBO. PRUEBA ( COLUMN_2) VALUES ( ' VALOR' ) ;
I NSERT I NTO PRUEBA DEFAULT VALUES;
GO
SELECT COLUMNA_1, COLUMAN_2, COLUMNA_3, COLUMNA_4
FROM DBO. PRUEBA;
GO
1.2.3.2. Actualizacin de datos: UPDATE
La sentencia UPDATE se utiliza para cambiar el contenido de los registros de una o
varias columnas de una tabla de la base de datos. Su formato es:
UPDATE Nombr e_t abl a
SET nombr e_col umna1 = expr 1, nombr e_col umna2 = expr 2, . . .
[ WHERE {condi ci n}]
BASE DE DATOS AVANZADO I I 31
CIBERTEC CARRERAS PROFESIONALES
Nombre_tabla nombre de la tabla donde se cambiar los datos.
Nombre_columna columna cuyo valor se desea cambiar. En una misma
sentencia UPDATE pueden actualizarse varios campos de cada registro.
Expr es el nuevo valor que se desea asignar al campo. La expresin puede ser
un valor constante o una subconsulta. Las cadenas de caracteres debern
estar encerradas entre comillas. Las subconsultas entre parntesis.
La clusula WHERE sigue el mismo formato que la vista en la sentencia SELECT y
determina qu registros se modificarn.
1.2.3.2.1. Actualizar varias columnas
En el siguiente ejemplo, se actualizan los valores de las columnas precioUnidad y
UnidadesEnExistencia para todas las filas de la tabla Productos.
USE NEGOCI OS2011;
GO
UPDATE COMPRA. PRODUCTOS
SET PRECI OUNI DAD = 6000, UNI DADESENEXI STENCI A *= 1. 50
GO
1.2.3.2.2. Limitar las filas que se actualizan usando la clusula WHERE
En el ejemplo siguiente, actualice el valor de la columna precioUnidad de la tabla
Compra.Productos incrementando su valor en un 25% ms, para todas las filas cuyo
nombre del producto inicie con A y su stock o unidadesenExistencia sea mayor a
100.
USE NEGOCI OS2011;
GO
UPDATE COMPRA. PRODUCTOS
SET PRECI OUNI DAD *= 1. 25
WHERE NOMPRODUCTO LI KE ' A%' AND UNI DADESENEXI STENCI A > 100;
GO
32
CARRERAS PROFESIONALES CIBERTEC
1.2.3.2.3. Usar la instruccin UPDATE con informacin de otra tabla
En este ejemplo, se modifica la columna ventaEmp de la tabla SalesEmpleado para
reflejar las ventas registradas en la tabla Pedidos.
USE NEGOCI OS2011;
GO
UPDATE VENTA. SALESEMPLEADO
SET VENTAEMP = VENTAEMP + ( SELECT SUM( PRECI OUNI DAD*CANTI DAD)
FROM VENTA. PEDI DOSCABE PE J OI N VENTA. PEDI DOSDETA AS PD
ON PE. I DPEDI DO= PD. I DPEDI DO)
GO
1.2.3.3. Eliminacin de datos: DELETE
La sentencia DELETE se utiliza para eliminar uno o varios registros de una misma
tabla. En una instruccin DELETE con mltiples tablas, debe incluir el nombre de tabla
(Tabla.*). Si especifica ms de una tabla para eliminar registros, todas deben tener
una relacin de muchos a uno. Si desea eliminar todos los registros de una tabla,
eliminar la propia tabla es ms eficiente que ejecutar una consulta de borrado.
Las operaciones de eliminacin en cascada en una consulta nicamente eliminan
desde varios lados de una relacin. Por ejemplo, en la base de datos
NEGOCIOS2011, la relacin entre las tablas Clientes y PedidosCabe, la tabla
PedidosCabe es la parte de muchos, por lo que las operaciones en cascada slo
afectarn a la tabla PedidosCabe. Una consulta de borrado elimina los registros
completos, no nicamente los datos en campos especficos. Si desea eliminar valores
en un campo especificado, crea una consulta de actualizacin que cambie los valores
a Null.
El formato de la sentencia es:
DELETE FROM Nombr e_Tabl a
[ WHERE { condi ci n }]
BASE DE DATOS AVANZADO I I 33
CIBERTEC CARRERAS PROFESIONALES
Nombre_Tabla es el nombre de la tabla donde se desea borrar los datos.
La clusula WHERE sigue el mismo formato que la vista en la sentencia
SELECT y determina qu registros se borrarn.
1.2.3.3.1. Eliminar registros
En el siguiente ejemplo, elimine los registros de la tabla PedidosCabe. Cada sentencia
DELETE borra los registros que cumplen la condicin impuesta o todos si no se indica
clusula WHERE
USE NEGOCI OS2011;
GO
DELETE FROM VENTA. PEDI DOSCABE
GO
1.2.3.3.2. Eliminar las filas usando la clusula WHERE
En el ejemplo siguiente, elimine los registros de la tabla PedidosDeta de todos aquellos
pedidos cuya antigedad sea mayor a 10 aos.
USE NEGOCI OS2011;
GO
DELETE VENTA. PEDI DOSDETA
FROM VENTA. PEDI DOSCABE PE J OI N VENTA. PEDI DOSDETA PD
ON PE. I DPEDI DO=PD. I DPEDI DO
WHERE DATEDI FF( YY, GETDATE( ) , FECHAPEDI DO) > 10;
GO
34
CARRERAS PROFESIONALES CIBERTEC
1.2.3.4. Seleccin de datos : SELECT
Recupera las filas de la base de datos y habilita la seleccin de una o varias filas o
columnas de una o varias tablas en SQL Server 2008.
La sintaxis completa de la instruccin SELECT es compleja, aunque las clusulas
principales se pueden resumir del modo siguiente:
Sintaxis:
<SELECT st at ement > : : =
[ WI TH <common_t abl e_expr essi on> [ , . . . n] ]
<quer y_expr essi on>
[ ORDER BY { or der _by_expr essi on | col umn_posi t i on [ ASC |
DESC ] }
[ , . . . n ] ]
[ COMPUTE
{ { AVG | COUNT | MAX | MI N | SUM } ( expr essi on ) } [ , . . . n ]
[ BY expr essi on [ , . . . n ] ]
]
[ <FOR Cl ause>]
[ OPTI ON ( <quer y_hi nt > [ , . . . n ] ) ]
<quer y_expr essi on> : : =
{ <quer y_speci f i cat i on> | ( <quer y_expr essi on> ) }
[ { UNI ON [ ALL ] | EXCEPT | I NTERSECT }
<quer y_speci f i cat i on> | ( <quer y_expr essi on> ) [ . . . n ] ]
<quer y_speci f i cat i on> : : =
SELECT [ ALL | DI STI NCT ]
[ TOP ( expr essi on) [ PERCENT] [ WI TH TI ES ] ]
< sel ect _l i st >
[ I NTO new_t abl e ]
[ FROM { <t abl e_sour ce> } [ , . . . n ] ]
[ WHERE <sear ch_condi t i on> ]
[ <GROUP BY> ]
[ HAVI NG < sear ch_condi t i on > ]
Para nuestro curso usaremos la siguiente sintaxis:
SELECT [ ALL| DI STI NCT] [ TOP ( expr esi n) [ PERCENT] [ WI TH TI ES] ]
< l i st a de sel ecci n >
[ I NTO nombr e de l a nueva t abl a]
FROM <nombr e de t abl a>
WHERE <condi ci n>
GROUP BY <nombr e de campos>
HAVI NG <condi ci n> [ AND | OR <condi ci n>]
ORDER BY
BASE DE DATOS AVANZADO I I 35
CIBERTEC CARRERAS PROFESIONALES
1.2.3.4.1. Orden de procesamiento lgico de la instruccin SELECT
Los pasos siguientes muestran el orden de procesamiento lgico, u orden de enlace,
para una instruccin SELECT. Este orden determina el momento en que los objetos
definidos en un paso estn disponibles para las clusulas de los pasos subsiguientes.
Por ejemplo, si el procesador de consultas se puede enlazar (obtener acceso) a las
tablas o vistas definidas en la clusula FROM, estos objetos y sus columnas quedan
disponibles para todos los pasos subsiguientes. A la inversa, dado que la clusula
SELECT es el paso 8, las clusulas precedentes no pueden hacer referencia a los
alias de columna o las columnas derivadas definidos en esa clusula. Sin embargo, las
clusulas subsiguientes, como la clusula ORDER BY, s pueden hacer referencia a
ellos. Observe que la ejecucin fsica real de la instruccin est determinada por el
procesador de consultas y el orden de esta lista puede variar.
1. FROM
2. ON
3. J OIN
4. WHERE
5. GROUP BY
6. WITH CUBE o WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
Ejemplo: Recupera las filas de la tabla Productos cuyo precioUnidad sea mayor a 50
USE NEGOCI OS2011;
GO
BEGI N
DECLARE @MYPRODUCTO I NT
SET @MYPRODUCTO = 750
- - EVALUAR SI LA VARI ABLE @MYPRODUCTO ES DI FERENTE DE 0
I F ( @MYPRODUCTO <> 0)
36
CARRERAS PROFESIONALES CIBERTEC
SELECT I DPRODUCTO ' CODI GO' ,
NOMPRODUCTO ' PRODUCTO' ,
PRECI OUNI DAD ' PRECI O'
FROM COMPRA. PRODUCTOS
WHERE I DPRODUCTO = @MYPRODUCTO;
END
GO
1.2.3.4.2. Crear una tabla a partir de una consulta
Utilice la siguiente sintaxis para la creacin de una tabla con datos a partir de una
consulta:
SELECT <CAMPOS> I NTO TABLA
FROM TABLA_EXI STENTE
WHERE <CONDI CI ON>
Por ejemplo: Recuperar los registros de empleados cuyo cargo sea Supervisor de
Ventas y almacenarlos en la tabla EmpleadosBAK
USE NEGOCI OS2011
GO
SELECT I DEMPLEADO,
APEEMPLEADO,
NOMEMPLEADO
I NTO DBO. EMPLEADOBAK
FROM RRHH. EMPLEADOS
WHERE I DCARGO = ( SELECT C. I DCARGO
FROM RRHH. CARGOS C
WHERE DESCARGO = ' SUPERVI SOR DE VENTAS' )
GO
SELECT * FROM DBO. EMPLEADOBAK
GO
BASE DE DATOS AVANZADO I I 37
CIBERTEC CARRERAS PROFESIONALES
1.2.4. INSTRUCCION MERGE
La instruccin MERGE, nos permite realizar mltiples acciones sobre una tabla
tomando uno o varios criterios de comparacin; es decir, 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.
La instruccin MERGE nos sirve bsicamente para dos cosas:
1 Sincronizar los datos de 2 tablas. Supongamos que tenemos 2 bases distintas
(Produccin y Desarrollo por ejemplo) y queremos sincronizar los datos de una
tabla para que queden exactamente iguales. Lo que antes hubiese implicado
algunas sentencias mezcladas con INNER J OIN y NOT EXISTS, ahora es
posible resumirlo en una operacin atmica mucho ms sencilla y eficiente.
2 La otra razn por la cual podramos usar MERGE, es cuando tenemos nuevos
datos que queremos almacenar en una tabla y no sabemos si la primary key de
la tabla ya existe o no, por lo tanto, no sabemos si hacer un UPDATE o un
INSERT en la tabla.
Sintaxis:
MERGE [ I NTO] <t ar get t abl e>
USI NG <sour ce t abl e>
ON <j oi n/ mer ge pr edi cat e>
WHEN [ TARGET] NOT MATCHED <st at ement t o r unt >
Donde:
<target table>: Es la tabla de destino de las operaciones de insercin, actualizacin o
eliminacin que las clusulas WHEN de la instruccin MERGE especifican.
<source table>: Especifica el origen de datos que se hace coincidir con las filas de
datos en target_table. El resultado de esta coincidencia dicta las acciones que tomarn
las clusulas WHEN de la instruccin MERGE.
38
CARRERAS PROFESIONALES CIBERTEC
<join/merge predicate>: Especifica las condiciones en las que table_source se
combina con target_table para determinar dnde coinciden.
<statement to run when match found in target>: Especifica que todas las filas de
target_table que coinciden con las filas que devuelve <table_source> ON
<merge_search_condition>y que satisfacen alguna condicin de bsqueda adicional
se actualizan o eliminan segn la clusula <merge_matched>.
La instruccin MERGE puede tener a lo sumo dos clusulas WHEN MATCHED. Si se
especifican dos clusulas, la primera debe ir acompaada de una clusula AND
<search_condition>. Si hay dos clusulas WHEN MATCHED, una debe especificar
una accin UPDATE y la otra una accin DELETE. Puede actualizar la misma fila ms
de una vez, ni actualizar o eliminar la misma fila.
Ejemplo: Usar MERGE para realizar operaciones INSERT y UPDATE en una tabla
en una sola instruccin. Implemente un escenario para actualizar o insertar un
registro a la tabla pases: Si existe el cdigo del pas, actualice su nombre; sino inserte
el registro a la tabla
USE NEGOCI OS2011
GO
DECLARE @PAI S VARCHAR( 50) , @I D CHAR( 3)
SET @PAI S=' NI GERI A'
SET @I D=' 99'
MERGE VENTAS. PAI SES AS TARGET
USI NG ( SELECT @I D, @PAI S)
AS SOURCE ( I DPAI S, NOMBREPAI S)
ON ( TARGET. I DPAI S = SOURCE. I DPAI S)
WHEN MATCHED THEN
UPDATE SET NOMBREPAI S = SOURCE. NOMBREPAI S
WHEN NOT MATCHED THEN
I NSERT VALUES( SOURCE. I DPAI S, SOURCE. NOMBREPAI S) ;
GO
BASE DE DATOS AVANZADO I I 39
CIBERTEC CARRERAS PROFESIONALES
Ejemplo: Usar MERGE para realizar operaciones DELETE y UPDATE en una tabla
en una sola instruccin. Implemente un escenario para actualizar o eliminar un
registro a la tabla productos: Si existe el cdigo del producto y las
unidadesEnExistencia es menor o igual a cero, elimine el registro; sino actualice el
nombre del producto
USE NEGOCI OS2011
GO
DECLARE @PRODUCTO VARCHAR( 50) , @I D I NT
SET @PRODUCTO = ' VI NO'
SET @I D = 22
MERGE COMPRAS. PRODUCTOS AS TARGET
USI NG ( SELECT @I D, @PRODUCTO)
AS SOURCE ( I DPRODUCTO, NOMPRODUCTO)
ON ( TARGET. I DPRODUCTO = SOURCE. I DPRODUCTO)
WHEN MATCHED AND TARGET. UNI DADESENEXI STENCI A<=0 THEN
DELETE
WHEN MATCHED THEN
UPDATE SET NOMPRODUCTO = SOURCE. NOMPRODUCTO;
GO
Ejemplo: Usar MERGE para realizar operaciones INSERT, DELETE y UPDATE en
una tabla en una sola instruccin. Implemente un escenario para insertar, actualizar
o eliminar un registro a la tabla clientesBAK: Si existe el cdigo del cliente, si el
nombre del cliente y su direccin no coincide, actualice sus datos; sino existe el cdigo
Inserte el registro; y si no coincide en el origen elimine el Registro
USE NEGOCI OS2011
GO
MERGE VENTAS. CLI ENTESBAK AS TARGET
USI NG VENTAS. CLI ENTES AS SOURCE
ON ( TARGET. I DCLI ENTE = SOURCE. I DCLI ENTE)
WHEN MATCHED AND TARGET. NOMBRECLI ENTE <> SOURCE . NOMBRECLI ENTE THEN
UPDATE SET TARGET. NOMBRECLI ENTE = SOURCE . NOMBRECLI ENTE,
40
CARRERAS PROFESIONALES CIBERTEC
TARGET. DI RCLI ENTE = SOURCE . DI RCLI ENTE
WHEN NOT MATCHED THEN
I NSERT VALUE( SOURCE. NOMBRECLI ENTE, SOURCE . DI RCLI ENTE)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
GO
1.3. RECUPERACIN AVANZADA DE CONSULTA DE DATOS
Conocidos los fundamentos bsicos del comando SELECT, y est familiarizado con
varias de sus clusulas, a continuacin vamos a aprender tcnicas de consultas ms
avanzadas. Una de estas tcnicas es la de combinar el contenidos de una o ms
tablas para producir un conjunto de resultados que incorpore filas y columnas de cada
tabla. Otra tcnica es la de agrupar los datos para obtener, desde un conjunto de filas,
datos agrupados. Se pueden usar los elementos de Transact-SQL tales con CUBE y
ROLLUP para resumir datos.
1.3.1. COMBINACION DE TABLAS: JOIN
La sentencia J OIN en el lenguaje de consulta, permite combinar registros de dos o ms
tablas en una base de datos relacional. La sentencia J OIN se pueden especificar en las
clusulas FROM o WHERE, aunque se recomienda que se especifiquen en la clusula
FROM.
Las combinaciones se pueden clasificar en:
1.3.1.1. COMBINACION INTERNA.
Con esta operacin, se calcula el producto cruzado de los registros de dos tablas, pero solo
permanecen aquellos registros en la tabla combinada que satisfacen las condiciones que
se especifican. La clusula INNER JOIN permite la combinacin de los registros de las
tablas, comparando los valores de la columna especfica en ambas tablas. Cuando no
existe esta correspondencia, el registro no se muestra
Esta consulta de Transact SQL es un ejemplo de una combinacin interna:
BASE DE DATOS AVANZADO I I 41
CIBERTEC CARRERAS PROFESIONALES
USE NEGOCI OS2011
GO
SELECT C. I DCLI ENTE, C. NOMCLI ENTE, C. DI RCLI ENTE, P. NOMBREPAI S
FROM VENTAS. CLI ENTES C I NNER J OI N VENTAS. PAI SES P
ON C. I DPAI S = P. I DPAI S
GO
Esta combinacin interna se conoce como una combinacin equivalente. Devuelve todas
las columnas de ambas tablas y slo devuelve las filas en las que haya un valor igual en la
columna de la combinacin. Es equivalente a la siguiente consulta:
USE NEGOCI OS2011
GO
SELECT C. I DCLI ENTE, C. NOMCLI ENTE, C. DI RCLI ENTE, P. NOMBREPAI S
FROM VENTAS. CLI ENTES C, VENTAS. PAI SES P
WHERE C. I DPAI S = P. I DPAI S
GO
1.3.1.2. COMBINACIONES EXTERNAS
Mediante esta operacin no se requiere que cada registro en las tablas a tratar tenga un
registro equivalente en la otra tabla. El registro es mantenido en la tabla combinada si no
existe otro registro que le corresponda. Este tipo de operacin se subdivide dependiendo
de la tabla a la cual se le admitirn los registros que no tienen correspondencia, ya sean de
tabla izquierda, de tabla derecha o combinacin completa.
SQL Server 2008 utiliza las siguientes palabras clave para las combinaciones externas
especificadas en una clusula FROM:
LEFT OUTER JOIN o LEFT JOIN
RIGHT OUTER JOIN o RIGHT JOIN
FULL OUTER JOIN o FULL JOIN
42
CARRERAS PROFESIONALES CIBERTEC
A. LEFT JOIN o LEFT OUTER JOIN
La sentencia LEFT J OIN retorna la pareja de todos los valores de la izquierda con los
valores de la tabla de la derecha correspondientes, o retorna un valor nulo NULL en caso
de no correspondencia.
El operador de combinacin LEFT JOIN, indica que todas las filas de la primera tabla se
deben incluir en los resultados, con independencia si hay datos coincidentes en la segunda
tabla.
Ejemplo: Mostrar los registros de los clientes que han solicitado pedidos y aquellos clientes
que aun no han registrado pedidos
USE NEGOCI OS2011
GO
SELECT C. *, P. I DPEDI DO
FROM VENTAS. CLI ENTES C I NNER J OI N VENTAS. PEDI DOSCABE P
ON C. I DCLI ENTE = P. I DCLI ENTE
GO
B. RIGHT JOIN o RIGHT OUTER JOIN
Una combinacin externa derecha es el inverso de una combinacin externa izquierda. Se
devuelven todas las filas de la tabla de la derecha. Cada vez que una fila de la tabla de la
derecha no tenga correspondencia en la tabla de la izquierda, se devuelven valores NULL
para la tabla de la izquierda.
El operador de combinacin RIGHT JOIN, indica que todas las filas de la segunda tabla se
deben incluir en los resultados, con independencia si hay datos coincidentes en la primera
tabla.
Ejemplo: Mostrar los pedidos registrados por los productos, incluya los productos que
aun no se ha registrado en algn pedido.
USE NEGOCI OS2011
GO
BASE DE DATOS AVANZADO I I 43
CIBERTEC CARRERAS PROFESIONALES
SELECT PD. *, PO. NOMPRODUCTO
FROM COMPRAS. PRODUCTOS PO RI GHT J OI N VENTAS. PEDI DOSDETA PD
ON PD. I DPRODUCTO = PO. I DPRODUCTO
GO
C. FULL JOIN o FULL OUTER JOIN
Una combinacin externa completa devuelve todas las filas de las tablas de la izquierda y
la derecha. Cada vez que una fila no tenga coincidencia en la otra tabla, las columnas de la
lista de seleccin de la otra tabla contendrn valores NULL. Cuando haya una coincidencia
entre las tablas, la fila completa del conjunto de resultados contendr los valores de datos
de las tablas base.
Para retener la informacin que no coincida al incluir las filas no coincidentes en los
resultados de una combinacin, utilice una combinacin externa completa. SQL Server
2008 proporciona el operador de combinacin externa completa, FULL JOIN, que incluye
todas las filas de ambas tablas, con independencia de que la otra tabla tenga o no un valor
coincidente. En forma prctica, podemos decir que FULL JOIN es una combinacin de
LEFT JOIN y RIGHT JOIN.
Ejemplo: Mostrar los pedidos registrados por los productos, incluya los productos que
aun no se ha registrado en algn pedido.
USE NEGOCI OS2011
GO
SELECT PD. *, PO. NOMPRODUCTO
FROM VENTAS. PEDI DOSDETA PD FULL J OI N COMPRAS. PRODUCTOS PO
ON PD. I DPRODUCTO = PO. I DPRODUCTO
GO
D. COMBINACION CRUZADA
Las combinaciones cruzadas presentan el producto cartesiano de todos los registros de las
dos tablas. Se emplea el CROSS J OIN cuando se quiere combinar todos los registros de
una tabla con cada registro de otra tabla.
44
CARRERAS PROFESIONALES CIBERTEC
Por ejemplo, elaborar una lista de los productos donde asigne a cada producto todos los
posibles proveedores registrados en la base de datos. Aplique combinacin cruzada:
USE NEGOCI OS2011
GO
SELECT P. I DPRODUCTO, P. NOMPRODUCTO, PR. NOMPROVEEDOR
FROM COMPRAS. PRODUCTOS P CROSS J OI N COMPRAS. PROVEEDORES PR
GO
1.3.2. Datos Agrupados
Los resultados de consultas se pueden resumir, agrupar y ordenar utilizando funciones
agregadas y las clusulas GROUP BY, HAVING y ORDER BY con la instruccin
SELECT. Tambin, se puede usar la clusula compute (una extensin Transact-SQL)
con funciones agregadas para generar un informe con filas detalladas y resumidas.
1.3.2.1. Funciones Agregadas
Las funciones agregadas calculan valores sumarios a partir de datos de una columna
concreta. Las funciones agregadas se pueden aplicar a todas las filas de una tabla, a
un subconjunto de la tabla especificada por una clusula WHERE o a uno o ms
grupos de filas de la tabla. De cada conjunto de filas al que se aplica una funcin
agregada se genera un solo valor.
A continuacin detallamos la sintaxis y resultados de las funciones agregadas:
Funcin Agregada Resultado
Sum( [ al l | di st i nct ]
expr esi n)
Retorna la suma total de los valores (distintos)
de la expresin o columna
Avg ( [ al l | di st i nct ]
expr esi n)
Retorna el promedio de los valores (distintos) de
la expresin o columna
Count ( [ al l | di st i nct ]
expr esi n)
Retorna el nmero de valores (distintos) no
nulos de la expresin
Count ( *) Numero de filas seleccionadas
Max( expr esi n)
Retorna el mximo valor de la expresin o
columna
BASE DE DATOS AVANZADO I I 45
CIBERTEC CARRERAS PROFESIONALES
Mi n( expr esi n)
Retorna el mnimo valor de la expresin o
columna
Las funciones SUM y AVG slo pueden utilizarse con columnas numricas: int ,
smallint , tinyint, decimal, numeric, float y Money. Las funciones MIN y MAX no pueden
usarse con tipos de datos bit .
Las funciones agregadas distintas de COUNT(*) no pueden utilizarse con los tipos de
datos text e image
1.3.2.1.1. Uso de la funcin COUNT(*)
La funcin COUNT(*) no requiere ninguna expresin como argumento, porque no
emplea informacin sobre alguna columna. Esta funcin se utiliza para hallar el
nmero total de filas de una tabla.
Ejemplo: Mostrar la cantidad de pedidos registrados en el ao 2011
USE NEGOCI OS2011
GO
SELECT COUNT( *) AS ' CANTI DAD DE PEDI DOS'
FROM VENTAS. PEDI DOSCABE
WHERE DATEPART( YY, FECHAPEDI DO) =2011
GO
La palabra clave DISTINCT es opcional con SUM, AVG y COUNT, y no se permite con
MIN, MAX ni COUNT (*). Si utiliza DISTINCT, el argumento no puede incluir una
expresin aritmtica, slo debe componerse de un nombre de columna, esta palabra
clave aparece entre parntesis y antes del nombre de la columna.
Ejemplo: Mostrar la cantidad de clientes que han generado pedidos.
USE NEGOCI OS2011
GO
46
CARRERAS PROFESIONALES CIBERTEC
SELECT COUNT( DI STI NCT I DCLI ENTE) AS ' NUMERO DE CLI ENTES'
FROM VENTAS. PEDI DOSCABE
WHERE DATEPART( YY, FECHAPEDI DO) =1996
GO
1.3.2.1.2. Uso de la funcin AVG
La funcin AVG () calcula la media aritmtica de un conjunto de valores en un campo
especfico de la consulta
La media calcula por la funcin AVG es la media aritmtica (la suma de los valores
dividido por el nmero de valores).
La funcin AVG no incluye ningn campo NULL en el clculo.
Ejemplo: Mostrar el precio Promedio de los productos.
USE NEGOCI OS2011
GO
SELECT AVG( PRECI OUNI DAD) AS ' PRECI O PROMEDI O'
FROM COMPRAS. PRODUCTOS
GO
1.3.2.1.3. Uso de la funcin MAX() y MIN()
La funcin MAX (expr) y la funcin MIN (expr) devuelven el mximo o mnimo valor de
un conjunto de valores contenidos en un campo especfico de una consulta.
La expresin (expr) es el campo sobre el que se desea realizar el clculo; expr pueden
incluir el nombre de un campo de una tabla, una constante o una funcin (la cual
puede ser intrnseca o definida por el usuario pero no otras de las funciones
agregadas de SQL).
Ejemplo: Mostrar el mximo y el mnimo precio de los productos.
BASE DE DATOS AVANZADO I I 47
CIBERTEC CARRERAS PROFESIONALES
USE NEGOCI OS2011
GO
SELECT MAX( PRECI OUNI DAD) AS ' MAYOR PRECI O' , MI N( PRECI OUNI DAD)
AS ' MENOR PRECI O'
FROM COMPRAS. PRODUCTOS
GO
1.3.2.1.4. Uso de la funcin SUM
La funcin SUM (expr) retorna la suma del conjunto de valores contenido en un campo
especfico de una consulta.
La expresin (expr) representa el nombre del campo que contiene los datos que
desean sumarse o una expresin que realiza un clculo utilizando los datos de dichos
campos.
Ejemplo: Mostrar la suma de los pedidos registrados en este ao.
USE NEGOCI OS2011
GO
SELECT SUM( PRECI OUNI DAD*CANTI DAD) AS ' SUMA'
FROM VENTAS. PEDI DOSDETA PD J OI N VENTAS. PEDI DOSCABE PC
ON PD. I DPEDI DO = PC. I DPEDI DO
WHERE YEAR( FECHAPEDI DO) =2011
GO
1.3.2.2. Clusula GROUP BY
Agrupa un conjunto de filas seleccionado en un conjunto de filas de resumen por los
valores de una o ms columnas o expresiones de SQL Server 2008.
La clusula GROUP BY se utiliza en las instrucciones SELECT para dividir la salida de
una tabla en grupos. Puede formar grupos segn uno o varios nombres de columna, o
48
CARRERAS PROFESIONALES CIBERTEC
segn los resultados de las columnas calculadas utilizando tipos de datos numricos
en una expresin. El nmero mximo de columnas o expresiones es 16.
La clusula GROUP BY aparece casi siempre en instrucciones que tambin incluyen
funciones agregadas, en cuyo caso el agregado genera un valor para cada grupo. A
estos valores se les llama agregados vectoriales. Un agregado escalar es un solo
valor generado por una funcin agregada sin una clusula GROUP BY.
Los valores sumarios (agregados vectoriales) generados por las instrucciones
SELECT con agregados y una clusula GROUP BY aparecen como columnas en
cada fila de los resultados.
Ejemplo: Mostrar la suma y la cantidad de pedidos registrados por cada cliente.
USE NEGOCI OS2011
GO
SELECT C. NOMCLI ENTE AS ' CLI ENTE' ,
COUNT( *) AS ' CANTI DAD' , SUM( PRECI OUNI DAD*CANTI DAD) AS
' SUMA'
FROM VENTAS. PEDI DOSDETA PD J OI N VENTAS. PEDI DOSCABE PC
ON PD. I DPEDI DO = PC. I DPEDI DO
J OI N VENTAS. CLI ENTES C ON C. I DCLI ENTE = PC. I DCLI ENTE
GROUP BY C. NOMCLI ENTE
GO
Si incluye la clausula WHERE en una consulta agregada, sta se aplica antes de
calcular el valor o la funcin agregada.
Ejemplo: Mostrar la suma de pedidos registrados por cada cliente en el ao 1996.
USE NEGOCI OS2011
GO
SELECT C. NOMCLI ENTE AS ' CLI ENTE' ,
SUM( PRECI OUNI DAD*CANTI DAD) AS ' SUMA'
BASE DE DATOS AVANZADO I I 49
CIBERTEC CARRERAS PROFESIONALES
FROM VENTAS. PEDI DOSDETA PD J OI N VENTAS. PEDI DOSCABE PC
ON PD. I DPEDI DO = PC. I DPEDI DO
J OI N VENTAS. CLI ENTES C ON C. I DCLI ENTE = PC. I DCLI ENTE
WHERE YEAR( FECHAPEDI DO) =1996
GROUP BY C. NOMCLI ENTE
GO
1.3.2.3. Clusula HAVING
Es posible que necesitemos calcular un agregado, pero que no necesitemos obtener
todos los datos, solo los que cumplan una condicin del agregado. Por ejemplo,
podemos calcular el valor de las ventas por producto, pero que solo queramos ver los
datos de los productos que hayan vendido ms o menos de una determinada cantidad.
En estos casos, debemos utilizar la clausula HAVING.
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier
registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la
clusula HAVING.
Ejemplo: Mostrar los clientes cuyo importe total de pedidos (suma de pedidos
registrados por cada cliente) sea mayor a 1000.
USE NEGOCI OS2011
GO
SELECT C. NOMCLI ENTE AS ' CLI ENTE' ,
SUM( PRECI OUNI DAD*CANTI DAD) AS ' SUMA'
FROM VENTAS. PEDI DOSDETA PD J OI N VENTAS. PEDI DOSCABE PC
ON PD. I DPEDI DO = PC. I DPEDI DO
J OI N VENTAS. CLI ENTES C ON C. I DCLI ENTE = PC. I DCLI ENTE
GROUP BY C. NOMCLI ENTE
HAVI NG SUM( PRECI OUNI DAD*CANTI DAD) >1000
GO
Se utiliza la clusula WHERE para excluir aquellas filas que no desea agrupar y la
clusula HAVING para filtrar los registros una vez agrupados.
50
CARRERAS PROFESIONALES CIBERTEC
Ejemplo: Mostrar los clientes cuyo importe total de pedidos (suma de pedidos
registrados por cliente) sea mayor a 1000 siendo registrados en el ao 2011.
USE NEGOCI OS2011
GO
SELECT C. NOMCLI ENTE AS ' CLI ENTE' ,
SUM( PRECI OUNI DAD*CANTI DAD) AS ' SUMA'
FROM VENTAS. PEDI DOSDETA PD J OI N VENTAS. PEDI DOSCABE PC
ON PD. I DPEDI DO = PC. I DPEDI DO
J OI N VENTAS. CLI ENTES C ON C. I DCLI ENTE = PC. I DCLI ENTE
WHERE YEAR( FECHAPEDI DO) =2011
GROUP BY C. NOMCLI ENTE
HAVI NG SUM( PRECI OUNI DAD*CANTI DAD) >1000
GO
1.3.3. AGREGAR CONJUNTO DE RESULTADOS: UNION
La operacin UNION combina los resultados de dos o ms consultas en un solo
conjunto de resultados que incluye todas las filas que pertenecen a las consultas de la
unin. La operacin UNION es distinta de la utilizacin de combinaciones de columnas
de dos tablas.
Para utilizar la operacin UNION, debemos aplicar algunas reglas bsicas para
combinar los conjuntos de resultados de dos consultas con UNION: