Introdução à T-SQL
Embora existam diversas maneiras de armazenarmos dados
estruturados, os bancos de dados relacionais ainda são os mais utilizados na
maioria das soluções e sistemas. Dentro da plataforma Microsoft de
desenvolvimento, o SQL Server 2008 figura como principal opção para
armazenamento de dados.
Dominar uma linguagem de banco de dados, como o SQL, é
essencial para desenvolvedores de aplicações que pretendam utilizar o SQL
Server. Notadamente, a T-SQL se firmou como uma linguagem poderosa e contribuiu
para a consolidação do SQL Server.
Veremos como podemos criar um ambiente de estudo para
desenvolvimento com a T-SQL, quais são os conceitos e fundamentos por trás da
linguagem e suas aplicações. Também aprenderemos a utilizar o SQL Server Manager
Studio para criarmos scripts de banco de dados utilizando diversas facilidades
para desenvolvimento.
Criando o ambiente para desenvolvimento
Como primeiro passo para criação do ambiente de desenvolvimento,
devemos realizar a instalação do SQL Server 2008 Express. Na primeira edição da
Easy .net Magazine você encontra o processo de instalação descrito
detalhadamente. Ao final desse artigo, na sessão de Links, você encontrará a
URL para o artigo que descreve a instalação.
Após a instalação do SQL Server 2008 Express, devemos fazer o
download do banco de dados de exemplo chamado “AdventureWorks”, disponível no
CodePlex (vide sessão Links, “Downloads de bancos de dados de exemplo”). No
link mencionado você encontrará o download do arquivo “AdventureWorks2008_SR4.exe”,
um instalador do banco de dados de exemplo “AdventureWorks”. Uma vez executado,
o instalador apresentará uma tela para selecionarmos as opções para instalação.
Conforme podemos conferir na Figura 1,
para os exemplos demonstrados nesse artigo utilizaremos apenas a opção
“AdventureWorks OLTP”. Para iniciar a instalação clique no botão “Install”.
A partir daqui o instalador realizará todo o processo de
instalação, conforme ilustra a Figura 2.
Além de criar a base de dados de exemplo o instalador fará o processo de anexar
o banco de dados à instância do SQL Server 2008.
Para entendermos como funciona o processo de anexação de uma
base de dados no SQL Server vamos utilizar o SQL Server Management Studio,
localizado no menu Iniciar > Microsoft SQL Server 2008. Na tela de login,
ilustrada na Figura 3, clique em
“Connect” (se você optar por logar com uma conta do SQL Server, informe antes o
usuário e a senha).
Aqui vale lembrar que os procedimentos que veremos não são
necessários se você utilizou o instalador do banco de dados de exemplo do
CodePlex. Contudo, é importante que você conheça a forma manual de instalação
de uma base de dados, pois essa é a forma padrão utilizada na prática. Com o
Microsoft SQL Server Management Studio iniciado, clique com o botão direito em
Databases, conforme ilustra a Figura 4,
e escolha a opção “Attach”.
Na tela “Attach Databases” clique no botão “Add”, conforme
destaque da Figura 5. Essa tela nos
auxiliará no processo de anexação de um arquivo de banco de dados a nossa
instância de SQL Server 2008.
Conforme podemos ver na
Figura
6, a janela “Locate Database Files” exibe os diretórios da máquina. A
título de exemplo, a
Figura 6 mostra
como faríamos para anexar a base de dados de exemplo “AdventureWorks”. Devemos
escolher o diretório onde se localiza o arquivo “AdventureWorks_Data.mdf”. Por
padrão, esse arquivo fica dentro de “c:\Arquivos de programas\Microsoft SQL
Server\MSSQL10.SQLEXPRESS\MSSQL\Data”, contudo, esse caminho pode variar muito
caso haja instalações prévias do SQL Server.
Nesse momento bastaria confirmar a operação clicando em “Ok”,
contudo, isso não será necessário, pois o banco de dados “AdventureWorks” já
foi anexado pelo instalador do CodePlex. Conforme mostra a Figura 7, após todo o processo de instalação o banco de dados
“AdventureWorks” está pronto para utilização. Podemos navegar em seus objetos e
realizar nossa introdução ao desenvolvimento com T-SQL.
Nosso ambiente de desenvolvimento está totalmente pronto e
funcional para os exemplos que veremos nesse artigo. Contudo, vamos conhecer
antes a origem da linguagem SQL e o seus principais padrões. Esse conhecimento
é importante para sabermos até onde os comandos e palavras-chave utilizadas em
uma consulta são compatíveis com outros bancos de dados.
O surgimento do SQL e
seus padrões
A linguagem SQL (do inglês, Structured Query Language) é conhecida
por ser um padrão de banco de dados amplamente utilizado, principalmente devido
a sua simplicidade e facilidade de uso. Diferente de outras linguagens de consulta
a banco de dados, SQL especifica a forma do resultado e não o caminho para
chegar a ele.
Embora o SQL tenha sido originalmente criado pela IBM,
rapidamente surgiram vários "dialetos" desenvolvidos por outros fabricantes,
tais como: Oracle, Microsoft SQL Server, entre outros. Essa expansão levou à
necessidade de ser criado e adaptado um padrão para a linguagem, o que foi realizado
pela American National Standards Institute (ANSI) em 1986 e a ISO em 1987. O
SQL foi revisto em 1992 e a esta versão foi dado o nome de SQL-92. Foi revisto
novamente em 1999 e 2003 para se tornar SQL:1999 (SQL3) e SQL:2003,
respectivamente.
Dentro do padrão SQL (também conhecido como SQL Standard), temos
alguns grupos de palavras-chave utilizados em contextos distintos, como veremos
a seguir.
A DML (Data Manipulation Language, ou Linguagem
de Manipulação de Dados) é um subconjunto da linguagem usada para inserir,
atualizar e apagar dados. A seguir temos os comandos utilizados na manipulação
de dados:
INSERT à é usada para inserir um registro (formalmente uma
tupla) em uma tabela existente.
UPDATE à para mudar os valores de dados em uma ou mais linhas
da tabela existente.
DELETE à permite remover linhas existentes de uma tabela.
A DDL (Data Definition Language, ou Linguagem
de Definição de Dados) permite definir tabelas novas e elementos associados. A
maioria dos bancos de dados de SQL comerciais tem extensões proprietárias no
DDL. Os comandos básicos da DDL são poucos:
CREATE à cria um objeto (uma Tabela, por exemplo) dentro da
base de dados.
DROP à apaga um objeto do banco de dados.
Alguns sistemas de banco de dados usam o comando ALTER, que permite ao usuário alterar
um objeto, por exemplo, adicionando uma coluna a uma tabela existente. Outros comandos DDL:
ALTER TABLE
CREATE INDEX
ALTER INDEX
DROP INDEX
CREATE VIEW
DROP VIEW
O DCL (Data Control
Language, ou Linguagem de Controle de Dados) controla os aspectos de
autorização de dados e licenças de usuários para controlar quem tem acesso para
ver ou manipular dados dentro do banco de dados. Duas palavras-chaves da DCL:
GRANT à autoriza ao usuário executar ou setar operações.
REVOKE à remove ou restringe a capacidade de um usuário de
executar operações.
Nota: Existem ainda outras linguagens de banco de dados, como por exemplo,
a DTL (Linguagem de Transição de
Dados) e a DQL (Linguagem de
Consulta de Dados).
Conhecer os padrões da linguagem SQL é importante, pois quando
queremos criar consultas portáveis para outros bancos de dados devemos nos
preocupar com o tipo de palavra-reservada que usamos em nossas query’s.
Utilizando os padrões SQL temos alguma garantia de que a maioria dos
gerenciadores de banco de dados, como é o caso do Microsoft SQL Server, serão
capazes de entender nossas consultas e realizá-las corretamente.
Obviamente, quando a portabilidade para outras engines de banco
de dados não são necessárias, podemos tirar proveito dos recursos exclusivos
que o SQL Server 2008 oferece. Veremos a seguir como podemos criar uma Solution
no SQL Server Management Studio.
Iniciando nos recursos do SQL Server Management Studio
O SQL Server Management Studio inclui ferramentas gráficas para
administração de banco de dados em um rico ambiente de desenvolvimento. O
Management Studio permite acessar e gerenciar o Mecanismo de Banco de Dados, através
do Query Analyser teremos a capacidade de escrever instruções Transact-SQL ou T-SQL (a implementação Microsoft do padrão SQL).
Nota: A versão Express do SQL Server Management Studio não possui o
recurso que veremos a seguir de criação de projetos, contudo, é possível criar
arquivos de scripts e salvá-los no diretório padrão do SQL Server 2008 ou em
qualquer outro projeto. Caso esteja utilizando a versão Express, basta utilizar
a opção New Query no Management e informar os scripts do exemplo para fazer os
testes.
Para abrir o SQL Server Management Studio, vá ao menu iniciar
escolha “Todos os Programas / Microsoft SQL Server 2008 e escolha SQL Server
Management Studio”. Com o Management Studio iniciado, escolha no menu File a
opção New / Project. A tela “New Project” será exibida, conforme vemos na Figura 8. Escolha o template “SQL
Server Scripts” e informe o nome do projeto. No exemplo da Figura 9, utilizei o nome EasyNetMag. Para confirmar a criação do
projeto, clique no botão “Ok”.
Figura 8. Criando um projeto de scripts SQL Server no SQL Server Management
Studio
Devemos agora criar uma conexão para o nosso projeto. Na janela
“Solution Explorer” clique com o botão direito no item “Connections” e escolha
a opção “New Connection”. Será exibida a tela de login do SQL Server 2008. Após
informar os dados de login clique no botão “Ok” para conectar no banco de dados
e criar a nossa conexão. A Figura 9 ilustra
como a nova conexão será exibida na janela “Solution Explorer” do Management
Studio. Podemos criar tantas conexões quantas forem necessárias, mas para o
nosso exemplo precisaremos apenas da conexão com a instância do SQL Server 2008
Express, previamente instalada.
Figura 9. Adicionando uma nova conexão no projeto EasyNetMag
Vamos agora criar o nosso primeiro script no projeto EasyNetMag.
Seguindo a tradição universal para iniciarmos em qualquer linguagem, faremos
uma query para exibir a mensagem “Hello world!”. Na janela “Solution Explorer”,
clique com o botão direito no item Queries e escolha “New Query”. Será criado
um novo arquivo dentro do item Queries, chamado “SQLQuery1.sql”. Para renomear
o arquivo clique no item “SQLQuery1.sql” na janela “Solution Explorer” e em
seguida clique na tecla F4 do teclado para abrir a janela Properties. Conforme
vemos na Figura 10, na janela
Properties podemos alterar o nome do arquivo “SQLQuery1.sql” utilizando a
propriedade “Name”. Dê o nome “HelloWorld.sql” para o arquivo.
Figura 10. Alterando o nome de um arquivo de script
Feito isso, vamos garantir que o nosso arquivo de script
recém-criado utilize a conexão correta. Para fazermos essa associação clique no
editor de texto e observe que a janela “Properties” irá alterar as opções de
configuração. A propriedade “Connection / Connection name” exibirá as conexões
disponíveis para uso. No nosso caso teremos apenas uma, criada anteriormente.
Caso você utilizasse mais de uma conexão no seu projeto, essa seria a
propriedade a ser alterada para definir qual a associação necessária para cada
arquivo de script (Figura 11).
Figura 11. Definindo qual a conexão que será utilizada pelo arquivo de script
Dentro do editor de texto, vamos inserir o código:
SELECT 'Hello
world!'
Em seguida vamos clicar no botão Execute, localizado na barra de
ferramentas do SQL Server Management Studio. A Figura 12 mostra onde está localizado o botão Execute, o editor de
textos e o painel de resultados – que será exibido após a execução do script.
Basicamente esse script instrui o SQL Server a processar como resultado da consulta
um texto simples.
É importante salientar que esse texto não está, necessariamente,
inserido dentro da nossa base de dados de exemplo. Essa é apenas uma das formas
de exibirmos textos dentro de um script, poderíamos ao invés de utilizar a
palavra-reservada “SELECT” utilizar “PRINT”, contudo isso faria com que o texto
fosse exibido na aba “Messages”, localizada atrás da aba “Results” (painel de
resultados). A palavra reservada “PRINT” pode ser utilizada para exibir
informações relativas a um procedimento executado dentro de um script que não
necessite fazer parte do retorno da consulta como um todo.
Figura 12. Principais componentes do SQL Server Management Studio
Além das facilidades que vimos até aqui, o SQL Server Management
Studio é capaz de oferecer uma opção para debugarmos nossos scripts através do
botão “Debug”, localizado imediatamente à direita do botão “Execute”. Ao
utilizarmos a opção “Debug” podemos executar o nosso script, sentença a
sentença. Utilizamos a tecla F11 para avançarmos para a próxima sentença,
conforme vemos no exemplo da Figura 13.
Figura 13. Debugando scripts no Management Studio
A opção de Debug é extremamente útil quando queremos identificar
algum erro ou inconsistência da nossa consulta, pois através das janelas “Locals”
e “Call Stack” podemos verificar o valor de variáveis e a situação da nossa
consulta na medida que o SQL Server processa cada sentença.
O SQL Server Management Studio oferece uma biblioteca de modelos
de scripts prontos para uso. Eles cobrem a maioria das situações necessárias no
desenvolvimento utilizando T-SQL, além de ser uma boa opção para vermos boas
práticas na elaboração de scripts. Para acessar a biblioteca de modelos vá ao
menu na opção “View / Template Explorer”, ou utilize a tecla de atalho
“CTRL+Alt+T” (veja Figura 14).
Figura 14. Utilizando os templates do SQL Server Management Studio
Vamos utilizar um modelo, como exemplo, dentro do nosso projeto
de scripts. Na janela “Template Explorer” selecione na opção “Stored Procedure”
o modelo “Create Procedure Basic Template” e dê um duplo clique neste item. O
modelo será aberto no editor de textos do Management Studio. Em seguida, na
janela “Solution Explorer”, clique com o botão direito no item Queries e
escolha “New Query”. Renomeie o arquivo para “ListarProdutos.sql”, conforme
explicado anteriormente. Por fim, copie o conteúdo do arquivo de modelo e cole
no arquivo criado.
Como resultado final você terá o projeto conforme mostra a Figura 15. Note que, se executarmos o
script da forma que está, ocorrerá um erro. Isso porque o arquivo de modelo
deve ser utilizado apenas como um guia na construção de scripts, portanto,
devemos alterá-lo para atingir o objetivo pretendido.
Figura 15. Exemplo de template de script para Stored Procedure, disponível no SQL
Server Management Studio
Altere o arquivo “ListarProduto.sql” de forma que o seu
resultado final seja o demonstrado na Listagem
1. No script podemos notar três blocos distintos de código, separados pela
palavra-reservada “GO”. No primeiro bloco temos apenas a instrução “USE
AdventureWorks”, que informa para a engine do SQL Server que todas as sentenças
que vierem em seguida devem ser executadas dentro da base de dados
“AdventureWorks”. O segundo bloco serve para verificar se a Stored Procedure
que queremos criar já existe no banco de dados, através do comando “IF EXISTS”
verificamos se a consulta entre parênteses retorna algum resultado. Em caso
afirmativo, a Stored Procedure chamada “Production.ListarProdutos” será
deletada da base de dados, como o comando “DROP PROCEDURE”. O terceiro e último
bloco de código cria a Stored Procedure através do comando “CREATE PROCEDURE”.
Você deve ter notado que no script a tabela e a stored procedure
foram referenciadas da seguinte forma: “Production.Product” e
“Production.ListarProdutos”, respectivamente. O termo “Production” é chamado de
schema (ou esquema). Um esquema é simplesmente um contêiner de objetos. Um
único esquema pode conter objetos de propriedade de vários usuários de banco de
dados. Vários usuários de banco de dados podem compartilhar um único esquema
padrão. Portanto, no nosso exemplo, “Production” é o schema que abriga os
objetos “Product” e “ListarProdutos”.
Listagem 1. Exemplo de script de criação de stored procedure
USE AdventureWorks
GO
--
=============================================
-- Create
basic stored procedure template
--
=============================================
-- Drop
stored procedure if it already exists
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE SPECIFIC_SCHEMA
= N'Production'
AND
SPECIFIC_NAME = N'ListarProdutos'
)
DROP PROCEDURE Production.ListarProdutos
GO
CREATE PROCEDURE
Production.ListarProdutos
AS
BEGIN
SELECT
Production.Product.ProductID,
Production.Product.Name,
Production.Product.ListPrice
FROM
Production.Product
WHERE
Production.Product.Color = 'Blue'
END
GO
Ao executarmos o script teremos a seguinte mensagem no painel
Messages:
Command(s)
completed successfully.
Abrindo a janela “Object Explorer” podemos expandir o item
“Programmability / Stored Procedures” para vermos a Stored Procedure criada,
conforme ilustrado na Figura 16.
Figura 16. Stored Procedure criada
Uma opção muito útil do Management Studio é o chamado
IntelliSense. Basicamente, o IntelliSense é um recurso que nos auxilia em tempo
de desenvolvimento dentro do editor de textos abrindo uma pequena janela com as
opções disponíveis de comando ou objeto de acordo com o contexto. Para ativar o
IntelliSense, clique com o botão direito no editor de textos e escolha a opção
“IntelliSense”, conforme vemos na Figura
17.
Figura 17. Opção de IntelliSense do SQL Server Management Studio
Com o IntelliSense ativado, toda vez que estivermos utilizando o
Editor de Textos e digitarmos “.” ou pressionarmos “CTRL-J” no teclado, uma
janela com as opções de objetos (atributos, funções, propriedades, campos,
tabelas etc.) possíveis serão exibidas. A Figura
18 mostra o IntelliSense exibindo a lista de campos disponíveis para a
tabela “Sales.SalesTerritory”. A grande sacada do IntelliSense é que ele é
capaz de exibir apenas o que interessa no contexto.
Figura 18. IntelliSense do SQL Server Management Studio em ação
Conforme vimos nesse tópico, o SQL Server Management Studio pode
ser utilizado para criarmos um projeto de scripts além de fornecer um ambiente
rico em recursos para desenvolvimento. Com isso mantemos nossos scripts de
forma organizada e ainda podemos utilizar um repositório de códigos-fonte (como
o Team Foundation Server) para armazenarmos todos os nossos scripts. Você pode
utilizar o projeto criado para abrigar todos os exemplos que veremos ao longo
do artigo. A seguir teremos uma introdução aos principais conceitos da T-SQL.
Entendendo os
fundamentos da T-SQL
A T-SQL (ou Transact-SQL) possui vários elementos que são
utilizados, ou influenciam, a maioria das instruções. Vamos conhecer a seguir
cada um desses elementos.
Identificadores:
Nomes de objetos como tabelas, exibições, colunas, bancos de dados e
servidores;
Tipos de dados:
Define os tipos de dados contidos nos objetos de dados, como colunas, variáveis
e parâmetros;
Constantes: Símbolos
que representam tipos de dados específicos, por exemplo, INT, VARCHAR,
DATETIME, entre outros;
Funções: Elementos de
sintaxe que utilizam zero ou um ou mais valores de entrada e retornam um valor
escalar ou um conjunto tabular de valores. Como exemplo podemos citar a função
SUM para adicionar vários valores, a função DATEDIFF para determinar quantas
unidades de tempo separam duas datas, a função @@SERVERNAME para adquirir o
nome de uma instância do Microsoft SQL Server;
Expressões: Unidades
de sintaxe que o SQL Server pode resolver para valores únicos. Exemplos de
expressões incluem constantes, funções que retornam um único valor, uma
referência a uma coluna ou uma variável;
Operadores em expressões:
Funcionam com uma ou mais expressões simples para formar uma expressão mais
complexa. Por exemplo, o sinal de multiplicação (*) na expressão PriceColumn *
1,1 aumenta o preço em 10%;
Comentários: Partes
do texto inseridas em instruções T-SQL ou scripts para explicar o objetivo da
instrução. Os comentários não são executados pelo SQL Server;
Palavras-chave reservadas:
Palavras reservadas para utilização pelo SQL Server e que não devem ser
utilizadas para os nomes de objetos em um banco de dados.
A Tabela 1 apresenta
todas as palavras-reservadas da T-SQL, sendo que as mais utilizadas estão
destacadas em negrito.
|
AUTHORIZATION
|
DISK
|
INTO
|
READ
|
UPDATE
|
...