Fundamentos de SQL
Fundamentos de SQL
Fundamentos de SQL
Bases de datos
Una base de datos de Microsoft SQL Server 2005 consta de una coleccin 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 informacin de inventario para el almacn de una fbrica. 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 podra 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 elaboracin de los informes anuales. Antes de crear una base de datos, es importante entender las partes que la componen y cmo disearlas 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 informacin del sistema que utiliza SQL Server, como por ejemplo los valores de las opciones de configuracin.
Tablas
Las tablas son objetos de la base de datos que contienen todos sus datos. Una tabla se define mediante una coleccin de columnas. En las tablas, los datos se organizan con arreglo a un formato de filas y columnas, similar al de una hoja de clculo. 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 compaa puede haber una fila para cada empleado y distintas columnas en las que figuren detalles de los empleados tales como el nmero de empleado, el nombre, la direccin, el puesto que ocupa y su nmero de telfono particular.
Desarrollo de Software
Datos binarios
Los datos binarios se componen de nmeros hexadecimales. Por ejemplo, el nmero decimal 245 corresponde al hexadecimal F5. Los datos binarios se almacenan utilizando los tipos de datos binary, varbinary e image de Microsoft SQL Server 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 nmero de dgitos 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 Word, hojas de clculo de Microsoft Excel e imgenes 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 deber utilizar el tipo de datos image. Es recomendable que la longitud definida de una columna binaria no supere la longitud mxima prevista para los datos binarios que deben almacenarse.
Datos de carcter
Se define como dato de carcter cualquier combinacin de letras, smbolos y caracteres numricos. Por ejemplo, son datos de carcter vlidos "928", "Johnson" y "(0*&(%B99nh jkJ.". En Microsoft SQL Server 2005, los datos de carcter se almacenan utilizando los tipos de datos char, varchar y text. Utilice varchar cuando vare el nmero 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 ms de 8 KB. Por ejemplo, dado que los documentos HTML son caracteres ASCII y suelen ocupar ms 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 mxima prevista para los datos de carcter 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 Microsoft SQL Server 2005 permiten la utilizacin de caracteres definidos por un conjunto de caracteres determinado. El conjunto de caracteres se elige durante la instalacin de SQL Server y no puede modificarse. Si se utilizan los tipos de datos Unicode, una columna puede almacenar cualquier carcter definido por el estndar 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 ms de un conjunto de caracteres. Utilice nvarchar cuando las entradas de una columna varen en cuanto al nmero de caracteres Unicode que contienen (hasta 4.000). Utilice nchar cuando todas las entradas de una
Desarrollo de Software
columna tengan la misma longitud fija (hasta 4.000 caracteres Unicode). Utilice ntext cuando alguna entrada de una columna ocupe ms de 4.000 caracteres Unicode.
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 carcter n como prefijo para identificar estos tipos de datos y valores.
Datos numricos
Los datos numricos se componen exclusivamente de nmeros. Incluyen nmeros positivos y negativos, decimales, fracciones y nmeros enteros.
Datos enteros
Los datos enteros constan de nmeros enteros positivos o negativos, como 15, 0, 5 y 2509. Los datos enteros se almacenan utilizando los tipos de datos bigint, int, smallint y tinyint de Microsoft SQL Server 2005. El tipo de datos bigint puede almacenar un intervalo de nmeros 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 nmeros que tinyint. Utilice el tipo de datos bigint para almacenar nmeros del intervalo comprendido entre -2^63 (9223372036854775808) y 2^63-1 (9223372036854775807). El tamao de almacenamiento es de 8 bytes. Utilice el tipo de datos int para almacenar nmeros del intervalo comprendido entre -2.147.483.648 y 2.147.483.647 (para cada valor se necesitan 4 bytes de espacio de almacenamiento). Utilice el tipo de datos smallint para almacenar nmeros del intervalo que va desde -32.768 hasta 32.767 (para cada valor se necesitan 2 bytes de espacio de almacenamiento), y el tipo de datos tinyint para almacenar nmeros 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 dgito menos significativo. Estos datos se almacenan mediante los tipos de datos decimal o numeric de SQL Server. El nmero de bytes necesarios para almacenar un valor decimal o numeric depende del nmero total de dgitos de Recopilado por Yuri Marquez Solis
Desarrollo de Software
datos y del nmero de cifras a la derecha del separador decimal. Por ejemplo, se necesitan ms bytes para almacenar el valor 19.283,29383 que para almacenar el valor 1,1. En SQL Server, el tipo de datos numeric es sinnimo del tipo de datos decimal.
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 Microsoft SQL Server 2005. Los datos de moneda pueden almacenarse con una precisin mxima de cuatro decimales. Utilice el tipo de datos money para almacenar valores del intervalo comprendido entre -922.337.203.685.477,5808 y +922.337.203.685.477,5807 (para almacenar cada valor se necesitan 8 bytes). Utilice el tipo de datos smallmoney para almacenar valores del intervalo comprendido entre -214.748,3648 y 214.748,3647 (para almacenar cada valor se necesitan 4 bytes). Si se necesita un nmero mayor de decimales, utilice el tipo de datos decimal.
Datos especiales
Los datos especiales son aqullos que no se ajustan a ninguna de las categoras de datos, como los datos binarios, de carcter, Unicode, de fecha y hora, numricos y de moneda. Microsoft SQL Server 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 nmero 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 funcin @@DBTS. Los datos de tipo timestamp no estn relacionados con la fecha ni la hora de una insercin ni de un cambio en los datos. Si desea registrar automticamente en qu 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 sinnimo de timestamp.
Desarrollo de Software
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 sta es la primera visita del cliente puede almacenarse en una columna de tipo bit.
uniqueidentifier Se trata de un nmero hexadecimal de 16 bytes que hace referencia a un identificador exclusivo global (GUID). El GUID es especialmente til cuando una fila debe ser nica entre otras muchas. Por ejemplo, utilice el tipo de datos uniqueidentifier en una columna con nmeros de identificacin de los clientes para compilar una lista de clientes de una compaa en varios pases.
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 slo puede utilizarse para definir variables locales del tipo table o el valor de retorno de una funcin 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 maysculas seguidas de un nmero de proveedor de cinco cifras.
Desarrollo de Software
2. Haga clic con el botn secundario en el selector de fila para la columna y seleccione Establecer clave principal. En la ficha ndices y claves de las pginas de propiedades se crea automticamente un ndice 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 comunicar que las relaciones existentes se eliminarn automticamente como parte de este proceso.
en el selector de fila.
Si una clave principal consta de ms de una columna, se permiten valores duplicados en una columna, pero cada combinacin de valores de todas las columnas de la clave principal debe ser nica.
2. Agregue las tablas entre las que desea crear una relacin de varios a varios. 3. Cree una tercera tabla. Para ello, haga clic con el botn secundario del mouse dentro del diagrama de la base de datos y, a continuacin, haga clic en Nueva tabla. sta se convertir en la tabla de unin. 4. En el cuadro de dilogo Elegir nombre, escriba un nombre para la tabla. Por ejemplo, la tabla de unin entre la tabla de ttulos 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 unin. Puede agregar otras columnas a esta tabla, igual que en cualquier otra tabla. 6. En la tabla de unin, establezca la clave principal para que incluya todas las columnas de la clave principal de las otras dos tablas. 7. Defina una relacin de uno a varios entre cada una de las dos tablas principales y la tabla de unin.
Desarrollo de Software
. ALTER . DROP Modificar los datos creados 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 manipulacin de datos (DML): Desarrollo de la programacin de la base de datos. . . . . SELECT INSERT UPDATE DELETE
Elementos de sintaxis: Directivas de procesos por lotes GO: Enva 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.
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 nmero, deben empezar por un signo alfabtico, pueden incluir el guion bajo (_), la arroba @ y la almohadilla #. Generalmente para las variables locales se usan @ + el nombre. EJEMPLO: @Contador. Recopilado por Yuri Marquez Solis
Desarrollo de Software
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: Numricos: Fechas: datetime 0,333 s smalldatetime 1 minuto Enteros int, tinyint, smallint, bigint Decimales numeric, decimal, money, smallmoney Coma Flotante float, real
Caracteres: Ancho fijo: char, nchar Ancho Variable: varchar, nvarchar Texto e Imagen: Text Ntext Rowversion
Binario: Binary, varbinary Valores tipo byte Bit Un solo bit (1 o ninguno)
Identificadores nicos: Representa un identificador global nico (GUID) Si queremos que no se repita el dato en la base de datos, usamos este identificador Uniqueidentifier
Operadores de SQL:
Lgicos: AND, OR, NOT De Comparacin: = < > <> Igual Menor Mayor Diferente
Desarrollo de Software
>= Mayor o igual <= Menor o igual
--Create database Itae On primary (Name= Itae _data, Filename='C: \ itae.mdf', size=10, maxsize=15, filegrowth=25%) Log On (Name= Itae _log, filename='C: \ itae.ldf', size=4, maxsize=6, filegrowth=1MB) Despus de la sentencia Create database, Se especifica el nombre de la base de datos. Un nombre en la base de datos debe de ser nico 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. Especifica el tamao del Archivo. Maxsize. Especifica el tamao mximo que puede alcanzar el archive si se requiere espacio adicional Filegrowth. Es la cantidad de espacio que se aade 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 proceder abrir la base de datos con el use nombre de la base de datos y luego el Use Go. Use master Go Luego se proceder abrir la tabla Sysdatabases y ah se podr visualizar si la base de datos ah sido creada.
Desarrollo de Software
Select * from Sysdatabases
Luego se proceder abrir la base de datos con el use nombre de la base de datos y luego el go
10
Desarrollo de Software
Insercin de datos parciales: No introducir todos los datos, solo meter datos en un determinado campo o en varios, pero no en toda la tabla. Insercin de datos mediante valores de columna predeterminados: Se usa para no dejar a las tablas con el valor null y as 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
ELIMINACIN 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 = SERRA TRUNCATE TABLE: Elimina todas las filas de la tabla (La tabla con su estructura no se elimina, slo los datos de la tabla). No crea filas en el registro de transacciones, con lo cual es el mtodo ms rpido de borrar. TRUNCATE TABLE NombreTabla Truncate Table emp Eliminacin de filas basada en otras tablas DELETE [ FROM ] {NombreTabla | NombreVista} [ FROM, OrigenTabla,... ] [ WHERE CondicionBusqueda ]
ACTUALIZACIONES
Actualizacin de filas basadas en datos de la propia tabla UPDATE {NombreTabla | NombreVista } SET NombreColumna = expresin { DEFAULT | NULL, ... } USE Northwind UPDATE products SET unitprice = (unitprice * 1.1 ) Actualizacin de filas basadas en otras tablas
11
Desarrollo de Software
UPDATE {NombreTabla | NombreVista } SET NombreColumna = expresin { DEFAULT | NULL, ... } FROM OrigenTabla WHERE CondicionBusqueda
Ejercicios: Ejemplo 1
Abrir la base de datos creada anteriormente
Ejemplo 2
Crearemos la Tabla alumnos
--CREATE TABLE alumnos --( --Idalumno --nom_alumno --ape_alumno --dir_alumno --tel_alumno --Email_alumno --) VarChar(8)not null, Varchar (50) Not Null, Varchar (50) Not Null, Varchar (50) Not Null, VarChar(8), 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.
12
--Insert into alumnos (idalumno,nom_alumno,ape_alumno,dir_alumno,tel_alumno,email_alumno)Values ('Cli01','james','james','Ventanilla','252511','jazoon_28@hotmail.com') --Insert into alumnos (idalumno,nom_alumno,ape_alumno,dir_alumno,tel_alumno,email_alumno)Values ('Cli01','Juan Carlos','Ochoa Valverde','Coop. Primavera Mz. R1. Lote 16','5572147','jaz_28@hotmail.com') --Insert into alumnos (idalumno,nom_alumno,ape_alumno,dir_alumno,tel_alumno,email_alumno) Values ('Cli02','Arturo','Capuay Laqui','Jr. Viru 406 N8','481-6507','eternal_alcaris@Hotmail.com') --Insert into alumnos (idalumno,nom_alumno,ape_alumno,dir_alumno,tel_alumno,email_alumno) Values ('Cli03','Luis Alexander','Aguilar Wong','Jr. Hon ','920-1090','luis_hexen@Hotmail.com') --Insert into alumnos (idalumno,nom_alumno,ape_alumno,dir_alumno,tel_alumno,email_alumno) Values ('Cli04','Fredy Richard',' Anaya Jesus','Residencial ','539-0886','fredyanaya@Hotmail.com')
Ejemplo 5
Si deseramos Eliminar seria con la sentencia Delete
Ejemplo 6
Para Actualizar se Utiliza la sentencia Update y Set
13
Desarrollo de Software
--Update alumnos set nom_alumno='diego', ape_alumno='cueva', dir_alumno='los olivos', tel_alumno='5402972', email_alumno='hades_278@hotmail.com' where idalumno='01'
Ejemplo 7
Para Realizar una Consulta se utiliza el Where
Ejemplo 8
Si tambin uno desea se puede poner en orden ascendente y descendente par ello se utilizar el ASC y 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.
14
Desarrollo de Software
Drop database Itae Elimina la Base de Datos Itae con la sentencia Drop, seguido del tipo de objeto y finalizando el nombre.
BETWEEN.- para seleccin en base a un rango de valores. Los valores pueden ser numricos, de
cana, fechas y horas.
In.-Para seleccin en base a un conjunto de valores, los valores pueden ser numricos, de cadena,
fechas y horas. Para estos ejemplos ah utilizado la base de datos con el nombre de Poseidn y contiene las siguientes tablas y campos.
15
Desarrollo de Software
Ejemplo 10
Lista de productos cuyo nombre contenga la palabra vino
Use Poseidon Go Select * from productos where nombreproducto like '%vino%' Luego procedemos a ejecutar la aplicacin.
Ejemplo 12
Lista de productos cuya primera letea empieza con la letra a.
16
Desarrollo de Software
Ejemplo 13
Lista de productos cuya primera letea empieza con la letra a y la tercera con la letra e.
Ejemplo 14
Lista de productos cuyo nombre empieza con cualquier carcter que va en el rango de la M a la T.
Ejemplo 15
Lista de productos cuyo nombre empieza con A con cualquier carcter en el rango que va de U a la Adems, el segundo carcter no debe ser la letra r.
17
Desarrollo de Software
El Carcter ^ significa incluir. El Carcter % representa cualquier cadena de caracteres, inclusive la cadena nula El Carcter _ Representa cualquier carcter imprimible no puede ser nulo.
Ejemplo 16
Lista de productos cuyo nombre empieza con la palabra Queso.
Ejemplo 17
Lista productos cuyo segundo carcter empiece con la letra e.
Ejemplo 18
Lista de productos cuyo nombre empiece con C, M R.
18
Desarrollo de Software
Ejemplo 19
Lista de productos cuyo nombre empiece con C, M R. El segundo Carcter debe ser A.
El comodn [cmr], representa el conjunto de caracteres validos en la posicin en la que aparecer el comodn.
Ejemplo 20
Seleccionar todos los productos que termine con la letra Z
Ejemplo 21
Mostrar todos los productos cuya cuarta letra sea A
19
Desarrollo de Software
Select * from productos where nombreproducto like '___a%'
Ejemplo 22
Lista de productos cuyo precio se encuentra en el rango que va de 15 a 21 nuevos soles.
Ejemplo 23
Lista de productos cuyo nombre se encuentren en el rango de Cerveza y galletas
20
Desarrollo de Software
Ejemplo 24
Lista de proveedores ubicados en las ciudades de Londres, Paris, Lima.
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, (preciounidad*cantidad)*0.19 as IGV from [detalles de pedidos]
21
Desarrollo de Software
Ejemplo 27
Mostar los productos cuyo precio sea mayor a 40 Select * from productos where Preciounidad > 40
Ejemplo 28
Mostrar todos los datos de los Clientes ordenados por Ciudad. Select * from clientes order by ciudad
22
Desarrollo de Software
Ejemplo 29
Mostrar todos los productos de la Categora 2. Select * from productos where IdCategora='2'
Ejemplo 30
Mostrar todos los pedidos realizados en la fecha 1996-06-05 Select * from Pedidos where FechaPedido ='1996-06-05'
23
Desarrollo de Software
Ejemplo 31
Mostrar todos los pedidos mayores a la Fecha 1996-05-05 Select * from Pedidos where FechaPedido > '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 IdCategora no sea 3. Select * from productos where IdCategora<> 3
24
Desarrollo de Software
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 Categora (1,2,3) Select * from productos where IdCategora not in (1, 2, 3) order by IdProducto
25
Desarrollo de Software
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
26
Desarrollo de Software
USO DE FUNCIONES
Podemos utilizar funciones para construir expresiones y generar columnas computadoras O condiciones complejas.
Funcin de agregacin:
Son funciones que se utilizan para calcular valores en las tablas. Si queremos usarlas combinndolas 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 expresin: HAVING. Equivalente a where Todos estos ejercicios han sido desarrollado con la base de datos Poseidn.
AVG: Realiza la media sobre la expresin dada, debe ser un tipo de dato
Int.
27
Desarrollo de Software
Ejercicios Ejemplo 38
Encontrar la Factura medio del pas Brasil, mostrando el nmero de los Factura con el pas de Destinatario Brasil. Select count (*) as [Numero de Facturas], PasDestinatario, Avg (Preciounidad) as [Precio Medio] from Facturas group by PasDestinatario having PasDestinatario ='Brasil'
Ejemplo 39
Encontrar el precio ms alto, mas bajo y la diferencia entre ambos de todos los productos con IdCategora 2. Select IdCategora, Max (Preciounidad) as [Precio mas alto] , min(Preciounidad) as [Precio mas Bajo] , Max(Preciounidad) - min(Preciounidad) as [Diferencia entre Ambos] from Productos group by IdCategora having IdCategora = '2'
28
Ejemplo 41
Visualizar los clientes que vivan en las siguientes ciudades Londres, Madrid y Barcelona Select count (*) as [N de personas], ciudad from clientes group by ciudad Having ciudad in ('londres','Madrid','Barcelona') order by ciudad
Ejemplo 42
Lista de productos cuya venta all sido mayor a 50000. Select IdProducto, Monto=Sum (Preciounidad * Cantidad) from [Detalles de pedidos] group by IdProducto having Sum (Preciounidad * Cantidad)>50000 order by IdProducto
Ejemplo 43
Recopilado por Yuri Marquez Solis
29
Desarrollo de Software
Cuantos Clientes no tienen Fax. Select Count (*) as [Total de Clientes sin Fax] from clientes where fax is null
Ejemplo 44
Cuantos Clientes tienen Fax.
Select Count (*) as [Total de Clientes Tienen Fax] from clientes where fax is Not null
La siguiente tabla muestra los valores de partefecha que podemos utilizar. partefecha Recopilado por Yuri Marquez Solis Abreviatura
30
Desarrollo de Software
Year Quarter Month Dayofyear Day Week weekday Hour minute second milisecond Yy, yyyy Qq ,q Mm, m Dy, y Dd, d Wk, ww Dw Hh Mi, n Ss, s Ms
Getdate
Select getdate () Funcin que recupera la fecha actual del sistema.
Convert, Cast
Convierten explcitamente una expresin de un tipo de datos en otro. CAST y CONVERT proporcionan funciones similares. Convert (Tipodedatosdestino, Origen, Estilo) o Tipodedatosdestino: Siempre ha de ser tipo carcter o Origen: Puede ser tipo fecha, numrico o moneda. o Estilo: Opcional. Es un cdigo que indica el formato en el que devuelve la cadena de caracteres. Sintaxis: Convert (TipoDato, Dato) Cast (Dato as TipoDato) Ejemplo: declare @n int,@palabra nvarchar(10) set @n = 1 set @palabra ='Nmero' print convert(nvarchar(2),@n) + ' ' + @palabra print cast(@n as nvarchar(2)) + ' ' + @palabra while (@n<11) begin print convert(nvarchar(2),@n) + ' ' + @palabra print cast(@n as nvarchar(2)) + ' ' + @palabra set @n = @n + 1 end
DateName
31
Desarrollo de Software
Devuelve una cadena de caracteres que representa la parte de la fecha especificada de la fecha especificada Los clculos 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
Ejemplo 46
Select IdPedido, DateName (week, FechaPedido) as 'Numero de Semana' from Pedidos where IdPedido = 1035251
Ejemplo 47
Select IdPedido, datename (weekday, FechaPedido) as 'Da 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
32
Desarrollo de Software
Select DateName (minute, getdate ()) as 'minutos'
Ejemplo 50
Select DateName (Hh, FechaPedido) as 'hora' from Pedidos where IdPedido = 10352
Ejemplo 51
Select DateName (Hour, getdate ()) as 'hora'-->18
Ejemplo 52
Select DateName (Hh, getdate ()) as 'hora'-->18
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
33
Desarrollo de Software
Ejemplo 54
Select Datepart (Hh, getdate ()) as 'Hora'-->17
Ejemplo 55
Select Datepart (mi, getdate ()) as 'Minutos'-->54
Nombres de Fechas
Day (fecha) Devuelve UN INT, equivale a Datepart Select Select Select Select Select day (getdate ()) as da-->6 (da en la que se ejecuta la sentencia) Datepart (dd, getdate ()) -->6 (da en la que se ejecuta la sentencia) Month (getdate ()) -->1 (Mes en la que se ejecuta la sentencia) Datepart (mm, getdate ()) -->1 (Mes en la que se ejecuta la sentencia) Year (getdate ()) -->2008 (Ao en la que se ejecuta la sentencia)
Ejemplo 56
Select year (FechaPedido) as 'Ao' from Pedidos where IdPedido = 10352
Ejemplo 57
34
Desarrollo de Software
Select datediff (yyyy, FechaPedido, getdate()) as 'Dia' from Pedidos where IdPedido = 10352
DateAdd
DateAdd (Datepart, number, date) Aade un nmero a la fecha puesta DatePart es el formato de lo que queremos aadir. Number es el nmero que queremos incrementar la fecha expuesta. Select convert (datetime,'1-1-02') Select dateadd (dd, 7,'1-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 comparacin y el tipo de dato que nos devolver, aos, das, minutos etc.
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
35
Desarrollo de Software
Ejemplo 60
Lista de Pedidos mostrando la diferencia en das entre la fecha del pedido y la fecha de Envi. Select IdPedido, FechaPedido, FechaEnvo, das =datediff (day, FechaPedido, FechaEnvo) from pedidos
Ejemplo 61
Genere un listado de pedidos en el que la fecha del pedido se muestre en el formato nombre del da, da de mes ao. Select IdPedido, FechaPedido, Fecha=datename (dw, IdPedido)+ ', ' + str (datepart (dd, IdPedido) ,2)+' de '+datename (mm, IdPedido)+' de '+str (datepart (yy, IdPedido) ,4) from pedidos
36
Desarrollo de Software
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
FUNCIONES MATEMATICAS
ABS
Es el valor Absoluto
37
Desarrollo de Software
Select ABS (-4) as 'VALOR ABSOLUTO'-->4
CEILING
Devuelve el entero ms pequeo mayor o igual que la expresin numrica dada. Select CEILING (5.4) as 'CEILING'--6
FLOOR
Devuelve el entero ms grande menor o igual que la expresin numrica dada. Select FLOOR (5) as 'FLOOR'-->5
POWER
Devuelve el valor de la expresin indicada elevada a la potencia especificada. Select POWER (3, 2) as '3 ELEVADO A 2'-->9
RAND
Devuelve un valor float aleatorio de 0 a 1. Las llamadas repetitivas de RAND() en una nica consulta producirn el mismo valor. Select RAND(6) as 'ALEATORIO'--0.71368515806921451 Select RAND(6) as 'ALEATORIO'--0.71368515806921451 Select RAND(4) as 'ALEATORIO'--0.7136478921266981 Rand sobre los milisegundos actuales Select RAND(DATEPART(ms,GETDATE())) as 'ALEATORIO'-->0.71443047691954253 Select RAND(999999999)-->0.68504257551273573
ROUND
Devuelve una expresin numrica, redondeada a la longitud o precisin especificada. Round (Nmero, Redondeo del Nmero) ROUND siempre devuelve un valor. Si length es un valor negativo y mayor que el nmero de dgitos anteriores al separador decimal, ROUND devuelve 0. Select Select Select Select ROUND (123.4567, 2) -->123.4600 ROUND (123.4567,-2) -->100.0000 ROUND (123.4567, 0) -->123.0000 ROUND (123.4567,-3) --->0
SIGN
Recopilado por Yuri Marquez Solis
38
Desarrollo de Software
Devuelve el signo positivo (+1), cero (0) o negativo (-1) de la expresin especificada. Dice el valor negativo, positivo o neutro (0) del valor especificado Select SIGN (-3) -->-1 Select SIGN (3) -->1 Select SIGN (0) -->0
SQUARE
Devuelve el cuadrado de la expresin especificada. Select SQUARE (4) as Cuadrado-->16.0
SQRT
Devuelve la raz cuadrada de la expresin especificada. Select SQRT (4) as [RAIZ CUADRADA] -->2.0
FUNCIONES DE CADENA
ASCII
Devuelve el cdigo ASCII del carcter ms a la izquierda de una expresin de caracteres. Select ASCII('A')-->65 Select ASCII('a')-->97 Select ascii('aula')-->97
CHAR
Una funcin de cadena que convierte un cdigo ASCII int en un carcter. select char(65)-->A select char(97)-->a
CHARINDEX
Devuelve la posicin inicial de la expresin especificada en una cadena de caracteres. Recopilado por Yuri Marquez Solis
39
Desarrollo de Software
CHARINDEX (expression1, expression2 [, start_location]) Argumentos expression1 Es una expresin que contiene la secuencia de caracteres que se desea buscar. Expression1 es una expresin del tipo de cadenas cortas de caracteres. Expression2 Es una expresin, normalmente una columna, en la que se busca la cadena especificada. Expression2 es de la categora del tipo de datos cadena de caracteres. start_location Es la posicin del carcter de expression2 en el que se empieza la bsqueda de expression1. Si no se especifica start_location, es un nmero negativo o es cero, la bsqueda 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 Select Select Select charindex charindex charindex charindex ('cie','murcielago') -->4 ('cie','murcielago', 2) -->4 ('cie','murcielago', 5) -->0 ('cie','murcielago',-6) -->4
LEFT
Devuelve la parte de una cadena de caracteres que comienza en un nmero de caracteres especificado a partir de la izquierda Select left ('murcielago',5) -->murci
RIGHT
Devuelve la parte de una cadena de caracteres que Comienza en el nmero de caracteres especificado En integer_expression a partir de la derecha. Select right ('hola que tal',5) -->e tal
LEN
Cuenta el nmero de caracteres que se incluyen en la cadena. Select len ('murcilago') -->10
LOWER
Recopilado por Yuri Marquez Solis
40
Desarrollo de Software
Convierte a Minsculas la cadena especificada Select lower ('MurcIELaGO') as [minusculas] -->murcielago
UPPER
Convierte a Maysculas la cadena especificada Select upper ('murcielago') as [MAYUSCULAS] -->MURCIELAGO
RTRIM y LTRIM
Elimina los espacios que existen a la izquierda y a la derecha respectivamente. Select Rtrim (' murcilago ') AS [SIN ESPACIOS] -->murcilago Select Ltrim (' murcilago ') AS [SIN ESPACIOS] -->murcilago Select ltrim(rtrim(' hola '))+'.'
REPLACE
Reemplaza por una tercera expresin todas las apariciones de la segunda expresin de cadena proporcionada en la primera expresin de cadena Select replace ('hola que tal estas','a','A') -->holA que tAl estAs Select replace ('buenos dias, que tal estas','ue','') -->bnos dias,q tal estas
SPACE
Coloca el nmero de espacios que se le indiquen para entre una cadena de caracteres. Select 'hola'+space(5)+'que tal'-->hola que tal
SUBSTRING
Devuelve parte de una expresin de caracteres, binaria, de texto o de imagen. Sintaxis: SUBSTRING (Expresin, Comienzo, Duracin) Argumentos Expresin Es una cadena de caracteres, cadena binaria, texto, imagen, Columna o expresin que incluye una columna. No deben usarse expresiones que incluyan funciones de agregado. Start Recopilado por Yuri Marquez Solis
41
Desarrollo de Software
Es un entero que especifica el punto en que comienza la subcadena. Length Es un entero que especifica la longitud de la subcadena (El nmero de caracteres o bytes que se devuelven). Select substring ('murcielago', 3, 5) -->rciel Select substring ('murcielago', 3, len ('murcielago')) -->rciel
REVERSE
Devuelve invertida una expresin de carcter. Select reverse ('hola')
REPLICATE
Repite una expresin de caracteres un nmero especificado de veces. Select replicate ('murcielago', 5) Replicate, replicate, replicate, replicate, replicate
STUFF
Elimina el nmero de caracteres especificados e insertados Otro conjunto de caracteres en un punto de inicio indicado. Select STUFF ('Murcilago', 2, 3, 'ijklmn') Mijklmnielago
FUNCIONES DE SISTEMA
42
Desarrollo de Software ISDATE (Expresin) Dice si la expresin es una fecha o no. Devuelve 1 si la expresin es
una fecha y 0 si no es una fecha. Select isdate ('12/10/01') as [Validacin Fecha]
43
Desarrollo de Software
SYSTEM_USER
Devuelve el usuario del sistema actual Depende de la autentificacin con la que te hayas conectado
USER_NAME()
Devuelve el nombre del usuario actual Select user_name ()
Select coalesce (PrecioUnidad, Cantidad) from [detalles de Pedidos] Si el PrecioUnidad es nulo devolver la Cantidad, y si los dos son nulos, devolver un campo Null.
44
Desarrollo de Software
Use Northwind Select * from [Order Details]
[Order Details] Esta tabla perteneciente a la Northwind, se encarga de manejar los pedidos Order Id : N de Pedido. Producto Id : N de Producto. Ambos campos son Primary Key, con lo que no puede haber una combinacin de ambos campos que sea igual. OrderId 1 1 1 2 3 ProductId A B C A C
Es decir en este caso no podra existir una nueva combinacin 1 A o 2 A. Quantity: Es la cantidad del producto del pedido.
ROLLUP
Se usa para presentar resmenes 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
45
Desarrollo de Software
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 adems, otra fila con la suma de todas las cantidades de todos los productos. El resultado de este ejemplo, sera el que muestra la imagen:
Ejemplo 64
Select ProductID, OrderId, Sum(Quantity) As Cantidad_Total From [Order Details] where orderid < 10250 Group by ProductID, OrderID with Rollup Order by ProductID, OrderID
CUBE
Al igual que Rollup realiza resmenes de campos agrupados. Pero en este caso muestra un resumen con cada combinacin posible de los campos agrupados.
Ejemplo 65
Select ProductID, OrderId, Sum(Quantity) As Cantidad_Total From [Order Details] where orderid < 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 combinacin posible entre el Recopilado por Yuri Marquez Solis
46
Desarrollo de Software
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 clusula de resumen, es decir, para saber por ejemplo si un Null 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 < 10250 Group by ProductID, OrderID with Cube Order by ProductID, OrderID 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. Ponindole un alias al grouping saldra el nombre de columna que le indiquemos.
COMPUTE
Realiza un resumen en una columna aparte con el resultado de la funcin de agregado indicada. Su formato sera Compute funcin(campo). No se puede utilizar en aplicaciones cliente / servidor, es una clausula meramente informativa. Tampoco se le pueden poner alias a los resmenes.
Ejemplo 67
Select Productid, Orderid, Quantity From [Order Details] order by ProductID, Orderid compute Sum(quantity) Recopilado por Yuri Marquez Solis
47
Desarrollo de Software
Vemos que muestra la columna con la suma total de todas las cantidades.
Ejemplo 68
Realizar una consulta que resuma la cantidad de artculos pedidos por cada ndice de producto y nmero de pedido. Realizando un clculo acumulativo.
select productid as [PRODUCTO] ,orderid as [N PEDIDO] ,sum(quantity) as [SUMA TOTAL] from [Order Details] group by productid, orderid with rollup order by productid, orderid
PRODUCTO N 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
Ejemplo 69
Recopilado por Yuri Marquez Solis
48
Desarrollo de Software
Modificacin al ejercicio anterior: Realizar el mismo resumen pero nicamente para el producto cuyo id es 50
select productid as [PRODUCTO] ,orderid as [N PEDIDO] ,sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by productid, orderid with rollup order by productid, ordered PRODUCTO N 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 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 modificacin 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 [N PEDIDO] ,grouping(orderid) as [GRUPO PEDIDO] ,sum(quantity) as [SUMA TOTAL] from [Order Details] where productid = 50 group by Productid,orderid with cube order by productid,orderid
PRODUCTO GRUPO PRODUCTO N 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 Recopilado por Yuri Marquez Solis
49
Desarrollo de Software
50 50 50 50 50 50 50 50 50 50 50 0 0 0 0 0 0 0 0 0 0 0 NULL 10350 10383 10429 10465 10637 10729 10751 10920 10948 11072 1 0 0 0 0 0 0 0 0 0 0 235 15 15 40 25 25 40 20 24 9 22
Ejemplo 71
Lista de pedidos que muestre por cdigo de pedido la cantidad de productos vendidos por cada uno de ellos.
select Idpedido,idproducto,preciounidad,cantidad,[Sub Total]=sum(Preciounidad*Cantidad) from [detalles de pedidos] group by Idpedido,idproducto,preciounidad,cantidad order by IdPedido compute sum(Cantidad) by IdPedido
50
Desarrollo de Software
Ejemplo 72
Generar un resumen de subtotales en una consulta que devuelva el nmero de pedido, la cantidad pedida para todos los orderid 11070
Select Orderid as [N PEDIDO], Quantity AS [CANTIDAD] From [Order Details] where orderid >= 11070 order by Orderid compute Sum(quantity) by orderid compute sum(quantity)
N PEDIDO CANTIDAD ----------- -------11070 40 11070 20 11070 30 11070 20 sum =========== 110
51
Desarrollo de Software
(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 [N PEDIDO], Quantity as [CANTIDAD] From [Order Details] where orderid = 11075 or orderid = 11076 order by Orderid compute Sum(quantity) by ordered N PEDIDO CANTIDAD ----------- -------11075 10 11075 30 11075 2 sum =========== 42
N PEDIDO CANTIDAD ----------- -------11076 20 11076 20 11076 10 sum =========== 50 (8 filas afectadas)
Ejemplo 74
Modificacin al ejercicio anterior: Agregar la cantidad total y la cantidad promedio al final del informe
Select Orderid as [N 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)
52
Desarrollo de Software
N PEDIDO CANTIDAD ----------- -------11075 10 11075 30 11075 2 sum =========== 42
sum =========== 92
avg =========== 15
Ejemplo 75
Seleccionar de forma agrupada por tipo, todos los tipos, la suma de los precios y la suma del anticipo de la tabla ttulos
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 19.9900 5000.0000 business 11.9500 5000.0000 Recopilado por Yuri Marquez Solis
53
Desarrollo de Software
business business 2.9900 19.9900 10125.0000 5000.0000
TIPO PRECIO ANTICIPO ------------ --------------------- --------------------mod_cook 19.9900 .0000 mod_cook 2.9900 15000.0000 sum ===================== 22.9800
TIPO PRECIO ANTICIPO ------------ --------------------- --------------------popular_comp 22.9500 7000.0000 popular_comp 20.0000 8000.0000 popular_comp NULL NULL sum ===================== 42.9500
TIPO PRECIO ANTICIPO ------------ --------------------- --------------------psychology 21.5900 7000.0000 psychology 10.9500 2275.0000 psychology 7.0000 6000.0000 Recopilado por Yuri Marquez Solis
54
Desarrollo de Software
psychology 19.9900 psychology 7.9900 2000.0000 4000.0000
Ejemplo 76
Obtener todos los tipos, precios y anticipos de la tabla titulos individualmente ordenados por el tipo en un informe que, adems, 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 19.9900 5000.0000 business 11.9500 5000.0000 business 2.9900 10125.0000 business 19.9900 5000.0000 sum ===================== 54.9200
TIPO PRECIO ANTICIPO ------------ --------------------- --------------------mod_cook 19.9900 .0000 mod_cook 2.9900 15000.0000
55
Desarrollo de Software
sum ===================== 22.9800
sum ===================== 15000.0000 TIPO PRECIO ANTICIPO ------------ --------------------- --------------------popular_comp 22.9500 7000.0000 popular_comp 20.0000 8000.0000 popular_comp NULL NULL sum ===================== 42.9500
Ejemplo 77
Generar un informe que muestre la suma de los precios de los libros de psicologa 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 10.9500 psychology 0736 7.0000 psychology 0736 19.9900 psychology 0736 7.9900 sum ===================== Recopilado por Yuri Marquez Solis
56
Desarrollo de Software
45.9300
TIPO CODIGO EDITOR PRECIO ------------ ------------- --------------------psychology 0877 21.5900 sum ===================== 21.5900
(7 filas afectadas)
Ejemplo 78
Generar un informe que obtenga la suma de los precios de todos los libros de psicologa, as como la suma de los precios de los libros de psicologa 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 10.9500 psychology 0736 7.0000 psychology 0736 19.9900 psychology 0736 7.9900 sum ===================== 45.9300
57
Desarrollo de Software
sum ===================== 21.5900
(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 19.9900 .0000 mod_cook 0877 2.9900 15000.0000 sum ===================== 22.9800
TIPO CODIGO EDITOR PRECIO ANTICIPO ------------ ------------- --------------------- --------------------trad_cook 0877 11.9500 4000.0000 trad_cook 0877 20.9500 7000.0000 trad_cook 0877 14.9900 8000.0000 Recopilado por Yuri Marquez Solis
58
Desarrollo de Software
sum ===================== 47.8900
(9 filas afectadas)
Ejemplo 80
Generar un informe que muestre todos los ttulos, precio y anticipo de aquellos ttulos que tengan un precio superior a 20 dlares. Ofrecer tambin la suma total del precio y del anticipo.
Select title as [TITULO] ,price as [PRECIO] ,advance as [ANTICIPO] From titles where price > 20 order by title compute sum(price) compute sum(advance)
TITULO PRECIO ANTICIPO -------------------------------------------------------------------------------- --------------------- -------------------But Is It User Friendly? 22.9500 7000.0000 Computer Phobic AND Non-Phobic Individuals: Behavior Variations 21.5900 7000.0000 Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean 20.9500 7000.0000 sum ===================== 65.4900
(5 filas afectadas)
Ejemplo 81
59
Desarrollo de Software
Generar un informe que muestre el precio, el tipo y el nmero de editor de la tabla titles de todos aquellas obras que pertenezcan la categora de business. Adems aparecer la suma total de precios y el mximo pub_id de esta seleccin
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 2.9900 0736 business 19.9900 1389 business 19.9900 1389 business 11.9500 1389 sum ===================== 54.9200 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. Mostrar la suma de los precios y los anticipos por tipo y luego, calcular 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 19.9900 .0000 mod_cook 2.9900 15000.0000 sum ===================== 22.9800
60
Desarrollo de Software
TIPO PRECIO ANTICIPO ------------ --------------------- --------------------trad_cook 20.9500 7000.0000 trad_cook 11.9500 4000.0000 trad_cook 14.9900 8000.0000 sum ===================== 47.8900
Ejemplo 83
1. A que precio se ah vendido los productos?
61
Desarrollo de Software
Si observa el resultado contiene filas duplicadas si se desea eliminar esas filas se agrega a la consulta la clausula DISTINCT.
62
Desarrollo de Software
La nica condicin es que las 2 tablas tengan un campo en comn.
Ejemplo 84
select clientes.NombreCompaa,pedidos.idpedido from clientes inner join pedidos on clientes.idcliente=pedidos.idcliente
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 pedidos.IdPedido, pedidos.IdCliente, 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 pedidos.IdPedido, pedidos.IdCliente order by pedidos. IdPedido
CROSS JOIN
Recopilado por Yuri Marquez Solis
63
Desarrollo de Software
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 comn para ejecutar el Cross Join.
Ejemplo 86
La siguiente consulta combina cada una de las filas de la tabla categoras con cada una de las filas de la tabla productos select productos.NombreProducto,categorias.Nombrecategoria from productos cross join categorias order by productos.NombreProducto
Mostrar el pedido completo con el id='10248' Select pedidos.IdPedido, pedidos.IdCliente, Total=sum ([detalles de pedidos].Preciounidad*[detalles de pedidos].Cantidad) From [detalles de pedidos] inner join pedidos on [Detalles de pedidos].IdPedido=pedidos.IdPedido where pedidos.IdPedido='10248' Group by pedidos.IdPedido, pedidos.IdCliente
Ejemplo 88
Recopilado por Yuri Marquez Solis
64
Desarrollo de Software
1. Mostrar la cantidad de productos por categora. Select Categoras.IdCategora, Categoras.NombreCategora, [Total de Producto]=sum (UnidadesEnExistencia) from Categoras inner join Productos on Categoras.IdCategora=productos.IdCategora Group by Categoras.IdCategora, Categoras.NombreCategora
Ejemplo 89
Calcular cuantas ventas tiene cada uno de los vendedores.
Select empleados.IdEmpleado, empleados.Nombre, empleados.Apellidos, [Total de ventas]=count (pedidos.IdPedido) from empleados Inner join Pedidos on empleados.IdEmpleado=pedidos.IdEmpleado Group by empleados.IdEmpleado, empleados.Nombre, empleados.Apellidos
65
Desarrollo de Software
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 despus saca la de Plantilla
Select Apellido, Oficio as 'OFICIO/FUNCION' ,salario from emp UNION Select Apellido, Funcion, Salario from Plantilla
66
Desarrollo de Software
Recomendaciones a la hora de usar las combinaciones: Combinar tablas en funcin de claves principales y externas Limite el nmero de tablas de las combinaciones.
67
Desarrollo de Software
SUBCONSULTAS Es una SELECT anidada en una instruccin INSERT, DELETE, SELECT o UPDATE. Como una tabla derivada
Select e.emp_no as Numero ,e.Apellido from (select emp_no, apellido from emp) as e
Select emp_no as [Numero] ,Apellido ,Salario ,(select avg(Salario) from emp) as Diferencia from emp where oficio = 'Empleado'
Para correlacionar datos: Expresin dinmica que cambia en cada fila de una consulta externa Es una combinacin entre la subconsulta y la fila de la consulta externa. Dividen consultas complejas con dos o ms consultas simples relacionadas
Subconsulta correlacionada Select apellido, oficio,dept_no from emp as e where 20 < (select dept_no from dept as d where e.dept_no = d.dept_no and d.dnombre = 'Ventas') SUBCONSULTAS
68
Desarrollo de Software 1. Mostrar el numero de empleado, el apellido y la fecha de alta del empleado mas antiguo de la
empresa SELECT emp_no,apellido, 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_no,apellido, 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 Jimnez.
select apellido, oficio from emp where oficio = (select oficio from emp where apellido = 'JIMENEZ')
4. Queremos saber el apellido, oficio, salario y nmero 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 > (select max (salario) from emp where dept_no = 30)
69
Desarrollo de Software 5. Mostrar el apellido, la funcin, sala o departamento de todos los empleados que trabajen en la
empresa. select e.Apellido, e.Oficio as [Cargo en Empresa], d.dnombre as [Oficina] from emp as e inner join dept as d on e.dept_no = d.dept_no union select p.Apellido, p.funcion, s.nombre from plantilla as p inner join sala as s on p.hospital_cod = s.hospital_cod and p.sala_cod = s.sala_cod union select d.Apellido, d.especialidad, h.nombre from doctor as d inner join hospital as h on d.hospital_cod = h.hospital_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 = ventas)) order by 2
70
Desarrollo de Software 8. Mostrar los empleados que tienen mejor salario que la media de los directores, no incluyendo al
presidente. Select * from emp where salario > (select avg (salario) from emp where oficio = 'DIRECTOR') and oficio <> 'PRESIDENTE'
9. Mostrar el apellido, funcin, salario y cdigo 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 = ENFERMERO or funcion = ENFERMERA) and hospital_cod = (select hospital_cod from hospital where nombre = SAN CARLOS) Select apellido, funcion, salario, hospital_cod from plantilla where funcion in ('ENFERMERO','ENFERMERA') and hospital_cod = (select hospital_cod from hospital where nombre = 'SAN CARLOS')
10. Visualizar los datos de los hospitales que tienen personal (Doctores) de cardiologa.
Select * from hospital where hospital_cod in (select hospital_cod from doctor where especialidad = Cardiologa)
71
Desarrollo de Software
72
Desarrollo de Software 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 = PROVINCIAL or nombre= GENERAL)
12. Mostrar el apellido de los enfermos que nacieron antes que el Seor Miller.
Select apellido from enfermo where Fecha_nac < (select fecha_nac from enfermo where apellido = MILLER B.)
73
Desarrollo de Software
Simulacion de una clausula JOIN Vamos a mostrar los oficios que estn en ms de un departamento. Select distinct e1.oficio from emp as e1 where e1.oficio in(Select e2.oficio from emp as e2 where e1.dept_no <> e2.dept_no) Se debe utilizar antes una combinacin que una subconsulta, la combinacin sera asi, dando los mismos resultados: Select distinct e1.Oficio from emp as e1 inner join emp as e2 on e1.oficio = e2.oficio where e1.dept_no <> e2.dept_no Estos son los dos oficios que estn en ms de un departamento.
select e1.apellido,e1.oficio, e1.salario from emp as e1 where e1.salario > (select avg(e2.salario) from emp as e2 where e1.oficio = e2.oficio)
Esta es la consulta utilizando el HAVING, que es la que deberamos utilizar antes que una subconsulta de simulacin HAVING: SELECT e1.apellido,e1.oficio, e1.salario FROM emp AS e1 INNER JOIN emp AS e2 ON e1.oficio = e2.oficio GROUP BY e1.oficio, e1.salario,e1.apellido HAVING e1.salario > AVG (e2.salario)
74