70
Microsoft SQL SERVER / Desarrollo de Aplicaciones utilizando Visual Studio Net 2005 Prof.: Diego Alberto Cueva Valverde [email protected] 1 Bases de datos Una base de datos de Microsoft® SQL Server™ 2005 consta de una colección de tablas que contienen datos y otros objetos, como vistas , índices , procedimientos almacenados y desencadenadores , que se definen para poder llevar a cabo distintas operaciones con datos. Los datos almacenados en una base de datos suelen estar relacionados con un tema o un proceso determinados como, por ejemplo, la información de inventario para el almacén de una fábrica. SQL Server admite muchas bases de datos. Cada base de datos puede almacenar datos interrelacionados o sin relacionar procedentes de otras bases de datos. Por ejemplo, un servidor podría tener una base de datos que almacena datos del personal y otra que almacena datos relacionados con los productos. Por otra parte, puede utilizarse una base de datos para almacenar datos acerca de pedidos actuales de los clientes y otra base de datos relacionada puede almacenar pedidos anteriores de los clientes que se utilicen para la elaboración de los informes anuales. Antes de crear una base de datos, es importante entender las partes que la componen y cómo diseñarlas para asegurar que la base de datos funcione correctamente una vez implementada. Importante Se recomienda no crear objetos de usuario, como tablas, vistas, procedimientos almacenados o desencadenadores en la base de datos master. La base de datos master contiene las tablas del sistema con la información del sistema que utiliza SQL Server, como por ejemplo los valores de las opciones de configuración. Tablas Las tablas son objetos de la base de datos que contienen todos sus datos. Una tabla se define mediante una colección de columnas. En las tablas, los datos se organizan con arreglo a un formato de filas y columnas, similar al de una hoja de cálculo. Cada fila representa un registro único, y cada columna representa un campo dentro de un registro. Por ejemplo, en una tabla que contenga los datos de los empleados de una compañía puede haber una fila para cada empleado y distintas columnas en las que figuren detalles de los empleados tales como el número de empleado, el nombre, la dirección, el puesto que ocupa y su número de teléfono particular. Especificar un tipo de datos para una columna La asignación de un tipo de datos a cada columna es uno de los primeros pasos que debe llevarse a cabo para diseñar una tabla. Los tipos de datos definen los valores de datos permitidos para cada columna. Para asignar un tipo de datos a una columna, puede utilizar los tipos de datos de Microsoft® SQL Server™ 2005 o crear sus propios tipos de datos basándose en los del sistema. Por ejemplo , si sólo desea incluir nombres en una columna, puede asignar un tipo de datos de carácter para la misma. Asimismo, si desea que una columna sólo contenga números, puede asignar un tipo de datos numérico. Para obtener más información acerca de los tipos de datos definidos por el usuario. SQL Server también admite sinónimos de SQL-92 para varios tipos de bases de datos. Para obtener más información.

Fundamentos de Programacion Con SQL

Embed Size (px)

Citation preview

Page 1: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 1

Bases de datos

Una base de datos de Microsoftreg SQL Servertrade 2005 consta de una coleccioacuten de tablas que contienen

datos y otros objetos como vistas iacutendices procedimientos almacenados y desencadenadores que se

definen para poder llevar a cabo distintas operaciones con datos Los datos almacenados en una base de

datos suelen estar relacionados con un tema o un proceso determinados como por ejemplo la

informacioacuten de inventario para el almaceacuten de una faacutebrica

SQL Server admite muchas bases de datos Cada base de datos puede almacenar datos

interrelacionados o sin relacionar procedentes de otras bases de datos Por ejemplo un servidor podriacutea

tener una base de datos que almacena datos del personal y otra que almacena datos relacionados con los

productos Por otra parte puede utilizarse una base de datos para almacenar datos acerca de pedidos

actuales de los clientes y otra base de datos relacionada puede almacenar pedidos anteriores de los

clientes que se utilicen para la elaboracioacuten de los informes anuales

Antes de crear una base de datos es importante entender las partes que la componen y coacutemo

disentildearlas para asegurar que la base de datos funcione correctamente una vez implementada

Importante Se recomienda no crear objetos de usuario como tablas vistas procedimientos

almacenados o desencadenadores en la base de datos master La base de datos master contiene las

tablas del sistema con la informacioacuten del sistema que utiliza SQL Server como por ejemplo los

valores de las opciones de configuracioacuten

Tablas

Las tablas son objetos de la base de datos que contienen todos sus datos Una tabla se define mediante

una coleccioacuten de columnas En las tablas los datos se organizan con arreglo a un formato de filas y

columnas similar al de una hoja de caacutelculo Cada fila representa un registro uacutenico y cada columna

representa un campo dentro de un registro Por ejemplo en una tabla que contenga los datos de los

empleados de una compantildeiacutea puede haber una fila para cada empleado y distintas columnas en las que

figuren detalles de los empleados tales como el nuacutemero de empleado el nombre la direccioacuten el puesto

que ocupa y su nuacutemero de teleacutefono particular

Especificar un tipo de datos para una columna

La asignacioacuten de un tipo de datos a cada columna es uno de los primeros pasos que debe llevarse a cabo

para disentildear una tabla Los tipos de datos definen los valores de datos permitidos para cada columna

Para asignar un tipo de datos a una columna puede utilizar los tipos de datos de Microsoftreg SQL

Servertrade 2005 o crear sus propios tipos de datos basaacutendose en los del sistema Por ejemplo si soacutelo

desea incluir nombres en una columna puede asignar un tipo de datos de caraacutecter para la misma

Asimismo si desea que una columna soacutelo contenga nuacutemeros puede asignar un tipo de datos numeacuterico

Para obtener maacutes informacioacuten acerca de los tipos de datos definidos por el usuario

SQL Server tambieacuten admite sinoacutenimos de SQL-92 para varios tipos de bases de datos Para obtener

maacutes informacioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 2

Datos binarios

Los datos binarios se componen de nuacutemeros hexadecimales Por ejemplo el nuacutemero decimal 245

corresponde al hexadecimal F5 Los datos binarios se almacenan utilizando los tipos de datos binary

varbinary e image de Microsoftreg SQL Servertrade 2005 Una columna a la que se asigne el tipo de datos

binary debe tener la misma longitud fija (hasta 8 KB) para cada fila En una columna a la que se asigne

el tipo de datos varbinary las entradas pueden variar en el nuacutemero de diacutegitos hexadecimales (hasta 8

KB) que contienen Las columnas con datos image pueden utilizarse para almacenar datos binarios de

longitud variable que excedan los 8 KB como documentos de Microsoft Wordreg hojas de caacutelculo de

Microsoft Excelreg e imaacutegenes que incluyan archivos de mapa de bits archivos con formato GIF

(Graphics Interchange Format) y archivos con formato JPEG (Joint Photographic Experts Group)

En general utilice varbinary para almacenar datos binarios excepto si su longitud supera los 8 KB en

cuyo caso deberaacute utilizar el tipo de datos image Es recomendable que la longitud definida de una

columna binaria no supere la longitud maacutexima prevista para los datos binarios que deben almacenarse

Datos de caraacutecter

Se define como dato de caraacutecter cualquier combinacioacuten de letras siacutembolos y caracteres numeacutericos Por

ejemplo son datos de caraacutecter vaacutelidos 928 Johnson y (0amp(B99nh jkJ En Microsoftreg SQL

Servertrade 2005 los datos de caraacutecter se almacenan utilizando los tipos de datos char varchar y text

Utilice varchar cuando variacutee el nuacutemero de caracteres de las entradas de una columna siempre que no

haya ninguna entrada que tenga una longitud mayor que 8 KB Utilice char cuando todas las entradas de

una columna tengan la misma longitud fija (hasta 8 KB) Las columnas de datos text pueden utilizarse

para almacenar caracteres ASCII de maacutes de 8 KB Por ejemplo dado que los documentos HTML son

caracteres ASCII y suelen ocupar maacutes de 8 KB se pueden almacenar en columnas text en SQL Server

antes de verlos en un examinador

Se recomienda que la longitud definida para una columna de caracteres no supere a la longitud maacutexima

prevista para los datos de caraacutecter que vayan a almacenarse

Para almacenar datos de caracteres internacionales en SQL Server utilice los tipos de datos nchar

nvarchar y ntext

Datos Unicode

Los tipos de datos tradicionales no Unicode de Microsoftreg SQL Servertrade 2005 permiten la utilizacioacuten

de caracteres definidos por un conjunto de caracteres determinado El conjunto de caracteres se elige

durante la instalacioacuten de SQL Server y no puede modificarse Si se utilizan los tipos de datos Unicode

una columna puede almacenar cualquier caraacutecter definido por el estaacutendar Unicode que incluye todos los

caracteres definidos en los diversos conjuntos de caracteres Los tipos de datos Unicode ocupan el

doble de espacio que los que no lo son

Los datos Unicode se almacenan mediante los tipos de datos nchar nvarchar y ntext de SQL Server

Utilice estos tipos de datos para las columnas que almacenen caracteres de maacutes de un conjunto de

caracteres Utilice nvarchar cuando las entradas de una columna variacuteen en cuanto al nuacutemero de

caracteres Unicode que contienen (hasta 4000) Utilice nchar cuando todas las entradas de una

columna tengan la misma longitud fija (hasta 4000 caracteres Unicode) Utilice ntext cuando alguna

entrada de una columna ocupe maacutes de 4000 caracteres Unicode

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 3

Nota Los tipos de datos Unicode de SQL Server se basan en los tipos de datos National Character

del conjunto de normas SQL-92 SQL-92 utiliza el caraacutecter n como prefijo para identificar estos

tipos de datos y valores

Datos de fecha y hora

Los datos de fecha y hora constan de combinaciones vaacutelidas de fecha y hora Por ejemplo datos vaacutelidos

de fecha y hora pueden ser 40198 1215000000 pm y 128291501 am 17898 Los datos de

fecha y hora se almacenan utilizando los tipos de datos datetime y smalldatetime de Microsoftreg SQL

Servertrade 2005 Utilice datetime para almacenar datos del intervalo que va desde el 1 de enero de 1753

hasta el 31 de diciembre del 9999 (para cada valor se necesitan 8 bytes de espacio de almacenamiento)

Utilice smalldatetime para almacenar fechas en el intervalo que va desde el 1 de enero de 1900 hasta el

6 de junio del antildeo 2079 (para cada valor se necesitan 4 bytes de espacio de almacenamiento)

Datos numeacutericos

Los datos numeacutericos se componen exclusivamente de nuacutemeros Incluyen nuacutemeros positivos y negativos

decimales fracciones y nuacutemeros enteros

Datos enteros

Los datos enteros constan de nuacutemeros enteros positivos o negativos como ndash15 0 5 y 2509 Los datos

enteros se almacenan utilizando los tipos de datos bigint int smallint y tinyint de Microsoftreg SQL

Servertrade 2005 El tipo de datos bigint puede almacenar un intervalo de nuacutemeros mayor que el tipo de

datos int El tipo de datos int puede almacenar un intervalo mayor de enteros que smallint que a su vez

puede almacenar un intervalo mayor de nuacutemeros que tinyint

Utilice el tipo de datos bigint para almacenar nuacutemeros del intervalo comprendido entre -2^63 (-

9223372036854775808) y 2^63-1 (9223372036854775807) El tamantildeo de almacenamiento es de 8

bytes

Utilice el tipo de datos int para almacenar nuacutemeros del intervalo comprendido entre -2147483648 y

2147483647 (para cada valor se necesitan 4 bytes de espacio de almacenamiento)

Utilice el tipo de datos smallint para almacenar nuacutemeros del intervalo que va desde -32768 hasta

32767 (para cada valor se necesitan 2 bytes de espacio de almacenamiento) y el tipo de datos tinyint

para almacenar nuacutemeros del intervalo que va desde 0 hasta 255 (para cada valor se necesita 1 byte de

espacio de almacenamiento)

Datos decimales

Los datos decimales se componen de datos de los que se almacena hasta el diacutegito menos significativo

Estos datos se almacenan mediante los tipos de datos decimal o numeric de SQL Server El nuacutemero de

bytes necesarios para almacenar un valor decimal o numeric depende del nuacutemero total de diacutegitos de

datos y del nuacutemero de cifras a la derecha del separador decimal Por ejemplo se necesitan maacutes bytes

para almacenar el valor 1928329383 que para almacenar el valor 11

En SQL Server el tipo de datos numeric es sinoacutenimo del tipo de datos decimal

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 4

Datos numeacutericos aproximados

Los datos numeacutericos aproximados (coma flotante) constan de datos que se almacenan con tanta

precisioacuten como permite el sistema de numeracioacuten binario Los datos numeacutericos aproximados se

almacenan mediante los tipos de datos float y real de SQL Server Por ejemplo dado que en notacioacuten

decimal la fraccioacuten un tercio se expresa como 0333333 (hasta el infinito) este valor no se puede

representar con total precisioacuten mediante los datos decimales aproximados Por lo tanto el valor

recuperado de SQL Server puede no coincidir exactamente con el que se almacenoacute originalmente en la

columna Otros ejemplos de aproximaciones numeacutericas son los valores de coma flotante que acaban en

03 06 y 07

Datos de moneda

Los datos de moneda representan cantidades positivas o negativas de dinero Los datos de moneda se

almacenan utilizando los tipos de datos money y smallmoney de Microsoftreg SQL Servertrade 2005 Los

datos de moneda pueden almacenarse con una precisioacuten maacutexima de cuatro decimales Utilice el tipo de

datos money para almacenar valores del intervalo comprendido entre -9223372036854775808 y

+9223372036854775807 (para almacenar cada valor se necesitan 8 bytes) Utilice el tipo de datos

smallmoney para almacenar valores del intervalo comprendido entre -2147483648 y 2147483647

(para almacenar cada valor se necesitan 4 bytes) Si se necesita un nuacutemero mayor de decimales utilice

el tipo de datos decimal

Datos especiales

Los datos especiales son aqueacutellos que no se ajustan a ninguna de las categoriacuteas de datos como los datos

binarios de caraacutecter Unicode de fecha y hora numeacutericos y de moneda

Microsoftreg SQL Servertrade 2005 incluye cuatro tipos de datos especiales

timestamp

Se utiliza para indicar la secuencia de actividades de SQL Server en una fila representada

como un nuacutemero creciente en formato binario Cuando se modifica una fila de una tabla el valor

de timestamp (la marca de tiempo) se actualiza con el valor actual de timestamp de la base de

datos que se obtiene con la funcioacuten DBTS Los datos de tipo timestamp no estaacuten

relacionados con la fecha ni la hora de una insercioacuten ni de un cambio en los datos Si desea

registrar automaacuteticamente en queacute momento se producen modificaciones en una tabla utilice un

tipo de datos datetime o smalldatetime para registrar los sucesos y los desencadenadores

Nota En SQL Server rowversion es un sinoacutenimo de timestamp

bit

Puede ser un 1 o un 0 Utilice el tipo de datos bit para representar los valores TRUE

(verdadero) o FALSE (falso) o YES o NO Por ejemplo un cuestionario para los clientes en el

que se pregunte si eacutesta es la primera visita del cliente puede almacenarse en una columna de

tipo bit

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 5

uniqueidentifier

Se trata de un nuacutemero hexadecimal de 16 bytes que hace referencia a un identificador

exclusivo global (GUID) El GUID es especialmente uacutetil cuando una fila debe ser uacutenica entre

otras muchas Por ejemplo utilice el tipo de datos uniqueidentifier en una columna con nuacutemeros

de identificacioacuten de los clientes para compilar una lista de clientes de una compantildeiacutea en varios

paiacuteses

sql_variant

Un tipo de datos que almacena valores de varios tipos de datos aceptados en SQL Server

excepto text ntext timestamp y sql_variant

table

Un tipo de datos especial que se utiliza para almacenar un conjunto de resultados para su

proceso posterior El tipo de datos table soacutelo puede utilizarse para definir variables locales del

tipo table o el valor de retorno de una funcioacuten definida por el usuario

definidas por el usuario

Permite que el usuario defina tipos de datos como por ejemplo product_code que se basa en

el tipo de datos char y que consta de dos letras mayuacutesculas seguidas de un nuacutemero de

proveedor de cinco cifras

Definir una clave principal

Defina una Clave Principalcpara exigir que se escriban valores uacutenicos en columnas especificadas que no

permiten nulos Si define una clave principal para una tabla en la base de datos puede relacionar esa

tabla con otras tablas asiacute se reduce la necesidad de datos redundantes Una tabla soacutelo puede tener una

clave principal

Para definir una clave principal

1 En el diagrama de base de datos o en el Disentildeador de tablas haga clic en el selector de fila de

la columna de la base de datos que desee definir como clave principal Si desea seleccionar

varias columnas mantenga presionada la tecla CTRL mientras hace clic en los selectores de fila

para las otras columnas

2 Haga clic con el botoacuten secundario en el selector de fila para la columna y seleccione Establecer

clave principal En la ficha Iacutendices y claves de las paacuteginas de propiedades se crea

automaacuteticamente un iacutendice de clave principal denominado PK_ seguido del nombre de la tabla

Advertencia Si desea volver a definir la clave principal se deben eliminar las relaciones con la clave

principal existente antes de poder crear la nueva clave principal Un mensaje comunicaraacute que las

relaciones existentes se eliminaraacuten automaacuteticamente como parte de este proceso

Una columna de clave principal se identifica por un siacutembolo de llave principal en el selector de fila

Si una clave principal consta de maacutes de una columna se permiten valores duplicados en una columna

pero cada combinacioacuten de valores de todas las columnas de la clave principal debe ser uacutenica

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 6

Coacutemo crear una relacioacuten de varios a varios entre tablas

Para crear una relacioacuten de varios a varios entre tablas

1 Abra un diagrama de base de datos

2 Agregue las tablas entre las que desea crear una relacioacuten de varios a varios

3 Cree una tercera tabla Para ello haga clic con el botoacuten secundario del mouse dentro del

diagrama de la base de datos y a continuacioacuten haga clic en Nueva tabla

Eacutesta se convertiraacute en la tabla de unioacuten

4 En el cuadro de diaacutelogo Elegir nombre escriba un nombre para la tabla

Por ejemplo la tabla de unioacuten entre la tabla de tiacutetulos y la tabla de autores se llama

titleauthors

5 Copie las columnas de clave principal de cada una de las otras dos tablas en la tabla de unioacuten

Puede agregar otras columnas a esta tabla igual que en cualquier otra tabla

6 En la tabla de unioacuten establezca la clave principal para que incluya todas las columnas de la clave

principal de las otras dos tablas

7 Defina una relacioacuten de uno a varios entre cada una de las dos tablas principales y la tabla de

unioacuten

Fundamentos de Programacioacuten con SQL Existen 3 tipos de instrucciones para el lenguaje en SQL

- Lenguaje de control de datos (DDL) Creacioacuten y eliminacioacuten de tipos de datos y objetos

CREATE Crear Objeto

ALTER Modificar los datos creados

DROP Eliminar el Objeto

- Lenguaje de control de datos (DCL) Se basa en los derechos que tiene el usuario sobre la

base da datos (Permisos)

GRANT Dar permisos a un usuario para efectuar determinadas

Instrucciones

DENY Eliminar el permiso que se ha concedido con el GRANT

REVOKE Eliminar todos los permisos

- Lenguaje de manipulacioacuten de datos (DML) Desarrollo de la programacioacuten de la base de

datos

SELECT

INSERT

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 7

UPDATE

DELETE

Elementos de sintaxis

Directivas de procesos por lotes

- GO Enviacutea lotes de instrucciones de TRANSACT SQL a las herramientas y utilidades (Sirve

para separar bloques de instrucciones)

- EXEC O EXECUTE Ejecuta funciones definidas por el usuario procedimientos de sistema

y procedimientos almacenados

Comentarios en SQL

- En liacutenea --

- En Bloque comentario

Tablas en SQL

Tabla master Es la tabla que contiene como generar una base de datos y sobre ella

se crean todas las bases de datos

Tabla model Es la tabla modelo las bases de datos creadas se basan en esta tabla

como modelo

Tabla Northwind y Pubs Son tablas de ejemplos que vienen con SQL y todo usuario

puede trabajar con ellas

Identificadores para los objetos

Los nombres que se le dan a las tablas lo primero es que no pueden empezar por un nuacutemero

deben empezar por un signo alfabeacutetico pueden incluir el guion bajo (_) la arroba y la

almohadilla

Generalmente para las variables locales se usan + el nombre

EJEMPLO Contador

Para las variables totales se usan dos arrobas + el nombre Contador

EJEMPLO Error

Nombre indica una tabla o procedimiento temporal (Local)

Nombre Igual que el anterior pero global

Tipos de datos

- Numeacutericos

Enteros int tinyint smallint bigint

Decimales numeric decimal money smallmoney

Coma Flotante float real

- Fechas

datetime 0333 s

smalldatetime 1 minuto

- Caracteres

Ancho fijo char nchar

Ancho Variable varchar nvarchar

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 8

- Texto e Imagen

Text

Ntext

Rowversion

- Binario

Binary varbinary Valores tipo byte

Bit Un solo bit (1 o ninguno)

- Identificadores Uacutenicos

Representa un identificador global uacutenico (GUID)

Si queremos que no se repita el dato en la base de datos usamos este identificador

Uniqueidentifier

Operadores de SQL

Loacutegicos

AND OR NOT

De Comparacioacuten

= Igual

lt Menor

gt Mayor

ltgt Diferente

gt= Mayor o igual

lt= Menor o igual

Crear una Base de Datos Utilizando el Lenguaje SQL

Ejemplo

Para crear la base de datos es la siguiente opcioacuten database seguido del nombre de la Base de Datos

--Create database Itae

On primary

(Name= Itae _data Filename=C itaemdf size=10 maxsize=15 filegrowth=25)

Log On

(Name= Itae _log filename=C itaeldf size=4 maxsize=6 filegrowth=1MB)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 9

Despueacutes de la sentencia Create database Se especifica el nombre de la base de datos Un

nombre en la base de datos debe de ser uacutenico en el servidor

Name- Es el nombre a utilizar cuando una sentencia SQL se tiene que hacer referencia al archivo de

datos o al archivo log respectivamente

Filename- Es una cadena que incluye la ruta y el nombre del archivo La ruta debe especificar una

carpeta existente en el servidor que esta instalado en el SQL

Size ndash Especifica el tamantildeo del Archivo

Maxsize ndashEspecifica el tamantildeo maacuteximo que puede alcanzar el archive si se requiere espacio adicional

Filegrowth ndashEs la cantidad de espacio que se antildeade al archive cada vez que se necesita espacio

adicional Se puede especificar en MB o en porcentaje

Cuando se crea una base de datos su nombre se registra en la tabla del sistema Sysdatabases

de la base de datos master

Para comprobar si la base de datos existe ejecutaremos la siguiente sentencia SQL

Se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el Use Go

Use master

Go

Luego se procederaacute abrir la tabla Sysdatabases y ahiacute se podraacute visualizar si la base de datos ah

sido creada

Select from Sysdatabases

Luego se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el go

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 2: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 2

Datos binarios

Los datos binarios se componen de nuacutemeros hexadecimales Por ejemplo el nuacutemero decimal 245

corresponde al hexadecimal F5 Los datos binarios se almacenan utilizando los tipos de datos binary

varbinary e image de Microsoftreg SQL Servertrade 2005 Una columna a la que se asigne el tipo de datos

binary debe tener la misma longitud fija (hasta 8 KB) para cada fila En una columna a la que se asigne

el tipo de datos varbinary las entradas pueden variar en el nuacutemero de diacutegitos hexadecimales (hasta 8

KB) que contienen Las columnas con datos image pueden utilizarse para almacenar datos binarios de

longitud variable que excedan los 8 KB como documentos de Microsoft Wordreg hojas de caacutelculo de

Microsoft Excelreg e imaacutegenes que incluyan archivos de mapa de bits archivos con formato GIF

(Graphics Interchange Format) y archivos con formato JPEG (Joint Photographic Experts Group)

En general utilice varbinary para almacenar datos binarios excepto si su longitud supera los 8 KB en

cuyo caso deberaacute utilizar el tipo de datos image Es recomendable que la longitud definida de una

columna binaria no supere la longitud maacutexima prevista para los datos binarios que deben almacenarse

Datos de caraacutecter

Se define como dato de caraacutecter cualquier combinacioacuten de letras siacutembolos y caracteres numeacutericos Por

ejemplo son datos de caraacutecter vaacutelidos 928 Johnson y (0amp(B99nh jkJ En Microsoftreg SQL

Servertrade 2005 los datos de caraacutecter se almacenan utilizando los tipos de datos char varchar y text

Utilice varchar cuando variacutee el nuacutemero de caracteres de las entradas de una columna siempre que no

haya ninguna entrada que tenga una longitud mayor que 8 KB Utilice char cuando todas las entradas de

una columna tengan la misma longitud fija (hasta 8 KB) Las columnas de datos text pueden utilizarse

para almacenar caracteres ASCII de maacutes de 8 KB Por ejemplo dado que los documentos HTML son

caracteres ASCII y suelen ocupar maacutes de 8 KB se pueden almacenar en columnas text en SQL Server

antes de verlos en un examinador

Se recomienda que la longitud definida para una columna de caracteres no supere a la longitud maacutexima

prevista para los datos de caraacutecter que vayan a almacenarse

Para almacenar datos de caracteres internacionales en SQL Server utilice los tipos de datos nchar

nvarchar y ntext

Datos Unicode

Los tipos de datos tradicionales no Unicode de Microsoftreg SQL Servertrade 2005 permiten la utilizacioacuten

de caracteres definidos por un conjunto de caracteres determinado El conjunto de caracteres se elige

durante la instalacioacuten de SQL Server y no puede modificarse Si se utilizan los tipos de datos Unicode

una columna puede almacenar cualquier caraacutecter definido por el estaacutendar Unicode que incluye todos los

caracteres definidos en los diversos conjuntos de caracteres Los tipos de datos Unicode ocupan el

doble de espacio que los que no lo son

Los datos Unicode se almacenan mediante los tipos de datos nchar nvarchar y ntext de SQL Server

Utilice estos tipos de datos para las columnas que almacenen caracteres de maacutes de un conjunto de

caracteres Utilice nvarchar cuando las entradas de una columna variacuteen en cuanto al nuacutemero de

caracteres Unicode que contienen (hasta 4000) Utilice nchar cuando todas las entradas de una

columna tengan la misma longitud fija (hasta 4000 caracteres Unicode) Utilice ntext cuando alguna

entrada de una columna ocupe maacutes de 4000 caracteres Unicode

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 3

Nota Los tipos de datos Unicode de SQL Server se basan en los tipos de datos National Character

del conjunto de normas SQL-92 SQL-92 utiliza el caraacutecter n como prefijo para identificar estos

tipos de datos y valores

Datos de fecha y hora

Los datos de fecha y hora constan de combinaciones vaacutelidas de fecha y hora Por ejemplo datos vaacutelidos

de fecha y hora pueden ser 40198 1215000000 pm y 128291501 am 17898 Los datos de

fecha y hora se almacenan utilizando los tipos de datos datetime y smalldatetime de Microsoftreg SQL

Servertrade 2005 Utilice datetime para almacenar datos del intervalo que va desde el 1 de enero de 1753

hasta el 31 de diciembre del 9999 (para cada valor se necesitan 8 bytes de espacio de almacenamiento)

Utilice smalldatetime para almacenar fechas en el intervalo que va desde el 1 de enero de 1900 hasta el

6 de junio del antildeo 2079 (para cada valor se necesitan 4 bytes de espacio de almacenamiento)

Datos numeacutericos

Los datos numeacutericos se componen exclusivamente de nuacutemeros Incluyen nuacutemeros positivos y negativos

decimales fracciones y nuacutemeros enteros

Datos enteros

Los datos enteros constan de nuacutemeros enteros positivos o negativos como ndash15 0 5 y 2509 Los datos

enteros se almacenan utilizando los tipos de datos bigint int smallint y tinyint de Microsoftreg SQL

Servertrade 2005 El tipo de datos bigint puede almacenar un intervalo de nuacutemeros mayor que el tipo de

datos int El tipo de datos int puede almacenar un intervalo mayor de enteros que smallint que a su vez

puede almacenar un intervalo mayor de nuacutemeros que tinyint

Utilice el tipo de datos bigint para almacenar nuacutemeros del intervalo comprendido entre -2^63 (-

9223372036854775808) y 2^63-1 (9223372036854775807) El tamantildeo de almacenamiento es de 8

bytes

Utilice el tipo de datos int para almacenar nuacutemeros del intervalo comprendido entre -2147483648 y

2147483647 (para cada valor se necesitan 4 bytes de espacio de almacenamiento)

Utilice el tipo de datos smallint para almacenar nuacutemeros del intervalo que va desde -32768 hasta

32767 (para cada valor se necesitan 2 bytes de espacio de almacenamiento) y el tipo de datos tinyint

para almacenar nuacutemeros del intervalo que va desde 0 hasta 255 (para cada valor se necesita 1 byte de

espacio de almacenamiento)

Datos decimales

Los datos decimales se componen de datos de los que se almacena hasta el diacutegito menos significativo

Estos datos se almacenan mediante los tipos de datos decimal o numeric de SQL Server El nuacutemero de

bytes necesarios para almacenar un valor decimal o numeric depende del nuacutemero total de diacutegitos de

datos y del nuacutemero de cifras a la derecha del separador decimal Por ejemplo se necesitan maacutes bytes

para almacenar el valor 1928329383 que para almacenar el valor 11

En SQL Server el tipo de datos numeric es sinoacutenimo del tipo de datos decimal

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 4

Datos numeacutericos aproximados

Los datos numeacutericos aproximados (coma flotante) constan de datos que se almacenan con tanta

precisioacuten como permite el sistema de numeracioacuten binario Los datos numeacutericos aproximados se

almacenan mediante los tipos de datos float y real de SQL Server Por ejemplo dado que en notacioacuten

decimal la fraccioacuten un tercio se expresa como 0333333 (hasta el infinito) este valor no se puede

representar con total precisioacuten mediante los datos decimales aproximados Por lo tanto el valor

recuperado de SQL Server puede no coincidir exactamente con el que se almacenoacute originalmente en la

columna Otros ejemplos de aproximaciones numeacutericas son los valores de coma flotante que acaban en

03 06 y 07

Datos de moneda

Los datos de moneda representan cantidades positivas o negativas de dinero Los datos de moneda se

almacenan utilizando los tipos de datos money y smallmoney de Microsoftreg SQL Servertrade 2005 Los

datos de moneda pueden almacenarse con una precisioacuten maacutexima de cuatro decimales Utilice el tipo de

datos money para almacenar valores del intervalo comprendido entre -9223372036854775808 y

+9223372036854775807 (para almacenar cada valor se necesitan 8 bytes) Utilice el tipo de datos

smallmoney para almacenar valores del intervalo comprendido entre -2147483648 y 2147483647

(para almacenar cada valor se necesitan 4 bytes) Si se necesita un nuacutemero mayor de decimales utilice

el tipo de datos decimal

Datos especiales

Los datos especiales son aqueacutellos que no se ajustan a ninguna de las categoriacuteas de datos como los datos

binarios de caraacutecter Unicode de fecha y hora numeacutericos y de moneda

Microsoftreg SQL Servertrade 2005 incluye cuatro tipos de datos especiales

timestamp

Se utiliza para indicar la secuencia de actividades de SQL Server en una fila representada

como un nuacutemero creciente en formato binario Cuando se modifica una fila de una tabla el valor

de timestamp (la marca de tiempo) se actualiza con el valor actual de timestamp de la base de

datos que se obtiene con la funcioacuten DBTS Los datos de tipo timestamp no estaacuten

relacionados con la fecha ni la hora de una insercioacuten ni de un cambio en los datos Si desea

registrar automaacuteticamente en queacute momento se producen modificaciones en una tabla utilice un

tipo de datos datetime o smalldatetime para registrar los sucesos y los desencadenadores

Nota En SQL Server rowversion es un sinoacutenimo de timestamp

bit

Puede ser un 1 o un 0 Utilice el tipo de datos bit para representar los valores TRUE

(verdadero) o FALSE (falso) o YES o NO Por ejemplo un cuestionario para los clientes en el

que se pregunte si eacutesta es la primera visita del cliente puede almacenarse en una columna de

tipo bit

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 5

uniqueidentifier

Se trata de un nuacutemero hexadecimal de 16 bytes que hace referencia a un identificador

exclusivo global (GUID) El GUID es especialmente uacutetil cuando una fila debe ser uacutenica entre

otras muchas Por ejemplo utilice el tipo de datos uniqueidentifier en una columna con nuacutemeros

de identificacioacuten de los clientes para compilar una lista de clientes de una compantildeiacutea en varios

paiacuteses

sql_variant

Un tipo de datos que almacena valores de varios tipos de datos aceptados en SQL Server

excepto text ntext timestamp y sql_variant

table

Un tipo de datos especial que se utiliza para almacenar un conjunto de resultados para su

proceso posterior El tipo de datos table soacutelo puede utilizarse para definir variables locales del

tipo table o el valor de retorno de una funcioacuten definida por el usuario

definidas por el usuario

Permite que el usuario defina tipos de datos como por ejemplo product_code que se basa en

el tipo de datos char y que consta de dos letras mayuacutesculas seguidas de un nuacutemero de

proveedor de cinco cifras

Definir una clave principal

Defina una Clave Principalcpara exigir que se escriban valores uacutenicos en columnas especificadas que no

permiten nulos Si define una clave principal para una tabla en la base de datos puede relacionar esa

tabla con otras tablas asiacute se reduce la necesidad de datos redundantes Una tabla soacutelo puede tener una

clave principal

Para definir una clave principal

1 En el diagrama de base de datos o en el Disentildeador de tablas haga clic en el selector de fila de

la columna de la base de datos que desee definir como clave principal Si desea seleccionar

varias columnas mantenga presionada la tecla CTRL mientras hace clic en los selectores de fila

para las otras columnas

2 Haga clic con el botoacuten secundario en el selector de fila para la columna y seleccione Establecer

clave principal En la ficha Iacutendices y claves de las paacuteginas de propiedades se crea

automaacuteticamente un iacutendice de clave principal denominado PK_ seguido del nombre de la tabla

Advertencia Si desea volver a definir la clave principal se deben eliminar las relaciones con la clave

principal existente antes de poder crear la nueva clave principal Un mensaje comunicaraacute que las

relaciones existentes se eliminaraacuten automaacuteticamente como parte de este proceso

Una columna de clave principal se identifica por un siacutembolo de llave principal en el selector de fila

Si una clave principal consta de maacutes de una columna se permiten valores duplicados en una columna

pero cada combinacioacuten de valores de todas las columnas de la clave principal debe ser uacutenica

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 6

Coacutemo crear una relacioacuten de varios a varios entre tablas

Para crear una relacioacuten de varios a varios entre tablas

1 Abra un diagrama de base de datos

2 Agregue las tablas entre las que desea crear una relacioacuten de varios a varios

3 Cree una tercera tabla Para ello haga clic con el botoacuten secundario del mouse dentro del

diagrama de la base de datos y a continuacioacuten haga clic en Nueva tabla

Eacutesta se convertiraacute en la tabla de unioacuten

4 En el cuadro de diaacutelogo Elegir nombre escriba un nombre para la tabla

Por ejemplo la tabla de unioacuten entre la tabla de tiacutetulos y la tabla de autores se llama

titleauthors

5 Copie las columnas de clave principal de cada una de las otras dos tablas en la tabla de unioacuten

Puede agregar otras columnas a esta tabla igual que en cualquier otra tabla

6 En la tabla de unioacuten establezca la clave principal para que incluya todas las columnas de la clave

principal de las otras dos tablas

7 Defina una relacioacuten de uno a varios entre cada una de las dos tablas principales y la tabla de

unioacuten

Fundamentos de Programacioacuten con SQL Existen 3 tipos de instrucciones para el lenguaje en SQL

- Lenguaje de control de datos (DDL) Creacioacuten y eliminacioacuten de tipos de datos y objetos

CREATE Crear Objeto

ALTER Modificar los datos creados

DROP Eliminar el Objeto

- Lenguaje de control de datos (DCL) Se basa en los derechos que tiene el usuario sobre la

base da datos (Permisos)

GRANT Dar permisos a un usuario para efectuar determinadas

Instrucciones

DENY Eliminar el permiso que se ha concedido con el GRANT

REVOKE Eliminar todos los permisos

- Lenguaje de manipulacioacuten de datos (DML) Desarrollo de la programacioacuten de la base de

datos

SELECT

INSERT

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 7

UPDATE

DELETE

Elementos de sintaxis

Directivas de procesos por lotes

- GO Enviacutea lotes de instrucciones de TRANSACT SQL a las herramientas y utilidades (Sirve

para separar bloques de instrucciones)

- EXEC O EXECUTE Ejecuta funciones definidas por el usuario procedimientos de sistema

y procedimientos almacenados

Comentarios en SQL

- En liacutenea --

- En Bloque comentario

Tablas en SQL

Tabla master Es la tabla que contiene como generar una base de datos y sobre ella

se crean todas las bases de datos

Tabla model Es la tabla modelo las bases de datos creadas se basan en esta tabla

como modelo

Tabla Northwind y Pubs Son tablas de ejemplos que vienen con SQL y todo usuario

puede trabajar con ellas

Identificadores para los objetos

Los nombres que se le dan a las tablas lo primero es que no pueden empezar por un nuacutemero

deben empezar por un signo alfabeacutetico pueden incluir el guion bajo (_) la arroba y la

almohadilla

Generalmente para las variables locales se usan + el nombre

EJEMPLO Contador

Para las variables totales se usan dos arrobas + el nombre Contador

EJEMPLO Error

Nombre indica una tabla o procedimiento temporal (Local)

Nombre Igual que el anterior pero global

Tipos de datos

- Numeacutericos

Enteros int tinyint smallint bigint

Decimales numeric decimal money smallmoney

Coma Flotante float real

- Fechas

datetime 0333 s

smalldatetime 1 minuto

- Caracteres

Ancho fijo char nchar

Ancho Variable varchar nvarchar

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 8

- Texto e Imagen

Text

Ntext

Rowversion

- Binario

Binary varbinary Valores tipo byte

Bit Un solo bit (1 o ninguno)

- Identificadores Uacutenicos

Representa un identificador global uacutenico (GUID)

Si queremos que no se repita el dato en la base de datos usamos este identificador

Uniqueidentifier

Operadores de SQL

Loacutegicos

AND OR NOT

De Comparacioacuten

= Igual

lt Menor

gt Mayor

ltgt Diferente

gt= Mayor o igual

lt= Menor o igual

Crear una Base de Datos Utilizando el Lenguaje SQL

Ejemplo

Para crear la base de datos es la siguiente opcioacuten database seguido del nombre de la Base de Datos

--Create database Itae

On primary

(Name= Itae _data Filename=C itaemdf size=10 maxsize=15 filegrowth=25)

Log On

(Name= Itae _log filename=C itaeldf size=4 maxsize=6 filegrowth=1MB)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 9

Despueacutes de la sentencia Create database Se especifica el nombre de la base de datos Un

nombre en la base de datos debe de ser uacutenico en el servidor

Name- Es el nombre a utilizar cuando una sentencia SQL se tiene que hacer referencia al archivo de

datos o al archivo log respectivamente

Filename- Es una cadena que incluye la ruta y el nombre del archivo La ruta debe especificar una

carpeta existente en el servidor que esta instalado en el SQL

Size ndash Especifica el tamantildeo del Archivo

Maxsize ndashEspecifica el tamantildeo maacuteximo que puede alcanzar el archive si se requiere espacio adicional

Filegrowth ndashEs la cantidad de espacio que se antildeade al archive cada vez que se necesita espacio

adicional Se puede especificar en MB o en porcentaje

Cuando se crea una base de datos su nombre se registra en la tabla del sistema Sysdatabases

de la base de datos master

Para comprobar si la base de datos existe ejecutaremos la siguiente sentencia SQL

Se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el Use Go

Use master

Go

Luego se procederaacute abrir la tabla Sysdatabases y ahiacute se podraacute visualizar si la base de datos ah

sido creada

Select from Sysdatabases

Luego se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el go

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 3: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 3

Nota Los tipos de datos Unicode de SQL Server se basan en los tipos de datos National Character

del conjunto de normas SQL-92 SQL-92 utiliza el caraacutecter n como prefijo para identificar estos

tipos de datos y valores

Datos de fecha y hora

Los datos de fecha y hora constan de combinaciones vaacutelidas de fecha y hora Por ejemplo datos vaacutelidos

de fecha y hora pueden ser 40198 1215000000 pm y 128291501 am 17898 Los datos de

fecha y hora se almacenan utilizando los tipos de datos datetime y smalldatetime de Microsoftreg SQL

Servertrade 2005 Utilice datetime para almacenar datos del intervalo que va desde el 1 de enero de 1753

hasta el 31 de diciembre del 9999 (para cada valor se necesitan 8 bytes de espacio de almacenamiento)

Utilice smalldatetime para almacenar fechas en el intervalo que va desde el 1 de enero de 1900 hasta el

6 de junio del antildeo 2079 (para cada valor se necesitan 4 bytes de espacio de almacenamiento)

Datos numeacutericos

Los datos numeacutericos se componen exclusivamente de nuacutemeros Incluyen nuacutemeros positivos y negativos

decimales fracciones y nuacutemeros enteros

Datos enteros

Los datos enteros constan de nuacutemeros enteros positivos o negativos como ndash15 0 5 y 2509 Los datos

enteros se almacenan utilizando los tipos de datos bigint int smallint y tinyint de Microsoftreg SQL

Servertrade 2005 El tipo de datos bigint puede almacenar un intervalo de nuacutemeros mayor que el tipo de

datos int El tipo de datos int puede almacenar un intervalo mayor de enteros que smallint que a su vez

puede almacenar un intervalo mayor de nuacutemeros que tinyint

Utilice el tipo de datos bigint para almacenar nuacutemeros del intervalo comprendido entre -2^63 (-

9223372036854775808) y 2^63-1 (9223372036854775807) El tamantildeo de almacenamiento es de 8

bytes

Utilice el tipo de datos int para almacenar nuacutemeros del intervalo comprendido entre -2147483648 y

2147483647 (para cada valor se necesitan 4 bytes de espacio de almacenamiento)

Utilice el tipo de datos smallint para almacenar nuacutemeros del intervalo que va desde -32768 hasta

32767 (para cada valor se necesitan 2 bytes de espacio de almacenamiento) y el tipo de datos tinyint

para almacenar nuacutemeros del intervalo que va desde 0 hasta 255 (para cada valor se necesita 1 byte de

espacio de almacenamiento)

Datos decimales

Los datos decimales se componen de datos de los que se almacena hasta el diacutegito menos significativo

Estos datos se almacenan mediante los tipos de datos decimal o numeric de SQL Server El nuacutemero de

bytes necesarios para almacenar un valor decimal o numeric depende del nuacutemero total de diacutegitos de

datos y del nuacutemero de cifras a la derecha del separador decimal Por ejemplo se necesitan maacutes bytes

para almacenar el valor 1928329383 que para almacenar el valor 11

En SQL Server el tipo de datos numeric es sinoacutenimo del tipo de datos decimal

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 4

Datos numeacutericos aproximados

Los datos numeacutericos aproximados (coma flotante) constan de datos que se almacenan con tanta

precisioacuten como permite el sistema de numeracioacuten binario Los datos numeacutericos aproximados se

almacenan mediante los tipos de datos float y real de SQL Server Por ejemplo dado que en notacioacuten

decimal la fraccioacuten un tercio se expresa como 0333333 (hasta el infinito) este valor no se puede

representar con total precisioacuten mediante los datos decimales aproximados Por lo tanto el valor

recuperado de SQL Server puede no coincidir exactamente con el que se almacenoacute originalmente en la

columna Otros ejemplos de aproximaciones numeacutericas son los valores de coma flotante que acaban en

03 06 y 07

Datos de moneda

Los datos de moneda representan cantidades positivas o negativas de dinero Los datos de moneda se

almacenan utilizando los tipos de datos money y smallmoney de Microsoftreg SQL Servertrade 2005 Los

datos de moneda pueden almacenarse con una precisioacuten maacutexima de cuatro decimales Utilice el tipo de

datos money para almacenar valores del intervalo comprendido entre -9223372036854775808 y

+9223372036854775807 (para almacenar cada valor se necesitan 8 bytes) Utilice el tipo de datos

smallmoney para almacenar valores del intervalo comprendido entre -2147483648 y 2147483647

(para almacenar cada valor se necesitan 4 bytes) Si se necesita un nuacutemero mayor de decimales utilice

el tipo de datos decimal

Datos especiales

Los datos especiales son aqueacutellos que no se ajustan a ninguna de las categoriacuteas de datos como los datos

binarios de caraacutecter Unicode de fecha y hora numeacutericos y de moneda

Microsoftreg SQL Servertrade 2005 incluye cuatro tipos de datos especiales

timestamp

Se utiliza para indicar la secuencia de actividades de SQL Server en una fila representada

como un nuacutemero creciente en formato binario Cuando se modifica una fila de una tabla el valor

de timestamp (la marca de tiempo) se actualiza con el valor actual de timestamp de la base de

datos que se obtiene con la funcioacuten DBTS Los datos de tipo timestamp no estaacuten

relacionados con la fecha ni la hora de una insercioacuten ni de un cambio en los datos Si desea

registrar automaacuteticamente en queacute momento se producen modificaciones en una tabla utilice un

tipo de datos datetime o smalldatetime para registrar los sucesos y los desencadenadores

Nota En SQL Server rowversion es un sinoacutenimo de timestamp

bit

Puede ser un 1 o un 0 Utilice el tipo de datos bit para representar los valores TRUE

(verdadero) o FALSE (falso) o YES o NO Por ejemplo un cuestionario para los clientes en el

que se pregunte si eacutesta es la primera visita del cliente puede almacenarse en una columna de

tipo bit

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 5

uniqueidentifier

Se trata de un nuacutemero hexadecimal de 16 bytes que hace referencia a un identificador

exclusivo global (GUID) El GUID es especialmente uacutetil cuando una fila debe ser uacutenica entre

otras muchas Por ejemplo utilice el tipo de datos uniqueidentifier en una columna con nuacutemeros

de identificacioacuten de los clientes para compilar una lista de clientes de una compantildeiacutea en varios

paiacuteses

sql_variant

Un tipo de datos que almacena valores de varios tipos de datos aceptados en SQL Server

excepto text ntext timestamp y sql_variant

table

Un tipo de datos especial que se utiliza para almacenar un conjunto de resultados para su

proceso posterior El tipo de datos table soacutelo puede utilizarse para definir variables locales del

tipo table o el valor de retorno de una funcioacuten definida por el usuario

definidas por el usuario

Permite que el usuario defina tipos de datos como por ejemplo product_code que se basa en

el tipo de datos char y que consta de dos letras mayuacutesculas seguidas de un nuacutemero de

proveedor de cinco cifras

Definir una clave principal

Defina una Clave Principalcpara exigir que se escriban valores uacutenicos en columnas especificadas que no

permiten nulos Si define una clave principal para una tabla en la base de datos puede relacionar esa

tabla con otras tablas asiacute se reduce la necesidad de datos redundantes Una tabla soacutelo puede tener una

clave principal

Para definir una clave principal

1 En el diagrama de base de datos o en el Disentildeador de tablas haga clic en el selector de fila de

la columna de la base de datos que desee definir como clave principal Si desea seleccionar

varias columnas mantenga presionada la tecla CTRL mientras hace clic en los selectores de fila

para las otras columnas

2 Haga clic con el botoacuten secundario en el selector de fila para la columna y seleccione Establecer

clave principal En la ficha Iacutendices y claves de las paacuteginas de propiedades se crea

automaacuteticamente un iacutendice de clave principal denominado PK_ seguido del nombre de la tabla

Advertencia Si desea volver a definir la clave principal se deben eliminar las relaciones con la clave

principal existente antes de poder crear la nueva clave principal Un mensaje comunicaraacute que las

relaciones existentes se eliminaraacuten automaacuteticamente como parte de este proceso

Una columna de clave principal se identifica por un siacutembolo de llave principal en el selector de fila

Si una clave principal consta de maacutes de una columna se permiten valores duplicados en una columna

pero cada combinacioacuten de valores de todas las columnas de la clave principal debe ser uacutenica

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 6

Coacutemo crear una relacioacuten de varios a varios entre tablas

Para crear una relacioacuten de varios a varios entre tablas

1 Abra un diagrama de base de datos

2 Agregue las tablas entre las que desea crear una relacioacuten de varios a varios

3 Cree una tercera tabla Para ello haga clic con el botoacuten secundario del mouse dentro del

diagrama de la base de datos y a continuacioacuten haga clic en Nueva tabla

Eacutesta se convertiraacute en la tabla de unioacuten

4 En el cuadro de diaacutelogo Elegir nombre escriba un nombre para la tabla

Por ejemplo la tabla de unioacuten entre la tabla de tiacutetulos y la tabla de autores se llama

titleauthors

5 Copie las columnas de clave principal de cada una de las otras dos tablas en la tabla de unioacuten

Puede agregar otras columnas a esta tabla igual que en cualquier otra tabla

6 En la tabla de unioacuten establezca la clave principal para que incluya todas las columnas de la clave

principal de las otras dos tablas

7 Defina una relacioacuten de uno a varios entre cada una de las dos tablas principales y la tabla de

unioacuten

Fundamentos de Programacioacuten con SQL Existen 3 tipos de instrucciones para el lenguaje en SQL

- Lenguaje de control de datos (DDL) Creacioacuten y eliminacioacuten de tipos de datos y objetos

CREATE Crear Objeto

ALTER Modificar los datos creados

DROP Eliminar el Objeto

- Lenguaje de control de datos (DCL) Se basa en los derechos que tiene el usuario sobre la

base da datos (Permisos)

GRANT Dar permisos a un usuario para efectuar determinadas

Instrucciones

DENY Eliminar el permiso que se ha concedido con el GRANT

REVOKE Eliminar todos los permisos

- Lenguaje de manipulacioacuten de datos (DML) Desarrollo de la programacioacuten de la base de

datos

SELECT

INSERT

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 7

UPDATE

DELETE

Elementos de sintaxis

Directivas de procesos por lotes

- GO Enviacutea lotes de instrucciones de TRANSACT SQL a las herramientas y utilidades (Sirve

para separar bloques de instrucciones)

- EXEC O EXECUTE Ejecuta funciones definidas por el usuario procedimientos de sistema

y procedimientos almacenados

Comentarios en SQL

- En liacutenea --

- En Bloque comentario

Tablas en SQL

Tabla master Es la tabla que contiene como generar una base de datos y sobre ella

se crean todas las bases de datos

Tabla model Es la tabla modelo las bases de datos creadas se basan en esta tabla

como modelo

Tabla Northwind y Pubs Son tablas de ejemplos que vienen con SQL y todo usuario

puede trabajar con ellas

Identificadores para los objetos

Los nombres que se le dan a las tablas lo primero es que no pueden empezar por un nuacutemero

deben empezar por un signo alfabeacutetico pueden incluir el guion bajo (_) la arroba y la

almohadilla

Generalmente para las variables locales se usan + el nombre

EJEMPLO Contador

Para las variables totales se usan dos arrobas + el nombre Contador

EJEMPLO Error

Nombre indica una tabla o procedimiento temporal (Local)

Nombre Igual que el anterior pero global

Tipos de datos

- Numeacutericos

Enteros int tinyint smallint bigint

Decimales numeric decimal money smallmoney

Coma Flotante float real

- Fechas

datetime 0333 s

smalldatetime 1 minuto

- Caracteres

Ancho fijo char nchar

Ancho Variable varchar nvarchar

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 8

- Texto e Imagen

Text

Ntext

Rowversion

- Binario

Binary varbinary Valores tipo byte

Bit Un solo bit (1 o ninguno)

- Identificadores Uacutenicos

Representa un identificador global uacutenico (GUID)

Si queremos que no se repita el dato en la base de datos usamos este identificador

Uniqueidentifier

Operadores de SQL

Loacutegicos

AND OR NOT

De Comparacioacuten

= Igual

lt Menor

gt Mayor

ltgt Diferente

gt= Mayor o igual

lt= Menor o igual

Crear una Base de Datos Utilizando el Lenguaje SQL

Ejemplo

Para crear la base de datos es la siguiente opcioacuten database seguido del nombre de la Base de Datos

--Create database Itae

On primary

(Name= Itae _data Filename=C itaemdf size=10 maxsize=15 filegrowth=25)

Log On

(Name= Itae _log filename=C itaeldf size=4 maxsize=6 filegrowth=1MB)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 9

Despueacutes de la sentencia Create database Se especifica el nombre de la base de datos Un

nombre en la base de datos debe de ser uacutenico en el servidor

Name- Es el nombre a utilizar cuando una sentencia SQL se tiene que hacer referencia al archivo de

datos o al archivo log respectivamente

Filename- Es una cadena que incluye la ruta y el nombre del archivo La ruta debe especificar una

carpeta existente en el servidor que esta instalado en el SQL

Size ndash Especifica el tamantildeo del Archivo

Maxsize ndashEspecifica el tamantildeo maacuteximo que puede alcanzar el archive si se requiere espacio adicional

Filegrowth ndashEs la cantidad de espacio que se antildeade al archive cada vez que se necesita espacio

adicional Se puede especificar en MB o en porcentaje

Cuando se crea una base de datos su nombre se registra en la tabla del sistema Sysdatabases

de la base de datos master

Para comprobar si la base de datos existe ejecutaremos la siguiente sentencia SQL

Se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el Use Go

Use master

Go

Luego se procederaacute abrir la tabla Sysdatabases y ahiacute se podraacute visualizar si la base de datos ah

sido creada

Select from Sysdatabases

Luego se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el go

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 4: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 4

Datos numeacutericos aproximados

Los datos numeacutericos aproximados (coma flotante) constan de datos que se almacenan con tanta

precisioacuten como permite el sistema de numeracioacuten binario Los datos numeacutericos aproximados se

almacenan mediante los tipos de datos float y real de SQL Server Por ejemplo dado que en notacioacuten

decimal la fraccioacuten un tercio se expresa como 0333333 (hasta el infinito) este valor no se puede

representar con total precisioacuten mediante los datos decimales aproximados Por lo tanto el valor

recuperado de SQL Server puede no coincidir exactamente con el que se almacenoacute originalmente en la

columna Otros ejemplos de aproximaciones numeacutericas son los valores de coma flotante que acaban en

03 06 y 07

Datos de moneda

Los datos de moneda representan cantidades positivas o negativas de dinero Los datos de moneda se

almacenan utilizando los tipos de datos money y smallmoney de Microsoftreg SQL Servertrade 2005 Los

datos de moneda pueden almacenarse con una precisioacuten maacutexima de cuatro decimales Utilice el tipo de

datos money para almacenar valores del intervalo comprendido entre -9223372036854775808 y

+9223372036854775807 (para almacenar cada valor se necesitan 8 bytes) Utilice el tipo de datos

smallmoney para almacenar valores del intervalo comprendido entre -2147483648 y 2147483647

(para almacenar cada valor se necesitan 4 bytes) Si se necesita un nuacutemero mayor de decimales utilice

el tipo de datos decimal

Datos especiales

Los datos especiales son aqueacutellos que no se ajustan a ninguna de las categoriacuteas de datos como los datos

binarios de caraacutecter Unicode de fecha y hora numeacutericos y de moneda

Microsoftreg SQL Servertrade 2005 incluye cuatro tipos de datos especiales

timestamp

Se utiliza para indicar la secuencia de actividades de SQL Server en una fila representada

como un nuacutemero creciente en formato binario Cuando se modifica una fila de una tabla el valor

de timestamp (la marca de tiempo) se actualiza con el valor actual de timestamp de la base de

datos que se obtiene con la funcioacuten DBTS Los datos de tipo timestamp no estaacuten

relacionados con la fecha ni la hora de una insercioacuten ni de un cambio en los datos Si desea

registrar automaacuteticamente en queacute momento se producen modificaciones en una tabla utilice un

tipo de datos datetime o smalldatetime para registrar los sucesos y los desencadenadores

Nota En SQL Server rowversion es un sinoacutenimo de timestamp

bit

Puede ser un 1 o un 0 Utilice el tipo de datos bit para representar los valores TRUE

(verdadero) o FALSE (falso) o YES o NO Por ejemplo un cuestionario para los clientes en el

que se pregunte si eacutesta es la primera visita del cliente puede almacenarse en una columna de

tipo bit

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 5

uniqueidentifier

Se trata de un nuacutemero hexadecimal de 16 bytes que hace referencia a un identificador

exclusivo global (GUID) El GUID es especialmente uacutetil cuando una fila debe ser uacutenica entre

otras muchas Por ejemplo utilice el tipo de datos uniqueidentifier en una columna con nuacutemeros

de identificacioacuten de los clientes para compilar una lista de clientes de una compantildeiacutea en varios

paiacuteses

sql_variant

Un tipo de datos que almacena valores de varios tipos de datos aceptados en SQL Server

excepto text ntext timestamp y sql_variant

table

Un tipo de datos especial que se utiliza para almacenar un conjunto de resultados para su

proceso posterior El tipo de datos table soacutelo puede utilizarse para definir variables locales del

tipo table o el valor de retorno de una funcioacuten definida por el usuario

definidas por el usuario

Permite que el usuario defina tipos de datos como por ejemplo product_code que se basa en

el tipo de datos char y que consta de dos letras mayuacutesculas seguidas de un nuacutemero de

proveedor de cinco cifras

Definir una clave principal

Defina una Clave Principalcpara exigir que se escriban valores uacutenicos en columnas especificadas que no

permiten nulos Si define una clave principal para una tabla en la base de datos puede relacionar esa

tabla con otras tablas asiacute se reduce la necesidad de datos redundantes Una tabla soacutelo puede tener una

clave principal

Para definir una clave principal

1 En el diagrama de base de datos o en el Disentildeador de tablas haga clic en el selector de fila de

la columna de la base de datos que desee definir como clave principal Si desea seleccionar

varias columnas mantenga presionada la tecla CTRL mientras hace clic en los selectores de fila

para las otras columnas

2 Haga clic con el botoacuten secundario en el selector de fila para la columna y seleccione Establecer

clave principal En la ficha Iacutendices y claves de las paacuteginas de propiedades se crea

automaacuteticamente un iacutendice de clave principal denominado PK_ seguido del nombre de la tabla

Advertencia Si desea volver a definir la clave principal se deben eliminar las relaciones con la clave

principal existente antes de poder crear la nueva clave principal Un mensaje comunicaraacute que las

relaciones existentes se eliminaraacuten automaacuteticamente como parte de este proceso

Una columna de clave principal se identifica por un siacutembolo de llave principal en el selector de fila

Si una clave principal consta de maacutes de una columna se permiten valores duplicados en una columna

pero cada combinacioacuten de valores de todas las columnas de la clave principal debe ser uacutenica

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 6

Coacutemo crear una relacioacuten de varios a varios entre tablas

Para crear una relacioacuten de varios a varios entre tablas

1 Abra un diagrama de base de datos

2 Agregue las tablas entre las que desea crear una relacioacuten de varios a varios

3 Cree una tercera tabla Para ello haga clic con el botoacuten secundario del mouse dentro del

diagrama de la base de datos y a continuacioacuten haga clic en Nueva tabla

Eacutesta se convertiraacute en la tabla de unioacuten

4 En el cuadro de diaacutelogo Elegir nombre escriba un nombre para la tabla

Por ejemplo la tabla de unioacuten entre la tabla de tiacutetulos y la tabla de autores se llama

titleauthors

5 Copie las columnas de clave principal de cada una de las otras dos tablas en la tabla de unioacuten

Puede agregar otras columnas a esta tabla igual que en cualquier otra tabla

6 En la tabla de unioacuten establezca la clave principal para que incluya todas las columnas de la clave

principal de las otras dos tablas

7 Defina una relacioacuten de uno a varios entre cada una de las dos tablas principales y la tabla de

unioacuten

Fundamentos de Programacioacuten con SQL Existen 3 tipos de instrucciones para el lenguaje en SQL

- Lenguaje de control de datos (DDL) Creacioacuten y eliminacioacuten de tipos de datos y objetos

CREATE Crear Objeto

ALTER Modificar los datos creados

DROP Eliminar el Objeto

- Lenguaje de control de datos (DCL) Se basa en los derechos que tiene el usuario sobre la

base da datos (Permisos)

GRANT Dar permisos a un usuario para efectuar determinadas

Instrucciones

DENY Eliminar el permiso que se ha concedido con el GRANT

REVOKE Eliminar todos los permisos

- Lenguaje de manipulacioacuten de datos (DML) Desarrollo de la programacioacuten de la base de

datos

SELECT

INSERT

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 7

UPDATE

DELETE

Elementos de sintaxis

Directivas de procesos por lotes

- GO Enviacutea lotes de instrucciones de TRANSACT SQL a las herramientas y utilidades (Sirve

para separar bloques de instrucciones)

- EXEC O EXECUTE Ejecuta funciones definidas por el usuario procedimientos de sistema

y procedimientos almacenados

Comentarios en SQL

- En liacutenea --

- En Bloque comentario

Tablas en SQL

Tabla master Es la tabla que contiene como generar una base de datos y sobre ella

se crean todas las bases de datos

Tabla model Es la tabla modelo las bases de datos creadas se basan en esta tabla

como modelo

Tabla Northwind y Pubs Son tablas de ejemplos que vienen con SQL y todo usuario

puede trabajar con ellas

Identificadores para los objetos

Los nombres que se le dan a las tablas lo primero es que no pueden empezar por un nuacutemero

deben empezar por un signo alfabeacutetico pueden incluir el guion bajo (_) la arroba y la

almohadilla

Generalmente para las variables locales se usan + el nombre

EJEMPLO Contador

Para las variables totales se usan dos arrobas + el nombre Contador

EJEMPLO Error

Nombre indica una tabla o procedimiento temporal (Local)

Nombre Igual que el anterior pero global

Tipos de datos

- Numeacutericos

Enteros int tinyint smallint bigint

Decimales numeric decimal money smallmoney

Coma Flotante float real

- Fechas

datetime 0333 s

smalldatetime 1 minuto

- Caracteres

Ancho fijo char nchar

Ancho Variable varchar nvarchar

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 8

- Texto e Imagen

Text

Ntext

Rowversion

- Binario

Binary varbinary Valores tipo byte

Bit Un solo bit (1 o ninguno)

- Identificadores Uacutenicos

Representa un identificador global uacutenico (GUID)

Si queremos que no se repita el dato en la base de datos usamos este identificador

Uniqueidentifier

Operadores de SQL

Loacutegicos

AND OR NOT

De Comparacioacuten

= Igual

lt Menor

gt Mayor

ltgt Diferente

gt= Mayor o igual

lt= Menor o igual

Crear una Base de Datos Utilizando el Lenguaje SQL

Ejemplo

Para crear la base de datos es la siguiente opcioacuten database seguido del nombre de la Base de Datos

--Create database Itae

On primary

(Name= Itae _data Filename=C itaemdf size=10 maxsize=15 filegrowth=25)

Log On

(Name= Itae _log filename=C itaeldf size=4 maxsize=6 filegrowth=1MB)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 9

Despueacutes de la sentencia Create database Se especifica el nombre de la base de datos Un

nombre en la base de datos debe de ser uacutenico en el servidor

Name- Es el nombre a utilizar cuando una sentencia SQL se tiene que hacer referencia al archivo de

datos o al archivo log respectivamente

Filename- Es una cadena que incluye la ruta y el nombre del archivo La ruta debe especificar una

carpeta existente en el servidor que esta instalado en el SQL

Size ndash Especifica el tamantildeo del Archivo

Maxsize ndashEspecifica el tamantildeo maacuteximo que puede alcanzar el archive si se requiere espacio adicional

Filegrowth ndashEs la cantidad de espacio que se antildeade al archive cada vez que se necesita espacio

adicional Se puede especificar en MB o en porcentaje

Cuando se crea una base de datos su nombre se registra en la tabla del sistema Sysdatabases

de la base de datos master

Para comprobar si la base de datos existe ejecutaremos la siguiente sentencia SQL

Se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el Use Go

Use master

Go

Luego se procederaacute abrir la tabla Sysdatabases y ahiacute se podraacute visualizar si la base de datos ah

sido creada

Select from Sysdatabases

Luego se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el go

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 5: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 5

uniqueidentifier

Se trata de un nuacutemero hexadecimal de 16 bytes que hace referencia a un identificador

exclusivo global (GUID) El GUID es especialmente uacutetil cuando una fila debe ser uacutenica entre

otras muchas Por ejemplo utilice el tipo de datos uniqueidentifier en una columna con nuacutemeros

de identificacioacuten de los clientes para compilar una lista de clientes de una compantildeiacutea en varios

paiacuteses

sql_variant

Un tipo de datos que almacena valores de varios tipos de datos aceptados en SQL Server

excepto text ntext timestamp y sql_variant

table

Un tipo de datos especial que se utiliza para almacenar un conjunto de resultados para su

proceso posterior El tipo de datos table soacutelo puede utilizarse para definir variables locales del

tipo table o el valor de retorno de una funcioacuten definida por el usuario

definidas por el usuario

Permite que el usuario defina tipos de datos como por ejemplo product_code que se basa en

el tipo de datos char y que consta de dos letras mayuacutesculas seguidas de un nuacutemero de

proveedor de cinco cifras

Definir una clave principal

Defina una Clave Principalcpara exigir que se escriban valores uacutenicos en columnas especificadas que no

permiten nulos Si define una clave principal para una tabla en la base de datos puede relacionar esa

tabla con otras tablas asiacute se reduce la necesidad de datos redundantes Una tabla soacutelo puede tener una

clave principal

Para definir una clave principal

1 En el diagrama de base de datos o en el Disentildeador de tablas haga clic en el selector de fila de

la columna de la base de datos que desee definir como clave principal Si desea seleccionar

varias columnas mantenga presionada la tecla CTRL mientras hace clic en los selectores de fila

para las otras columnas

2 Haga clic con el botoacuten secundario en el selector de fila para la columna y seleccione Establecer

clave principal En la ficha Iacutendices y claves de las paacuteginas de propiedades se crea

automaacuteticamente un iacutendice de clave principal denominado PK_ seguido del nombre de la tabla

Advertencia Si desea volver a definir la clave principal se deben eliminar las relaciones con la clave

principal existente antes de poder crear la nueva clave principal Un mensaje comunicaraacute que las

relaciones existentes se eliminaraacuten automaacuteticamente como parte de este proceso

Una columna de clave principal se identifica por un siacutembolo de llave principal en el selector de fila

Si una clave principal consta de maacutes de una columna se permiten valores duplicados en una columna

pero cada combinacioacuten de valores de todas las columnas de la clave principal debe ser uacutenica

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 6

Coacutemo crear una relacioacuten de varios a varios entre tablas

Para crear una relacioacuten de varios a varios entre tablas

1 Abra un diagrama de base de datos

2 Agregue las tablas entre las que desea crear una relacioacuten de varios a varios

3 Cree una tercera tabla Para ello haga clic con el botoacuten secundario del mouse dentro del

diagrama de la base de datos y a continuacioacuten haga clic en Nueva tabla

Eacutesta se convertiraacute en la tabla de unioacuten

4 En el cuadro de diaacutelogo Elegir nombre escriba un nombre para la tabla

Por ejemplo la tabla de unioacuten entre la tabla de tiacutetulos y la tabla de autores se llama

titleauthors

5 Copie las columnas de clave principal de cada una de las otras dos tablas en la tabla de unioacuten

Puede agregar otras columnas a esta tabla igual que en cualquier otra tabla

6 En la tabla de unioacuten establezca la clave principal para que incluya todas las columnas de la clave

principal de las otras dos tablas

7 Defina una relacioacuten de uno a varios entre cada una de las dos tablas principales y la tabla de

unioacuten

Fundamentos de Programacioacuten con SQL Existen 3 tipos de instrucciones para el lenguaje en SQL

- Lenguaje de control de datos (DDL) Creacioacuten y eliminacioacuten de tipos de datos y objetos

CREATE Crear Objeto

ALTER Modificar los datos creados

DROP Eliminar el Objeto

- Lenguaje de control de datos (DCL) Se basa en los derechos que tiene el usuario sobre la

base da datos (Permisos)

GRANT Dar permisos a un usuario para efectuar determinadas

Instrucciones

DENY Eliminar el permiso que se ha concedido con el GRANT

REVOKE Eliminar todos los permisos

- Lenguaje de manipulacioacuten de datos (DML) Desarrollo de la programacioacuten de la base de

datos

SELECT

INSERT

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 7

UPDATE

DELETE

Elementos de sintaxis

Directivas de procesos por lotes

- GO Enviacutea lotes de instrucciones de TRANSACT SQL a las herramientas y utilidades (Sirve

para separar bloques de instrucciones)

- EXEC O EXECUTE Ejecuta funciones definidas por el usuario procedimientos de sistema

y procedimientos almacenados

Comentarios en SQL

- En liacutenea --

- En Bloque comentario

Tablas en SQL

Tabla master Es la tabla que contiene como generar una base de datos y sobre ella

se crean todas las bases de datos

Tabla model Es la tabla modelo las bases de datos creadas se basan en esta tabla

como modelo

Tabla Northwind y Pubs Son tablas de ejemplos que vienen con SQL y todo usuario

puede trabajar con ellas

Identificadores para los objetos

Los nombres que se le dan a las tablas lo primero es que no pueden empezar por un nuacutemero

deben empezar por un signo alfabeacutetico pueden incluir el guion bajo (_) la arroba y la

almohadilla

Generalmente para las variables locales se usan + el nombre

EJEMPLO Contador

Para las variables totales se usan dos arrobas + el nombre Contador

EJEMPLO Error

Nombre indica una tabla o procedimiento temporal (Local)

Nombre Igual que el anterior pero global

Tipos de datos

- Numeacutericos

Enteros int tinyint smallint bigint

Decimales numeric decimal money smallmoney

Coma Flotante float real

- Fechas

datetime 0333 s

smalldatetime 1 minuto

- Caracteres

Ancho fijo char nchar

Ancho Variable varchar nvarchar

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 8

- Texto e Imagen

Text

Ntext

Rowversion

- Binario

Binary varbinary Valores tipo byte

Bit Un solo bit (1 o ninguno)

- Identificadores Uacutenicos

Representa un identificador global uacutenico (GUID)

Si queremos que no se repita el dato en la base de datos usamos este identificador

Uniqueidentifier

Operadores de SQL

Loacutegicos

AND OR NOT

De Comparacioacuten

= Igual

lt Menor

gt Mayor

ltgt Diferente

gt= Mayor o igual

lt= Menor o igual

Crear una Base de Datos Utilizando el Lenguaje SQL

Ejemplo

Para crear la base de datos es la siguiente opcioacuten database seguido del nombre de la Base de Datos

--Create database Itae

On primary

(Name= Itae _data Filename=C itaemdf size=10 maxsize=15 filegrowth=25)

Log On

(Name= Itae _log filename=C itaeldf size=4 maxsize=6 filegrowth=1MB)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 9

Despueacutes de la sentencia Create database Se especifica el nombre de la base de datos Un

nombre en la base de datos debe de ser uacutenico en el servidor

Name- Es el nombre a utilizar cuando una sentencia SQL se tiene que hacer referencia al archivo de

datos o al archivo log respectivamente

Filename- Es una cadena que incluye la ruta y el nombre del archivo La ruta debe especificar una

carpeta existente en el servidor que esta instalado en el SQL

Size ndash Especifica el tamantildeo del Archivo

Maxsize ndashEspecifica el tamantildeo maacuteximo que puede alcanzar el archive si se requiere espacio adicional

Filegrowth ndashEs la cantidad de espacio que se antildeade al archive cada vez que se necesita espacio

adicional Se puede especificar en MB o en porcentaje

Cuando se crea una base de datos su nombre se registra en la tabla del sistema Sysdatabases

de la base de datos master

Para comprobar si la base de datos existe ejecutaremos la siguiente sentencia SQL

Se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el Use Go

Use master

Go

Luego se procederaacute abrir la tabla Sysdatabases y ahiacute se podraacute visualizar si la base de datos ah

sido creada

Select from Sysdatabases

Luego se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el go

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 6: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 6

Coacutemo crear una relacioacuten de varios a varios entre tablas

Para crear una relacioacuten de varios a varios entre tablas

1 Abra un diagrama de base de datos

2 Agregue las tablas entre las que desea crear una relacioacuten de varios a varios

3 Cree una tercera tabla Para ello haga clic con el botoacuten secundario del mouse dentro del

diagrama de la base de datos y a continuacioacuten haga clic en Nueva tabla

Eacutesta se convertiraacute en la tabla de unioacuten

4 En el cuadro de diaacutelogo Elegir nombre escriba un nombre para la tabla

Por ejemplo la tabla de unioacuten entre la tabla de tiacutetulos y la tabla de autores se llama

titleauthors

5 Copie las columnas de clave principal de cada una de las otras dos tablas en la tabla de unioacuten

Puede agregar otras columnas a esta tabla igual que en cualquier otra tabla

6 En la tabla de unioacuten establezca la clave principal para que incluya todas las columnas de la clave

principal de las otras dos tablas

7 Defina una relacioacuten de uno a varios entre cada una de las dos tablas principales y la tabla de

unioacuten

Fundamentos de Programacioacuten con SQL Existen 3 tipos de instrucciones para el lenguaje en SQL

- Lenguaje de control de datos (DDL) Creacioacuten y eliminacioacuten de tipos de datos y objetos

CREATE Crear Objeto

ALTER Modificar los datos creados

DROP Eliminar el Objeto

- Lenguaje de control de datos (DCL) Se basa en los derechos que tiene el usuario sobre la

base da datos (Permisos)

GRANT Dar permisos a un usuario para efectuar determinadas

Instrucciones

DENY Eliminar el permiso que se ha concedido con el GRANT

REVOKE Eliminar todos los permisos

- Lenguaje de manipulacioacuten de datos (DML) Desarrollo de la programacioacuten de la base de

datos

SELECT

INSERT

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 7

UPDATE

DELETE

Elementos de sintaxis

Directivas de procesos por lotes

- GO Enviacutea lotes de instrucciones de TRANSACT SQL a las herramientas y utilidades (Sirve

para separar bloques de instrucciones)

- EXEC O EXECUTE Ejecuta funciones definidas por el usuario procedimientos de sistema

y procedimientos almacenados

Comentarios en SQL

- En liacutenea --

- En Bloque comentario

Tablas en SQL

Tabla master Es la tabla que contiene como generar una base de datos y sobre ella

se crean todas las bases de datos

Tabla model Es la tabla modelo las bases de datos creadas se basan en esta tabla

como modelo

Tabla Northwind y Pubs Son tablas de ejemplos que vienen con SQL y todo usuario

puede trabajar con ellas

Identificadores para los objetos

Los nombres que se le dan a las tablas lo primero es que no pueden empezar por un nuacutemero

deben empezar por un signo alfabeacutetico pueden incluir el guion bajo (_) la arroba y la

almohadilla

Generalmente para las variables locales se usan + el nombre

EJEMPLO Contador

Para las variables totales se usan dos arrobas + el nombre Contador

EJEMPLO Error

Nombre indica una tabla o procedimiento temporal (Local)

Nombre Igual que el anterior pero global

Tipos de datos

- Numeacutericos

Enteros int tinyint smallint bigint

Decimales numeric decimal money smallmoney

Coma Flotante float real

- Fechas

datetime 0333 s

smalldatetime 1 minuto

- Caracteres

Ancho fijo char nchar

Ancho Variable varchar nvarchar

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 8

- Texto e Imagen

Text

Ntext

Rowversion

- Binario

Binary varbinary Valores tipo byte

Bit Un solo bit (1 o ninguno)

- Identificadores Uacutenicos

Representa un identificador global uacutenico (GUID)

Si queremos que no se repita el dato en la base de datos usamos este identificador

Uniqueidentifier

Operadores de SQL

Loacutegicos

AND OR NOT

De Comparacioacuten

= Igual

lt Menor

gt Mayor

ltgt Diferente

gt= Mayor o igual

lt= Menor o igual

Crear una Base de Datos Utilizando el Lenguaje SQL

Ejemplo

Para crear la base de datos es la siguiente opcioacuten database seguido del nombre de la Base de Datos

--Create database Itae

On primary

(Name= Itae _data Filename=C itaemdf size=10 maxsize=15 filegrowth=25)

Log On

(Name= Itae _log filename=C itaeldf size=4 maxsize=6 filegrowth=1MB)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 9

Despueacutes de la sentencia Create database Se especifica el nombre de la base de datos Un

nombre en la base de datos debe de ser uacutenico en el servidor

Name- Es el nombre a utilizar cuando una sentencia SQL se tiene que hacer referencia al archivo de

datos o al archivo log respectivamente

Filename- Es una cadena que incluye la ruta y el nombre del archivo La ruta debe especificar una

carpeta existente en el servidor que esta instalado en el SQL

Size ndash Especifica el tamantildeo del Archivo

Maxsize ndashEspecifica el tamantildeo maacuteximo que puede alcanzar el archive si se requiere espacio adicional

Filegrowth ndashEs la cantidad de espacio que se antildeade al archive cada vez que se necesita espacio

adicional Se puede especificar en MB o en porcentaje

Cuando se crea una base de datos su nombre se registra en la tabla del sistema Sysdatabases

de la base de datos master

Para comprobar si la base de datos existe ejecutaremos la siguiente sentencia SQL

Se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el Use Go

Use master

Go

Luego se procederaacute abrir la tabla Sysdatabases y ahiacute se podraacute visualizar si la base de datos ah

sido creada

Select from Sysdatabases

Luego se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el go

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 7: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 7

UPDATE

DELETE

Elementos de sintaxis

Directivas de procesos por lotes

- GO Enviacutea lotes de instrucciones de TRANSACT SQL a las herramientas y utilidades (Sirve

para separar bloques de instrucciones)

- EXEC O EXECUTE Ejecuta funciones definidas por el usuario procedimientos de sistema

y procedimientos almacenados

Comentarios en SQL

- En liacutenea --

- En Bloque comentario

Tablas en SQL

Tabla master Es la tabla que contiene como generar una base de datos y sobre ella

se crean todas las bases de datos

Tabla model Es la tabla modelo las bases de datos creadas se basan en esta tabla

como modelo

Tabla Northwind y Pubs Son tablas de ejemplos que vienen con SQL y todo usuario

puede trabajar con ellas

Identificadores para los objetos

Los nombres que se le dan a las tablas lo primero es que no pueden empezar por un nuacutemero

deben empezar por un signo alfabeacutetico pueden incluir el guion bajo (_) la arroba y la

almohadilla

Generalmente para las variables locales se usan + el nombre

EJEMPLO Contador

Para las variables totales se usan dos arrobas + el nombre Contador

EJEMPLO Error

Nombre indica una tabla o procedimiento temporal (Local)

Nombre Igual que el anterior pero global

Tipos de datos

- Numeacutericos

Enteros int tinyint smallint bigint

Decimales numeric decimal money smallmoney

Coma Flotante float real

- Fechas

datetime 0333 s

smalldatetime 1 minuto

- Caracteres

Ancho fijo char nchar

Ancho Variable varchar nvarchar

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 8

- Texto e Imagen

Text

Ntext

Rowversion

- Binario

Binary varbinary Valores tipo byte

Bit Un solo bit (1 o ninguno)

- Identificadores Uacutenicos

Representa un identificador global uacutenico (GUID)

Si queremos que no se repita el dato en la base de datos usamos este identificador

Uniqueidentifier

Operadores de SQL

Loacutegicos

AND OR NOT

De Comparacioacuten

= Igual

lt Menor

gt Mayor

ltgt Diferente

gt= Mayor o igual

lt= Menor o igual

Crear una Base de Datos Utilizando el Lenguaje SQL

Ejemplo

Para crear la base de datos es la siguiente opcioacuten database seguido del nombre de la Base de Datos

--Create database Itae

On primary

(Name= Itae _data Filename=C itaemdf size=10 maxsize=15 filegrowth=25)

Log On

(Name= Itae _log filename=C itaeldf size=4 maxsize=6 filegrowth=1MB)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 9

Despueacutes de la sentencia Create database Se especifica el nombre de la base de datos Un

nombre en la base de datos debe de ser uacutenico en el servidor

Name- Es el nombre a utilizar cuando una sentencia SQL se tiene que hacer referencia al archivo de

datos o al archivo log respectivamente

Filename- Es una cadena que incluye la ruta y el nombre del archivo La ruta debe especificar una

carpeta existente en el servidor que esta instalado en el SQL

Size ndash Especifica el tamantildeo del Archivo

Maxsize ndashEspecifica el tamantildeo maacuteximo que puede alcanzar el archive si se requiere espacio adicional

Filegrowth ndashEs la cantidad de espacio que se antildeade al archive cada vez que se necesita espacio

adicional Se puede especificar en MB o en porcentaje

Cuando se crea una base de datos su nombre se registra en la tabla del sistema Sysdatabases

de la base de datos master

Para comprobar si la base de datos existe ejecutaremos la siguiente sentencia SQL

Se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el Use Go

Use master

Go

Luego se procederaacute abrir la tabla Sysdatabases y ahiacute se podraacute visualizar si la base de datos ah

sido creada

Select from Sysdatabases

Luego se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el go

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 8: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 8

- Texto e Imagen

Text

Ntext

Rowversion

- Binario

Binary varbinary Valores tipo byte

Bit Un solo bit (1 o ninguno)

- Identificadores Uacutenicos

Representa un identificador global uacutenico (GUID)

Si queremos que no se repita el dato en la base de datos usamos este identificador

Uniqueidentifier

Operadores de SQL

Loacutegicos

AND OR NOT

De Comparacioacuten

= Igual

lt Menor

gt Mayor

ltgt Diferente

gt= Mayor o igual

lt= Menor o igual

Crear una Base de Datos Utilizando el Lenguaje SQL

Ejemplo

Para crear la base de datos es la siguiente opcioacuten database seguido del nombre de la Base de Datos

--Create database Itae

On primary

(Name= Itae _data Filename=C itaemdf size=10 maxsize=15 filegrowth=25)

Log On

(Name= Itae _log filename=C itaeldf size=4 maxsize=6 filegrowth=1MB)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 9

Despueacutes de la sentencia Create database Se especifica el nombre de la base de datos Un

nombre en la base de datos debe de ser uacutenico en el servidor

Name- Es el nombre a utilizar cuando una sentencia SQL se tiene que hacer referencia al archivo de

datos o al archivo log respectivamente

Filename- Es una cadena que incluye la ruta y el nombre del archivo La ruta debe especificar una

carpeta existente en el servidor que esta instalado en el SQL

Size ndash Especifica el tamantildeo del Archivo

Maxsize ndashEspecifica el tamantildeo maacuteximo que puede alcanzar el archive si se requiere espacio adicional

Filegrowth ndashEs la cantidad de espacio que se antildeade al archive cada vez que se necesita espacio

adicional Se puede especificar en MB o en porcentaje

Cuando se crea una base de datos su nombre se registra en la tabla del sistema Sysdatabases

de la base de datos master

Para comprobar si la base de datos existe ejecutaremos la siguiente sentencia SQL

Se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el Use Go

Use master

Go

Luego se procederaacute abrir la tabla Sysdatabases y ahiacute se podraacute visualizar si la base de datos ah

sido creada

Select from Sysdatabases

Luego se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el go

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 9: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 9

Despueacutes de la sentencia Create database Se especifica el nombre de la base de datos Un

nombre en la base de datos debe de ser uacutenico en el servidor

Name- Es el nombre a utilizar cuando una sentencia SQL se tiene que hacer referencia al archivo de

datos o al archivo log respectivamente

Filename- Es una cadena que incluye la ruta y el nombre del archivo La ruta debe especificar una

carpeta existente en el servidor que esta instalado en el SQL

Size ndash Especifica el tamantildeo del Archivo

Maxsize ndashEspecifica el tamantildeo maacuteximo que puede alcanzar el archive si se requiere espacio adicional

Filegrowth ndashEs la cantidad de espacio que se antildeade al archive cada vez que se necesita espacio

adicional Se puede especificar en MB o en porcentaje

Cuando se crea una base de datos su nombre se registra en la tabla del sistema Sysdatabases

de la base de datos master

Para comprobar si la base de datos existe ejecutaremos la siguiente sentencia SQL

Se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el Use Go

Use master

Go

Luego se procederaacute abrir la tabla Sysdatabases y ahiacute se podraacute visualizar si la base de datos ah

sido creada

Select from Sysdatabases

Luego se procederaacute abrir la base de datos con el use nombre de la base de datos y luego el go

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 10: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 10

INSERCIOacuteN ELIMINACIOacuteN Y MODIFICACIOacuteN DE DATOS

- Insercioacuten de una fila mediante valores

INSERT INTO NombreTabla | NombreVista [Valor de la Columna] VALUES Valores

Cuando hay llaves es porque se debe elegir entre uno de los dos esta barra | indica que se debe

poner uno de los dos valores

- Uso INSERTSELECT

INSERT NombreTabla SELECT ListaColumnas FROM ListaTablas WHERE

CondicionBusqueda

Se introducen en la tabla las columnas y filas que devuelva con sus respectivos datos La consulta

SELECT debe devolver los datos adecuados para la tabla donde vamos a introducir los valores

- Creacioacuten de una tabla mediante SELECT INTO Creacioacuten de una tabla que a la vez se le

introducen valores

SELECT ListaColumnas INTO NuevaTabla FROM TablaOrigen

WHERE CondicionBusqueda

Se utiliza mucho para crear tablas temporales

- Insercioacuten de datos parciales No introducir todos los datos solo meter datos en un

determinado campo o en varios pero no en toda la tabla

- Insercioacuten de datos mediante valores de columna predeterminados Se usa para no

dejar a las tablas con el valor null y asiacute no da error

Se utilizan dos clausulas

DEFAULT Especificar que cogiera en la lista de valores el valor por defecto

de esa columna

DEFAULT VALUES Crea una nueva fila con los valores por defecto de todas

las columnas

ELIMINACIOacuteN DE DATOS

- DELETE Elimina una o varias filas Hay un control de las modificaciones (Borrado) que se

estan haciendo

DELETE [FROM (Opcional) ] NombreTabla | NombreVista

WHERE CondicionBusqueda

Delete from emp where apellido = bdquoSERRA‟

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 11: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 11

- TRUNCATE TABLE Elimina todas las filas de la tabla (La tabla con su estructura no se

elimina soacutelo los datos de la tabla) No crea filas en el registro de transacciones con lo cual

es el meacutetodo maacutes raacutepido de borrar

TRUNCATE TABLE NombreTabla

Truncate Table emp

- Eliminacioacuten de filas basada en otras tablas

DELETE [ FROM ] NombreTabla | NombreVista

[ FROM OrigenTabla ] [ WHERE CondicionBusqueda ]

ACTUALIZACIONES

- Actualizacioacuten de filas basadas en datos de la propia tabla

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

USE Northwind

UPDATE products

SET unitprice = (unitprice 11 )

- Actualizacioacuten de filas basadas en otras tablas

UPDATE NombreTabla | NombreVista

SET NombreColumna = expresioacuten DEFAULT | NULL

FROM OrigenTabla

WHERE CondicionBusqueda

Ejercicios

Ejemplo 1

Abrir la base de datos creada anteriormente

--use Itae

se procederaacute abrir la base de datos

--go

Ejemplo 2

Crearemos la Tabla alumnos

--CREATE TABLE alumnos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 12: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 12

--(

--Idalumno VarChar(8)not null

--nom_alumno Varchar (50) Not Null

--ape_alumno Varchar (50) Not Null

--dir_alumno Varchar (50) Not Null

--tel_alumno VarChar(8)

--Email_alumno Varchar (50)

--)

Ejemplo 3

Para que se muestre la Tabla completa y con todos los registros se utiliza en Select para

seleccionar los campos from para seleccionar la tabla que se desea visualizar

--select from alumnos

Ejemplo 4

Ingreso de Datos a la Tabla alumnos se utiliza la sentencia insert into

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01jamesjamesVentanilla252511jazoon_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno)Values

(Cli01Juan CarlosOchoa ValverdeCoop Primavera Mz R1 Lote 16557-

2147jaz_28hotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli02ArturoCapuntildeay LaquiJr Viru 406 Nordm8481-6507eternal_alcarisHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli03Luis AlexanderAguilar WongJr Hon 920-1090luis_hexenHotmailcom)

--Insert into alumnos (idalumnonom_alumnoape_alumnodir_alumnotel_alumnoemail_alumno) Values

(Cli04Fredy Richard Anaya JesusResidencial 539-0886fredyanayaHotmailcom)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 13: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 13

Ejemplo 5

Si deseaacuteramos Eliminar seria con la sentencia Delete

--delete from alumnos where nom_alumno=juan Carlos

Ejemplo 6

Para Actualizar se Utiliza la sentencia Update y Set

--Update alumnos set nom_alumno=diego ape_alumno=cueva dir_alumno=los olivos

tel_alumno=5402972 email_alumno=hades_278hotmailcom where idalumno=01

Ejemplo 7

Para Realizar una Consulta se utiliza el Where

--select from alumnos where idalumno=Cli01

Ejemplo 8

Si tambieacuten uno desea se puede poner en orden ascendente y descendente paraacute ello se utilizar el

ASC y Desc

--select from alumnos ORDER BY nom_alumno Asc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 14: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 14

--select from alumnos ORDER BY nom_alumno desc

Ejemplo 9

Para eliminar un Objeto de la base de datos se utiliza la sentencia Drop

Eliminar de la base de Datos Itae la Tabla Alumnos

Drop table alumnos Elimina la Tabla Clientes con la sentencia Drop seguido del tipo de

objeto y finalizando el nombre

Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop seguido del

tipo de objeto y finalizando el nombre

OPERADORES DE CONDICIOacuteN _ FILAS

En la expresioacuten loacutegica que especifica condicioacuten _ filas se puede utilizar ademaacutes de los operadores

relacioacuten o de comparacioacuten los siguientes operadores SQL

LIKE- Para comparacioacuten de cadenas de caracteres admite los comodines y _

OPERADOR LIKE

Cualquier nuacutemero de caracteres

_ Para un caraacutecter individual

[ ] Para un conjunto de caracteres que esteacute dentro del corchete

[ ^ ] Que el caraacutecter individual que no esteacute dentro del corchete

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que acaben con een

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 15: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 15

EJEMPLO LIKE lsquoeenrsquo Muestra todos los caracteres que contengan een en ese orden

EJEMPLO LIKE lsquo_enrsquo Muestra todos los caracteres que contenga tres letras y acaben en en

EJEMPLO LIKE lsquo[CK ]rsquo Muestra todos los caracteres que empiecen por C o K

EJEMPLO LIKE lsquo[S-V]ingrsquo Nombre de 4 letras cuya primera letra estuviera entre S o V y acabe en

ing

EJEMPLO LIKE lsquoM[^c]rsquo Todos los que empiecen por M y segunda letra no sea una c No hay limite

de caracteres

BETWEEN- para seleccioacuten en base a un rango de valores Los valores pueden ser numeacutericos de

cana fechas y horas

In-Para seleccioacuten en base a un conjunto de valores los valores pueden ser numeacutericos de cadena

fechas y horas

Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidoacuten y contiene las siguientes

tablas y campos

Ejemplo 10

Lista de productos cuyo nombre contenga la palabra vino

Use Poseidon

Go

Select from productos where nombreproducto like vino

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 16: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 16

Luego procedemos a ejecutar la aplicacioacuten

El siacutembolo representa a cualquier cadena de caracteres inclusive la cadena nula

Ejemplo 12

Lista de productos cuya primera letea empieza con la letra a

Select from productos where nombreproducto like [a]

Ejemplo 13

Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e

Select from productos where nombreproducto like [a][e]

Ejemplo 14

Lista de productos cuyo nombre empieza con cualquier caraacutecter que va en el rango de la M a la

T

Select from productos where nombreproducto like [m-t]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 17: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 17

Ejemplo 15

Lista de productos cuyo nombre empieza con A ograve con cualquier caraacutecter en el rango que va de U

a la Ademaacutes el segundo caraacutecter no debe ser la letra r

Select from productos where nombreproducto like [^b-t][^r]

El Caraacutecter ^ significa incluir

El Caraacutecter representa cualquier cadena de caracteres inclusive la cadena nula

El Caraacutecter _ Representa cualquier caraacutecter imprimible no puede ser nulo

Ejemplo 16

Lista de productos cuyo nombre empieza con la palabra Queso

Select from productos where nombreproducto like queso

Ejemplo 17

Lista productos cuyo segundo caraacutecter empiece con la letra e

Select from productos where nombreproducto like _e

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 18: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 18

Ejemplo 18

Lista de productos cuyo nombre empiece con C M Ograve R

Select from productos where nombreproducto like bdquo[cmr]

Ejemplo 19

Lista de productos cuyo nombre empiece con C M Ograve R El segundo Caraacutecter debe ser A

Select from productos where nombreproducto like bdquo[cmr] a

El comodiacuten [cmr] representa el conjunto de caracteres validos en la posicioacuten en la que

apareceraacute el comodiacuten

Ejemplo 20

Seleccionar todos los productos que termine con la letra Z

Select from productos where nombreproducto like z

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 19: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 19

Ejemplo 21

Mostrar todos los productos cuya cuarta letra sea A

Select from productos where nombreproducto like ___a

USO DEL OPERADOR BETWEEN

Permite seleccionar en base a un rango de valores

Ejemplo 22

Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles

Select from productos where preciounidad between 15 and 21

Ejemplo 23

Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas

Select from productos where nombreproducto between cerveza and galletas

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 20: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 20

USO DEL OPERADOR IN

Permite seleccionar en base a un conjunto de valores

Ejemplo 24

Lista de proveedores ubicados en las ciudades de Londres Paris Lima

Select from proveedores where ciudad in (londresPariacutesTokyo)

Ejercicios de Repaso

Ejemplo 25

Mostrar todos los datos de los empleados de nuestra tabla Empleados

Select from empleados

Ejemplo 26

Mostrar la tabla detalles de Pedido el 19 de cada compra realizada

Select idpedido idproducto preciounidad cantidad (preciounidadcantidad)019 as IGV

from [detalles de pedidos]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 21: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 21

Ejemplo 27

Mostar los productos cuyo precio sea mayor a 40

Select from productos where Preciounidad gt 40

Ejemplo 28

Mostrar todos los datos de los Clientes ordenados por Ciudad

Select from clientes order by ciudad

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 22: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 22

Ejemplo 29

Mostrar todos los productos de la Categoriacutea 2

Select from productos where IdCategoriacutea=2

Ejemplo 30

Mostrar todos los pedidos realizados en la fecha 1996-06-05

Select from Pedidos where FechaPedido =1996-06-05

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 23: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 23

Ejemplo 31

Mostrar todos los pedidos mayores a la Fecha 1996-05-05

Select from Pedidos where FechaPedido gt 1996-05-05

Ejemplo 32

Visualizar los productos que el precio unitario esta comprendido entre 20 a 25

Select from productos where preciounidad between 20 and 25

Ejemplo 33

Mostrar todos los productos cuya IdCategoriacutea no sea 3

Select from productos where IdCategoriacutealtgt 3

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 24: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 24

Ejemplo 34

Mostrar los distintos IdPedido de la Tabla Pedidos

Select distinct IdPedido from [detalles de pedidos]

Ejemplo 35

Mostrar de la Tabla producto los que no son de la Categoriacutea (123)

Select from productos where IdCategoriacutea not in (1 2 3) order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 25: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 25

Agrupar y resumir datos

Sacar los n primeros valores

SELECT TOP n Nombre Apellido (Saca los n primeros valores)

SELECT TOP n PERCENT Nombre Apellido (Saca el n por ciento)

SELECT TOP n WITH TIES Nombre Apellido ORDER BY (Saca los n primeros ordenados por

lo que sea y con coincidencias en el valor n)

Ejemplo 36

Select top 5 from productos Devuelve los 5 primeros Productos

Ejemplo 37

Select top 50 percent from productos Devuelve el 50 de los Productos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 26: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 26

USO DE FUNCIONES

Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones

complejas

Funcioacuten de agregacioacuten

Son funciones que se utilizan para calcular valores en las tablas Si queremos usarlas

combinaacutendolas junto con otros campos debemos utilizar Group by y agrupar los datos que no son

funciones

Con la sentencia group by no se utiliza la clausula where se utilizara una clausula propia de la

expresioacuten HAVING Equivalente a where

Todos estos ejercicios han sido desarrollado con la base de datos Poseidoacuten

COUNT Cuenta los registros que hay en la consulta

Si pongo un valor dentro de la expresioacuten devolveraacute la cuenta de todos los

registros no nulos

Si pongo un asterisco contaraacute todos los registros aunque tengan valores

nulos

Select count () from Pedidos Valores con Nulos

Select count (FechaEnviacuteo) from Pedidos Valores sin nulos

AVG Realiza la media sobre la expresioacuten dada debe ser un tipo de dato

Int

Select avg(Preciounidad) from productos

MAX Saca el valor maacuteximo de una consulta

Select max (FechaPedido) from Pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 27: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 27

MIN Devuelve el valor miacutenimo de una consulta

Select min (FechaPedido) from Pedidos

SUM Devuelve la suma de los salarios

Select sum(Cantidad) from [Detalles de pedidos]

Ejercicios

Ejemplo 38

Encontrar la Factura medio del paiacutes Brasil mostrando el nuacutemero de los Factura con el paiacutes de

Destinatario Brasil

Select count () as [Numero de Facturas] PaiacutesDestinatario

Avg (Preciounidad) as [Precio Medio] from

Facturas group by PaiacutesDestinatario having PaiacutesDestinatario =Brasil

Ejemplo 39

Encontrar el precio maacutes alto mas bajo y la diferencia entre ambos de todos los productos con

IdCategoriacutea 2

Select IdCategoriacutea Max (Preciounidad) as [Precio mas alto] min(Preciounidad) as

[Precio mas Bajo] Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos]

from Productos group by IdCategoriacutea having IdCategoriacutea = 2

Ejemplo 40

Visualizar el nuacutemero de productos por Categoriacutea

Select IdCategoriacutea as [Nordm de Categoriacutea] Count (IdCategoriacutea) as [Nordm de Productos]

From Productos group by IdCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 28: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 28

Ejemplo 41

Visualizar los clientes que vivan en las siguientes ciudades Londres Madrid y Barcelona

Select count () as [Nordm de personas] ciudad from clientes group by ciudad Having ciudad in

(londresMadridBarcelona) order by ciudad

Ejemplo 42

Lista de productos cuya venta allaacute sido mayor a 50000

Select IdProducto Monto=Sum (Preciounidad Cantidad) from [Detalles de pedidos] group

by IdProducto having Sum (Preciounidad Cantidad)gt50000 order by IdProducto

Ejemplo 43

Cuantos Clientes no tienen Fax

Select Count () as [Total de Clientes sin Fax] from clientes where fax is null

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 29: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 29

Ejemplo 44

Cuantos Clientes tienen Fax

Select Count () as [Total de Clientes Tienen Fax] from clientes where fax is Not null

Funciones de Fecha y Hora

La siguiente tabla muestra las funciones de fecha y hora disponibles en SQL server

Funcioacuten Resultado

GETDATE() Retorna la fecha y hora del sistema

DATEADD(partefechanfecha) Retorna una nueva fecha antildeadiendo n

unidades de partefecha a fecha

DATEDIFF(parteFechafecha1fecha2) Retorna la diferencia en parteFecha entre

fecha1 y fecha2

DATENAME(partefechafecha) Retorna la cadena correspondiente a

partefecha en fecha

DATEPART(partefechafecha) Retorna el numero correspondiente a

partefecha y fecha

DAY(fecha) Retorna el numero correspondiente a la

parte del diacutea de fecha

MONTH(fecha) Retorna el numero correspondiente a la

parte del mes de fecha

YEAR(fecha) Retorna el numero correspondiente a la

parte del antildeo de fecha

GETUTCDATE() Retorna la fecha y hora del meridiano de

Greenwich

La siguiente tabla muestra los valores de partefecha que podemos utilizar

partefecha Abreviatura

Year Yy yyyy

Quarter Qq q

Month Mm m

Dayofyear Dy y

Day Dd d

Week Wk ww

weekday Dw

Hour Hh

minute Mi n

second Ss s

milisecond Ms

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 30: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 30

Getdate

Select getdate () Funcioacuten que recupera la fecha actual del sistema

Convert Cast

Convierten expliacutecitamente una expresioacuten de un tipo de datos en otro CAST y CONVERT

proporcionan funciones similares

Convert (Tipodedatosdestino Origen Estilo)

o Tipodedatosdestino Siempre ha de ser tipo caraacutecter

o Origen Puede ser tipo fecha numeacuterico o moneda

o Estilo Opcional Es un coacutedigo que indica el formato en el que devuelve la cadena de

caracteres

Sintaxis

Convert (TipoDato Dato)

Cast (Dato as TipoDato)

Ejemplo

declare n intpalabra nvarchar(10)

set n = 1

set palabra =Nuacutemero

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

while (nlt11)

begin

print convert(nvarchar(2)n) + + palabra

print cast(n as nvarchar(2)) + + palabra

set n = n + 1

end

DateName

Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha

especificada

Los caacutelculos para las horas no son exactos cuando se trata de SmallDateTime por lo que

devuelve 0

Ejemplo 45

Select IdPedido DateName (Month FechaPedido) as Nombre del mes from Pedidos where IdPedido =

10352 diciembre

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 31: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 31

Ejemplo 46

Select IdPedido DateName (week FechaPedido) as Numero de Semana from Pedidos where IdPedido

= 1035251

Ejemplo 47

Select IdPedido datename (weekday FechaPedido) as Diacutea De Semana from Pedidos where IdPedido =

10352 Martes

Horas

Ejemplo 48

Select IdPedido datename (mi FechaPedido) as Minutos from Pedidos where IdPedido = 10352

Ejemplo 49

Select DateName (minute getdate ()) as minutos

Ejemplo 50

Select DateName (Hh FechaPedido) as hora from Pedidos where IdPedido = 10352

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 32: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 32

Ejemplo 51

Select DateName (Hour getdate ()) as hora--gt18

Ejemplo 52

Select DateName (Hh getdate ()) as hora--gt18

DatePart

Devuelve la parte de la fecha u hora indicada Sintaxis

Datepart (Valor devolver fecha)

Ejemplo 53

Select IdPedido datepart (mm FechaPedido) as Mes from Pedidos where IdPedido = 10352

Ejemplo 54

Select Datepart (Hh getdate ()) as Hora--gt17

Ejemplo 55

Select Datepart (mi getdate ()) as Minutos--gt54

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 33: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 33

Nombres de Fechas

Day (fecha)

Devuelve UN INT equivale a Datepart

Select day (getdate ()) as diacutea--gt6 (diacutea en la que se ejecuta la sentencia)

Select Datepart (dd getdate ()) --gt6 (diacutea en la que se ejecuta la sentencia)

Select Month (getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Datepart (mm getdate ()) --gt1 (Mes en la que se ejecuta la sentencia)

Select Year (getdate ()) --gt2008 (Antildeo en la que se ejecuta la sentencia)

Ejemplo 56

Select year (FechaPedido) as Antildeo from Pedidos where IdPedido = 10352

Ejemplo 57

Select datediff (yyyy FechaPedido getdate()) as Dia from Pedidos where IdPedido = 10352

DateAdd

DateAdd (Datepart number date)

Antildeade un nuacutemero a la fecha puesta

DatePart es el formato de lo que queremos antildeadir

Number es el nuacutemero que queremos incrementar la fecha expuesta

Select convert (datetime1-1-02)

Select dateadd (dd 71-1-02)

DateDiff

Devuelve la diferencia entre dos fechas en el intervalo que le indiquemos Sintaxis

DateDiff (DatoqueDevuelve Fecha1 Fecha2)

o Datoquedevuelve Indicamos como queremos que haga la comparacioacuten y el tipo de dato

que nos devolveraacute antildeos diacuteas minutos etc

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 34: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 34

Ejemplo 58

Select datediff (yyyy FechaPedido getdate ()) as Dia from Pedidos where IdPedido = 10352

Ejercicios de funciones de Fecha

Ejemplo 59

Lista de pedidos emitidos en febrero de 1996

Select from Pedidos where month (FechaPedido) =2 and year (FechaPedido) =1996

Ejemplo 60

Lista de Pedidos mostrando la diferencia en diacuteas entre la fecha del pedido y la fecha de Envioacute

Select IdPedido FechaPedido FechaEnviacuteo diacuteas =datediff (day FechaPedido FechaEnviacuteo) from

pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 35: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 35

Ejemplo 61

Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del

diacutea diacutea de mes antildeo

Select IdPedido FechaPedido Fecha=datename (dw IdPedido)+ + str (datepart (dd

IdPedido) 2)+ de +datename (mm IdPedido)+ de +str (datepart (yy IdPedido) 4) from

pedidos

Ejemplo 62

Mostrar de la tabla pedidos la fecha de pedidos en fecha corta

Select IdPedido convert (varchar (30) FechaPedido 106) as [Fecha Corta] from pedidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 36: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 36

FUNCIONES MATEMATICAS

ABS

Es el valor Absoluto

Select ABS (-4) as VALOR ABSOLUTO--gt4

CEILING

Devuelve el entero maacutes pequentildeo mayor o igual que la expresioacuten numeacuterica dada

Select CEILING (54) as CEILING--6

FLOOR

Devuelve el entero maacutes grande menor o igual que la expresioacuten numeacuterica dada

Select FLOOR (5) as FLOOR--gt5

POWER

Devuelve el valor de la expresioacuten indicada elevada a la potencia especificada

Select POWER (3 2) as 3 ELEVADO A 2--gt9

RAND

Devuelve un valor float aleatorio de 0 a 1

Las llamadas repetitivas de RAND() en una uacutenica consulta produciraacuten el mismo valor

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(6) as ALEATORIO--071368515806921451

Select RAND(4) as ALEATORIO--07136478921266981

Rand sobre los milisegundos actuales

Select RAND(DATEPART(msGETDATE())) as ALEATORIO--gt071443047691954253

Select RAND(999999999)--gt068504257551273573

ROUND

Devuelve una expresioacuten numeacuterica redondeada a la longitud o precisioacuten especificada

Round (Nuacutemero Redondeo del Nuacutemero)

ROUND siempre devuelve un valor Si length es un valor negativo y mayor que el nuacutemero de

diacutegitos anteriores al separador decimal ROUND devuelve 0

Select ROUND (1234567 2) --gt1234600

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 37: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 37

Select ROUND (1234567-2) --gt1000000

Select ROUND (1234567 0) --gt1230000

Select ROUND (1234567-3) ---gt0

SIGN

Devuelve el signo positivo (+1) cero (0) o negativo (-1) de la expresioacuten especificada

Dice el valor negativo positivo o neutro (0) del valor especificado

Select SIGN (-3) --gt-1

Select SIGN (3) --gt1

Select SIGN (0) --gt0

SQUARE

Devuelve el cuadrado de la expresioacuten especificada

Select SQUARE (4) as bdquoCuadrado‟--gt160

SQRT

Devuelve la raiacutez cuadrada de la expresioacuten especificada

Select SQRT (4) as [RAIZ CUADRADA] --gt20

FUNCIONES DE CADENA

ASCII

Devuelve el coacutedigo ASCII del caraacutecter maacutes a la izquierda de una expresioacuten de caracteres

Select ASCII(A)--gt65

Select ASCII(a)--gt97

Select ascii(aula)--gt97

CHAR

Una funcioacuten de cadena que convierte un coacutedigo ASCII int en un caraacutecter

select char(65)--gtA

select char(97)--gta

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 38: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 38

CHARINDEX

Devuelve la posicioacuten inicial de la expresioacuten especificada en una cadena de caracteres

CHARINDEX (expression1 expression2 [ start_location])

Argumentos

expression1

Es una expresioacuten que contiene la secuencia de caracteres que se desea buscar

Expression1 es una expresioacuten del tipo de cadenas cortas de caracteres

Expression2

Es una expresioacuten normalmente una columna

en la que se busca la cadena especificada

Expression2 es de la categoriacutea del tipo de datos cadena de caracteres

start_location

Es la posicioacuten del caraacutecter de expression2 en el que se empieza la buacutesqueda de expression1

Si no se especifica start_location es un nuacutemero negativo o es cero

la buacutesqueda empieza al principio de la cadena expression2

Si expression1 no se encuentra en expression2 CHARINDEX devuelve 0

Si alguno de los dos es null devuelve null

Select charindex (ciemurcielago) --gt4

Select charindex (ciemurcielago 2) --gt4

Select charindex (ciemurcielago 5) --gt0

Select charindex (ciemurcielago-6) --gt4

LEFT

Devuelve la parte de una cadena de caracteres que comienza en un nuacutemero de caracteres

especificado a partir de la izquierda

Select left (murcielago5) --gtmurci

RIGHT

Devuelve la parte de una cadena de caracteres que

Comienza en el nuacutemero de caracteres especificado

En integer_expression a partir de la derecha

Select right (hola que tal5) --gte tal

LEN

Cuenta el nuacutemero de caracteres que se incluyen en la cadena

Select len (murcieacutelago) --gt10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 39: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 39

LOWER

Convierte a Minuacutesculas la cadena especificada

Select lower (MurcIELaGO) as [minusculas] --gtmurcielago

UPPER

Convierte a Mayuacutesculas la cadena especificada

Select upper (murcielago) as [MAYUSCULAS] --gtMURCIELAGO

RTRIM y LTRIM

Elimina los espacios que existen a la izquierda y a la derecha respectivamente

Select Rtrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select Ltrim ( murcieacutelago ) AS [SIN ESPACIOS] --gtmurcieacutelago

Select ltrim(rtrim( hola ))+

REPLACE

Reemplaza por una tercera expresioacuten todas las apariciones

de la segunda expresioacuten de cadena proporcionada en la primera expresioacuten de cadena

Select replace (hola que tal estasaA) --gtholA que tAl estAs

Select replace (buenos dias que tal estasuentildentildentilde) --gtbntildentildentildenos diasqntildentildentilde tal estas

SPACE

Coloca el nuacutemero de espacios que se le indiquen para entre una cadena de caracteres

Select hola+space(5)+que tal--gthola que tal

SUBSTRING

Devuelve parte de una expresioacuten de caracteres binaria de texto o de imagen

Sintaxis

SUBSTRING (Expresioacuten Comienzo Duracioacuten)

Argumentos

Expresioacuten

Es una cadena de caracteres cadena binaria texto imagen

Columna o expresioacuten que incluye una columna

No deben usarse expresiones que incluyan funciones de agregado

Start

Es un entero que especifica el punto en que comienza la subcadena

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 40: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 40

Length

Es un entero que especifica la longitud de la subcadena

(El nuacutemero de caracteres o bytes que se devuelven)

Select substring (murcielago 3 5) --gtrciel

Select substring (murcielago 3 len (murcielago)) --gtrciel

REVERSE

Devuelve invertida una expresioacuten de caraacutecter

Select reverse (hola)

REPLICATE

Repite una expresioacuten de caracteres un nuacutemero especificado de veces

Select replicate (murcielago 5)

Replicate replicate replicate replicate replicate

STUFF

Elimina el nuacutemero de caracteres especificados e insertados

Otro conjunto de caracteres en un punto de inicio indicado

Select STUFF (Murcieacutelago 2 3 ijklmn) Mijklmnielago

FUNCIONES DE SISTEMA

- APP_NAME () Devuelve el nombre de la aplicacioacuten actual

Select app_name () as [Nombre de la aplicacion]

- DATALENGTH (Expresioacuten) Devuelve un entero que es numero de bites necesarios para

representar esa expresioacuten int

Select datalength (Ninoni) as [Numero de bites]

- ISDATE (Expresioacuten) Dice si la expresioacuten es una fecha o no Devuelve 1 si la expresioacuten es

una fecha y 0 si no es una fecha

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 41: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 41

Select isdate (121001) as [Validacioacuten Fecha]

- ISNUMERIC (Expresion) Dice si la expresioacuten es un numero o no Devuelve 1 si la

expresioacuten es un nuacutemero y 0 si la expresioacuten no es nuacutemero

Select isnumeric (ddd) as [Validacion Numero]

- ISNULL (Expresioacuten ExpresionDevuelta) Si la expresioacuten es nula te devuelve la Expresioacuten

Devuelta y si no devuelve la primera Expresioacuten

Select isnull (nullNo nulo) as [Es Nulo]

- PARSENAME (bdquoNombreObjeto‟ ParteNombre)

ParteNombre es un valor de tipo Int que coge unos determinados valores del

NombreObjeto

1 Objeto

2 Propietario

3 Base de Datos

4 Servidor

Select parsename (saposeidondbopedidos1) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos 2) as [Parte Expresioacuten]

Select parsename (saposeidondbopedidos3) as [Parte Expresioacuten]

Select parsename ( saposeidondbopedidos 4) as [Parte Expresioacuten]

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 42: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 42

- SYSTEM_USER Devuelve el usuario del sistema actual

Depende de la autentificacioacuten con la que te hayas conectado

Select system_user as [Usuario conectado]

- USER_NAME() Devuelve el nombre del usuario actual

Select user_name ()

- COALESCE (expresioacuten1 expresioacuten2 )

Devuelve la primera expresioacuten no NULL

Si todos son NULL devuelve NULL

Select coalesce (PrecioUnidad Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo

devolveraacute la Cantidad y si los dos son nulos devolveraacute un campo Null

PROCEDIMIENTOS PARA AGRUPAR Y RESUMIR DATOS

En el examen de certificacioacuten las bases de datos que se suelen usar son las que vienen de ejemplo en

SQL es decir Northwind y Pubs

Use Base de datos Indica que la siguiente sentencia usaraacute la base de datos indicada Ejemplo Ponemos

en el analizador de consultas lo siguiente

Use Northwind

Select from [Order Details]

[Order Details]

Esta tabla perteneciente a la Northwind se encarga de manejar los pedidos

Order Id Nordm de Pedido

Producto Id Nordm de Producto

Ambos campos son Primary Key con lo que no puede haber una combinacioacuten de ambos campos que sea

igual

OrderId ProductId

1 A

1 B

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 43: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 43

1 C

2 A

3 C

Es decir en este caso no podriacutea existir una nueva combinacioacuten ldquo1 Ardquo o ldquo2 Ardquo

Quantity Es la cantidad del producto del pedido

ROLLUP

Se usa para presentar resuacutemenes de datos A de usarse junto con la clausula group by lo que hace es

realizar un resumen de los campos incluidos en el rollup

Ejemplo 63

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Este ejemplo suma todas las cantidades y mediante

rollup muestra una fila con la suma de todas las

cantidades de cada producto y ademaacutes otra fila con la

suma de todas las cantidades de todos los productos El

resultado de este ejemplo seriacutea el que muestra la

imagen

Ejemplo 64

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Rollup

Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 44: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 44

CUBE

Al igual que Rollup realiza resuacutemenes de campos agrupados Pero en este caso muestra un resumen con

cada combinacioacuten posible de los campos agrupados

Ejemplo 65

Select ProductID OrderId

Sum(Quantity) As Cantidad_Total

From [Order Details]

where orderid lt 10250

Group by ProductID OrderID

with Cube

Order by ProductID OrderID

En este caso como vemos en la imagen hace un resumen con

la suma de la cantidad de cada combinacioacuten posible entre el

productid y el orderid

GROUPING

Indica si el resultado de un campo es el que hay en la propia tabla o se ha introducido mediante una

claacuteusula de resumen es decir para saber por ejemplo si un ldquoNullrdquo de una celda es de la propia tabla o ha

es debido a una clausula Cube o Rollup

Ejemplo 66

Select Productid grouping(ProductID) Orderid grouping(OrderId)

Sum(Quantity) As Cantidad_Total From [Order Details] where orderid lt 10250 Group by ProductID

OrderID with Cube Order by ProductID OrderID

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 45: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 45

Vemos que por cada

grouping que hemos puesto

sale una columna 1 indica

que el Null es creado por la

clausula Cube y 0 indica que

es de la tabla

Ponieacutendole un alias al

grouping saldriacutea el nombre

de columna que le

indiquemos

COMPUTE

Realiza un resumen en una columna aparte con el resultado de la funcioacuten de agregado indicada Su

formato seriacutea Compute funcioacuten(campo) No se puede utilizar en aplicaciones cliente servidor es una

clausula meramente informativa Tampoco se le pueden poner alias a los resuacutemenes

Ejemplo 67

Select Productid Orderid Quantity From [Order Details] order by ProductID Orderid compute

Sum(quantity)

Vemos que muestra la

columna con la suma

total de todas las

cantidades

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 46: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 46

Ejercicios de ROLLUP GROUPING y CUBE

Ejemplo 68

Realizar una consulta que resuma la cantidad de artiacuteculos pedidos por cada iacutendice de producto y

nuacutemero de pedido Realizando un caacutelculo acumulativo

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid orderid with rollup order by productid orderid

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 51317

1 NULL 828

1 10285 45

1 10294 18

1 10317 20

1 10348 15

1 10354 12

1 10370 15

1 10406 10

1 10413 24

1 10477 15

1 10522 40

1 10526 8

1 10576 10

1 10590 20

hellip

Ejemplo 69

Modificacioacuten al ejercicio anterior Realizar el mismo resumen pero uacutenicamente para el producto

cuyo id es 50

select productid as [PRODUCTO] orderid as [Nordm PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid orderid with rollup order by productid ordered

PRODUCTO Nordm PEDIDO SUMA TOTAL

----------- ----------- -----------

NULL NULL 235

50 NULL 235

50 10350 15

50 10383 15

50 10429 40

50 10465 25

50 10637 25

50 10729 40

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 47: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 47

50 10751 20

50 10920 24

50 10948 9

50 11072 22

(12 filas afectadas)

Ejemplo 70

Realizar un resumen por medio de CUBE y de GROUPING sobre la modificacioacuten del ejercicio

anterior de tal manera que sea posible obtener un resumen por producto y por pedido

select Productid as [PRODUCTO] grouping(productid) as [GRUPO PRODUCTO] orderid as [Nordm PEDIDO] grouping(orderid) as [GRUPO PEDIDO] sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productidorderid with cube order by productidorderid

PRODUCTO GRUPO PRODUCTO Nordm PEDIDO GRUPO PEDIDO SUMA TOTAL

----------- -------------- ----------- ------------ -----------

NULL 1 NULL 1 235

NULL 1 10350 0 15

NULL 1 10383 0 15

NULL 1 10429 0 40

NULL 1 10465 0 25

NULL 1 10637 0 25

NULL 1 10729 0 40

NULL 1 10751 0 20

NULL 1 10920 0 24

NULL 1 10948 0 9

NULL 1 11072 0 22

50 0 NULL 1 235

50 0 10350 0 15

50 0 10383 0 15

50 0 10429 0 40

50 0 10465 0 25

50 0 10637 0 25

50 0 10729 0 40

50 0 10751 0 20

50 0 10920 0 24

50 0 10948 0 9

50 0 11072 0 22

(22 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 48: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 48

Obtencioacuten de resuacutemenes detallados con Computer by

SELECT lista_columna FROM tabla ORDER BY columnax COMPUTE FUNCION_AGREGACION

(columna) BY columnax

Columnax- Es la Columna en base a cuyos valores se formaran los grupos

La clausula COMPUTE BY permite agrupar las filas en base a los valores de una o maacutes columnas y

luego efectuar alguna operacioacuten de resumen sobre cada grupo asiacute generado

La diferencia con GROUP BY es que permite mostrar informacioacuten mas detallada de cada grupo

Ejemplo 71

Lista de pedidos que muestre por coacutedigo de pedido la cantidad de productos vendidos por cada uno

de ellos

select Idpedidoidproductopreciounidadcantidad[Sub Total]=sum(PreciounidadCantidad) from

[detalles de pedidos] group by Idpedidoidproductopreciounidadcantidad order by IdPedido compute

sum(Cantidad) by IdPedido

EJERCICIOS CON COMPUTE

Ejemplo 72

Generar un resumen de subtotales en una consulta que devuelva el nuacutemero de pedido la cantidad

pedida para todos los orderid 11070

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 49: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 49

Select Orderid as [Nordm PEDIDO] Quantity AS [CANTIDAD] From [Order Details] where orderid gt= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11070 40

11070 20

11070 30

11070 20

sum

===========

110

sum

===========

110

(6 filas afectadas)

Ejemplo 73

Generar un resumen con calculo de subtotales similar al anterior pero para los orderid 11075 y

11076

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered Nordm PEDIDO CANTIDAD ----------- -------- 11075 10 11075 30 11075 2 sum =========== 42 Nordm PEDIDO CANTIDAD ----------- -------- 11076 20 11076 20 11076 10

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 50: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 50

sum =========== 50 (8 filas afectadas)

Ejemplo 74

Modificacioacuten al ejercicio anterior Agregar la cantidad total y la cantidad promedio al final del

informe

Select Orderid as [Nordm PEDIDO] Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by orderid compute sum(quantity) compute avg(quantity)

Nordm PEDIDO CANTIDAD

----------- --------

11075 10

11075 30

11075 2

sum

===========

42

Nordm PEDIDO CANTIDAD

----------- --------

11076 20

11076 20

11076 10

sum

===========

50

sum

===========

92

avg

===========

15

(10 filas afectadas)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 51: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 51

Ejemplo 75

Seleccionar de forma agrupada por tipo todos los tipos la suma de los precios y la suma del

anticipo de la tabla tiacutetulos

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute avg (advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

avg

=====================

62812500

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 52: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 52

avg

=====================

75000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

psychology 215900 70000000

psychology 109500 22750000

psychology 70000 60000000

psychology 199900 20000000

psychology 79900 40000000

sum

=====================

675200

avg

=====================

42550000

(30 filas afectadas)

Ejemplo 76

Obtener todos los tipos precios y anticipos de la tabla titulos individualmente ordenados por el tipo

en un informe que ademaacutes muestre la suma total de los precios y anticipo por cada tipo

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles order by type compute sum(price) by type compute sum(advance) by type

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

business 199900 50000000

business 119500 50000000

business 29900 101250000

business 199900 50000000

sum

=====================

549200

sum

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 53: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 53

=====================

251250000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

popular_comp 229500 70000000

popular_comp 200000 80000000

popular_comp NULL NULL

sum

=====================

429500

sum

=====================

150000000

(30 filas afectadas)

Ejemplo 77

Generar un informe que muestre la suma de los precios de los libros de psicologiacutea de cada editor

Select type AS [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 54: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 54

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

(7 filas afectadas)

Ejemplo 78

Generar un informe que obtenga la suma de los precios de todos los libros de psicologiacutea asiacute como la

suma de los precios de los libros de psicologiacutea por editor

Select type as [TIPO] pub_id as [CODIGO EDITOR] price as [PRECIO] From titles where type = psychology order by pub_id compute sum(price) by pub_id compute sum(price)

TIPO CODIGO EDITOR PRECIO

------------ ------------- ---------------------

psychology 0736 109500

psychology 0736 70000

psychology 0736 199900

psychology 0736 79900

sum

=====================

459300

TIPO CODIGO EDITOR PRECIO

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 55: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 55

------------ ------------- ---------------------

psychology 0877 215900

sum

=====================

215900

sum

=====================

675200

(8 filas afectadas)

Ejemplo 79

Generar un informe que obtenga la suma de los precios y los anticipos para cada tipo de libro de

cocina

Select type as [TIPO] pub_id [CODIGO EDITOR] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type advance compute sum(price) by type compute sum(advance) by type

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

mod_cook 0877 199900 0000

mod_cook 0877 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO CODIGO EDITOR PRECIO ANTICIPO

------------ ------------- --------------------- ---------------------

trad_cook 0877 119500 40000000

trad_cook 0877 209500 70000000

trad_cook 0877 149900 80000000

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 56: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 56

sum

=====================

478900

sum

=====================

190000000

(9 filas afectadas)

Ejemplo 80

Generar un informe que muestre todos los tiacutetulos precio y anticipo de aquellos tiacutetulos que tengan

un precio superior a 20 doacutelares Ofreceraacute tambieacuten la suma total del precio y del anticipo

Select title as [TITULO] price as [PRECIO] advance as [ANTICIPO] From titles where price gt 20 order by title compute sum(price) compute sum(advance)

TITULO PRECIO ANTICIPO

-------------------------------------------------------------------------------- --------------------- -------------

--------

But Is It User Friendly 229500 70000000

Computer Phobic AND Non-Phobic Individuals Behavior Variations 215900

70000000

Onions Leeks and Garlic Cooking Secrets of the Mediterranean 209500

70000000

sum

=====================

654900

sum

=====================

210000000

(5 filas afectadas)

Ejemplo 81

Generar un informe que muestre el precio el tipo y el nuacutemero de editor de la tabla titles de todos

aquellas obras que pertenezcan la categoriacutea de ldquobusinessrdquo Ademaacutes apareceraacute la suma total de

precios y el maacuteximo pub_id de esta seleccioacuten

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 57: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 57

Select type as [TIPO] price as [PRECIO] pub_id as [CODIGO EDITOR] From titles where type = business order by pub_id compute sum(price) compute max(pub_id) TIPO PRECIO CODIGO EDITOR

------------ --------------------- -------------

business 29900 0736

business 199900 1389

business 199900 1389

business 119500 1389

sum

=====================

549200

max

====

1389

(6 filas afectadas)

Ejemplo 82

Realizar una consulta que recupere el tipo precio y anticipo de la tabla titles para los libros de

cocina Mostraraacute la suma de los precios y los anticipos por tipo y luego calcularaacute el total general de

los precios y los anticipos para todos los registros seleccionados

Select type as [TIPO] price as [PRECIO] advance as [ANTICIPO] From titles where type like cook order by type compute sum(price) by type compute sum(advance) by type compute sum(price) compute sum(advance)

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

mod_cook 199900 0000

mod_cook 29900 150000000

sum

=====================

229800

sum

=====================

150000000

TIPO PRECIO ANTICIPO

------------ --------------------- ---------------------

trad_cook 209500 70000000

trad_cook 119500 40000000

trad_cook 149900 80000000

sum

=====================

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 58: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 58

478900

sum

=====================

190000000

sum

=====================

708700

sum

=====================

340000000

(11 filas afectadas)

Eliminacioacuten de filas duplicadas del resultado de una consulta

SELECT DISTINCT lista_columnas FROM tabla [WHERE Condicion_filas] [ORDER BY columnas(s)]

Cuando se utiliza la clausula DISTINCT SQL Elimina las filas que se duplican en el resultado de la

consulta

Ejemplo 83

1 iquestA que precio se ah vendido los productos

Select IdProducto Preciounidad from [Detalles de pedidos] order by IdProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 59: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 59

Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la

consulta la clausula DISTINCT

Select distinct IdProducto Preciounidad from [Detalles de pedidos]

CONSULTAS A PARTIR DE MULTIPLES TABLAS

La mayoriacutea de las consultas que se hacen en una base de datos requiere que se lean datos procedentes

de dos oacute maacutes tablas

INNER JOIN- son las filas que satisfacen la condicioacuten de la combinacioacuten

En la siguiente sentencia SQL enlaza 2 tablas la tabla clientes y la tabla pedidos en esta ejemplo me

muestra los campos nombre compantildeiacutea y el campo idpedido

La uacutenica condicioacuten es que las 2 tablas tengan un campo en comuacuten

Ejemplo 84

select clientesNombreCompantildeiacuteapedidosidpedido from clientes inner join pedidos on

clientesidcliente=pedidosidcliente

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 60: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 60

Ejemplo 85

Mostrar de la tabla pedidos y detalle de pedidos el total de cada compra realizada de cada uno

de los pedidos

Select distinct pedidosIdPedido pedidosIdCliente Total=sum ([detalles de

pedidos]Preciounidad[detalles de pedidos]Cantidad) From [detalles de pedidos] inner join pedidos on

[detalles de pedidos]IdPedido=pedidos IdPedido Group by pedidosIdPedido pedidosIdCliente order

by pedidos IdPedido

CROSS JOIN

Un Cross Join es la consulta correlacionada que combine cada una de las filas de una de las tablas con

todas las filas de la otra tabla

No es necesario que exista una columna en comuacuten para ejecutar el Cross Join

Ejemplo 86

La siguiente consulta combina cada una de las filas de la tabla categoriacuteas con cada una de las filas de la

tabla productos

select productosNombreProductocategoriasNombrecategoria from productos cross join categorias

order by productosNombreProducto

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 61: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 61

Ejercicios de consultas Muacuteltiples

Ejemplo 87

Mostrar el pedidos completo con el id=10248

Select pedidosIdPedido pedidosIdCliente

Total=sum ([detalles de pedidos]Preciounidad[detalles de pedidos]Cantidad)

From [detalles de pedidos] inner join pedidos on

[Detalles de pedidos]IdPedido=pedidosIdPedido where pedidosIdPedido=10248

Group by pedidosIdPedido pedidosIdCliente

Ejemplo 88

1 Mostrar la cantidad de productos por categoriacutea

Select CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

[Total de Producto]=sum (UnidadesEnExistencia) from Categoriacuteas inner join

Productos on CategoriacuteasIdCategoriacutea=productosIdCategoriacutea

Group by CategoriacuteasIdCategoriacutea CategoriacuteasNombreCategoriacutea

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 62: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 62

Ejemplo 89

Calcular cuantas ventas tiene cada uno de los vendedores

Select empleadosIdEmpleado empleadosNombre empleadosApellidos

[Total de ventas]=count (pedidosIdPedido) from empleados

Inner join Pedidos on empleadosIdEmpleado=pedidosIdEmpleado

Group by empleadosIdEmpleado empleadosNombre empleadosApellidos

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 63: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 63

OPERADOR UNION

Es un operador que combina un conjunto de resultados por ejemplo una sentencia SELECT con

OTRA

Saca las filas de los empleados y despueacutes saca la de Plantilla

Recomendaciones a la hora de usar las combinaciones

Combinar tablas en funcioacuten de claves principales y externas

Limite el nuacutemero de tablas de las combinaciones

Select Apellido

Oficio as

OFICIOFUNCION

salario from emp

UNION

Select Apellido

Funcion Salario from

Plantilla

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 64: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 64

SUBCONSULTAS

Es una SELECT anidada en una instruccioacuten INSERT DELETE SELECT o UPDATE

Como una tabla derivada

Select eemp_no as Numero

eApellido

from (select emp_no apellido from emp) as e

Como una expresioacuten

Select emp_no as [Numero]

Apellido

Salario

(select avg(Salario) from emp)

as Diferencia

from emp

where oficio = Empleado

Para correlacionar datos

- Expresioacuten dinaacutemica que cambia en cada fila de una consulta externa

- Es una combinacioacuten entre la subconsulta y la fila de la consulta externa

- Dividen consultas complejas con dos o maacutes consultas simples relacionadas

Subconsulta correlacionada

Select apellido oficiodept_no

from emp as e

where 20 lt

(select dept_no from dept as d

where edept_no = ddept_no

and ddnombre = Ventas)

SUBCONSULTAS

1 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas antiguo de la

empresa

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 65: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 65

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select min(fecha_alt) from emp)

2 Mostrar el numero de empleado el apellido y la fecha de alta del empleado mas modernos de la

empresa

SELECT emp_noapellido

fecha_alt from emp where fecha_alt = (select max(fecha_alt) from emp)

3 Visualizar el apellido y el oficio de los empleados con el mismo oficio que Jimeacutenez

select apellido oficio from emp where

oficio = (select oficio from emp where apellido = JIMENEZ)

4 Queremos saber el apellido oficio salario y nuacutemero de departamento de los empleados con

salario mayor que el mejor salario del departamento 30

Select apellido oficio salario dept_no from emp where salario gt (select max (salario) from

emp where dept_no = 30)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 66: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 66

5 Mostrar el apellido la funcioacuten sala o departamento de todos los empleados que trabajen en la

empresa

select eApellido eOficio as [Cargo en Empresa] ddnombre as [Oficina]

from emp as e

inner join dept as d

on edept_no = ddept_no

union

select pApellido pfuncion snombre

from plantilla as p

inner join sala as s

on phospital_cod = shospital_cod

and psala_cod = ssala_cod

union

select dApellido despecialidad hnombre

from doctor as d

inner join hospital as h

on dhospital_cod = hhospital_cod

order by 3

6 Averiguar el salario de todos los empleados de la empresa de forma que se aprecien las

diferencias entre ellos

select Apellido Salario from emp

union

select Apellido Salario from plantilla

order by 2 desc

7 Mostrar apellidos y oficio de los empleados del departamento 20 cuyo trabajo sea el mismo que

el de cualquier empleado de ventas

Select apellido oficio from emp where dept_no = 20 and oficio in

(select oficio from emp where dept_no =

(select dept_no from dept where dnombre = lsquoventasrsquo))

order by 2

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 67: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 67

8 Mostrar los empleados que tienen mejor salario que la media de los directores no incluyendo al

presidente

Select from emp where salario gt

(select avg (salario) from emp where oficio = DIRECTOR)

and oficio ltgt PRESIDENTE

9 Mostrar el apellido funcioacuten salario y coacutedigo de hospital de los empleados de la plantilla que

siendo enfermeros o enfermeras pertenecen al hospital SAN CARLOS

Select apellido funcion salario hospital_cod from plantilla where (funcion = lsquoENFERMEROrsquo or

funcion = lsquoENFERMERArsquo) and hospital_cod = (select hospital_cod from hospital where nombre =

lsquoSAN CARLOSrsquo)

Select apellido funcion salario hospital_cod from plantilla where

funcion in (ENFERMEROENFERMERA)

and hospital_cod = (select hospital_cod from hospital

where nombre = SAN CARLOS)

10 Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologiacutea

Select from hospital where hospital_cod in (select hospital_cod from doctor where

especialidad = lsquoCardiologiacutearsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 68: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 68

11 Visualizar el salario anual de los empleados de la plantilla del Hospital Provincial y General

Select apellido funcion salario 12 as [SALARIO ANUAL] from plantilla where

hospital_cod in (select hospital_cod from hospital where nombre = lsquoPROVINCIALrsquo or

nombre= lsquoGENERALrsquo)

12 Mostrar el apellido de los enfermos que nacieron antes que el Sentildeor Miller

Select apellido from enfermo where Fecha_nac lt (select fecha_nac from enfermo where

apellido = lsquoMILLER Brsquo)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 69: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 69

Simulacion de una clausula JOIN

Vamos a mostrar los oficios que estaacuten en maacutes de un departamento

Select distinct e1oficio from emp as e1

where e1oficio in(Select e2oficio from emp as e2

where e1dept_no ltgt e2dept_no)

Se debe utilizar antes una combinacioacuten que una subconsulta la combinacioacuten seriacutea asi dando los

mismos resultados

Select distinct e1Oficio from emp as e1

inner join emp as e2

on e1oficio = e2oficio

where e1dept_no ltgt e2dept_no

Estos son los dos oficios que estaacuten en

maacutes de un departamento

Subconsulta para simular una clausula HAVING

select e1apellidoe1oficio e1salario

from emp as e1

where e1salario gt

(select avg(e2salario) from emp as e2

where e1oficio = e2oficio)

Esta es la consulta utilizando el HAVING que es la que deberiacuteamos utilizar antes que una

subconsulta de simulacioacuten HAVING

SELECT e1apellidoe1oficio e1salario

FROM emp AS e1

INNER JOIN emp AS e2

ON e1oficio = e2oficio

GROUP BY e1oficio e1salarioe1apellido

HAVING e1salario gt AVG (e2salario)

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70

Page 70: Fundamentos de Programacion Con SQL

Microsoft SQL SERVER Desarrollo de Aplicaciones utilizando Visual Studio Net 2005

Prof Diego Alberto Cueva Valverde diegoalberto_1987hotmailcom 70