Compartilhar via


Exemplos de SELECT (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureBanco 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 você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.

A. Usar SELECT para recuperar linhas e colunas

O exemplo a seguir mostra três exemplos de código. O primeiro exemplo de código retorna todas as linhas (nenhuma WHERE cláusula é especificada) e todas as colunas (usando o *) da tabela no AdventureWorks2025 banco de Product dados.

USE AdventureWorks2025;
GO

SELECT *
FROM Production.Product
ORDER BY Name ASC;

-- Alternate way.
USE AdventureWorks2025;
GO

SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO

Este exemplo retorna todas as linhas (nenhuma WHERE cláusula é especificada) e apenas um subconjunto das colunas (Name, ProductNumber, ) ListPriceda Product tabela no AdventureWorks2025 banco de dados. Além disso, um título de coluna é adicionado.

USE AdventureWorks2025;
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 R produto e que têm dias para fabricar que é menor que 4.

USE AdventureWorks2025;
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 AdventureWorks2025;
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

Essa consulta calcula a receita de cada produto em cada ordem de venda.

USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO

Este segundo exemplo cria a tabela permanente NewProducts.

USE AdventureWorks2025;
GO

IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO

ALTER DATABASE AdventureWorks2025 SET RECOVERY BULK_LOGGED;
GO

SELECT *
INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
    AND ListPrice < $100;
GO

ALTER DATABASE AdventureWorks2025 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 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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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.

Você também pode usar uma subconsulta correlacionada na HAVING cláusula 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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
GO

SELECT SalesOrderID,
    SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO

Devido à GROUP BY cláusula, a consulta retorna apenas uma linha contendo a soma de todas as vendas para cada pedido 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 atual, agrupadas por ID de produto e ID de oferta especial.

USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
GO

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

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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
GO

SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO

Se você quiser garantir que os cálculos de cada produto incluam pelo menos 1.500 itens, use HAVING COUNT(*) > 1500 para eliminar os produtos que retornam totais para menos de 1500 itens vendidos. A consulta tem esta aparência:

USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 UNION cláusula é importante. O exemplo a seguir mostra o uso incorreto e correto de UNION duas SELECT instruções em que você renomeia uma coluna na saída.

USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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