Exemplos de SELECT (Transact-SQL)
Aplica-se a: SQL ServerBanco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
Este artigo fornece exemplos de uso da instrução SELECT.
Os exemplos de código do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022
ou AdventureWorksDW2022
, que pode ser baixado da home page Microsoft SQL Server Samples and Community Projects.
R. Usar SELECT para recuperar linhas e colunas
O exemplo a seguir mostra três exemplos de código. Este primeiro retorna todas as linhas (nenhuma cláusula WHERE foi especificada) e todas as colunas (usando o *
) da tabela Product
do banco de dados AdventureWorks2022
.
USE AdventureWorks2022;
GO
SELECT *
FROM Production.Product
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2022;
GO
SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO
Este exemplo retorna todas as linhas (nenhuma cláusula WHERE foi especificada) e somente um subconjunto das colunas (Name
, ProductNumber
, ListPrice
) da tabela Product
do banco de dados AdventureWorks2022
. Além disso, um título de coluna é adicionado.
USE AdventureWorks2022;
GO
SELECT Name,
ProductNumber,
ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
Este exemplo retorna somente as linhas de Product
que têm uma linha de produto igual a R
e que tenham dias para manufatura menores que 4
.
USE AdventureWorks2022;
GO
SELECT Name,
ProductNumber,
ListPrice AS Price
FROM Production.Product
WHERE ProductLine = 'R'
AND DaysToManufacture < 4
ORDER BY Name ASC;
GO
B. Usar SELECT com títulos de coluna e cálculos
Os exemplos a seguir retornam todas as linhas da tabela Product
. O primeiro exemplo retorna o total de vendas e os descontos para cada produto. No segundo exemplo, a receita total é calculada para cada produto.
USE AdventureWorks2022;
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
Esta é a consulta que calcula a receita para cada produto em cada ordem de vendas.
USE AdventureWorks2022;
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 com SELECT
O exemplo a seguir usa DISTINCT
para impedir a recuperação de títulos duplicados.
USE AdventureWorks2022;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO
D. Criar tabelas com SELECT INTO
O primeiro exemplo a seguir cria uma tabela temporária denominada #Bicycles
em tempdb
.
USE tempdb;
GO
IF OBJECT_ID(N'#Bicycles', N'U') IS NOT NULL
DROP TABLE #Bicycles;
GO
SELECT *
INTO #Bicycles
FROM AdventureWorks2022.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO
Este segundo exemplo cria a tabela permanente NewProducts
.
USE AdventureWorks2022;
GO
IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2022 SET RECOVERY BULK_LOGGED;
GO
SELECT *
INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2022 SET RECOVERY FULL;
GO
E. Usar subconsultas correlacionadas
Uma subconsulta correlacionada é uma consulta que depende da consulta externa para obter os valores. Essa consulta pode ser executada repetidamente, uma vez para cada linha que possa ser selecionada pela consulta externa.
O primeiro exemplo mostra consultas semanticamente equivalentes para ilustrar a diferença entre usar a palavra-chave EXISTS
e a palavra-chave IN
. Ambos são exemplos de uma subconsulta válida que recupera uma instância de cada nome de produto para o qual o modelo do produto é uma camisa de marca de manga longa e os números de ProductModelID
são correspondentes entre as tabelas Product
e ProductModel
.
USE AdventureWorks2022;
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 AdventureWorks2022;
GO
SELECT DISTINCT Name
FROM Production.Product
WHERE ProductModelID IN (
SELECT ProductModelID
FROM Production.ProductModel AS pm
WHERE p.ProductModelID = pm.ProductModelID
AND Name LIKE 'Long-Sleeve Logo Jersey%'
);
GO
O próximo exemplo usa IN
e recupera uma instância do nome e do nome de família de cada funcionário para os quais o bônus da tabela SalesPerson
é 5000.00
e para os quais existam números de identificação de funcionário correspondentes nas tabelas Employee
e SalesPerson
.
USE AdventureWorks2022;
GO
SELECT DISTINCT p.LastName,
p.FirstName
FROM Person.Person AS p
INNER 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
A subconsulta anterior dessa instrução não pode ser avaliada de maneira independente da consulta externa. É necessário um valor de Employee.EmployeeID
, mas esse valor é alterado à medida que o Mecanismo de Banco de Dados do SQL Server examina diferentes linhas em Employee
.
Uma subconsulta correlata também pode ser usada na cláusula HAVING
de uma consulta externa. Este exemplo localiza os modelos de produto cujo preço máximo de tabela é mais que o dobro da média para o modelo.
USE AdventureWorks2022;
GO
SELECT p1.ProductModelID
FROM Production.Product AS p1
GROUP BY p1.ProductModelID
HAVING MAX(p1.ListPrice) >= (
SELECT AVG(p2.ListPrice) * 2
FROM Production.Product AS p2
WHERE p1.ProductModelID = p2.ProductModelID
);
GO
Este exemplo usa duas subconsultas correlatas para localizar os nomes de funcionários que venderam um produto específico.
USE AdventureWorks2022;
GO
SELECT DISTINCT pp.LastName,
pp.FirstName
FROM Person.Person pp
INNER 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
O exemplo a seguir localiza o total de cada ordem de vendas no banco de dados.
USE AdventureWorks2022;
GO
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Devido à cláusula GROUP BY
, somente uma linha que contenha a soma de todas as vendas será retornada para cada ordem de vendas.
G. Usar GROUP BY com vários grupos
O exemplo a seguir localiza o preço médio e a soma das vendas do ano até a data atual, agrupadas por ID de produto e ID de oferta especial.
USE AdventureWorks2022;
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 e WHERE
O exemplo a seguir põe os resultados em grupos depois de recuperar apenas as linhas com preços de tabela maiores que $1000
.
USE AdventureWorks2022;
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 com uma expressão
O exemplo a seguir agrupa por uma expressão. É possível agrupar por uma expressão se a mesma não contiver funções de agregação.
USE AdventureWorks2022;
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 com ORDER BY
O exemplo a seguir localiza o preço médio de cada tipo de produto e ordena os resultados por preço médio.
USE AdventureWorks2022;
GO
SELECT ProductID,
AVG(UnitPrice) AS [Average Price]
FROM Sales.SalesOrderDetail
WHERE OrderQty > 10
GROUP BY ProductID
ORDER BY AVG(UnitPrice);
GO
K. Usar a cláusula HAVING.
O primeiro exemplo a seguir mostra uma cláusula HAVING
com uma função de agregação. Ela agrupa as linhas da tabela SalesOrderDetail
por ID de produto e elimina os produtos cujas quantidades médias de pedido forem cinco ou menos. O segundo exemplo mostra uma cláusula HAVING
sem funções de agregação.
USE AdventureWorks2022;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
Esta consulta usa a cláusula LIKE
na cláusula HAVING
.
USE AdventureWorks2022;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
L. Usar HAVING e GROUP BY
O exemplo a seguir mostra o uso de cláusulas GROUP BY
, HAVING
, WHERE
e ORDER BY
em uma instrução SELECT
. Ele produz grupos e valores resumidos, mas o faz depois de eliminar os produtos com preços acima de $25 e quantidades médias de pedido abaixo de 5. Também organiza os resultados por ProductID
.
USE AdventureWorks2022;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
M. Usar HAVING com SUM e AVG
O exemplo a seguir agrupa a tabela SalesOrderDetail
por ID de produto e somente inclui os grupos de produtos que têm pedidos totalizando mais de $1000000.00
e cujas quantidades médias do pedido são inferiores a 3
.
USE AdventureWorks2022;
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 consultar os produtos com vendas totais maiores que $2000000.00
, use esta consulta:
USE AdventureWorks2022;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Para certificar-se de que existam pelo menos 1.500 itens envolvidos nos cálculos para cada produto, use HAVING COUNT(*) > 1500
para eliminar os produtos que retornam totais para menos que 1500
itens vendidos. A consulta tem esta aparência:
USE AdventureWorks2022;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
N. Usar a dica de otimizador INDEX
O exemplo a seguir mostra dois modos de uso da dica de otimização INDEX
. O primeiro exemplo mostra como forçar o otimizador a usar um índice não clusterizado para recuperar linhas de uma tabela. O segundo exemplo força uma varredura de tabela usando um índice de 0.
USE AdventureWorks2022;
GO
SELECT pp.FirstName,
pp.LastName,
e.NationalIDNumber
FROM HumanResources.Employee AS e WITH (INDEX (AK_Employee_NationalIDNumber))
INNER JOIN Person.Person AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Force a table scan by using INDEX = 0.
USE AdventureWorks2022;
GO
SELECT pp.LastName,
pp.FirstName,
e.JobTitle
FROM HumanResources.Employee AS e WITH (INDEX = 0)
INNER JOIN Person.Person AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
M. Usar OPTION e as dicas de GROUP
O exemplo a seguir mostra como a cláusula OPTION (GROUP)
é usada com uma cláusula GROUP BY
.
USE AdventureWorks2022;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
O. Usar a dica de consulta UNION
O exemplo a seguir usa a dica de consulta MERGE UNION
.
USE AdventureWorks2022;
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. Usarum UNION
No exemplo a seguir, o conjunto de resultados inclui o conteúdo das colunas ProductModelID
e Name
das tabelas ProductModel
e Gloves
.
USE AdventureWorks2022;
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 AdventureWorks2022;
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 com UNION
No exemplo a seguir, a cláusula INTO
da segunda instrução SELECT
especifica que a tabela denominada ProductResults
contenha o conjunto de resultados final da união das colunas designadas das tabelas ProductModel
e Gloves
. A tabela Gloves
é criada na primeira instrução SELECT
.
USE AdventureWorks2022;
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 AdventureWorks2022;
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 de duas instruções SELECT com ORDER BY
A ordem de determinados parâmetros usados com a cláusula UNION é importante. O exemplo a seguir mostra o uso incorreto e correto de UNION
em duas instruções SELECT
nas quais uma coluna deve ser renomeada na saída.
USE AdventureWorks2022;
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 AdventureWorks2022;
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 AdventureWorks2022;
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 três instruções SELECT para mostrar os efeitos de ALL e parênteses
Os exemplos a seguir usam UNION
para combinar os resultados de três tabelas que têm as mesmas cinco linhas de dados. O primeiro exemplo usa UNION ALL
para mostrar os registros duplicados e retorna todas as 15 linhas. O segundo exemplo usa UNION
sem ALL
para eliminar as linhas duplicadas dos resultados combinados das três instruções SELECT
e retorna cinco linhas.
O terceiro exemplo usa ALL
com a primeira UNION
e parênteses cercam a segunda UNION
que não está usando ALL
. A segunda UNION
é processada primeiro porque está entre parênteses e retorna cinco linhas porque a opção ALL
não é usada e as duplicatas são removidas. Essas cinco linhas são combinadas com os resultados do primeiro SELECT
usando as palavras-chave UNION ALL
. Esse exemplo não remove as duplicatas entre os dois conjuntos de cinco linhas. O resultado final tem 10 linhas.
USE AdventureWorks2022;
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
INNER 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
INNER 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
INNER 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
Conteúdo relacionado
- CREATE TRIGGER (Transact-SQL)
- CREATE VIEW (Transact-SQL)
- DELETE (Transact-SQL)
- EXECUTE (Transact-SQL)
- Expressões (Transact-SQL)
- INSERT (Transact-SQL)
- LIKE (Transact-SQL)
- Set Operators – UNION (Transact-SQL)
- Operadores de conjunto – EXCEPT e INTERSECT (Transact-SQL)
- UPDATE (Transact-SQL)
- WHERE (Transact-SQL)
- PathName (Transact-SQL)
- SELECT – Cláusula INTO (Transact-SQL)