Exemplos de SELECT (Transact-SQL)

Este tópico fornece exemplos de uso da instrução SELECT.

A. Usando 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 AdventureWorks2008R2.

USE AdventureWorks2008R2;
GO
SELECT *
FROM Production.Product
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2008R2;
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 AdventureWorks2008R2. Além disso, um título de coluna é adicionado.

USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
GO
SELECT Name, ProductNumber, ListPrice AS Price
FROM Production.Product 
WHERE ProductLine = 'R' 
AND DaysToManufacture < 4
ORDER BY Name ASC;
GO

B. Usando 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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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. Usando DISTINCT com SELECT

O exemplo a seguir usa DISTINCT para impedir a recuperação de títulos duplicados.

USE AdventureWorks2008R2;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO

D. Criando 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 AdventureWorks2008R2.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO

Este segundo exemplo cria a tabela permanente NewProducts.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.NewProducts', 'U') IS NOT NULL
    DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2008R2 SET RECOVERY BULK_LOGGED;
GO

SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25 
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2008R2 SET RECOVERY FULL;
GO

E. Usando subconsultas correlatas

O exemplo a seguir mostra consultas semanticamente equivalentes e ilustra a diferença entre o uso da palavra-chave EXISTS e da 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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
GO
SELECT DISTINCT Name
FROM Production.Product
WHERE ProductModelID IN
    (SELECT ProductModelID 
     FROM Production.ProductModel
     WHERE Name LIKE 'Long-Sleeve Logo Jersey%');
GO

O exemplo a seguir usa IN em uma subconsulta correlata ou repetitiva. Trata-se de uma consulta que depende da consulta externa para obter seus valores. A consulta é executada repetidamente, uma vez para cada linha que pode ser selecionada pela consulta externa. Essa consulta recupera uma instância do nome e sobrenome de cada funcionário para os quais o bônus da tabela SalesPerson seja 5000.00 e para os quais existam números de identificação de funcionário correspondentes nas tabelas Employee e SalesPerson.

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

A subconsulta anterior dessa instrução não pode ser avaliada independentemente da consulta externa. É necessário um valor de Employee.BusinessEntityID, 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 AdventureWorks2008R2;
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

Este exemplo usa duas subconsultas correlatas para localizar os nomes de funcionários que venderam um produto específico.

USE AdventureWorks2008R2;
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. Usando GROUP BY

O exemplo a seguir localiza o total de cada ordem de vendas no banco de dados.

USE AdventureWorks2008R2;
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. Usando 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 AdventureWorks2008R2;
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. Usando 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 AdventureWorks2008R2;
GO
SELECT ProductModelID, AVG(ListPrice) AS 'Average List Price'
FROM Production.Product
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO

I. Usando 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 AdventureWorks2008R2;
GO
SELECT AVG(OrderQty) AS 'Average Quantity', 
NonDiscountSales = (OrderQty * UnitPrice)
FROM Sales.SalesOrderDetail
GROUP BY (OrderQty * UnitPrice)
ORDER BY (OrderQty * UnitPrice) DESC;
GO

J. Usando 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 AdventureWorks2008R2;
GO
SELECT ProductID, AVG(UnitPrice) AS 'Average Price'
FROM Sales.SalesOrderDetail
WHERE OrderQty > 10
GROUP BY ProductID
ORDER BY AVG(UnitPrice);
GO

K. Usando 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 AdventureWorks2008R2;
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 AdventureWorks2008R2 ;
GO
SELECT SalesOrderID, CarrierTrackingNumber 
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO

L. Usando 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 AdventureWorks2008R2;
GO
SELECT ProductID 
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO

M. Usando 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 AdventureWorks2008R2;
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 que tiveram vendas totais maiores que $2000000.00, use esta consulta:

USE AdventureWorks2008R2;
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 mil e quinhentos 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 parece com:

USE AdventureWorks2008R2;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO

N. Calculando totais de grupo usando COMPUTE BY

O exemplo a seguir usa dois exemplos de código para mostrar o uso de COMPUTE BY. O primeiro exemplo de código usa COMPUTE BY com uma função de agregação e o segundo usa um item COMPUTE BY e duas funções de agregação.

Esta consulta calcula a soma dos pedidos, para produtos com preços inferiores a $5.00, para cada tipo de produto.

USE AdventureWorks2008R2;
GO
SELECT ProductID, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID, LineTotal
COMPUTE SUM(LineTotal) BY ProductID;
GO

Esta consulta recupera o tipo de produto e o total de produtos do pedido com preços unitários inferiores a $5.00. A cláusula COMPUTE BY usa duas funções de agregação diferentes.

USE AdventureWorks2008R2;
GO
SELECT ProductID, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID, LineTotal
COMPUTE SUM(LineTotal), MAX(LineTotal) BY ProductID;
GO

O. Calculando valores gerais usando COMPUTE sem BY

A palavra-chave COMPUTE pode ser usada sem BY para produzir totais gerais, contas gerais e assim por diante.

O exemplo a seguir localiza o total geral dos preços e adiantamentos para todos os tipos de produtos inferiores a $2.00.

USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, UnitPrice, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $2.00
COMPUTE SUM(OrderQty), SUM(LineTotal);
GO

Você pode usar COMPUTE BY e COMPUTE sem BY na mesma consulta. A consulta a seguir mostra a soma das quantidades do pedido e os totais de linha por tipo de produto e depois calcula o total geral das quantidades do pedido e totais de linha.

USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, UnitPrice, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID
COMPUTE SUM(OrderQty), SUM(LineTotal) BY ProductID
COMPUTE SUM(OrderQty), SUM(LineTotal);
GO

P. Calculando somas computadas em todas as linhas

O exemplo a seguir mostra somente três colunas na lista de seleção e fornece totais com base em todas as quantidades do pedido e todos os totais de linha no final dos resultados.

USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, LineTotal
FROM Sales.SalesOrderDetail
COMPUTE SUM(OrderQty), SUM(LineTotal);
GO

Q. Usando mais de uma cláusula COMPUTE

O exemplo a seguir localiza a soma dos preços de todos os pedidos com preço unitário inferior a $5, organizados por ID do produto e quantidade do pedido, bem como a soma dos preços de todos os pedidos inferiores a $5, organizados somente por ID de produto. Você pode usar funções de agregação diferentes na mesma instrução ao incluir mais de uma cláusula COMPUTE BY.

USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, UnitPrice, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID, OrderQty, LineTotal
COMPUTE SUM(LineTotal) BY ProductID, OrderQty
COMPUTE SUM(LineTotal) BY ProductID;
GO

R. Comparando GROUP BY com COMPUTE

O primeiro exemplo a seguir usa a cláusula COMPUTE para calcular a soma de todos os pedidos cujo preço unitário do produto seja inferior a $5.00, por tipo de produto. O segundo exemplo produz as mesmas informações resumidas usando somente GROUP BY.

USE AdventureWorks2008R2;
GO
SELECT ProductID, LineTotal
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
ORDER BY ProductID
COMPUTE SUM(LineTotal) BY ProductID;
GO

Esta é a segunda consulta que usa GROUP BY.

USE AdventureWorks2008R2;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID
ORDER BY ProductID;
GO

S. Usando SELECT com cláusulas GROUP BY, COMPUTE e ORDER BY

O exemplo a seguir retorna somente os pedidos com preço unitário inferior a $5 e depois calcula a soma do total de linha por produto e o total geral. Todas as colunas computadas aparecem na lista de seleção.

USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
COMPUTE SUM(SUM(LineTotal)) BY ProductID, OrderQty
COMPUTE SUM(SUM(LineTotal));
GO

T. Usando a dica de otimização 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 e o segundo exemplo força uma verificação da tabela usando um índice 0.

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

U. Usando 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 AdventureWorks2008R2;
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

V. Usando a dica de consulta UNION

O exemplo a seguir usa a dica de consulta MERGE UNION.

USE AdventureWorks2008R2;
GO
SELECT *
FROM HumanResources.Employee AS e1
UNION
SELECT *
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO

W. Usando uma UNION simples

No exemplo a seguir, o conjunto de resultados inclui o conteúdo das colunas ProductModelID e Name das tabelas ProductModel e Gloves.

USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

X. Usando 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. Observe que a tabela Gloves é criada na primeira instrução SELECT.

USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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 * 
FROM dbo.ProductResults;

Y. Usando 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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

Z. Usando 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 5 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 5 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 em primeiro lugar porque está entre parênteses e retorna 5 linhas porque a opção ALL não é usada e as linhas duplicadas são removidas. Essas 5 linhas são combinadas com os resultados do primeiro SELECT usando as palavras-chave UNION ALL. Isso não remove as duplicatas entre os dois conjuntos de 5 linhas. O resultado final tem 10 linhas.

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