You are on page 1of 12

Ejemplos de SELECT

(Transact-SQL)
SQL Server 2012
Otras versiones

Personas que lo han encontrado til: 1 de 5 - Valorar este tema


En este tema se proporcionan ejemplos del uso de la instruccin SELECT.

A.Usar SELECT para recuperar filas y columnas


En el siguiente ejemplo se muestran tres fragmentos de cdigo. En el primer
ejemplo de cdigo, se devuelven todas las filas (no se especifica la clusula WHERE)
y todas las columnas (con *) de la tabla Product de la base de datos
AdventureWorks2012 .
Transact-SQL
USE AdventureWorks2012;
GO
SELECT *
FROM Production.Product
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2012;
GO
SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO
En este ejemplo se devuelven todas las filas (no se ha especificado la clusula
WHERE) y solo un subconjunto de las columnas
(Name, ProductNumber,ListPrice) de la tabla Product de la base de datos
AdventureWorks2012 . Adems, se agrega un encabezado de columna.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT Name, ProductNumber, ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
En este ejemplo solo se devuelven las filas de Product que tienen una lnea de
productos de R y cuyo valor correspondiente a los das para fabricar es inferior a
Transact-SQL
USE AdventureWorks2012;
GO
SELECT Name, ProductNumber, ListPrice AS Price

4.

FROM Production.Product
WHERE ProductLine = 'R'
AND DaysToManufacture < 4
ORDER BY Name ASC;
GO

B.Usar SELECT con encabezados de columna y


clculos
En los siguientes ejemplos se devuelven todas las filas de la tabla Product. En el
primer ejemplo se devuelven las ventas totales y los descuentos de cada
producto. En el segundo ejemplo se calculan los beneficios totales de cada
producto.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT p.Name AS ProductName,
NonDiscountSales = (OrderQty * UnitPrice),
Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY ProductName DESC;
GO
sta es la consulta que calcula el beneficio de cada producto de cada pedido de
venta.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT 'Total income is', ((OrderQty * UnitPrice) * (1.0 - UnitPriceDiscount)), ' for ',
p.Name AS ProductName
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY ProductName ASC;
GO

C.Usar DISTINCT con SELECT


En el siguiente ejemplo se utiliza DISTINCT para evitar la recuperacin de ttulos
duplicados.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO

D.Crear tablas con SELECT INTO

En el primer ejemplo se crea una tabla temporal


denominada #Bicycles en tempdb.
Transact-SQL
USE tempdb;
GO
IF OBJECT_ID (N'#Bicycles',N'U') IS NOT NULL
DROP TABLE #Bicycles;
GO
SELECT *
INTO #Bicycles
FROM AdventureWorks2012.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO
En el segundo ejemplo se crea la tabla permanente NewProducts.
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED;
GO
SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL;
GO

E.Usar subconsultas correlacionadas


En el siguiente ejemplo se muestran consultas que son semnticamente
equivalentes y se demuestra la diferencia entre la utilizacin de la palabra
claveEXISTS y la palabra clave IN. Ambos son ejemplos de subconsultas vlidas
que recuperan una instancia de cada nombre de producto cuyo modelo es un jersey
de manga larga con logotipo y cuyos nmeros de ProductModelID coinciden en
las tablas Product y ProductModel.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT DISTINCT Name
FROM Production.Product AS p
WHERE EXISTS
(SELECT *
FROM Production.ProductModel AS pm
WHERE p.ProductModelID = pm.ProductModelID
AND pm.Name LIKE 'Long-Sleeve Logo Jersey%');
GO

-- OR
USE AdventureWorks2012;
GO
SELECT DISTINCT Name
FROM Production.Product
WHERE ProductModelID IN
(SELECT ProductModelID
FROM Production.ProductModel
WHERE Name LIKE 'Long-Sleeve Logo Jersey%');
GO
En el siguiente ejemplo se utiliza IN en una subconsulta correlativa o repetitiva. Se
trata de una consulta que depende de la consulta externa de sus valores. Se ejecuta
varias veces, una vez por cada fila que pueda seleccionar la consulta externa. Esta
consulta recupera una instancia del nombre y apellido de cada empleado cuya
bonificacin en la tabla SalesPerson sea de 5000.00 y cuyos nmeros de
identificacin coincidan en las tablas Employeey SalesPerson.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT DISTINCT p.LastName, p.FirstName
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = p.BusinessEntityID WHERE 5000.00 IN
(SELECT Bonus
FROM Sales.SalesPerson AS sp
WHERE e.BusinessEntityID = sp.BusinessEntityID);
GO
La subconsulta anterior de esta instruccin no se puede evaluar
independientemente de la consulta externa. Necesita el
valor Employee.EmployeeID, aunque este valor cambia a medida que el Motor
de base de datos de SQL Server examina diferentes filas de Employee.
Una subconsulta correlativa se puede usar tambin en la clusula HAVING de una
consulta externa. En este ejemplo se buscan los modelos cuyo precio mximo es
superior al doble de la media del modelo.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT p1.ProductModelID
FROM Production.Product AS p1
GROUP BY p1.ProductModelID
HAVING MAX(p1.ListPrice) >= ALL
(SELECT AVG(p2.ListPrice)
FROM Production.Product AS p2
WHERE p1.ProductModelID = p2.ProductModelID);
GO
En este ejemplo se utilizan dos subconsultas correlativas para buscar los nombres
de los empleados que han vendido un producto especfico.
Transact-SQL
USE AdventureWorks2012;

GO
SELECT DISTINCT pp.LastName, pp.FirstName
FROM Person.Person pp JOIN HumanResources.Employee e
ON e.BusinessEntityID = pp.BusinessEntityID WHERE pp.BusinessEntityID IN
(SELECT SalesPersonID
FROM Sales.SalesOrderHeader
WHERE SalesOrderID IN
(SELECT SalesOrderID
FROM Sales.SalesOrderDetail
WHERE ProductID IN
(SELECT ProductID
FROM Production.Product p
WHERE ProductNumber = 'BK-M68B-42')));
GO

F.Usar GROUP BY
En este ejemplo se busca el total de cada pedido de venta de la base de datos.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Debido a la clusula GROUP BY, solo se devuelve una fila que contiene la suma de
todas las ventas por cada pedido de venta.

G.Usar GROUP BY con varios grupos


En este ejemplo se busca el precio medio y la suma de las ventas anuales hasta la
fecha, agrupados por Id. de producto e Id. de oferta especial.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS [Average Price],
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY ProductID, SpecialOfferID
ORDER BY ProductID;
GO

H.Usar GROUP BY y WHERE


En el siguiente ejemplo se colocan los resultados en grupos despus de recuperar
nicamente las filas con precios superiores a $1000.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductModelID, AVG(ListPrice) AS [Average List Price]

FROM Production.Product
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO

I.Usar GROUP BY con una expresin


En este ejemplo se agrupa por una expresin. Puede agrupar por una expresin si
sta no incluye funciones de agregado.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT AVG(OrderQty) AS [Average Quantity],
NonDiscountSales = (OrderQty * UnitPrice)
FROM Sales.SalesOrderDetail
GROUP BY (OrderQty * UnitPrice)
ORDER BY (OrderQty * UnitPrice) DESC;
GO

J.Usar GROUP BY con ORDER BY


En este ejemplo se busca el precio medio de cada tipo de producto y se ordenan los
resultados por precio medio.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, AVG(UnitPrice) AS [Average Price]
FROM Sales.SalesOrderDetail
WHERE OrderQty > 10
GROUP BY ProductID
ORDER BY AVG(UnitPrice);
GO

K.Usar la clusula HAVING


En el primer ejemplo se muestra una clusula HAVING con una funcin de
agregado. Agrupa las filas de la tabla SalesOrderDetail por Id. de producto y
elimina aquellos productos cuyas cantidades de pedido medias son cinco o
menos. En el segundo ejemplo se muestra una clusula HAVING sin funciones de
agregado.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO

En esta consulta se utiliza la clusula LIKE en la clusula


USE AdventureWorks2012 ;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO

HAVING.

L.Usar HAVING y GROUP BY


En el siguiente ejemplo se muestra el uso de las clusulas GROUP
BY, HAVING, WHERE y ORDER BY en una instruccin SELECT. Genera grupos
y valores de resumen pero lo hace tras eliminar los productos cuyos precios superan
los 25 $ y cuyas cantidades de pedido medias son inferiores a 5. Tambin organiza
los resultados por ProductID.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO

M.Usar HAVING con SUM y AVG


En el siguiente ejemplo se agrupa la tabla SalesOrderDetail por Id. de producto y
solo se incluyen aquellos grupos de productos cuyos pedidos suman ms
de $1000000.00 y cuyas cantidades de pedido medias son inferiores a 3.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $1000000.00
AND AVG(OrderQty) < 3;
GO
Para ver los productos cuyas ventas totales son superiores a
esta consulta:
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;

$2000000.00, utilice

GO
Si desea asegurarse de que hay al menos mil quinientos elementos para los
clculos de cada producto, use HAVING COUNT(*) > 1500 para eliminar los
productos que devuelven totales inferiores a 1500 elementos vendidos. La
consulta sera la siguiente:
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO

N.Usar la sugerencia del optimizador INDEX


En el ejemplo siguiente se muestran dos formas de usar la sugerencia del
optimizador INDEX. En el primer ejemplo se muestra cmo obligar al optimizador a
que use un ndice no clster para recuperar filas de una tabla, mientras que en el
segundo ejemplo se obliga a realizar un recorrido de tabla mediante un ndice igual
a 0.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT pp.FirstName, pp.LastName, e.NationalIDNumber
FROM HumanResources.Employee AS e WITH
(INDEX(AK_Employee_NationalIDNumber))
JOIN Person.Person AS pp on e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Force a table scan by using INDEX = 0.
USE AdventureWorks2012;
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
FROM HumanResources.Employee AS e WITH (INDEX = 0) JOIN Person.Person AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO

M.Usar OPTION y las sugerencias GROUP


En el ejemplo siguiente se muestra cmo se usa la clusula
(GROUP) con una clusula GROUP BY.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty

OPTION

ORDER BY ProductID, OrderQty


OPTION (HASH GROUP, FAST 10);
GO

O.Usar la sugerencia de consulta UNION


En el ejemplo siguiente se usa la sugerencia de consulta MERGE UNION.
Transact-SQL
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours
FROM HumanResources.Employee AS e1
UNION
SELECT BusinessEntityID, JobTitle, HireDate, VacationHours, SickLeaveHours
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO

P.Usar una instruccin UNION simple


En el ejemplo siguiente, el conjunto de resultados incluye el contenido de las
columnas ProductModelID y Name de las tablas ProductModel y Gloves.
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
-- Here is the simple union.
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

Q.Usar SELECT INTO con UNION


En el ejemplo siguiente, la clusula INTO de la segunda
instruccin SELECT especifica que la tabla denominada

ProductResults contiene

el conjunto final de resultados de la unin de las columnas designadas de las


tablas ProductModel y Gloves. Tenga en cuenta que la tabla Gloves se crea en
la primera instruccin SELECT.
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL
DROP TABLE dbo.ProductResults;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
INTO dbo.ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
SELECT ProductModelID, Name
FROM dbo.ProductResults;

R.Usar UNION con dos instrucciones SELECT y


ORDER BY
El orden de algunos parmetros empleados con la clusula UNION es importante. En
el ejemplo siguiente se muestra el uso correcto e incorrecto de UNION en dos
instrucciones SELECT en las que se va a cambiar el nombre de una columna en el
resultado.
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO

/* INCORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
/* CORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

S.Usar UNION de tres instrucciones SELECT para


mostrar los efectos de ALL y los parntesis
En los siguientes ejemplos se utiliza UNION para combinar los resultados de tres
tablas que tienen las mismas 5 filas de datos. En el primer ejemplo se
utiliza UNION ALL para mostrar los registros duplicados y se devuelven las 15
filas. En el segundo ejemplo se utiliza UNION sin ALL para eliminar las filas
duplicadas de los resultados combinados de las tres instrucciones SELECT y se
devuelven 5 filas.
En el tercer ejemplo se utiliza ALL con el primer UNION y los parntesis incluyen al
segundo UNION que no utiliza ALL. El segundo UNION se procesa en primer lugar
porque se encuentra entre parntesis. Devuelve 5 filas porque no se utiliza la
opcin ALL y se quitan los duplicados. Estas 5 filas se combinan con los resultados
del primer SELECT mediante las palabras clave UNION ALL. Esto no quita los
duplicados entre los dos conjuntos de 5 filas. El resultado final es de 10 filas.
Transact-SQL
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeOne;
GO
IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeTwo;
GO
IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeThree;
GO

SELECT pp.LastName, pp.FirstName, e.JobTitle


INTO dbo.EmployeeOne
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeTwo
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeThree
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION ALL
SELECT LastName, FirstName ,JobTitle
FROM dbo.EmployeeTwo
UNION ALL
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeOne
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeOne
UNION ALL
(
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree
);
GO

You might also like