Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila de SQL
Apostila de SQL
1 - MANIPULAO DE DADOS
SELECT select_list
[ INTO new_table_name ]
FROM table_list
[ WHERE search_conditions ]
[ GROUP BY group_by_list ]
[ HAVING search_conditions ]
[ ORDER BY order_list [ ASC | DESC ] ]
select_list
Descreve as colunas do conjunto de resultados. uma lista de expresses separadas por vrgulas.
Cada expresso define o formato (tipo de dados e tamanho) e a fonte dos dados para a coluna do
conjunto de resultados. Cada expresso de lista de seleo tipicamente uma referncia a uma
coluna na tabela de origem ou exibio de onde os dados provm, mas pode ser qualquer outra
expresso, como uma constante ou uma funo Transact-SQL. O uso da expresso * em uma lista
de seleo especifica que todas as colunas da tabela de origem so retornadas.
INTO new_table_name
Especifica que o conjunto de resultados usado para criar uma nova tabela. new_table_name
especifica o nome da tabela nova.
FROM table_list
Contm uma lista das tabelas das quais os dados do conjunto de resultados so recuperados. Essas
fontes podem ser:
Pg. 1 de 18
04/09/2010
Pode haver vrios objetos que tm o mesmo nome em um sistema. Por exemplo, Schema1 e
Schema2 podem ter uma tabela nomeada TableX. Para resolver a ambigidade e especificar o
objeto TableX possudo por Schema1, qualifique o nome de tabela pelo menos com o nome do
esquema:
Exemplo:
SELECT *
FROM Schema1.TableX
O banco de dados no qual o objeto reside pode nem sempre ser o banco de dados atual quando a
instruo SELECT executada. Para ter certeza de que o objeto correto sempre usado,
independentemente da configurao do banco de dados atual, qualifique o nome de objeto com o
banco de dados e o esquema:
Exemplo:
SELECT *
FROM AdventureWorks.Purchasing.ShipMethod
Desenvolvido por: Alexandre G. Silva
TOTVS ES
Pg. 2 de 18
04/09/2010
As tabelas e exibies especificadas na clusula FROM podem ter nomes de coluna duplicados.
Freqentemente, chaves estrangeiras tero o mesmo nome de coluna que sua chave primria
relacionada. Para resolver a ambigidade entre nomes duplicados, o nome de coluna deve ser
qualificado com o nome da tabela ou nome de exibio:
Exemplo:
SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name
FROM Sales.Customer JOIN Sales.Store ON
( Sales.Customer.CustomerID = Sales.Store.CustomerID)
WHERE Sales.Customer.TerritoryID = 1
Essa sintaxe fica muito grande quando os nomes de tabela e de exibio tiverem que ser
qualificados completamente. Voc pode resolver esse problema atribuindo um nome de correlao,
tambm conhecido como uma varivel de intervalo ou alias, tabela, usando a palavra-chave AS na
clusula FROM. O nome de tabela ou de exibio completamente qualificado tem de ser especificado
apenas na clusula FROM. Todas as outras referncias a tabelas ou exibies podem ento usar o
nome de correlao. Aplicar nomes de correlao e qualificar as tabelas completamente na amostra
anterior cria esta instruo SELECT:
Exemplo:
SELECT DISTINCT c.CustomerID, s.Name
FROM Sales.Customer AS c
JOIN
Sales.Store AS s
ON ( c.CustomerID = s.CustomerID)
WHERE c.TerritoryID = 1
Para obter mais informaes sobre qualificao de objeto, consulte Identificadores.
Nos Manuais Online do SQL Server, muitos exemplos de Transact-SQL esto simplificados por no se
usarem nomes qualificados. Embora esses elementos no estejam includos nos exemplos, a fim de
facilitar a legibilidade, recomendamos que voc use nomes qualificados em instrues Transact-SQL
em sistemas de produo.
Pg. 3 de 18
04/09/2010
DESCRIO
MIN()
MAX()
AVG()
SUM()
COUNT()
Operadores lgicos.
OPERADOR
DESCRIO
Igualdade
<>
Desigualdade
>
Maior que
<
Menor que
>=
Maior ou igual a
<=
Menor ou igual a
!>
No maoir que
!<
No menor que
!=
No igual
Pg. 4 de 18
04/09/2010
Junes internas (a operao de juno tpica como a que usa algum operador de comparao como
= ou <>). Esses incluem junes naturais e junes por igualdade.
As junes internas usam um operador de comparao para relacionar duas tabelas com base nos
valores em colunas comuns de cada tabela. Por exemplo, ao recuperar todas as linhas em que o
nmero de identificao do aluno o mesmo em ambas as tabelas alunos e cursos.
Junes externas. As junes externas pode ser uma juno externa esquerda, direita ou juno
externa completa.
As junes externas so especificadas com um dos seguintes conjuntos de palavras-chave quando
elas so especificadas na clusula FROM:
CROSS JOIN
Uma juno cruzada sem uma clusula WHERE produz o produto cartesiano das tabelas envolvidas
na juno. O tamanho do conjunto de resultados do produto cartesiano o nmero de linhas na
primeira tabela multiplicado pelo nmero de linhas na segunda tabela. O exemplo a seguir mostra
juno cruzada Transact-SQL.
Pg. 5 de 18
04/09/2010
Fonte: http://go.microsoft.com/fwlink/?LinkID=127303
Pg. 6 de 18
04/09/2010
7 Liste os produtos que tiveram ordem de compra cujo o valor total do item seja maior que
1000(mil), trazer como informao: numero do movimento, numero de sequncia, cdigo do
produto, valor total.
Pg. 7 de 18
04/09/2010
Funes escalares
As funes escalares definidas pelo usurio retornam um nico valor de dados do tipo definido na
clusula RETURNS. Para uma funo escalar embutida, no h nenhum corpo de funo; o valor
escalar o resultado de uma nica instruo. Para uma funo escalar com vrias instrues, o
corpo da funo, definido em um bloco BEGINEND, contm uma srie de instrues do TransactSQL que retornam o valor nico. O tipo de retorno pode ser em qualquer tipo de dados, exceto
texto, ntext, imagem, cursor e carimbo de data/hora.
Funes com valor de tabela
As funes com valor de tabela definidas pelo usurio retornam um tipo de dados de tabela. Para
uma funo com valor de tabela embutida, no h corpo de funo; a tabela o conjunto de
resultados de uma nica instruo SELECT.
Para uma funo com valor de tabela com vrias instrues, o corpo de funo, definido em um
bloco BEGIN... END, contm uma srie de instrues do Transact-SQL que criam e inserem linhas na
tabela que ser retornada.
Funes internas
As funes internas so fornecidas pelo SQL Server para ajudar voc a executar uma variedade de
operaes. Elas no podem ser modificadas. Voc pode usar funes internas em instrues do
Transact-SQL para:
Acessar informaes de tabelas do sistema SQL Server sem acessar os tabelas do sistema
diretamente.
Executar tarefas comuns como SUM, GETDATE ou IDENTITY.
Funes internas retornam os tipos de dados escalar ou de tabela. Por exemplo, @@ERROR retorna
0 se a ltima instruo do Transact-SQL tiver sido executada com xito. Se a instruo gerou um
erro, @@ERROR retorna o nmero do erro. E a funo SUM(parameter) retorna a soma de todos os
valores do parmetro.
Abaixo uma tabela contendo algumas funes internas que podem ser bastante teis
Funo
APP_NAME
Descrio
Retorna o nome do aplicativo para a sesso atual se definido pelo aplicativo
Expresso CASE
CAST e CONVERT
Pg. 8 de 18
04/09/2010
COLLATIONPROPERTY
COLUMNS_UPDATED
CURRENT_TIMESTAMP
CURRENT_USER
DATALENGTH
Funes escalares
As funes escalares definidas pelo usurio retornam um valor nico de dados do tipo definido na
clusula RETURNS. Para uma funo escalar embutida, no h um corpo de funo; o valor escalar
o resultado de uma nica instruo. Para uma funo escalar de vrias instrues, o corpo da
funo, definido em um bloco BEGIN...END, contm uma srie de instrues Transact-SQL, que
retornam o valor nico. O tipo de retorno pode ser qualquer tipo de dados, exceto text, ntext,
image, cursore timestamp.
Os exemplos a seguir criam uma funo escalar de vrias instrues. A funo pega um valor de
entrada, um ProductID, e retorna um nico valor de dados, a quantidade agregada do produto
especificado no inventrio.
Exemplo:
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.ufnGetInventoryStock', N'FN') IS NOT NULL
DROP FUNCTION ufnGetInventoryStock;
GO
CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)
RETURNS int
AS
-- Returns the stock level for the product.
BEGIN
DECLARE @ret int;
SELECT @ret = SUM(p.Quantity)
FROM Production.ProductInventory p
WHERE p.ProductID = @ProductID
AND p.LocationID = '6';
IF (@ret IS NULL)
Desenvolvido por: Alexandre G. Silva
TOTVS ES
Pg. 9 de 18
04/09/2010
As funes com valor de tabela definidas pelo usurio retornam um tipo de dados table. Para uma
funo com valor de tabela embutida, no h um corpo de funo; a tabela o conjunto de
resultados de uma nica instruo SELECT.
O exemplo a seguir cria uma funo com valor de tabela embutida. A funo pega um parmetro de
entrada, um ID cliente (loja), e retorna as colunas ProductID, Name e a agregao das vendas do
ano, at a data atual, como YTD Total para cada produto vendido para a loja.
Exemplo:
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL
DROP FUNCTION Sales.ufn_SalesByStore;
GO
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN
(
SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
FROM Production.Product AS P
JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
WHERE C.StoreID = @storeid
GROUP BY P.ProductID, P.Name
);
GO
Pg. 10 de 18
04/09/2010
Para uma funo com valor de tabela de vrias instrues, o corpo da funo definido em um bloco
BEGIN...END contm uma srie de instrues Transact-SQL, que criam e inserem linhas na tabela
que ser retornada.
O exemplo a seguir cria uma funo com valor de tabela. A funo toma um nico parmetro de
entrada, um EmployeeID e retorna uma lista de todos os funcionrios que reportam direta ou
indiretamente ao funcionrio especificado. A funo que especifica a ID do funcionrio 109
invocada em seguida.
Exemplo:
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.ufn_FindReports', N'TF') IS NOT NULL
DROP FUNCTION dbo.ufn_FindReports;
GO
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)
RETURNS @retFindReports TABLE
(
EmployeeID int primary key NOT NULL,
FirstName nvarchar(255) NOT NULL,
LastName nvarchar(255) NOT NULL,
JobTitle nvarchar(50) NOT NULL,
RecursionLevel int NOT NULL
)
--Returns a result set that lists all the employees who report to the
--specific employee directly or indirectly.*/
AS
BEGIN
WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) -CTE name and columns
AS (
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0 -- Get
the initial list of Employees for Manager n
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.BusinessEntityID = @InEmpID
UNION ALL
SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle,
RecursionLevel + 1 -- Join recursive member to anchor
FROM HumanResources.Employee e
INNER JOIN EMP_cte
ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode
INNER JOIN Person.Person p
ON p.BusinessEntityID = e.BusinessEntityID
)
-- copy the required columns to the result of the function
INSERT @retFindReports
Desenvolvido por: Alexandre G. Silva
TOTVS ES
Pg. 11 de 18
04/09/2010
Pg. 12 de 18
04/09/2010
As instrues CREATE PROCEDURE no podem ser combinadas com outras instrues SQL
em um nico lote.
Para criar procedimentos, voc deve ter a permisso CREATE PROCEDURE no banco de dados
e a permisso ALTER no esquema no qual o procedimento est sendo criado. Para
procedimentos armazenados CLR, voc deve possuir assembly referenciado em
<mtodo_especificador> ou ter a permisso REFERENCES nesse assembly.
Qualquer instruo de tratamento de erros necessria para detectar e tratar erros potenciais.
As funes de tratamento de erros como ERROR_LINE e ERROR_PROCEDURE podem ser
especificadas no procedimento armazenado. Para obter mais informaes, consulte Usando
TRY...CATCH em Transact-SQL.
Exemplo:
USE AdventureWorks;
Pg. 13 de 18
04/09/2010
Pg. 14 de 18
04/09/2010
Pg. 15 de 18
04/09/2010
HumanResources.uspGetEmployees2;
HumanResources.uspGetEmployees2 N'Wi%';
HumanResources.uspGetEmployees2 @FirstName = N'%';
HumanResources.uspGetEmployees2 N'[CK]ars[OE]n';
HumanResources.uspGetEmployees2 N'Hesse', N'Stefen';
HumanResources.uspGetEmployees2 N'H%', N'S%';
Pg. 16 de 18
04/09/2010
Exemplo:
DECLARE @ComparePrice money, @Cost money
EXECUTE Production.uspGetList '%Bikes%', 700,
@ComparePrice OUT,
Desenvolvido por: Alexandre G. Silva
TOTVS ES
Pg. 17 de 18
04/09/2010
Pg. 18 de 18
04/09/2010