Consultas en SQL Server – Opciones

Opciones en Select SQL Server

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ónExplicación
TopLimita las filas del conjunto de resultados. Se puede usar con un valor n o especificar un porcentaje. Se usa junto a la cláusula Order By.
With TiesPermite mostrar registros que hayan sido limitados usando la opción Top pero que tienen un valor igual al último registro que aparece.
DistinctPermite mostrar valores sin duplicados en una consulta.
With (index…)Obliga al optimizador a usar un índice específico.
UnionPermite unir diferentes consultas en un solo conjunto de resultados.
Into TablaPermite crear una tabla con el conjunto de resultados.
Offset y Fetch NextPermiten 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

10 productos más caros

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

Note que se ha incluido la palabra percent para mostrar el porcentaje solicitado de acuerdo a la cantidad de órdenes.

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.

Clientes que se repiten en el listado

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

Clientes ya no se repiten.

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

Para más información ver Uso de Fetch Next en SQL Server. El uso de Offset n rows va a permitir obviar los n registros superiores y el uso de Fetch next va a limitar a una cantidad determinada de registros en el listado.

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.