Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Este artigo fornece exemplos de uso da instrução SELECT .
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.
A. Use SELECT para recuperar linhas e colunas
O exemplo a seguir mostra três exemplos de código. Este primeiro exemplo de código retorna todas as linhas (nenhuma cláusula WHERE é especificada) e todas as colunas (usando o *) da Product tabela no AdventureWorks2025 banco de dados.
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 é especificada) e apenas um subconjunto das colunas (Name, ProductNumber, ListPrice) da Product tabela no AdventureWorks2025 banco de dados. 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 apenas as linhas que Product têm uma linha de produtos de R e que têm dias para fabricar que é menor 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. Use SELECT com cabeçalhos de coluna e cálculos
Os exemplos a seguir retornam todas as linhas da Product tabela. 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 de cada produto em cada ordem de venda.
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. Use 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 nomeada #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 NewProductspermanente .
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 seus valores. Essa consulta pode ser executada repetidamente, uma vez para cada linha que pode ser selecionada pela consulta externa.
O primeiro exemplo mostra consultas que são semanticamente equivalentes para ilustrar a diferença entre usar a EXISTS palavra-chave e a IN palavra-chave. Ambos são exemplos de uma subconsulta válida que recupera uma instância de cada nome de produto para o qual o modelo de produto é uma camisa de logotipo de manga comprida e os ProductModelID números correspondem entre as Product tabelas 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 primeiro nome e sobrenome de cada funcionário para o qual o SalesPerson bônus na tabela é 5000.00, e para o qual os números de identificação do funcionário correspondem nas Employee tabelas 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 nesta instrução não pode ser avaliada de forma independente da consulta principal. Ele requer um valor para Employee.EmployeeID, mas esse valor muda à medida que o Mecanismo de Banco de Dados do SQL Server examina linhas diferentes no Employee.
Uma subconsulta correlacionada também pode ser usada na HAVING cláusula de uma consulta externa. Este exemplo localiza os modelos de produto para os quais o preço de tabela máximo é mais do que o dobro da média do 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 correlacionadas para localizar os nomes dos funcionários que venderam um determinado produto.
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 venda no banco de dados.
USE AdventureWorks2022;
GO
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Devido à GROUP BY cláusula, apenas uma linha contendo a soma de todas as vendas é devolvida para cada ordem de venda.
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, agrupadas por ID do produto e ID da 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. Use GROUP BY e WHERE
O exemplo a seguir coloca 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. Você pode agrupar por uma expressão se a expressão não incluir funções agregadas.
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. Use 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. Use a cláusula HAVING
O primeiro exemplo a seguir mostra uma HAVING cláusula com uma função agregada. Ele agrupa as linhas na tabela por ID de SalesOrderDetail produto e elimina produtos cujas quantidades médias de pedidos são cinco ou menos. O segundo exemplo mostra uma HAVING cláusula sem funções agregadas.
USE AdventureWorks2022;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
Esta consulta usa a LIKE cláusula na HAVING cláusula.
USE AdventureWorks2022;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
L. Use TER e AGRUPAR POR
O exemplo a seguir mostra o uso de GROUP BY, HAVING, WHERE, e ORDER BY cláusulas em uma SELECT instrução. Ele produz grupos e valores resumidos, mas faz isso depois de eliminar os produtos com preços acima de US $ 25 e quantidades médias de pedidos 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. Use HAVING com SUM e AVG
O exemplo a seguir agrupa a SalesOrderDetail tabela por ID de produto e inclui apenas os grupos de produtos que têm pedidos que totalizam mais de $1000000.00 e cujas quantidades médias de pedidos são menores que 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 ver os produtos com vendas totais superiores $2000000.00a , utilize esta consulta:
USE AdventureWorks2022;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Se você quiser ter certeza de que há 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 do que 1500 os 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. Use a dica do otimizador INDEX
O exemplo a seguir mostra duas maneiras de usar a dica do INDEX otimizador. 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 verificação 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. Use OPTION e as dicas GROUP
O exemplo a seguir mostra como a OPTION (GROUP) cláusula é usada com uma GROUP BY cláusula.
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. Use 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. Use uma UNIÃO
No exemplo a seguir, o conjunto de resultados inclui o conteúdo das ProductModelID colunas e Name das ProductModel tabelas 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. Use SELECT INTO com UNION
No exemplo a seguir, a INTO cláusula na segunda SELECT instrução especifica que a tabela nomeada ProductResults contém o conjunto de resultados finais da união das colunas designadas das ProductModel tabelas e Gloves . A Gloves tabela é criada na primeira SELECT instrução.
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. Use UNIÃO de duas instruções SELECT com ORDER BY
A ordem de certos parâmetros utilizada com a cláusula UNION é importante. O exemplo a seguir mostra o uso incorreto e correto de UNION duas SELECT instruções 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. Use UNION de três instruções SELECT para mostrar os efeitos de ALL e parênteses
Os exemplos a seguir são usados 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 SELECT instruções e retorna cinco linhas.
O terceiro exemplo usa ALL com o primeiro UNION e entre parênteses o segundo UNION que não está usando ALL. A segunda UNION é processada primeiro porque está entre parênteses e retorna cinco linhas porque a ALL opção não é usada e as duplicatas são removidas. Essas cinco linhas são combinadas com os resultados da primeira SELECT usando as UNION ALL palavras-chave. Este 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
- CRIAR GATILHO (Transact-SQL)
- CRIAR VISTA (Transact-SQL)
- SUPRIMIR (Transact-SQL)
- EXECUTAR (Transact-SQL)
- Expressões (Transact-SQL)
- INSERIR (Transact-SQL)
- COMO (Transact-SQL)
- Operadores de Conjuntos - UNION (Transact-SQL)
- Operadores de Conjunto - EXCEPT e INTERSECT (Transact-SQL)
- ATUALIZAÇÃO (Transact-SQL)
- ONDE (Transact-SQL)
- Nome do Caminho (Transact-SQL)
- Cláusula SELECT - INTO (Transact-SQL)