Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual de SQL Server 2008
Manual de SQL Server 2008
FACULTAD DE INGENIERÍA
Cajamarca, 2012
Manual de SQL Server 2008 2012
INTRODUCCIÓN............................................................................................................................. - 5 -
CAPÍTULO I .................................................................................................................................... - 6 -
CONCEPTOS BÁSICOS DE SQL .........................................................................................................- 6 -
1.1. LENGUAJE ESTRUCTURADO DE CONSULTAS ........................................................... - 6 -
1.1.1. REQUERIMIENTOS Y CARACTERÍSTICAS........................................................................... - 6 -
1.2. INICIANDO SQL SERVER 2008 ......................................................................................... - 7 -
1.3. CREAR UNA NUEVA TABLA: ........................................................................................... - 12 -
1.4. HACER CONSULTAS ......................................................................................................... - 16 -
CAPITULO II ........................................................................................................................................ - 18 -
EJERCICIOS ....................................................................................................................................... - 37 -
CAPÍTULO IV ...................................................................................................................................... - 73 -
EJERCICIOS ....................................................................................................................................... - 85 -
CAPÍTULO V ....................................................................................................................................... - 96 -
EJEMPLOS .......................................................................................................................................... - 98 -
El presente manual de SQL Server 2008 trata principalmente del manejo de datos a
través de las diferentes sentencias que tiene SQL. En este se considera a las tablas como
contenedores de datos organizados en filas y en columnas. Aquí es posible seleccionar
datos que pertenezcan a diferentes tablas y también es permitido establecer reglas o
condiciones que tengan que cumplir dichos datos para poder ser considerados como
registros resultantes.
El mayor mérito de SQL está en su posibilidad de combinar las diferentes tablas de una
base de datos en un solo conjunto resultante y por ello ha sido considerado en la mayoría
de los programas administradores de Base de Datos tales como Oracle, Access o FoxPro.
Para cada comando; primero se definirá, luego se presentará y explicará la sintaxis SQL,
seguida por algún o algunos ejemplos.
Para iniciar el trabajo con SQL Server 2008y poder realizar ejercicios de consultas
con SQL TRANSACT primero ingresaremos al motor de la base de datos para lo
cual seguiremos los siguientes pasos:
El Tipo de Servidor Nombre del Servidor (ha sido definido El tipo de Autentificación
al que debemos conectarnos al momento de la instalación)
Los objetos lo podemos ver en las carpetas como Base de Datos, cuando lo
extendemos, entre otros; como también veremos las Bases de Datos existentes
que han sido creadas al momento de la instalación una de ellas con la que
trabajaremos es la Base de Datos Notrhwind.
Las tablas sirven para representar los datos o registros de una Base de
Datos.Cada tabla está compuesta por varias filas y columnas, cadacolumna tiene
un nombre único.
Ubicamos la Base de Datos donde vamos a crear nuestra tabla (en este caso
utilizaremos la Base de Datos Notrhwind) expandimos.
Después, iremos dando el nombre a cada campo que formarán las columnas de
la tabla (Código,Paterno, Materno, Nombre, Sexo, Dirección).
Cuando se crea una tabla, hay que especificar el nombre de la tabla, los nombres
de las columnas y sus tipos de datos. Se puede utilizar el mismo nombre de
columna en tablas diferentes de la misma base de datos.
Para llenar una tabla ya veremos más adelante los comandos que se deben
utilizar.
SELECT *
FROM Employees
Como podemos ver SQL nos muestra un listado de tablas que existe dentro de la
base de datos que estamos trabajando.
Tipos de Comandos:
2.1.1. SELECT
La sentencia SELECT permite seleccionar registros de una o más
tablas.Se usa para listar los campos deseados del resultado de una
consulta. Es la sentencia básica de SQL.
SINTAXIS
El * después de SELECT indicaque queremos ver todos los campos que aparecen
en la tabla.
Select
ProductID,ProductName,SupplierID,CategoryID,QuantityP
erUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLev
el,Discontinued
From Products
A. MODIFICADORES
SINTAXIS
Función Descripción
Select sum(Quantity)
From [Order Details]
Select max(UnitPrice)
From Products
C. USO DE ALIAS: Hay dos tipos de alias que se utilizan con mayor
frecuencia. Alias de columna y alias de tabla.
SINTAXIS
2.1.3. WHERE
SINTAXIS
SELECT "nombre_campo"
FROM "nombre_tabla"
WHERE "Condición_Filtro"
SELECT "nombre_campo"
FROM "nombre_tabla"
WHERE "condición " {[AND|OR] "condición "}
CONCATENACIÓN DE CADENAS
SINTAXIS
SELECT "nombre_campo"
FROM "nombre_tabla"
WHERE "nombre_campo" IN ('valor1', 'valor2', ...)
SELECT*
FROMProducts
WHERECategoryIDin(4,6,8,2)
El resultado es el siguiente:
SELECT*
FROMProducts
WHERESupplierIDin(3,5,8)
Resultado de la consulta:
Ejemplos:
o Mostrar el nombre del producto, unidad, código; cuyo precio es mayor que 100.
SELECTProductID,ProductID,UnitPrice
FROMProducts
WHEREUnitPrice>100
o Mostrar el nombre del producto, unidad, código; además los productos que
están entre 30 y 60.
selectProductID,ProductName,UnitPrice
fromProducts
WhereUnitPrice>30 ANDUnitPrice<60
BETWEEN
SINTAXIS
SELECT "nombre_campo"
FROM "nombre_tabla"
WHERE "nombre_campo" BETWEEN 'valor_mínimo' AND 'valor_máximo'
selectProductID,ProductName,UnitPrice
fromProducts
WhereUnitPricebetween 30 and 60
NULL
select ContactName
from dbo.Suppliers
where ContactName is not null
Al ejecutar esta consulta da la siguiente tabla como resultado:
SINTAXIS
SELECT "nombre_columna"
FROM "nombre_tabla"
WHERE "nombre_columna" LIKE {patrón}
Expresión Devuelve
LIKE 'BR%' Todos los nombres que comiencen por las letras BR.
LIKE '%een' Todos los nombres que terminen con las letras een.
LIKE '%en%' Todos los nombres que contengan las letras en.
LIKE '_en' Todos los nombres de tres letras que terminen con las
letras en.
LIKE '[CK]%' Todos los nombres que comiencen por C o por K.
LIKE '[S-V]ing' Todos los nombres de cuatro letras que terminen con
las letras ing y comiencen por cualquier letra
comprendida entre S y V.
LIKE 'M[^c]%' Todos los nombres que comiencen por la letra M y
cuya segunda letra no sea c.
Ejemplo
En este ejemplo se obtienen las compañías de la tabla customers que
contengan la palabra "restaurant" en su nombre.
SELECT companyname
FROM customers
WHERE companyname LIKE '%Restaurant%'
Al ejecutar la instrucción se nos presenta la siguiente tabla resultante:
SELECT *
FROM Employees
WHERE YEAR(BirthDate)=1963
Para mes sería Month y para día DAY. Recordar que "fecha" debe ser
un campo de tipo Date, y que el comparador es un entero (no poner
entre comillas)
Resultado de la consulta:
SELECT *
FROM dbo.Orders
WHERE Datepart(yyyy,OrderDate)='1996'
2.1.4. ORDER BY
SINTAXIS
SELECT "nombre_campo"
FROM "nombre_tabla"
WHERE "condición"
ORDER BY "nombre_campo" [ASC, DESC]
El campo por el que queremos ordenar debe estar en el SELECT. La palabra ASC
o DESC se pone al final de las columnas de ordenamiento.
TOP
SINTAXIS
Selecttop 15 OrderId,ProductID,Quantity
from[Order Details]
orderbyQuantitydesc
WITH TIES
EJERCICIOS
Base de Datos II (20011-1)
Ing. De Sistemas – FI- UNC
EJERCICIOS básicos de SQL TRANSACT
(Microsoft SQL SERVER 2008)
select *
from dbo.Customers
order by ContactName
select *
from dbo.Orders
order by OrderDate Desc
select *
from [Order Details]
order by Quantity
select *
from Products
where ProductName like 'P%' AND UnitPrice between 10 AND 120
5. Obtener todos los clientes de los Países de: USA, Francia y UK.
select *
from dbo.Customers
where Country in ('usa','francia','uk')
select *
from dbo.Products
where (CategoryID in (1,3,4,7)) AND (Discontinued='true'AND
UnitsInStock='0')
7. Obtener todas las órdenes hechas por el empleado con código: 2, 5 y 7 en el año
1996.
select *
from dbo.Orders
where EmployeeID in (2,5,7) AND YEAR(OrderDate)='1996'
select *
from dbo.Customers
where Fax is not null
9. Seleccionar todos los clientes que no cuentan con FAX, del País de USA.
select *
from dbo.Customers
where Fax is null AND Country='usa'
select*
from dbo.Employees
where ReportsTo is not null
11. Seleccionar todos los campos del cliente, cuya compañía empiecen con la letra de A
hasta la D y pertenezcan al país de USA, ordenarlos por la dirección.
select *
from dbo.Customers
where CompanyName like '[a-d]%' and Country='usa'
order by Address
12. Seleccionar todos los campos del proveedor, cuya compañía no comience con las
letras de la B a la G, y pertenezcan al país de UK, ordenarlos por nombre de la
compañía.
select *
from dbo.Suppliers
where (CompanyName like 'a%' or CompanyName like '[f-z]%') and
Country='uk'
order by CompanyName
13. Seleccionar los productos vigentes cuyos precios unitarios están entre 35 y 250, sin
stock en almacén, pertenecientes a las categorías 1, 3, 4, 7 y 8, que son distribuidos
por los proveedores 2, 4, 6, 7 y 9.
select *
from Products
where Discontinued='false' AND UnitPrice between 35 AND 250 AND
UnitsInStock='0' AND CategoryID in (1,3,4,7,8) AND SupplierID in
(2,4,6,7,9)
14. Seleccionar todos los campos de los productos descontinuados, que pertenezcan a
los proveedores con códigos: 1, 3, 7, 8 y 9, que tengan stock en almacén, y al
mismo tiempo que sus precios unitarios estén entre 39 y 190, ordenados por código
de proveedor y precio unitario de manera ascendente.
select *
from Products
where Discontinued='true' AND SupplierID in (1,3,7,8,9) AND
UnitsInStock!='0' AND UnitPrice between 39 AND 190
order by SupplierID,UnitPrice
select top 7 *
from dbo.Products
where UnitsInStock!=0
order by UnitPrice desc
16. Seleccionar los 9 productos, con menos stock en almacén, que pertenezcan a la
categoría 3, 5 y 8.
select top 9 *
from dbo.Products
where CategoryID in (3,5,8)
order by UnitsInStock
select *
from dbo.Orders
where EmployeeID between 2 AND 5 AND CustomerID like '[a-g]%' AND
DATEPART(MM,OrderDate)='07' AND DATEPART(dd,OrderDate)='31'
18. Seleccionar las órdenes de compra, realizadas por el empleado con código 3, de
cualquier año pero sólo de los últimos 5 meses (Agosto - Diciembre).
19.
select *
from Orders
where EmployeeID=3 and month(OrderDate)in (8,9,10,11,12)
select *
from [Order Details]
where Quantity between 10 AND 250
COMBINACIÓN DE TABLAS Y
AGRUPACIÓN DE DATOS
3.1. JOIN
Para realizar uniones en SQL se requieren mucho de los elementos que ya hemos
visto. SQL también proporciona varios mecanismos para reunir relaciones,
incluyendo reuniones condicionales y reuniones naturales, así como varias formas
de reunión externa. Estas operaciones adicionales se usan a menudo como
subconsultas dentro de la cláusula from.
Por ejemplo:
3.2. GROUP BY
Genera valores de resumen para una sola columna, para esto se utiliza funciones
de agregado con la cláusula GROUP BY. Utilice la cláusula HAVING con la
cláusula GROUP BY para restringir los grupos de filas devueltas en el conjunto de
resultados.
SINTAXIS
Esta sentencia se utiliza de similar manera que la sentencia WHERE para filtrar
instrucciones en SQL que incluyen agrupaciones de registros se empleará esta
cláusula HAVING.
Su sintaxis es:
SINTAXIS
Por ejemplo:
Mostrar la cantidad de órdenes hechas por cada empleado pero que sean mayores
que 100.
Se escribirá la siguiente instrucción:
Select COUNT(*) as total,e.FirstName,e.LastName
from dbo.Orders as o
inner join dbo.Employees as e on o.EmployeeID=e.EmployeeID
groupby e.FirstName,e.LastName
having COUNT(*)>100
orderby FirstName,LastName
Ejercicio 1
selectCOUNT(*)astotal,e.EmployeeID,e.LastName
fromdbo.Ordersaso
innerjoindbo.Employeesaseono.EmployeeID=e.EmployeeID
groupbye.EmployeeID,e.LastName
Ejercicio 2
selectCOUNT(*)astotal,e.FirstName,e.LastName
fromdbo.Ordersaso
innerjoindbo.Employeesaseono.EmployeeID=e.EmployeeID
groupbye.FirstName,e.LastName
havingCOUNT(*)>100
orderbyFirstName,LastName
Ejercicio 3
selectsum(od.Quantity)astotal,c.CompanyName
fromOrdersaso
innerjoin[Order Details]asodono.OrderID=od.OrderID
innerjoinCustomersasconc.CustomerID=o.CustomerID
groupbyc.CompanyName
orderbyc.CompanyName
Ejercicio 4
selectsum(Quantity*UnitPrice*2.82)astotal,o.OrderID
from[Order Details]asodinnerjoinOrdersasoono.OrderID=od.OrderID
whereyear(o.OrderDate)=1996 andMONTH(o.OrderDate)=12
groupbyo.OrderID
EJERCICIOS
21. Mostrar el código de categoría, nombre de categoría, código del producto, nombre del
producto y precio.
select
dbo.Categories.CategoryID,dbo.Categories.CategoryName,dbo.Products.Pro
ductID,dbo.Products.ProductName,dbo.Products.UnitPrice
from dbo.Categories
inner join dbo.Products on
dbo.Categories.CategoryID=dbo.Products.CategoryID
23. Mostrar: código, nombre, ciudad y país del proveedor. Código, nombre, precio, stock del
producto.
select s.SupplierID,s.CompanyName,s.City,s.Country,p.ProductID,
p.ProductName,p.UnitPrice,p.UnitsInStock
from Suppliers as s
inner join Products as p on s.SupplierID=p.SupplierID
24. Código y nombre de la categoría, código, nombre, precio y stock de los productos, código,
nombre de los proveedores.
select c.CategoryID,c.CategoryName,p.ProductID,p.ProductName,
p.UnitPrice,p.UnitsInStock,s.SupplierID,s.CompanyName
from dbo.Categories as c
inner join dbo.Products as p on c.CategoryID=p.CategoryID
inner join dbo.Suppliers as s on p.SupplierID=s.SupplierID
25. Mostrar número de la orden, fecha, nombre del producto, nombre de la categoría, nombre
del producto.
select od.OrderID,o.OrderDate,p.ProductName,c.CategoryName,s.CompanyName
from Orders as o
inner join [Order Details] as od on od.OrderID=o.OrderID
inner join dbo.Products as p on od.ProductID=p.ProductID
inner join dbo.Categories as c on c.CategoryID=p.CategoryID
inner join dbo.Suppliers as s on s.SupplierID=p.SupplierID
26. Mostrar número de la orden, fecha, nombre y dirección del cliente, nombre y apellido del
empleado, nombre del producto comprado y nombre del proveedor.
select
od.OrderID,o.OrderDate,c.CompanyName,c.Address,e.LastName,e.LastName,
p.ProductName,s.CompanyName
from [Order Details]as od
inner join Orders as o on od.OrderID=o.OrderID
inner join Products as p on od.ProductID=p.ProductID
inner join Customers as c on c.CustomerID=o.CustomerID
inner join Employees as e on e.EmployeeID=o.EmployeeID
inner join Suppliers as s on s.SupplierID=p.SupplierID
select c.CategoryID,c.CategoryName,p.ProductID,p.ProductName,
p.UnitPrice
from Categories as c
inner join dbo.Products as p on c.CategoryID=p.CategoryID
where c.CategoryID in (2,4,5,7)
28. Modificar el ejercicio 2: sólo las órdenes del mes de enero de 1997.
select s.SupplierID,s.CompanyName,s.City,s.Country,p.ProductID,
p.ProductName,p.UnitPrice,p.UnitsInStock
from Suppliers as s
inner join Products as p on s.SupplierID=p.SupplierID
where p.UnitsInStock='0'
select c.CategoryID,c.CategoryName,p.ProductID,p.ProductName,
p.UnitPrice,p.UnitsInStock,s.SupplierID,s.CompanyName
from dbo.Categories as c
inner join dbo.Products as p on c.CategoryID=p.CategoryID
inner join dbo.Suppliers as s on p.SupplierID=s.SupplierID
where p.UnitPrice between 50 AND 100
31. Modificar el ejercicio 5: sólo del primer trimestre del año 1996.
select od.OrderID,o.OrderDate,p.ProductName,c.CategoryName,s.CompanyName
from Orders as o
inner join [Order Details] as od on od.OrderID=o.OrderID
inner join dbo.Products as p on od.ProductID=p.ProductID
inner join dbo.Categories as c on c.CategoryID=p.CategoryID
inner join dbo.Suppliers as s on s.SupplierID=p.SupplierID
where (month(o.OrderDate)='1' or month(o.OrderDate)='1'or
month(o.OrderDate)='2'or month(o.OrderDate)='3') AND
YEAR(o.OrderDate)='1996'
BASE DE DATOS II
EJERCICIOS inner join, group by, having y where SQL
TRANSACT (Microsoft SQL SERVER 2008)
Usando la Base de Datos Northwind, realizar las siguientes consultas:
32. Visualizar el máximo y mínimo precio de los productos por categoría, mostrar el
nombre de la categoría.
33. Visualizar el máximo y mínimo precio de los productos por proveedor, mostrar el
nombre de la compañía proveedora.
34. Seleccionar las categorías que tengan más de 5 productos. Mostrar el nombre de la
categoría y número de productos.
select Country,count(SupplierID) as
total_proveedores,City,count(SupplierID) as total_proveedores
from dbo.Suppliers
group by Country,city
38. Calcular el stock total de los productos por cada categoría. Mostrar el nombre de la
categoría y el stock por categoría.
40. Obtener el Nombre del Cliente, Nombre del Proveedor, Nombre del Empleado y el
nombre de los productos que están en la orden 10250.
select c.CompanyName,
s.CompanyName,e.LastName,p.ProductName,o.OrderID
from Customers as c
inner join orders as o on c.CustomerID=o.CustomerID
inner join Employees as e on e.EmployeeID=o.EmployeeID
inner join [Order Details] as od on od.OrderID=o.OrderID
inner join Products as p on p.ProductID=od.ProductID
inner join Suppliers as s on s.SupplierID=p.supplierID
where o.OrderID='10250'
41. Mostrar el número de Órdenes realizadas de Cada uno de los Clientes por año.
42. Mostrar el número de Órdenes realizadas de Cada uno de los Empleados en cada
año.
43. Mostrar el número de Órdenes realizadas de Cada uno de los Clientes por cada mes
y año.
44. Contar el número de Órdenes que se han realizado por años y meses.
select
c.CompanyName,c.ContactName,od.OrderID,o.OrderDate,p.ProductID,od.Q
uantity,p.ProductName,s.CompanyName
from [Order Details] as od
inner join dbo.Orders as o on od.OrderID=o.OrderID
inner join dbo.Products as p on p.ProductID=od.ProductID
inner join dbo.Customers as c on c.CustomerID=o.CustomerID
inner join dbo.Suppliers as s on s.SupplierID=p.SupplierID
where s.CompanyName like '[a-g]%' and Quantity between 18 and 190
select p.CategoryID,COUNT(*) as
total_productos,c.CategoryName,p.ProductName
from dbo.Products as p inner join dbo.Categories as c on
p.CategoryID=c.CategoryID
group by p.CategoryID,c.CategoryName,p.ProductName
having p.CategoryID in(3,5,8)
order by c.CategoryName
MANIPULACIÓN DE TABLAS
SINTAXIS
insertinto[alumnitos]
values('A001','karen','estrada')
select*
fromalumnitos
Insertinto [alumnitos]
Values ('A002','juan','mendez')
Select *
From alumnitos
insertinto[alumnitos]
values('A003','ana','diaz')
select*
fromalumnitos
UPDATE "nombre_tabla"
SET "colonne 1" = [nuevo valor]
WHERE {condition}
Ejemplo
En el ejemplo siguiente se agrega el 10 por ciento a los precios actuales de todos
los productos de Northwind Traders.
USE northwind
UPDATE products
SET unitprice = (unitprice * 1.1)
Ejemplo 1:
updateProducts
setUnitPrice=UnitPrice*0.5
whereCategoryID='1'
selectcount(*),MIN(UnitPrice)asmini,max(UnitPrice)asmaxi
fromProducts
whereCategoryID=1
Ejemplo 3:
updatedbo.Categories
setCategoryName='juguetes'
whereCategoryID=5
select*
fromCategories
Ejemplo 4:
updateSuppliers
setFax='0'
whereFaxisnull
select*
fromSuppliers
Ejemplo 5:
updateEmployees
setFirstName='Karen',LastName='Estrada'
whereEmployeeID=6
select*
fromEmployees
Ejemplo 6:
updateCustomers
setCustomerID=('UNCFNI')
whereCustomerID=('ALFKI')
select*
fromCustomers
SINTAXIS
La instrucción DELETE quita una o varias filas de una tabla o una vista mediante
una transacción. Puede especificar las filas que elimina SQL Server si filtra la tabla
de destino o mediante una cláusula JOIN o una subconsulta.
La instrucción DELETE quita filas de las tablas. La instrucción DELETE permite
quitar una o varias filas de una tabla.
Al utilizar la instrucción DELETE, tenga en cuenta los hechos siguientes:
SQL Server eliminará todas las filas de la tabla si no incluye una cláusula
WHERE en la instrucción DELETE.
Cada fila eliminada se almacena en el registro de transacciones.
Ejemplo 1:
deletefromProducts
whereDiscontinued=1
Ejemplo 2:
delete
fromOrders
whereOrderID=10255
select*
fromOrders
whereOrderID=10255
Ejemplo 3:
delete
from[Order Details]
whereProductIDin(selectProductID
fromProducts
whereDiscontinued=1)
4.4. SUBCONSULTAS
Es una consulta dentro de otra más grande.
o Consulta : Seleccionar los productos cuyos precios sean mayores al
promedio de todos los productos
select*
fromProducts
whereUnitPrice>(selectAVG(UnitPrice)fromProducts)
o
delete
from[Order Details]
whereProductIDin(selectProductID
fromProducts
whereDiscontinued=1)
exec SPQ_PRODUCTS 2
Ejemplo:
ALTER proc SPQ_PRODUCTS
as
select *
from Products
where CategoryID=8
Exec hola 8
Ejemplo:
Alter procedure hola
@cod int
as
select *
from Customers
where CustomerID=@cod
Ejemplo:
Create proc precios
@li money,
@ls money
as
select *
from Products
where UnitPrice between @li and @ls
Las variables son elementos del lenguaje con valores asignados. En Transact-
SQL se pueden utilizar variables locales.
Una variable local es una variable definida por el usuario en una instrucción
DECLARE; se le asigna un valor inicial en una instrucción SET o SELECT y,
después, se utiliza en la instrucción, programa por lotes o procedimiento en el que
se declaró. Una variable local se identifica mediante un símbolo arroba (@) que
precede a su nombre mientras que una variable global incluye dos símbolos arroba
delante de su nombre.
EJERCICIOS
Ejemplo 1:
createprocempleado_unidades
@anioint
as
selectSUM(od.Quantity)astotal,e.LastName,e.FirstName,YEAR(o.OrderDate)asa
ño
fromdbo.EmployeesaseinnerjoinOrdersasoone.EmployeeID=o.EmployeeID
innerjoin[Order Details]asodonod.OrderID=o.OrderID
whereYEAR(o.OrderDate)=@anio
groupbye.LastName,e.FirstName,YEAR(o.OrderDate)
empleado_unidades 1996
alterprocmas_vendidos
@tint,
@anioint
as
selecttop
(@t)p.ProductName,sum(od.Quantity*od.UnitPrice*2.81)asmonto_total
fromProductsaspinnerjoin[Order
Details]asodonp.ProductID=od.ProductIDinnerjoin
Ordersasoono.OrderID=od.OrderID
whereYEAR(o.OrderDate)=@anio
groupbyp.ProductName
orderbysum(od.Quantity*od.UnitPrice)desc
mas_vendidos 3,1997
alterprocno_vendidos
@anioint
as
selectp.ProductID,p.ProductName,YEAR(o.OrderDate)asanio
fromProductsaspinnerjoin[Order
Details]asodonp.ProductID=od.ProductIDinnerjoin
Ordersasoono.OrderID=od.OrderID
wherep.ProductIDnotin(selectProductIDfrom[Order
Details])andyear(OrderDate)=@anio
no_vendidos 1996
alterprocproductos
@palnvarchar(40)
as
selectp.ProductName,e.FirstName
fromProductsaspinnerjoin[Order Details]asodonp.ProductID=od.ProductID
innerjoinOrdersasoono.OrderID=od.OrderIDinnerjoinEmployeesaseone.Employee
ID=o.EmployeeID
wherep.ProductNamelike@pal
productos'%queso%'
alterprocproductos
@palnvarchar(40)
as
selectp.ProductName,e.FirstName,e.LastName,SUM(od.Quantity)astotal_vendid
os
fromProductsaspinnerjoin[Order Details]asodonp.ProductID=od.ProductID
innerjoinOrdersasoono.OrderID=od.OrderIDinnerjoinEmployeesaseone.Employee
ID=o.EmployeeID
wherep.ProductNamelike@pal
groupbyp.ProductName,e.FirstName,e.LastName
orderbySUM(od.Quantity)desc
productos'%queso%'
7. dias trnascurridos
createprocdias_trans
@numint
as
selectcount(OrderID)ascant_ords,datediff(day,ShippedDate,RequiredDate)asd
ias_trans
fromOrders
wheredatediff(day,ShippedDate,RequiredDate)<@num
groupbydatediff(day,ShippedDate,RequiredDate)
dias_trans 10
8. En un año determinado
alterprocdias_trans
@numint,
@anioint
as
selectcount(OrderID)ascant_ords,datediff(day,ShippedDate,RequiredDate)asd
ias_trans
fromOrders
wheredatediff(day,ShippedDate,RequiredDate)<@numandYEAR(RequiredDate)=@an
io
groupbydatediff(day,ShippedDate,RequiredDate)
alterproc codigo
@pat varchar(30),
@mat varchar(30),
@nombre varchar(30)
as
declare @nr as int,@cod as char(4)
select @nr=max(substring(codigo,2,3))
from alumnitos
if @nrisnullset@nr=0;
set @nr=@nr+1;
if @nr<=9 set@cod='A00'+LTRIM(STR(@nr))
else if @nr<=99
set @cod='A0'+STR(@nr)
else if @nr<=999
set @cod='A'+STR(@nr)
;
Insert into alumnitos(codigo,paterno,materno,nombres)
values (@cod,@pat,@mat,@nombre)
Más ejercicios
alter proc insert_cliente
@nom varchar (20),
@ape varchar (30),
@dir varchar (30),
@email varchar (35)
as
declare @cod char(8)
declare @nr int
set @cod=left(@nom,2)+LEFT(@ape,2)
select @nr=COUNT(*)+1
from dbo.clientes
if @nr<=9
set @cod=Rtrim(@cod)+'0'+LTRIM(STR(@nr))
else
set @cod=rtrim(@cod)+LTRIM(STR(@nr))
insert into dbo.clientes
values (@cod,@nom,@ape,@dir,@email)
select *
from dbo.clientes
verdadero
alter proc insert_cliente
@nom varchar (20),
@ape varchar (30),
@dir varchar (30),
@email varchar (35)
as
declare @cod char(7)
declare @nr int
set @cod=left(@nom,2)+LEFT(@ape,2)
select @nr=COUNT(*)+1
from dbo.clientes
where SUBSTRING(codigo,1,4)=@cod
if @nr<=9
set @cod=Rtrim(@cod)+'00'+LTRIM(STR(@nr))
if @nr<=99
set @cod=Rtrim(@cod)+'0'+LTRIM(STR(@nr))
else
set @cod=rtrim(@cod)+LTRIM(STR(@nr))
insert into dbo.clientes
select *
from dbo.clientes
Insertar participantes
create proc insertpat
@nom varchar(30),
@ape varchar(30),
@sexo char (1)
as
declare @cod char (7)
declare @nr int
select @nr=COUNT(*)
from dbo.participantes
where sexo=@sexo
if @nr<9
set @cod=left(@nom,2)+LEFT(@ape,2)+'00'+LTRIM(STR(@nr+1))
else if @nr<99
set @cod=left(@nom,2)+LEFT(@ape,2)+'0'+LTRIM(STR(@nr+1))
else
set @cod=left(@nom,2)+LEFT(@ape,2)+'0'+LTRIM(STR(@nr+1))
insert into dbo.participantes
values (@cod,@nom,@ape,@sexo)
insertpat 'luis','ruiz','m'
Insertar alumnos
alter proc ins_alumnos
@nom varchar(30),
@ape varchar(30),
@fenac datetime
as
declare @cod char (9)
declare @nr int
set @cod=left(@nom,1)+LEFT(@ape,1)+Ltrim(str(YEAR(@fenac)))
select @nr=COUNT(*)+1
from dbo.alumnos
where substring(@cod,1,9)=@cod
if @nr<=9
set @cod=Rtrim(@cod)+'00'+LTRIM(STR(@nr))
if @nr<=99
set @cod=Rtrim(@cod)+'0'+LTRIM(STR(@nr))
ins_alumnos 'juan','perez','03/04/1991'
Insertar participantes
create proc insertpat
@nom varchar(30),
@ape varchar(30),
@sexo char (1)
as
declare @cod char (7)
declare @nr int
select @nr=COUNT(*)
from dbo.participantes
where sexo=@sexo
if @nr<9
set @cod=left(@nom,2)+LEFT(@ape,2)+'00'+LTRIM(STR(@nr+1))
else if @nr<99
set @cod=left(@nom,2)+LEFT(@ape,2)+'0'+LTRIM(STR(@nr+1))
else
set @cod=left(@nom,2)+LEFT(@ape,2)+'0'+LTRIM(STR(@nr+1))
insert into dbo.participantes
values (@cod,@nom,@ape,@sexo)
insertpat 'luis','ruiz','m'
update Products
set UnitPrice=UnitPrice+UnitPrice*@por/100
where CategoryID=@cat and Discontinued=0
select *
from Products
where Discontinued=1
order by UnitPrice
prod 1,0.5
select *
from alumn
select *
from alumn
OTRAS SENTENCIAS
La función de subcadena en SQL se utiliza para tomar una parte de los datos
almacenados. Esta función tiene diferentes nombres según las diferentes bases de
datos:
Ejemplo 1 :
Resultado :
'Sample'
Ejemplo 2 :
Resultado :
'Sample '
Ejemplo 3 :
Resultado :
' Sample'
Este resultado nos devolveria los goleadores de menor a mayor, pero lo logico es
que nos interese al reves, por lo que se sería:
Select Jugador,goles
from jugadores
order by goles desc
EJEMPLOS
CLIENTES ALEATORIOS
select *
from Employees
where EmployeeID=@azar
CUSTOMER AZAR
azar 3
REPORTING SERVICE
Para crear un origen de Datos compartido hacemos clic derecho sobre origen de datos
compartidos, luego hacemos clic en Agregar nuevo origen de datos.
Hacemos un anti clic en Informes, clic en Agregar, luego hacemos clic en nuevo
elemento.
Se abre el cuadro del origen de datos, como ya habíamos creado un origen de datos
compartido, seleccionamos la opción Utilizar referencia de origen de datos
compartidos; en este caso seleccionamos DataSource1. Finalmente aceptamos.
El Cuadro de Herramientas:
Por ejemplo el elemento Gráfico, donde se puede elegir el gráfico del cuadro
Selección tipo de gráfico y aceptamos, logrando ver el gráfico.
Código en SQL:
Reporting services:
En modo de diseño:
Código en SQL:
Reporting Service:
Para dar los valores a la categoría debemos agregar un nuevo conjunto de datos
(dataset2). En esta ocasión hacemos una consulta de tipo Texto.
En modo de diseño:
3. Crear un reporte usando reporting service que muestre el nombre del producto, el
nombre de la compañía del proveedor, precio, seleccionar el nombre de la
empresa y mostrar los productos del proveedor seleccionado.
Código en SQL:
select SupplierID,CompanyName
from Suppliers
order by SupplierID
En modo de diseño:
Informe final:
Código en SQL:
Reporting Services:
En modo de diseño:
5. Mostrar el nombre del cliente, nombre del empleado, número de la orden, fecha de
la orden, nombre del proveedor, filtrar por el empleado que hizo la orden.
Código en SQL:
En modo de diseño:
Informe final:
Mostrar el nombre del cliente en un Combo box e DROP DOWN para filtrar la información.
Código en SQL:
Reporting Services:
En modo de diseño:
Informe final:
2.
10 30 Proveedor
Precio y
Código en SQL:
select ProductName,UnitPrice,CategoryName,s.CompanyName
from Products as p inner join Categories as c on
c.CategoryID=p.CategoryID inner join Suppliers as s on
s.SupplierID=p.SupplierID
where UnitPrice between @li and @ls
Reporting Services:
En modo de diseño:
Informe final:
3. Proveedores (mostrar
companyname)
Código en SQL:
Reporting Services:
En modo de diseño:
Informe final:
6
5
5
4
3
3
2 2
2
1
0
Categoría A Categoría B Categoría C Categoría D …
Productos
Reporting Services:
En modo de diseño:
Meses
1 2 3 4 … 12
Juan Torres
Pedro León
Ana Díaz
María Huamán
Empleados (Nombre y apellidos)
Código en SQL:
Reporting Services:
En modo de diseño:
Informe final:
6. Mes Año
Total de Órdenes
6
Número de órdenes
5
realizadas
4
3
2
1
0
Emp 1 Emp 2 Emp 3 Emp 4 …
Reporting Services:
En modo de diseño:
Informe final:
4
Vendido
3
2
1
0
Años
Código en SQL:
Reporting Services:
En modo de diseño:
Informe final:
Código en SQL:
Reporting Services:
En modo de diseño:
Código para el color de texto en Stock
=IIf(Fields!UnitsInStock.Value=0,
"Red","Blue")
Código en SQL:
Reporting Services:
En modo de diseño:
Código para el texto de mostrar Discontinuado
o Vigente
=iif(Fields!Discontinued.Value="True
","Discontinuado","Vigente")
Vamos a agrupar por categorías; para esto hacemos anticlic en la fila, elegimos
Agregar grupo, seguidamente seleccionamos Grupo primario:
Se observará así:
También se puede hacer una suma total por cada grupo de al final.
ENLACES DE INFORMES
Tenemos un primer in forme
o Modo diseño.
Hacemos anti clic en el campo que va a servir de enlace para ir a otro informe y
hacemos clic en Propiedades de cuadro de texto…
Cuando hacemos clic en una de las celdas, se abrirá el siguiente informe enlazado
a éste al pasarle el parámetro.
Instalar el iis
Implementar el informe:
INFORMES INTEGRADOS
Tenemos dos in formes:
Obtenemos lo siguiente:
EJERCICIOS:
1. Expresión calcule los de categoría 1 salga un campo descuento.
Mostrar el
+CategoryName
select CategoryName,ProductName,UnitPrice,c.CategoryID
from Products as p inner join Categories as c on p.CategoryID=p.CategoryID
order by c.CategoryID
Reporting Services:
En modo de diseño:
Informe la categoría 4:
2.
Informe x Informe y
0
2008 2009 2010 2011
Código en SQL:
En modo de diseño:
Código en SQL:
En modo de diseño:
3. +HP(CompayName-Suppliers)
+IBM
Código en SQL:
En modo de diseño:
Informe final:
1. Mostrar los Empleados (Nombres y Apellidos) en una lista desplegable, para luego
mostrar Nro de la Orden, la fecha de la orden, Código del Producto, Nombre del
Producto, nombre de la categoría y el nombre de la compañía proveedora.
Código en SQL:
Reporting Services:
Código en SQL:
Reporting Services:
3. Crear un Grafico que muestre los años, los empleados y el Monto total ingresado
por los pedidos. Filtrar por años que se mostrara desde una lista desplegable.
Código en SQL:
4. Crear un Grafico que muestre los años, los meses y el numero de productos
pedidos de un cliente (solo considerar los productos videntes). Escogiendo el
cliente de una lista desplegable, donde se mostrara el nombre de la compañía del
cliente.
Código en SQL:
select CompanyName
from Customers
order by CompanyName
Reporting Services:
Código en SQL:
Reporting Services:
Código en SQL:
Reporting Services:
Código en SQL:
Reporting Services:
=IIf(Fields!CategoryID.Value=1,"Yellow",IIf(Fields!CategoryID.Value=2,"Yellow",IIf(
Fields!CategoryID.Value=3,"SeaGreen",IIf(Fields!CategoryID.Value=4,"SeaGreen",
IIf(Fields!CategoryID.Value=5,"Blue",IIf(Fields!CategoryID.Value=6,"Blue","Red"))))
))
Código en SQL:
Reporting Services:
ADMINISTRACIÓN DE USUARIOS
He aquí algunos códigos para crear usuarios con store procedure:
o Creación de login y borrado del mismo:
use master
select name from syslogins
use Northwind
select name from sysusers
CREACIÓN DE VISTAS
Código en SQL:
Seleccionar la vista:
select *
from v_todoproducts
Código en SQL:
Seleccionar la vista:
select *
from vista02
Código en SQL:
Seleccionar la vista:
select *
from vista03
Código en SQL:
Código en SQL:
exec Inicio_seccion
use master
go
select name
from syslogins
where year(createdate)=YEAR(GETDATE()) and
month(createdate)=month(GETDATE()) and
day(createdate)=day(GETDATE())
order by name
Código en SQL:
exec borrar_ISLogin
use master
go
select name
from syslogins
where year(createdate)=YEAR(GETDATE()) and
month(createdate)=month(GETDATE())
and day(createdate)=day(GETDATE())
order by name
Código en SQL:
exec usuario2
use Northwind
go
select name
from SYSUSERS
where year(createdate)=YEAR(GETDATE()) and
month(createdate)=month(GETDATE())
and day(createdate)=day(GETDATE())
order by name
Código en SQL:
select name
from SYSUSERS
where year(createdate)=YEAR(GETDATE()) and
month(createdate)=month(GETDATE())
and day(createdate)=day(GETDATE())
order by name
FUNCIONES
Cambiar a Mayúsculas:
Código en SQL:
select UPPER(companyname)
from Suppliers
Convierte a ninúsculas:
Código en SQL:
select LOWER('KArEEf')
select lower(customerid)
from Customers
Código en SQL:
Código en SQL:
Código en SQL:
Código en SQL:
select SUBSTRING('universidad',4,3)
Código en SQL:
Código en SQL:
select datepart(yy,GETDATE())
select datepart(yy,DATEADD(YY,-3,GETDATE()))
/*agregar años al año, 1 un año,fecha ala cual quiero
agregar*/
Getdate(), Dateadd
Código en SQL:
select GETDATE()
select DATEADD(mm,3,GETDATE())
select datepart(mm,GETDATE())
select datepart(mm,DATEADD(mm,-1,GETDATE()))
Datediff
Código en SQL:
select DATEDIFF(YY,'19/04/1991',GETDATE())
/*add añade, diff resta*/
Nombre de la fecha.
Código en SQL:
select DATENAME(MM,GETDATE())
select DATENAME(dd,GETDATE())
Código en SQL:
¿Es número?
Código en SQL:
select ISNUMERIC(90)
select ISNUMERIC('19/09/2011')
select ISNUMERIC('Pedro')
select ISNUMERIC(200)
Código en SQL:
select *
from Employees
select @@rowcount
Código en SQL:
update Products
set UnitPrice=100
where CategoryID=1
/*set @nr=@@rowcount*/
select @@rowcount
RESTRICCIONES
Crearemos una tabla para hacer las restricciones:
values ('hola')
PROPUESTOS:
1. Crear una función que devuelva el IGV
Create function fn_IGV
(@monto money)
returns money
as
begin
declare @sol money
set @sol=@monto*0.19
return @sol
4. Crear una función que pase como parámetro el fax, si no existe fax entonces que
se muestre 'no especificado', caso contrario que muestre el número de fax.
select fax
from Customers
5. Crear una función que me permita cambiar la clave de un usuario si se graba bien
devolver 1 y sino devolver 0
return @nr
end
/////
select dbo.fn_veri_user('juan2011','1234')
select dbo.fn_veri_user('karenjea','753159')
if @@rowcount=1
raiserror('se cambio la clave',10,1)
else
raiserror('usuario o clave incorrecta',10,1)
end
7. Crear una función que nos permita seleccionar un Proveedor de manera aleatoria.
-- FUNCION
create function fn_aleatorio()
returns varchar(20)
as
begin
declare @nreg int,@reg varchar(20),@rnd float
select @nreg=count(*)
from suppliers
select @reg=companyname
from suppliers
where supplierid=cast((@rnd*@nreg+1) as int)
return @reg
end
select dbo.fn_aleatorio()
TRIGRESS
1. Permitir eliminar un solo registro de la tabla order details.
CREATE TRIGGER BorrarOrd ON [order details]
FOR DELETE
AS
IF (SELECT COUNT(*) FROM Deleted) > 1
BEGIN
RAISERROR('Solo puede eliminar un registro a la vez', 16,
1)
ROLLBACK TRANSACTION
END
Probar:
delete from [Order Details]
where OrderID = 10529
CREATE TRIGGER A9
ON [ORDER DETAILS]
FOR INSERT
AS
UPDATE P
SET UNITSINSTOCK = (P.UNITSINSTOCK - I.QUANTITY)
FROM PRODUCTS AS P
INNER JOIN INSERTED AS I
ON P.PRODUCTID = I.PRODUCTID
CREATE TRIGGER A3
ON [ORDER DETAILS]
FOR DELETE
AS
UPDATE PRODUCTS
SET DISCONTINUED = 1
FROM PRODUCTS AS P
INNER JOIN DELETED AS D
ON P.PRODUCTID = D.PRODUCTID
Probar:
DELETE FROM [ORDER DETAILS]
WHERE ORDERID = 10333 AND PRODUCTID = 1
ALTER TRIGGER A5
ON SUPPLIERS
FOR UPDATE
AS
IF UPDATE(COMPANYNAME)
BEGIN
RAISERROR ('NO PUEDE CAMBIAR EL NOMBRE DE LA COMPAÑIA',10,1)
ROLLBACK TRANSACTION
END
probar:
UPDATE SUPPLIERS
SET COMPANYNAME ='JUAN'
WHERE SUPPLIERID = 2
5. Crear una tabla historico que vaya guardando el nombre de la compania (actual nombre
y nuevo nombre) de los proveedores. Tabla: historico (id, actual, nuevo) el id es identity.
CREATE TRIGGER A6
ON SUPPLIERS
FOR UPDATE
AS
IF UPDATE(COMPANYNAME)
BEGIN
DECLARE @C_ACT VARCHAR(50)
DECLARE @C_NEW VARCHAR(50)
Probarlo:
UPDATE SUPPLIERS
SET COMPANYNAME ='JUAN'
WHERE SUPPLIERID = 2