Consultas – Opciones

Opciones en un Listado con Select

Las opciones de un listado con la instrucción select permiten modificar el conjunto de resultados, las opciones son cláusulas adicionales que nos permiten reducir la cantidad de registros en el listado, mostrar registros únicos, obligar al optimizar a usar un  índice, combinar dos instrucciones, entre otras opciones.

Las opciones son:

Opción Explicación
Top Limita las filas del conjunto de resultados. Se puede usar con un valor n o especificar un porcentaje.
With Ties Permite mostrar registros que hayan sido limitados usando la opción Top pero que tienen un valor igual al último registro que aparece.
Distinct Permite mostrar valores sin duplicados en una consulta.
With (index…) Obliga al optimizador a usar un índice específico.
Union Permite unir diferentes consultas en un solo conjunto de resultados.
Into Tabla Permite crear una tabla con el conjunto de resultados.
Offset y Fetch Next Permiten listar un grupo de resultados que aparecen ordenados pero sin incluir los primeros.

 Ejercicios

Usando Northwind
use Northwind
go

1. — Listar los productos ordenados por precio, mostrar los 10 mas caros.

select Top 10 P.ProductID, P.ProductName, P.UnitPrice, P.UnitsInStock
from Products As P order by P.UnitPrice desc
go

2. — Listar las órdenes con mas monto, mostrar el 20% de estas.

select Top 20 percent O.OrderID, O.OrderDate, O.Freight
from Orders As O order by O.Freight desc
go




3. — Listar los 5 empleados que generaron más órdenes, incluir los que tengan la misma cantidad del quinto.(Ver agrupamientos)

Select Top 5 with ties
E.EmployeeID As ‘Cód. Empleado’, Empleado = E.LastName + Space(1) + E.FirstName,
COUNT(O.OrderID) As ‘Cantidad de Órdenes’
from Orders As O
join Employees As E on O.EmployeeID = E.EmployeeID
Group by E.EmployeeID, E.LastName + Space(1) + E.FirstName
Order by COUNT(O.OrderID) desc
go

 

Obligar al optimizador a usar un índice.

4. — Listar los productos usando el indice ProductName cuyo campo de indexación es el campo ProductNam.  Esta cláusula es similar a usar un Order By.

select * from Products with (index(ProductName))
go

— Usando AdventureWorks
USE AdventureWorks
go

5. – Listar los empleados ordenados por el Nº ID. (Índice AK_Employee_NationalIDNumber) (Ver Índices)

select P.FirstName As ‘Apellidos’, P.LastName As ‘Nombre’, E.NationalIDNumber As ‘Nº ID’
FROM HumanResources.Employee AS E WITH (INDEX(AK_Employee_NationalIDNumber))
JOIN Person.Contact AS P on E.ContactID = P.ContactID
WHERE LastName = ‘Johnson’
go

6. — Usando el índice 0 (la clave primaria – índice agrupado)

select P.FirstName As ‘Apellidos’, P.LastName As ‘Nombre’, E.NationalIDNumber As ‘Nº ID’
FROM HumanResources.Employee AS E WITH (0)
JOIN Person.Contact AS P on E.ContactID = P.ContactID
WHERE LastName = ‘Johnson’
go

 

Uso de Distinct

7. Usando Northwind, listado de los clientes que compraron en el primer mes de 1998

use Northwind
go
select C.CustomerID As ‘Código’, C.CompanyName As ‘Cliente’
from Customers As C
join Orders As O on C.CustomerID = O.CustomerID
where Month(O.OrderDate) = 1 and YEAR(O.OrderDate) = 1998
Order by Cliente
go
— Note que hay Clientes que se repiten.

Usando Distinct los clientes que se repiten no aparecen

select Distinct C.CustomerID As ‘Código’, C.CompanyName As ‘Cliente’
from Customers As C
join Orders As O on C.CustomerID = O.CustomerID
where Month(O.OrderDate) = 1 and YEAR(O.OrderDate) = 1998
Order by Cliente
go

 

Uso de Union simple

8.– Listado de los productos de las categorías 3 y 5 unida con los productos de las categorías 2,6 y 8

select * from Products where CategoryID in (3,5)
union
select * from Products where CategoryID in (2,6,8)
go

Uso de Offset y Fetch Next

use Northwind
go

Se pueden usar estas opciones desde SQL Server 2012
9.–Listar los 10 registros mas caros exceptuando los 5 primeros.

select ProductName, UnitPrice
from Products order by UnitPrice desc
offset 5 rows fetch next 10 rows only
go

 

Creando tablas resultado de un select – Into Tabla

10. — Crear una tabla ProductosCategoriaBebidas (Id = 1)

select P.ProductID, P.ProductName, P.UnitPrice, P.QuantityPerUnit, P.UnitsInStock, P.UnitsOnOrder
into ProductosCategoriaBebidas
from Products As P where CategoryID = 1
go
— Para visualizar los registros de la tabla generada.
select * from ProductosCategoriaBebidas
go
— Importante: La tabla creada con Into se crea sin restricciones.